• 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,一起讨论交流学习

    享受代码带来的乐趣,爱生活爱编程      

  • 相关阅读:
    8月24 杂七杂八
    胡思乱想
    前端思考题
    前端经典面试题
    一些被废弃的东西
    关于设置img图片大小优先级的问题
    关于 removeChild()删除节点
    关于前端基本要求及一些题
    关于 Oracle 11g 先决条件检查失败的解决办法
    《现代前端技术解析》第一章读书笔记(未完成)
  • 原文地址:https://www.cnblogs.com/biehongli/p/5960219.html
Copyright © 2020-2023  润新知