在頁面建個表單
<form action="login.do" method="post"> <input type="text" name="username" /> <input type="submit" value="確定" /> </form>
建個servlet
web.xml
<servlet> <servlet-name>LoginServlert</servlet-name> <servlet-class>servlet.LoginServlert</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlert</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping>
package servlet;import java.io.IOException;import java.io.PRintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlert extends HttpServlet { public LoginServlert() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); System.out.println("獲取的username:>>>>>>"+username); } public void init() throws ServletException { }}

后臺情況是這樣的:

亂碼了.
可以通過過濾器來解決
新建一個過濾器EncodingFilter.java
package 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;import javax.servlet.http.HttpServletRequest;public class EncodingFilter implements Filter{ private String encoding = ""; private String filterName = ""; public void init(FilterConfig filterConfig) throws ServletException { encoding = filterConfig.getInitParameter("encoding"); filterName = filterConfig.getFilterName(); if (encoding == null || "".equals(encoding)) { encoding = "UTF-8"; } System.out.println("獲得編碼值......"); } public void doFilter(ServletRequest request, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; System.out.println("請求被" + filterName + "過濾了......."); // 分別對請求和響應(yīng)進行編碼設(shè)置 request.setCharacterEncoding(encoding); res.setCharacterEncoding(encoding); chain.doFilter(req, res); System.out.println("響應(yīng)被被" + filterName + "過濾了......."); } public void destroy() { System.out.println("請求被銷毀......"); }}
在web.xml中配置filter
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
跑起來:

正常了.
我們換在地址欄里輸入漢字,看看是否亂碼.

結(jié)果是這樣的

過濾器不起作用了,怎么辦.
其實request.setCharacterEncoding(encoding);只對消息體中的數(shù)據(jù)起作用,對url中的參數(shù)不起作用了.
對上面的過濾器進行優(yōu)化.
編寫RequestEncodingWrapper.java
package filter;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class RequestEncodingWrapper extends HttpServletRequestWrapper { private String encoding = ""; public RequestEncodingWrapper(HttpServletRequest request) { // 必須調(diào)用父類構(gòu)造方法 super(request); } public RequestEncodingWrapper(HttpServletRequest request,String encoding){ // 必須調(diào)用父類構(gòu)造方法 super(request); this.encoding=encoding; } @Override public String getParameter(String name) { String value=getRequest().getParameter(name); try { //將參數(shù)值進行編碼轉(zhuǎn)換 if(value!=null&&!"".equals(value)){ value=new String(value.trim().getBytes("iso-8859-1"),encoding); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return value; } }
優(yōu)化EncodingFilter.java后
package 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;import javax.servlet.http.HttpServletRequest;public class EncodingFilter implements Filter { private String encoding = ""; private String filterName = ""; public void init(FilterConfig filterConfig) throws ServletException { encoding = filterConfig.getInitParameter("encoding"); filterName = filterConfig.getFilterName(); if (encoding == null || "".equals(encoding)) { encoding = "UTF-8"; } System.out.println("獲得編碼值......"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; System.out.println("請求被" + filterName + "過濾了......."); if("GET".equals(req.getMethod())){ req=new RequestEncodingWrapper(req,encoding); }else { request.setCharacterEncoding(encoding); } // 分別對請求和響應(yīng)進行編碼設(shè)置 response.setCharacterEncoding(encoding); chain.doFilter(req, response); System.out.println("響應(yīng)被被" + filterName + "過濾了......."); } public void destroy() { System.out.println("請求被銷毀......"); }}

好了.
Filter接口有三個方法:
init(FilterConfig filterConfig) 初始化過濾器,filterConfig參數(shù)可以得到過濾器初始化的配置參數(shù)信息.
doFilter(ServletRequest request, ServletResponse res,FilterChain chain)
request表示客戶端的請求,rewponse表示對應(yīng)請求的響應(yīng),chain是過濾器對象,.在該方法中的特定過濾器完成后,
可調(diào)用doFilter請求傳給過濾器中的下一個過濾器,也可以直接返回響應(yīng)內(nèi)容,還可以將目標(biāo)重定向.
destroy():釋放過濾器中使用的資源.
參數(shù)FilterConfig filterConfig有四個方法:
public String getFilterName() 得到過濾器的名字
public String getInitParameter(String name) 得到過濾器中初始化的參數(shù)值.
publi Enumeration getInitParameterNames() 得到過濾器配置中的所有初始化參數(shù)名字的枚舉類型.
publi ServletContext getServlet() 得到Servlet上下文對象.
說完了請求,我們再來說說響應(yīng).
我們經(jīng)常需要在向瀏覽器輸出內(nèi)容時,過濾一些敏感詞匯.
新建一個內(nèi)容替換的封裝器ResponseReplaeWrapper.java
package filter;import java.io.CharArrayWriter;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class ResponseReplaeWrapper extends HttpServletResponseWrapper { private CharArrayWriter charWriter = new CharArrayWriter(); public ResponseReplaeWrapper(HttpServletResponse response){ //必須調(diào)用父類構(gòu)造方法 super(response); } public PrintWriter getWriter() throws IOException{ //返回字符數(shù)組Writer,緩存內(nèi)容 return new PrintWriter(charWriter); } public CharArrayWriter getCharWriter(){ return charWriter; } }
過濾器:
package filter;import java.io.FileNotFoundException;import java.io.IOException;import java.io.PrintWriter;import java.util.Properties;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletResponse;public class ReplaceFilter implements Filter { private Properties propert = new Properties(); public void init(FilterConfig filterConfig) throws ServletException { System.out.println("ReplaceFilter init....."); // 通過filterConfig獲得初始胡文件名 String filePath = filterConfig.getInitParameter("filePath"); try { // 導(dǎo)入資源文件 propert.load(ReplaceFilter.class.getClassLoader() .getResourceAsStream(filePath)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; // 實例化響應(yīng)器包裝類 ResponseReplaeWrapper resp = new ResponseReplaeWrapper(res); chain.doFilter(request, resp); // 緩存輸出字符 String outString = resp.getCharWriter().toString(); // 循環(huán)替換不合法的字符 for (Object o : propert.keySet()) { String key = (String) o; outString = outString.replace(key, propert.getProperty(key)); } // 利用原先的HttpServletResponse輸出字符 PrintWriter out = res.getWriter(); out.write(outString); } public void destroy() { System.out.println("ReplaceFilter destroy......"); }}
在web.xml中配置過濾器
<filter> <filter-name>ReplaceFilter</filter-name> <filter-class>filter.ReplaceFilter</filter-class> <init-param> <param-name>filePath</param-name> <param-value>/replace_ZH.properties</param-value> </init-param> </filter> <filter-mapping> <filter-name>ReplaceFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
在src下新建配置文件replace_ZH.properties

建個測試的servlet
package servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ResponseServlet extends HttpServlet { public ResponseServlet() { super(); } public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println("思思博士<br/>色情<br/>賭博<br/>dfdffddf"); /*out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method");*/ out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void init() throws ServletException { }}

新聞熱點
疑難解答