過濾器案例:字符編碼過濾器html
在JavaWeb程序開發中,因爲Web容器內部所使用編碼格式並不支持中文字符集,因此,處理瀏覽器請求中的中文數據就會出現亂碼現象。java
圖3 無字符編碼過濾器web
從上圖能夠看出,因爲Web容器使用了ISO-8859-1編碼格式,因此在Web應用的業務處理中也會使用ISO-8859-1的編碼格式,雖然瀏覽器提交的請求使用的是中文編碼格式UTF-8,但通過業務處理中的ISO-8859-1編碼,仍然會出現中文亂碼現象。解決此問題的方法很是簡單,在業務處理中從新制定中文字符集進行編碼便可。在實際開發過程當中,若是經過每個業務處理指定中文字符集編碼,則操做過於繁瑣,並且容易遺漏某一個業務中的字符編碼設置;若是經過過濾器來處理字符編碼,就能夠作到簡單又萬無一失,如圖4所示。瀏覽器
圖4 使用字符編碼過濾器app
在Web應用中部署了字符編碼過濾器之後,即便Web容器的編碼格式不支持中文,但瀏覽器的每一次請求都會通過過濾器進行轉碼,因此,,能夠徹底避免中文亂碼的產生。jsp
下面的案例實現圖書信息的添加功能,並建立字符編碼過濾器,避免中文亂碼現象的產生。ide
● 建立字符編碼過濾器對象,其名稱爲CharactorFilter類。該類實現了javax.servlet.Filter接口,並在doFilter()方法中對請求中的字符編碼格式進行設置。代碼以下:post
package com.xdl.filter;編碼
import javax.servlet.*;url
import java.io.IOException;
public class CharactorFilter implements Filter {
private String encoding = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(encoding != null){
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
encoding = null;
}
}
CharactorFilter類是實例中的字符編碼過濾器,它主要經過在doFilter()方法中,指定request與response兩個參數的字符集encoding進行編碼處理,使得目標資源的字符集支持中文。其中,encoding是CharactorFilter類定義的字符編碼格式成員變量,該變量在過濾器的初始化方法init()中被賦值,它的值是經過FilterConfig對象讀取配置文件中的初始化參數獲取的。
在建立了過濾器對象以後,還須要對過濾器進行必定的配置才能夠正常使用。過濾器CharactorFilter的配置代碼以下:
<filter>
<filter-name>CharactorFilter<.filter-name>
<filter-class>com.xdl.filter.CharactorFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharactorFilter</filter-name>
<url-pattern>/*</url-pattern>
<filter-mapping>
● 建立名稱爲AddServlet的類,該類繼承HttpServlet,是處理添加圖書信息請求的Servlet對象,代碼以下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class AddServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String id = request.getParameter("id");
String name = request.getParameter("name");
String author = request.getParameter("author");
String price = request.getParameter("price");
out.print("<h2>圖書信息添加成功</h2><hr>");
out.print("圖書編號:" + id + "<br>");
out.print("圖書名稱:" + name + "<br>");
out.print("圖書做者:" + author + "<br>");
out.print("圖書價格:" + price + "<br>");
out.flush();
out.close();
}
}
AddServlet的類主要經過service()方法實現添加圖書信息請求的處理,其處理方法是將獲取的圖書信息數據直接輸出到頁面中。
在編寫了Servlet類後,還須要在web.xml文件中對Servlet進行配置,其配置代碼以下:
<servlet>
<servlet-name>AddServlet</servlet-name>
<servlet-class>com.xdl.servlet.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/AddServlet</url-pattern>
</servlet-mapping>
● 建立名稱爲index.jsp的頁面,它是程序中的主頁,該頁面主要用於放置添加圖書信息的表單,其代碼以下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加圖書信息</title>
</head>
<body>
<h1>添加圖書信息</h1>
<form action="/AddServlet" method="post">
圖書編號:<input type="text" name="id"><br>
圖書名稱:<input type="text" name="name"><br>
圖書做者:<input type="text" name="author"><br>
圖書價格:<input type="text" name="price"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
編寫完成index.jsp頁面後,便可部署發佈程序,實例運行後,將打開index.jsp頁面,如圖5所示。
圖5 index.jsp
添加正確的圖書信息後,單擊提交按鈕,其效果如圖6所示。
圖6 AddServlet生成的HTML頁面