• 解决servlet中get方式中中文乱码问题(二):装饰者模式使用


    注意,这里是针对Tomcat容器中get方式提交的servlet中获得参数,参数中有中文的时候乱码的问题

    之前我已经讲过,Tomcat8.0及以上URIEncoding都是utf-8的默认编码,不会出现get方式乱码的问题;

        只有Tomcat7.0及以下的版本,默认的URIEncoding才是ISO-8859-1才会出现中文乱码,当然我们也可以在Tomcat的conf中的server.xml中修改默认的URLEncoding来解决此问题(但是我们这里测试是要求不能修改Tomcat容器中的默认编码的时候哦安静),前面关于Tomcat的编码已经有了详细讲解,链接如下,这里就不再赘述了。

    在实现装饰者对getParameter进行加强的时候,我们发现:

    HttpServletRequest只是一个接口,我们继承重写不能使用接口;所以我们查阅API发现

    其中有一个实现子类HttpServletRequestWrapper,所以后面我们继承自HttpServletRequestWrapper进行重写getParameter!

    jsp中的代码:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>测试get方式中文乱码</title>
      </head>
      <body>
    	<form action="${pageContext.servletContext.contextPath }/servlet/TestEncodingServlet">
    		name:<input type="text" name="name" />
    		<input type="submit" value="提交" />
    	</form>
      </body>
    </html>
    

    servlet中的代码:

    package day03;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class TestEncodingServlet extends HttpServlet {
    	
    	private static final long serialVersionUID = 3996799889172019227L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		String name = request.getParameter("name");
    		System.out.println(name);
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    
    	}
    
    }
    

    xml中的配置:

    filter中的代码:

    package day03;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    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;
    import javax.servlet.http.HttpServletRequestWrapper;
    /**
     * 解决get方式中文参数乱码问题
     * @author mzy
     *
     */
    public class EncodingFilter implements Filter {
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {}
    	
    	@Override
    	public void destroy() {}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		HttpServletRequest tmpRequest = (HttpServletRequest)request;
    		/*
    		 * 如果是POST方式提交
    		 */
    		request.setCharacterEncoding("utf-8");
    		// 装饰者类使用,针对get方式中的中文参数
    		MyHttpRequest myRequest = new MyHttpRequest(tmpRequest);
    		/*
    		 * 放行:注意是放行我们装饰之后的request
    		 */
    		chain.doFilter(myRequest, response);
    		
    	}
    }
    
    /**
     * 装饰者类
     * 		1.继承自HttpServletRequestWrapper非final的
     * @author mzy 
     */
    class MyHttpRequest extends HttpServletRequestWrapper {
    	// 2.声明一个被装饰者类型的成员变量
    	private HttpServletRequest request;
    	
    	// 3.接收被装饰者类对象
    	public MyHttpRequest(HttpServletRequest request) {
    		super(request);
    		this.request = request;
    	}
    	/*
    	 * 4.加强方法:重写getParameter方法
    	 */
    	@Override
    	public String getParameter(String name) {
    		try {
    			// 得到原来的参数
    			String value = request.getParameter(name);
    			
    			// 判断是否是get方式提交的
    			if ("GET".equals(request.getMethod())) {
    				value = new String(value.getBytes("ISO-8859-1"), "utf-8");
    			}
    			
    			return value;
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    			throw new RuntimeException();
    		}
    	}
    }


  • 相关阅读:
    mysql去重
    java 实现一套流程管理、流转的思路(伪工作流)
    js模块加载框架 sea.js学习笔记
    使用js命名空间进行模块式开发
    二叉树的基本操作实现(数据结构实验)
    学生信息管理系统-顺序表&&链表(数据结构第一次作业)
    计算表达式的值--顺序栈(数据结构第二次实验)
    使用seek()方法报错:“io.UnsupportedOperation: can't do nonzero cur-relative seeks”错误的原因
    seek()方法的使用
    python中如何打印某月日历
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053415.html
Copyright © 2020-2023  润新知