Servlet字符编码过滤器,实现图书信息的添加功能,避免产生文字乱码现象的产生
同样的代码,网上可以找到和我一模一样的代码和配置,比我的更加详细,但是我重新写一个博客的原因自是把错误的原因写出来,因为这就是个坑,我弄了一天,希望对你们有所帮助。只为初学者发现错误不知道怎么解决有所帮助。不废话,上代码
第一个文件index.jsp,当然这个页面一般都是最后写的,这里我先介绍的原因的基本没啥错误。
注意: <form action="AddServlet" method="post">然后界面优化看自己写的就ok了!!!
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <form action="AddServlet" method="post"> 11 <table align="center" border="1" width="350"> 12 <tr> 13 <td class="2" align="center" colspan="2"> 14 <h2>添加图书信息</h2> 15 </td> 16 </tr> 17 <tr> 18 <td align="right">图书编号:</td> 19 <td> 20 <input type="text" name="id"> 21 </td> 22 </tr> 23 <tr> 24 <td align="right">图书名称:</td> 25 <td> 26 <input type="text" name="name"> 27 </td> 28 </tr> 29 <tr> 30 <td align="right">作者:</td> 31 <td> 32 <input type="text" name="author"> 33 </td> 34 </tr> 35 <tr> 36 <td align="right">价格:</td> 37 <td> 38 <input type="text" name="price"> 39 </td> 40 </tr> 41 <tr> 42 <td class="2" align="center" colspan="2"> 43 <input type="submit" value="添加"> 44 </td> 45 </tr> 46 </table> 47 </form> 48 </body> 49 </html>
第二个文件就是这个设置字符编码过滤器对象的Servlet的类CharactorFilter,其实这个文件如果你是初学者按照书本上的写没啥问题,细心点就可以了,把doFilter这个方法的参数自己记的修改为合理的ServletRequest request, ServletResponse response, FilterChain chain,理解书本上讲的,过滤器的实现等等等等。然后这个基本没啥大问题。
1 package com.ningmeng; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletConfig; 9 import javax.servlet.ServletException; 10 import javax.servlet.ServletRequest; 11 import javax.servlet.ServletResponse; 12 import javax.servlet.annotation.WebServlet; 13 import javax.servlet.http.HttpServlet; 14 15 /** 16 * Servlet implementation class CharactorFilter 17 */ 18 @WebServlet("/CharactorFilter") 19 public class CharactorFilter implements Filter { 20 private static final long serialVersionUID = 1L; 21 String encoding=null; //字符编码 22 23 /** 24 * @see Filter#init(FilterConfig) 25 */ 26 public void init(FilterConfig filterConfig) throws ServletException { 27 encoding=filterConfig.getInitParameter("encoding"); 28 //获取初始化参数 29 } 30 31 /** 32 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 33 */ 34 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 35 // TODO Auto-generated method stub 36 if(encoding!=null){//判断字符编码是否为空 37 request.setCharacterEncoding(encoding);//设置request的编码格式 38 response.setContentType("text/html;charset="+encoding); 39 //设置request字符编码 40 41 } 42 chain.doFilter(request, response);//传递给下一个过滤器 43 } 44 45 46 /** 47 * @see Servlet#destroy() 48 */ 49 public void destroy() { 50 // TODO Auto-generated method stub 51 encoding=null; 52 } 53 54 }
第三,当写好CharactorFilter类后,就需要配置web.xml,配置这个字节码的web.xml本来也没啥问题,就是注意过滤器名称,过滤器的完整类名,过滤器映射的过滤器名称和URL映射,这几个名字一定要配对就行了,基本没啥大的问题!!!
然而最扯淡的就是配置Servlet的问题,这里其实应该先说AddServlet.java这个类的,但是web.xml的配置都写在一起,所以先说下这个问题,一个令我找了一天的扯淡问题,
就是这句话
<servlet-mapping>
<!-- Servlet映射 -->
<servlet-name>AddServlet</servlet-name>
<!-- Servlet名称 -->
<url-pattern>/as</url-pattern>
<!-- URL映射 -->
</servlet-mapping>
当时我学的时候按照书本的写的,<url-pattern>/AddServlet</url-pattern>老报错,Server Tomcat v7.0 Server at localhost failed to start.就是这个扯淡的错误,当然对于英语不好的我,先是百度翻译,最后搜索错误,看到百度一大推,然并卵,并没有解决我的问题。直到我把 <url-pattern>/as</url-pattern>,当然这个名字是随便起得,然后我迫不及待地运行,竟然执行了,我真是搞不懂了,开始我把配置Servlet的这点删了,也可以运行,但我直到如果不配置Servlet肯定不对,虽然可以运行,后来请教了别人一下,虽然他也没给我说明白为啥,但是我发现了错误并解决了,最好不好把这个名字起的和上面的一样,ok,就这样代码顺利执行,顿时顺了一口气。
1 <?xml version="1.0" encoding="gbk"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <filter> 8 <!-- 声明过滤器 --> 9 <filter-name>CharactorFilter</filter-name> 10 <!-- 过滤器名称 --> 11 <filter-class>com.ningmeng.CharactorFilter</filter-class> 12 <!-- 过滤器的完整类名 --> 13 <init-param> 14 <!-- 初始化参数 --> 15 <param-name>encoding</param-name> 16 <!-- 参数名 --> 17 <param-value>UTF-8</param-value> 18 <!-- 参数值 --> 19 </init-param> 20 </filter> 21 <filter-mapping> 22 <!-- 过滤器映射 --> 23 <filter-name>CharactorFilter</filter-name> 24 <!-- 过滤器名称 --> 25 <url-pattern>/*</url-pattern> 26 <!-- URL映射 --> 27 </filter-mapping> 28 <servlet> 29 <!-- 声明Servlet --> 30 <servlet-name>AddServlet</servlet-name> 31 <!-- Servlet名称 --> 32 <servlet-class>com.ningmeng.AddServlet</servlet-class> 33 <!-- Servlet完整类名 --> 34 </servlet> 35 <servlet-mapping> 36 <!-- Servlet映射 --> 37 <servlet-name>AddServlet</servlet-name> 38 <!-- Servlet名称 --> 39 <url-pattern>/as</url-pattern> 40 <!-- URL映射 --> 41 </servlet-mapping> 42 </web-app>
第四or第三个文件,其实这个文件也没啥错误,就是写的时候和创建的时候注意一下就可以了,然后就可以直接运行了,享受代码带给你的乐趣,好了,好了,饿的慌,去吃饭。
1 package com.ningmeng; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 /** 13 * Servlet implementation class AddServlet 14 */ 15 @WebServlet("/AddServlet") 16 public class AddServlet extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 20 /** 21 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 22 */ 23 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 // TODO Auto-generated method stub 25 doPost(request,response);//处理get请求 26 27 } 28 29 /** 30 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 31 */ 32 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 33 //处理post请求 34 PrintWriter out=response.getWriter();//获取PrintWriter 35 String id=request.getParameter("id");//获取图书编号 36 String name=request.getParameter("name");//获取图书名称 37 String author=request.getParameter("author");//获取图书作者 38 String price=request.getParameter("price");//获取图书价格 39 out.print("<h2>图书信息添加成功</h2>");//输出图书信息 40 out.print("图书编号:"+id+"<br>"); 41 out.print("图书名称"+name+"<br>"); 42 out.print("作者:"+author+"<br>"); 43 out.print("价格:"+price+"<br>"); 44 out.flush();//刷新流 45 out.close();//关闭流 46 47 } 48 49 }
如果你按照我的方法还没解决你的问题,可以留言或者加我企鹅1748741328,一起讨论交流学习
享受代码带来的乐趣,爱生活爱编程