過濾器
字元編碼的問題:如果用戶端跟服務端字元編碼沒有采用統一的格式就會出現亂碼的現象,比如要利用Servlet在網頁上輸出内容,出現該現象就調用response對象的setCharacterEncoding方法,但是不可能在每一個Servlet中都調用該方法,太繁瑣且會導緻程式臃腫。
為此引入了過濾器,過濾器即過濾掉一些網頁資料,有些垃圾資料如果一直在請求響應中存在就會占用網絡資源。
生命周期
伺服器啟動—>伺服器關閉
實作步驟
1.建立一個類實作Filter接口(導包不要導錯了)
2.重寫init、destroy、doFilter方法
3.在web.xml中配置Filter以及Filter-mapping
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.bin.Filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/servlet/show</url-pattern>
</filter-mapping>
Demo
解決中文亂碼問題的過濾器
工程結構圖
在MyServlet中列印一個中文的字元串,此時肯定會出現亂碼,為此編寫一個過濾器MyFilter用于過濾,編寫完後将MyServlet與MyFilter配置到web.xml配置檔案中。
//MyServlet
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("你好世界");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
//MyFilter
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
//此句很重要,是傳遞請求的,如果沒有該句,則就會止步于過濾器,無法響應到用戶端
filterChain.doFilter(servletRequest,servletResponse);
}
}
<!--web.xml檔案-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.bin.Servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.bin.Filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/servlet/show</url-pattern>
</filter-mapping>
運作結果:
URL位址不同,通路/show并沒有過濾器,通路servlet/show有過濾器介入了。