网上图书商城项目学习笔记-037工具类之BaseServlet及统一中文编码

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     @Override
17     public void destroy() {}
18
19     @Override
20     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     @Override
34     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 qdmmy6
12  *
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     @Override
25     public String getParameter(String name) {
26         // 获取参数
27         String value = request.getParameter(name);
28         if(value == null) return null;//如果为null,直接返回null
29         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     @Override
39     public Map getParameterMap() {
40         Map<String,String[]> 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     @Override
58     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 qdmmy6
15  *
16  *         一个类多个请求处理方法,每个请求处理方法的原型与service相同! 原型 = 返回值类型 + 方法名称 + 参数列表
17  */
18 @SuppressWarnings("serial")
19 public class BaseServlet extends HttpServlet {
20     @Override
21     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 }
时间: 2024-12-18 10:06:10

网上图书商城项目学习笔记-037工具类之BaseServlet及统一中文编码的相关文章

网上图书商城项目学习笔记-035工具类之JdbcUtils及TxQueryRunner及C3P0配置

事务就是保证多个操作在同一个connection,TxQueryRunner通过JdbcUtils获取连接,而JdbcUtils通过ThreadLocal<Connection>确保了不同线程设置的con不会混淆(tl.set(con)),而同一线程的connecion可以共用,从而具有事务的功能 1.JdbcUtils.java 1 package cn.itcast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.SQLExc

网上图书商城项目学习笔记-003系统功能模块分析

1. itcastgoods文件夹介绍2. 项目导入演示 * 导入数据库 * 导入项目,发布,运行3. 项目原型导入演示 * 导入项目原型,发布,运行4. 小工具介绍5. jQuery介绍 6. 项目前台功能介绍 * User模块 > 注册 > 激活 > 登录 > 修改密码 > 退出 * Category模块 > 显示所有分类 * Book模块 > 按分类查询(分页) > 按图名查询(模糊)(分页) > 按作者查询(分页) > 按出版社查询(分页

网上图书商城项目学习笔记-031图书管理模块介绍及添加图书

一.流程分析 1.图书管理模块介绍 2. 3. 4.添加图书第一步 5.添加图书第二步 二.代码 1.view层 (1)body.jsp 1 <body> 2 <h1 align="center">图书管理</h1> 3 <p align="center"> 4 <a href="<c:url value='/admin/AdminBookServlet?method=addPre'/>&q

网上图书商城项目学习笔记-010显示所有分类

一.流程分析 二.代码 1.view层 1)main.jsp 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 4 5 <!DOCTYPE HTML

网上图书商城项目学习笔记-030删除二级分类

一.流程分析 二.代码 1.view层 和一相同 2.servlet层 (1)AdminCategoryServlet.java 1 /** 2 * 删除二级分类 3 * @param req 4 * @param resp 5 * @return 6 * @throws ServletException 7 * @throws IOException 8 */ 9 public String deleteChild(HttpServletRequest req, HttpServletResp

网上图书商城项目学习笔记-017结算,跳转结算页面

一.流程分析 二.代码 1.view层 (1)list.jsp <tr> <td colspan="7" align="right"> <a href="javascript:jiesuan();" id="jiesuan" class="jiesuan"></a> </td> </tr> </table> <form

网上图书商城项目学习笔记-018生成订单

一.流程分析 1.订单模块介绍 2.生成订单流程 二.代码 1.view层 (1)showitem.jsp 1 <form id="form1" action="<c:url value='/OrderServlet'/>" method="post"> 2 <input type="hidden" name="cartItemIds" value="${cartIt

网上图书商城项目学习笔记-012BOOK模块查询2

一.分析 > 按图名查询(模糊)(分页)> 按作者查询(分页)> 按出版社查询(分页)> 按id查询> 多条件组合查询(分页) 二.代码 1.view层 (1)gj.jsp等 1 <form action="<c:url value='/BookServlet'/>" method="get"> 2 <input type="hidden" name="method"

网上图书商城项目学习笔记-009退出功能

一.退出功能流程分析 二.代码 1.view层 1)top.jsp 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 4 5 <!DOCTYPE HT