博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网上图书商城项目学习笔记-037工具类之BaseServlet及统一中文编码
阅读量:4354 次
发布时间:2019-06-07

本文共 6226 字,大约阅读时间需要 20 分钟。

1.统一中文编码分析

tomcat默认esetISO-8859-1编码,在servlet中,可能通过request的setCharacterEncoding(charset)和response.setContentType("text/html;charset=UTF-8");处理post请求编码,但get请求的编码控制不了,所以,如果请求类型是get,则用装饰者模式把request整个调包

 

2.EncodingFilter.java

1 package cn.itcast.filter; 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.ServletException; 9 import javax.servlet.ServletRequest;10 import javax.servlet.ServletResponse;11 import javax.servlet.http.HttpServletRequest;12 13 14 public class EncodingFilter implements Filter {15     private String charset = "UTF-8";16     @Override17     public void destroy() {}18 19     @Override20     public void doFilter(ServletRequest request, ServletResponse response,21             FilterChain chain) throws IOException, ServletException {22         HttpServletRequest req = (HttpServletRequest) request;23         if(req.getMethod().equalsIgnoreCase("GET")) {24             if(!(req instanceof GetRequest)) {25                 req = new GetRequest(req, charset);//处理get请求编码26             }27         } else {28             req.setCharacterEncoding(charset);//处理post请求编码29         }30         chain.doFilter(req, response);31     }32 33     @Override34     public void init(FilterConfig fConfig) throws ServletException {35         String charset = fConfig.getInitParameter("charset");36         if(charset != null && !charset.isEmpty()) {37             this.charset = charset;38         }39     }40 }

3.GetRequest.java  装饰者模式

1 package cn.itcast.filter; 2  3 import java.io.UnsupportedEncodingException; 4 import java.util.Enumeration; 5 import java.util.Map; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletRequestWrapper; 8  9 /**10  * 对GET请求参数加以处理!11  * @author qdmmy612  *13  */14 public class GetRequest extends HttpServletRequestWrapper {15     private HttpServletRequest request;16     private String charset;17     18     public GetRequest(HttpServletRequest request, String charset) {19         super(request);20         this.request = request;21         this.charset = charset;22     }23 24     @Override25     public String getParameter(String name) {26         // 获取参数27         String value = request.getParameter(name);28         if(value == null) return null;//如果为null,直接返回null29         try {30             // 对参数进行编码处理后返回31             return new String(value.getBytes("ISO-8859-1"), charset);32         } catch (UnsupportedEncodingException e) {33             throw new RuntimeException(e);34         }35     }36     37     @SuppressWarnings({ "unchecked", "rawtypes" })38     @Override39     public Map getParameterMap() {40         Map
map = request.getParameterMap();41 if(map == null) return map;42 // 遍历map,对每个值进行编码处理43 for(String key : map.keySet()) {44 String[] values = map.get(key);45 for(int i = 0; i < values.length; i++) {46 try {47 values[i] = new String(values[i].getBytes("ISO-8859-1"), charset);48 } catch (UnsupportedEncodingException e) {49 throw new RuntimeException(e);50 }51 }52 }53 // 处理后返回54 return map;55 }56 57 @Override58 public String[] getParameterValues(String name) {59 String[] values = super.getParameterValues(name);60 for(int i = 0; i < values.length; i++) {61 try {62 values[i] = new String(values[i].getBytes("ISO-8859-1"), charset);63 } catch (UnsupportedEncodingException e) {64 throw new RuntimeException(e);65 }66 }67 return values;68 }69 }

3.BaseServlet.java

1 package cn.itcast.servlet; 2  3 import java.io.IOException; 4 import java.lang.reflect.Method; 5  6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse;10 11 /**12  * BaseServlet用来作为其它Servlet的父类13  * 14  * @author qdmmy615  * 16  *         一个类多个请求处理方法,每个请求处理方法的原型与service相同! 原型 = 返回值类型 + 方法名称 + 参数列表17  */18 @SuppressWarnings("serial")19 public class BaseServlet extends HttpServlet {20     @Override21     public void service(HttpServletRequest request, HttpServletResponse response)22             throws ServletException, IOException {23         response.setContentType("text/html;charset=UTF-8");//处理响应编码24         25         /**26          * 1. 获取method参数,它是用户想调用的方法 2. 把方法名称变成Method类的实例对象 3. 通过invoke()来调用这个方法27          */28         String methodName = request.getParameter("method");29         Method method = null;30         /**31          * 2. 通过方法名称获取Method对象32          */33         try {34             method = this.getClass().getMethod(methodName,35                     HttpServletRequest.class, HttpServletResponse.class);36         } catch (Exception e) {37             throw new RuntimeException("您要调用的方法:" + methodName + "它不存在!", e);38         }39         40         /**41          * 3. 通过method对象来调用它42          */43         try {44             String result = (String)method.invoke(this, request, response);45             if(result != null && !result.trim().isEmpty()) {
//如果请求处理方法返回不为空46 int index = result.indexOf(":");//获取第一个冒号的位置47 if(index == -1) {
//如果没有冒号,使用转发48 request.getRequestDispatcher(result).forward(request, response);49 } else {
//如果存在冒号50 String start = result.substring(0, index);//分割出前缀51 String path = result.substring(index + 1);//分割出路径52 if(start.equals("f")) {
//前缀为f表示转发53 request.getRequestDispatcher(path).forward(request, response);54 } else if(start.equals("r")) {
//前缀为r表示重定向55 response.sendRedirect(request.getContextPath() + path);56 }57 }58 }59 } catch (Exception e) {60 throw new RuntimeException(e);61 }62 }63 }

 

转载于:https://www.cnblogs.com/shamgod/p/5182030.html

你可能感兴趣的文章
IIS7.x经典模式与集成模式
查看>>
Java并发编程:并发容器之ConcurrentHashMap(转)
查看>>
消息系统(转)
查看>>
.htaccess中301强制跳转到带www前缀或不带www的域名
查看>>
TypeScript - Classes
查看>>
NOI 2008 志愿者招募 / bzoj 1061 (最小费用最大流)
查看>>
poj万人题
查看>>
linux 内存对其介绍及其应用举例
查看>>
NOIP2017 小凯的疑惑
查看>>
codevs http://www.codevs.cn/problem/?problemset_id=1 循环、递归、stl复习题
查看>>
call 大佬 三分姿势
查看>>
2017 济南综合班 Day 3
查看>>
NOIP模拟赛14
查看>>
序列化类型为"xx”的对象时检测到循环引用。
查看>>
pwnable.kr col
查看>>
form标签
查看>>
004之MFCSocket同步编程(指针机制)
查看>>
world machine, 输出lightmap
查看>>
Linux之profile、bash_profile、bashrc文件
查看>>
数据库路由中间件MyCat - 背景篇(2)
查看>>