网上图书商城项目学习笔记-037工具类之BaseServlet及统一中文编码
2016-02-04 17:29
274 查看
1.统一中文编码分析
tomcat默认esetISO-8859-1编码,在servlet中,可能通过request的setCharacterEncoding(charset)和response.setContentType("text/html;charset=UTF-8");处理post请求编码,但get请求的编码控制不了,所以,如果请求类型是get,则用装饰者模式把request整个调包
2.EncodingFilter.java
3.GetRequest.java 装饰者模式
3.BaseServlet.java
tomcat默认esetISO-8859-1编码,在servlet中,可能通过request的setCharacterEncoding(charset)和response.setContentType("text/html;charset=UTF-8");处理post请求编码,但get请求的编码控制不了,所以,如果请求类型是get,则用装饰者模式把request整个调包
2.EncodingFilter.java
package cn.itcast.filter; import java.io.IOException; 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; public class EncodingFilter implements Filter { private String charset = "UTF-8"; @Override public void destroy() {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; if(req.getMethod().equalsIgnoreCase("GET")) { if(!(req instanceof GetRequest)) { req = new GetRequest(req, charset);//处理get请求编码 } } else { req.setCharacterEncoding(charset);//处理post请求编码 } chain.doFilter(req, response); } @Override public void init(FilterConfig fConfig) throws ServletException { String charset = fConfig.getInitParameter("charset"); if(charset != null && !charset.isEmpty()) { this.charset = charset; } } }
3.GetRequest.java 装饰者模式
package cn.itcast.filter; import java.io.UnsupportedEncodingException; import java.util.Enumeration; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; /** * 对GET请求参数加以处理! * @author qdmmy6 * */ public class GetRequest extends HttpServletRequestWrapper { private HttpServletRequest request; private String charset; public GetRequest(HttpServletRequest request, String charset) { super(request); this.request = request; this.charset = charset; } @Override public String getParameter(String name) { // 获取参数 String value = request.getParameter(name); if(value == null) return null;//如果为null,直接返回null try { // 对参数进行编码处理后返回 return new String(value.getBytes("ISO-8859-1"), charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Map getParameterMap() { Map<String,String[]> map = request.getParameterMap(); if(map == null) return map; // 遍历map,对每个值进行编码处理 for(String key : map.keySet()) { String[] values = map.get(key); for(int i = 0; i < values.length; i++) { try { values[i] = new String(values[i].getBytes("ISO-8859-1"), charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } } // 处理后返回 return map; } @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); for(int i = 0; i < values.length; i++) { try { values[i] = new String(values[i].getBytes("ISO-8859-1"), charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } return values; } }
3.BaseServlet.java
package cn.itcast.servlet; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * BaseServlet用来作为其它Servlet的父类 * * @author qdmmy6 * * 一个类多个请求处理方法,每个请求处理方法的原型与service相同! 原型 = 返回值类型 + 方法名称 + 参数列表 */ @SuppressWarnings("serial") public class BaseServlet extends HttpServlet { @Override public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8");//处理响应编码 /** * 1. 获取method参数,它是用户想调用的方法 2. 把方法名称变成Method类的实例对象 3. 通过invoke()来调用这个方法 */ String methodName = request.getParameter("method"); Method method = null; /** * 2. 通过方法名称获取Method对象 */ try { method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); } catch (Exception e) { throw new RuntimeException("您要调用的方法:" + methodName + "它不存在!", e); } /** * 3. 通过method对象来调用它 */ try { String result = (String)method.invoke(this, request, response); if(result != null && !result.trim().isEmpty()) {//如果请求处理方法返回不为空 int index = result.indexOf(":");//获取第一个冒号的位置 if(index == -1) {//如果没有冒号,使用转发 request.getRequestDispatcher(result).forward(request, response); } else {//如果存在冒号 String start = result.substring(0, index);//分割出前缀 String path = result.substring(index + 1);//分割出路径 if(start.equals("f")) {//前缀为f表示转发 request.getRequestDispatcher(path).forward(request, response); } else if(start.equals("r")) {//前缀为r表示重定向 response.sendRedirect(request.getContextPath() + path); } } } } catch (Exception e) { throw new RuntimeException(e); } } }
相关文章推荐
- 【Java Tutorial中文版 开篇综述】 Oracle(甲骨文)公司Java最新官方教程【译文】
- Python中的时间相关问题
- LeetCode 191 Number of 1 Bits
- 第十八章 并发登录人数控制——《跟我学Shiro》
- Spring学习3—控制反转(IOC)基于Annotation(注解)的依赖注入实现
- ios关于如何获取手机当前的ip
- 学习笔记------数据结构(C语言版)栈和递归 汉诺塔
- eclipse加速之禁用JS、jsp等文件的语法验证,eclipsejs
- SQL Server Export and Import 导出和导入工具 导入EXCEL居然限制为255列
- nyoj264国王的魔镜
- Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)
- Spring学习2—Spring容器
- Android的WebView中js与java代码相互调用
- hdu 4289(最小割最大流定理)
- 导出为Excel例子 java
- HUE中通过SQL进行数据分析
- Sublime Text 3使用技巧
- getContextPath、getServletPath、getRequestURI的区别
- Spring学习1-初识Spring
- N皇后问题