目錄
過濾器
簡介
編碼過濾
登入檢測
Servlet監聽器
對Servlet上下文監聽
對session監聽
Servlet一共分為三類:基礎Servlet、過濾器、監聽器。
過濾器
簡介
過濾器的本質在于過濾所有的非法操作,而且所有的過濾需要自動實作過濾操作。想要在WEB中實作過濾器,需要一個專門的程式類,這個類需要去實作javax.servlet.Filter接口,這個接口裡面定義有三個方法:
- 初始化:public void init(FilterConfig filterConfig) throws ServletException ;
| - 當容器啟動後,過濾器就啟動了
- 執行過濾:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException ;
- 銷毀過濾器:public void destroy()
範例:建議MyFilter過濾器程式類
package cn.ren.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("*** 初始化參數 ****" + filterConfig.getInitParameter("myparam"));
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println(" *** 過濾器執行前 *****");
chain.doFilter(request, response);
System.out.println(" *** 過濾器執行後 *****");
}
@Override
public void destroy() {
System.out.println("*** 銷毀 ***");
}
}
對于每個過濾器而言将使用者的請求轉發到目标位置需要利用FilterChain接口完成,這個接口;裡面定義有 如下方法:
- public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException
過濾器依然屬于Servlet程式,是以依然需要在web.xml中進行配置
<filter>
<filter-name>MyFliter</filter-name>
<filter-class>cn.ren.filter.MyFliter</filter-class>
<init-param>
<param-name>myparam</param-name>
<param-value>init_param</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFliter</filter-name>
<!-- 這裡是過濾路徑,設定為“/*”表示過濾所有路徑,如果設定具體,則.. -->
<url-pattern>/*</url-pattern>
</filter-mapping>
所有的過濾器會根據器過濾路徑自動進行執行,執行時一定要使用FilterChain接口中的doFilter()方法,将使用者請求向後傳遞。
編碼過濾
編碼過濾主要是為了解決頁面亂碼的問題,如果所有的頁面通過過濾器進行編碼過濾,就不需要在每個頁面上編寫過濾代碼。
範例:定義一個input.jsp頁面
<body>
<form action="show.jsp" method="post">
資訊:<input type="text" name="msg" id="msg" >
<input type="submit" value="發送">
</form>
</body>
範例:編寫show.jsp頁面
<h1>msg = ${param.msg}</h1>
範例:編寫一個編碼過濾器
package cn.ren.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
private String charset = "UTF-8" ;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 可以通過初始化參數進行過濾器編碼的同一配置,這樣如果要更換編碼,這樣修改web.xml配置檔案
if(filterConfig.getInitParameter("charset") != null) {
this.charset = filterConfig.getInitParameter("charset") ;
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(this.charset);
response.setCharacterEncoding(this.charset);
chain.doFilter(request, response);
}
}
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.ren.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<!-- 這裡是過濾路徑,設定為“/*”表示過濾所有路徑,如果設定具體,則.. -->
<url-pattern>/*</url-pattern>
</filter-mapping>
規範以後的開發程式使用編碼過濾,不用在頁面編寫編碼
登入檢測
之後更。。。。。
Servlet監聽器
Servlet監聽器是對整個WEB狀态進行監聽,主要分為兩種形式:application監聽(ServletContext監聽、整個容器監聽)、session監聽(使用者的狀态);
對Servlet上下文監聽
實作對Servlet上下文監聽,那麼就需要兩種監聽處理:
- 對Servlet上下文的狀态監聽:javax.servlet.ServletContextListener
| - 容器啟動:public void contextInitialized(ServletContextEvent sce)
| - 容器銷毀:public void contextDestroyed(ServletContextEvent sce)
| - ServletContextEvent 事件對象:public ServletContext getServletContext()
- 對Servlet上下文屬性監聽:javax.servlet.ServletContextAttributeListener
|- 增加屬性:public void attributeAdded(ServletContextAttributeEvent event)
|- 替換屬性:public void attributeRemoved(ServletContextAttributeEvent event)
|- 删除屬性: public void attributeReplaced(ServletContextAttributeEvent event)
|- ServletContextAttributeEvent事件對象:
|- 取得屬性名稱:public String getName()
|- 取得屬性内容:public Object getValue()
範例:定義一個Servlet的整體監聽
package cn.ren.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener, ServletContextAttributeListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("*** 容器啟動 ***" + sce.getServletContext().getRealPath("/"));
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("*** 容器銷毀 ***" + sce.getServletContext().getRealPath("/"));
}
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println(" *** 增加application *** name = " + event.getName() + "、value = " + event.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println(" *** 删除application *** name = " + event.getName() + "、value = " + event.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println(" *** 替換application *** name = " + event.getName() + "、value = " + event.getValue());
}
}
配置
<listener>
<listener-class>cn.ren.listener.MyListener</listener-class>
</listener>
<%
//application.setAttribute("msg", "www.baidu.com") ;
application.removeAttribute("msg") ;
%>
對session監聽
session監聽指的是針對一個使用者的狀态監聽,有兩種:
- session的狀态監聽:javax.servlet.http.HttpSeesionListener;
| - session建立:public void sessionCreated(HttpSessionEvent se) ;
| - session銷毀:public void sessionDestroyed(HttpSessionEvent se) ;
| - HttpSessionEvent 事件: public HttpSession getSession()
- seesion的屬性監聽:javax.servlet.http.HttpSessionAttributeListener
| - 增加屬性:public void attributeAdded(HttpSessionBindingEvent event)
| - 替換屬性:pbulic void attributeRemoved(HttpSessionBindingEvent event)
| - 銷毀屬性:public void attributeReplaced(HttpSessionBindingEvent event)
| - HttpSessionBindingEvent 事件:
| - public String getName()
| - public Object getValue()
| - public HttpSession getSession()
範例:觀察Session
package cn.ren.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("**** Session建立 ***" + se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("**** Session銷毀***" + se.getSession().getId());
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("**** Session屬性增加 ***" + event.getName() + "、" + event.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("****屬性删除 ***" + event.getName() + "、" + event.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("****屬性替換***" + event.getName() + "、" + event.getValue());
}
}
<listener>
<listener-class>cn.ren.listener.SessionListener</listener-class>
</listener>
session有三種情況會銷毀:
- 【項目運作時】使用session.invalidate()方法銷毀;
- 【項目運作過程中】session過時銷毀,預設時間是30分鐘;
- 【項目開發之中】web項目重新加載會銷毀;
過時時間可以自定義:(時間機關為1分鐘)
<session-config>
<session-timeout>1</session-timeout>
</session-config>