servlet、filter、listener繼承的基類和獲得作用域的方式
一、servlet:
1、servlet屬於j2ee的元件,構建servlet的web project不需要匯入專案框架jar包
2、servlet的體系結構:
在j2ee API中,提供給servlet的支援介面和基類都位於javax.servlet.*和javax.servlet.http.*(提供所有與http請求有關的API)兩個包中
servlet包中常使用的介面
Interface ServletConfig
Interface ServletContext
Interface ServletRequest
Interface ServletResponse
Interface Servlet:此介面中提供的方法有init,getServletConfig,getServletInfo,destroy,service
jqavax.servlet.Genericservlet(實現了servlet介面,實現了基本servlet功能,提供有service()方法)
javax.servlet.http.HttpServlet(繼承了Genericservlet類,可以處理http請求,提供的doGet()+doPost()和service()方法作用相同
3、實現servlet控制器的功能類需要繼承HttpServlet類,並重寫HttpServlet類中的方法
public class TestServlet extends HttpServlet{
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
String username=req.getParameter("username");//可以隨意呼叫Request和Response方法
String name="admin";
String password="admin";
System.out.println(name+"\t"+password);
}
public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
this.doPost(req, resp);
System.out.println("這是get提交方式");
}
通過上面的這種重寫方式,可以避免因處理doGet或者doPost不同的提交方式而導致程式碼重複的問題
或者採用重寫service()方法,實際上,重寫doGet()和doPost()方法,也是程式自動呼叫service()方法進行解析get或者post的提交方式:
public void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
String username=req.getParameter("username");//可以隨意呼叫Request和Response方法
String name="admin";
String password="admin";
System.out.println(name+"\t"+password);
}
servlet的生命週期:通過重寫下面的兩個方法(過濾器中的)可以瞭解servlet的生命週期:
public void init(ServletConfig config)throws ServletException{
//第一條請求到來時載入,可以將當前servlet的初始化配置以ServletConfig config型別傳出來
System.out.println("servlet初始化");
}
public void destroy(){------------------------------------->>//伺服器停止時載入,是最後呼叫的方法
System.out.println("servlet的銷燬方法");
}
4、servlet中獲得請求物件:
application----ServletContext ServletContext application=config.getServletContext();這是通過config獲得的,也可以通過session獲得
session----HttpSession HttpSession session=request.getSession();通過session獲得
request---HttpServletRequest,繼承ServletRequest------------>>servlet,filter listener等的所有請求都是這個型別的
response---HttpServletResponse,繼承ServletResponse---------->>servlet,filter listener等的所有響應都是這個型別的
config---ServletConfig ------------------>>獲得初始化引數值
out----PrintWriter:PrintWriter out = response.getWriter();
exception----Exception
pageContext----javax.servlet.jsp.PageContext
page----javax.servlet.jsp.JspPage
5、servlet在web.xml中的配置:
<!-- 配置servlet -->
<servlet>
<servlet-name>LoginServlet</servlet-name>--------->>為此servlet定義的名稱
<servlet-class>net.cstp.servlet.LoginServlet</servlet-class>-------->>讓容器tomcat載入相應的servlet類
<1-- 可以設定初始化引數,在servlet初始化方法中通過ServletConfig config物件獲得該初始化引數 -->
<init-param>
<param-name>name</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>---------->>為了找到匹配載入類(servlet控制器),與servlet節點中的name相同
<url-pattern>/login</url-pattern>------------------>>servlet入口,與位址列的url或者表單中action的url相對應,以/開頭
</servlet-mapping>
<!-- 配置session的生命週期:單位分鐘 -->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
二、filter:過濾器,j2ee元件
1、filter的體系結構:位於javax.servlet.*包中
FilterConfig:提供獲得application物件的方法getServletContext() 以及初始化請求引數的方法getInitParameter(String name)
FilterChain:提供向下傳遞請求的方法doFilter(ServletRequest request, ServletResponse response)
Filter:提供三個方法,filter初始化init()、銷燬destroy() 、處理請求doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
2、實現filter介面功能的方式:實現Filter介面,並重寫Filter介面的三個方法
public class Myfilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("過濾器初始化成功");
}
public void destroy() {
System.out.println("過濾器銷燬的方法");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//獲得能處理http請求的請求request和響應response物件
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;
String username=(String)request.getSession().getAttribute("username");
if(username!=null){
//呼叫FilterChain介面宣告的變數chain作用:1.讓請求沿著過濾器向下傳遞;2.起分割的作用:上處理請求,下處理響應
System.out.println("處理的相關請求");
chain.doFilter(request, response);
System.out.println("處理的相關響應");
}else{
response.sendRedirect("../index.jsp");
}
}
}
3、filter在web.xml中的配置:
<!-- 全部過濾 -->
<filter>
<filter-name>YourFilter</filter-name>
<filter-class>net.cstp.filter.YourFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>YourFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 選擇性過濾 -->
<filter-mapping>
<filter-name>YourFilter</filter-name>
<url-pattern>/update</url-pattern>
</filter-mapping>
三、Listener:監聽器,j2ee元件
1、Listener的體系結構,位於javax.servlet.*和javax.servlet.http.*:針對不同的作用域物件,提供相對應的實現介面,並且依據作用不同,區分不同功能的實現介面
request物件:
Interface ServletRequestListener:提供建立和銷燬的方法
Interface ServletRequestAttributeListener:對作用域中屬性值新增、刪除、替換的監測
session物件:
Interface HttpSessionListener,可以用於統計網站當前的線上人數
Interface HttpSessionAttributeListener:繫結值 解除繫結
Interface HttpSessionBindingListener
application物件:
Interface ServletContextListener:監聽tomcat的啟動或者或者銷燬,也可以說當web專案被載入或者被銷燬的時候,可以用於統計網站歷史訪問量
Interface ServletContextAttributeListener
2、自定義監聽器:
1)、實現ServletRequestListener介面:
public class ValidateRequestListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent event) {
System.out.println("監聽器已經銷燬");
}
public void requestInitialized(ServletRequestEvent event) {
System.out.println("監聽器已經啟動");
ServletRequest req=event.getServletRequest();
HttpServletRequest request=(HttpServletRequest)req;
....
}
}
2)、實現ServletRequestAttributeListener介面:
public class ValidateServletArributeRequest implements ServletRequestAttributeListener {
//當把值新增到作用域中時,能夠監測得到
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("向request作用域新增一個屬性名"+arg0.getName()+"的值為:"+arg0.getValue());
}
//當把值從作用域中刪除時,能夠監測得到
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("把值從作用域中刪除了"+arg0.getName()+"的值為:"+arg0.getValue());
}
//當把作用域中的值替換時,能過監測得到
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("獲得被替換值為:"+arg0.getName()+"的值為:"+arg0.getValue());
ServletRequest req=arg0.getServletRequest();
HttpServletRequest request=(HttpServletRequest)req;
String name=(String)request.getAttribute("name");
System.out.println("獲得替換後的值為:"+name);
}
}
3、listener在web.xml中的配置:用到哪個,新增哪個
<listener>
<listener-class>net.cstp.listener.ValidateRequestListener</listener-class>
</listener>
<listener>
<listener-class>net.cstp.listener.ValidateSessionListener</listener-class>
</listener>
<!--
<listener>
<listener-class>net.cstp.listener.ValidateApplicationListener</listener-class>
</listener>
四、servlet、filter、listener的配置順序與載入順序:
載入順序與它們在 web.xml 檔案中的先後順序無關。即不會因為 filter 寫在 listener 的前面而會先加 載 filter。但是配置順序儘量與載入順序一致,也方便管理
web.xml 的載入順序是:context- param -> listener -> filter -> servlet ,而同個型別之間的實際程式呼叫的時候的順序是根據 對應的 mapping 的順序進行呼叫的。