在页面建个表单
<formaction="login.do"method="post"><inputtype="text"name="username"/><inputtype="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>
packageservlet;importjava.io.IOException;importjava.io.PRintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassLoginServlertextendsHttpServlet {publicLoginServlert() {super();
}publicvoiddestroy() {super.destroy();
}publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
doPost(request, response);
}publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
String username= request.getParameter("username");
System.out.println("获取的username:>>>>>>"+username);
}publicvoidinit()throwsServletException {
}
}
后台情况是这样的:
乱码了.
可以通过过滤器来解决
新建一个过滤器EncodingFilter.java
packagefilter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;publicclassEncodingFilterimplementsFilter{privateString encoding = "";privateString filterName = "";publicvoidinit(FilterConfig filterConfig)throwsServletException {
encoding= filterConfig.getInitParameter("encoding");
filterName=filterConfig.getFilterName();if(encoding ==null|| "".equals(encoding)) {
encoding= "UTF-8";
}
System.out.println("获得编码值......");
}publicvoiddoFilter(ServletRequest request, ServletResponse res,
FilterChain chain)throwsIOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
System.out.println("请求被" + filterName + "过滤了.......");//分别对请求和响应进行编码设置request.setCharacterEncoding(encoding);
res.setCharacterEncoding(encoding);
chain.doFilter(req, res);
System.out.println("响应被被" + filterName + "过滤了.......");
}publicvoiddestroy() {
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>
跑起来:
正常了.
我们换在地址栏里输入汉字,看看是否乱码.
结果是这样的
过滤器不起作用了,怎么办.
其实request.setCharacterEncoding(encoding);只对消息体中的数据起作用,对url中的参数不起作用了.
对上面的过滤器进行优化.
编写RequestEncodingWrapper.java
packagefilter;importjava.io.UnsupportedEncodingException;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;publicclassRequestEncodingWrapperextendsHttpServletRequestWrapper {privateString encoding = "";publicRequestEncodingWrapper(HttpServletRequest request) {//必须调用父类构造方法super(request);
}publicRequestEncodingWrapper(HttpServletRequest request,String encoding){//必须调用父类构造方法super(request);this.encoding=encoding;
}
@OverridepublicString getParameter(String name) {
String value=getRequest().getParameter(name);try{//将参数值进行编码转换if(value!=null&&!"".equals(value)){
value=newString(value.trim().getBytes("iso-8859-1"),encoding);
}
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}returnvalue;
}
}
优化EncodingFilter.java后
packagefilter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;publicclassEncodingFilterimplementsFilter {privateString encoding = "";privateString filterName = "";publicvoidinit(FilterConfig filterConfig)throwsServletException {
encoding= filterConfig.getInitParameter("encoding");
filterName=filterConfig.getFilterName();if(encoding ==null|| "".equals(encoding)) {
encoding= "UTF-8";
}
System.out.println("获得编码值......");
}publicvoiddoFilter(ServletRequest request, ServletResponse response,
FilterChain chain)throwsIOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
System.out.println("请求被" + filterName + "过滤了.......");if("GET".equals(req.getMethod())){
req=newRequestEncodingWrapper(req,encoding);
}else{
request.setCharacterEncoding(encoding);
}//分别对请求和响应进行编码设置response.setCharacterEncoding(encoding);
chain.doFilter(req, response);
System.out.println("响应被被" + filterName + "过滤了.......");
}publicvoiddestroy() {
System.out.println("请求被销毁......");
}
}
好了.
Filter接口有三个方法:
init(FilterConfig filterConfig)初始化过滤器,filterConfig参数可以得到过滤器初始化的配置参数信息.
doFilter(ServletRequest request, ServletResponse res,FilterChain chain)
request表示客户端的请求,rewponse表示对应请求的响应,chain是过滤器对象,.在该方法中的特定过滤器完成后,
可调用doFilter请求传给过滤器中的下一个过滤器,也可以直接返回响应内容,还可以将目标重定向.
destroy():释放过滤器中使用的资源.
参数FilterConfig filterConfig有四个方法:
public String getFilterName()得到过滤器的名字
public String getInitParameter(String name)得到过滤器中初始化的参数值.
publi Enumeration getInitParameterNames()得到过滤器配置中的所有初始化参数名字的枚举类型.
publi ServletContext getServlet()得到Servlet上下文对象.
说完了请求,我们再来说说响应.
我们经常需要在向浏览器输出内容时,过滤一些敏感词汇.
新建一个内容替换的封装器ResponseReplaeWrapper.java
packagefilter;importjava.io.CharArrayWriter;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpServletResponseWrapper;publicclassResponseReplaeWrapperextendsHttpServletResponseWrapper {privateCharArrayWriter charWriter =newCharArrayWriter();publicResponseReplaeWrapper(HttpServletResponse response){//必须调用父类构造方法super(response);
}publicPrintWriter getWriter()throwsIOException{//返回字符数组Writer,缓存内容returnnewPrintWriter(charWriter);
}publicCharArrayWriter getCharWriter(){returncharWriter;
}
}
过滤器:
packagefilter;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Properties;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletResponse;publicclassReplaceFilterimplementsFilter {privateProperties propert =newProperties();publicvoidinit(FilterConfig filterConfig)throwsServletException {
System.out.println("ReplaceFilter init.....");//通过filterConfig获得初始胡文件名String filePath = filterConfig.getInitParameter("filePath");try{//导入资源文件propert.load(ReplaceFilter.class.getClassLoader()
.getResourceAsStream(filePath));
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}publicvoiddoFilter(ServletRequest request, ServletResponse response,
FilterChain chain)throwsIOException, ServletException {
HttpServletResponse res=(HttpServletResponse) response;//实例化响应器包装类ResponseReplaeWrapper resp =newResponseReplaeWrapper(res);
chain.doFilter(request, resp);//缓存输出字符String outString =resp.getCharWriter().toString();//循环替换不合法的字符for(Object o : propert.keySet()) {
String key=(String) o;
outString=outString.replace(key, propert.getProperty(key));
}//利用原先的HttpServletResponse输出字符PrintWriter out =res.getWriter();
out.write(outString);
}publicvoiddestroy() {
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
packageservlet;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassResponseServletextendsHttpServlet {publicResponseServlet() {super();
}publicvoiddestroy() {super.destroy();//Just puts "destroy" string in log//Put your code here}publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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();
}publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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();
}publicvoidinit()throwsServletException {
}
}