Servlet API 提供了四个包装类:ServletRequestWrapper、ServletResponseWrapper、HttpServletRequestWrapper、HttpServletReponseWrapper。这些包装类使用的频率很小,但却很有用。当 servlet 接收到请求,service 方法被调用时,我们可以使用这些包装类来包装 servlet 容器传递过来的 request 和 response 对象以改变 request 和 response 的行为。例如,当 HTTP 请求的参数包含中文字符时,不想在每个 servlet 里面都对其转换编码,可以使用过滤器去拦截请求,然后使用 HttpServletRequestWrapper 去装饰该请求,覆盖 getParameter、getParameterValues 等方法,使这些方法返回的参数是转换过编码的。

应用示例

自定义的 HttpServletRequestWrapper:

package com.huey.hello.wrapper;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; public class CharsetServletRequestWrapper extends HttpServletRequestWrapper { private HttpServletRequest request;
private String oldCharset;
private String newCharset; public CharsetServletRequestWrapper(HttpServletRequest request, String oldCharset, String newCharset) {
super(request);
this.request = request;
this.oldCharset = oldCharset;
this.newCharset = newCharset;
} @Override
public String getParameter(String name) {
return convertCharset(request.getParameter(name));
} @Override
public String[] getParameterValues(String name) {
return convertCharset(request.getParameterValues(name));
} @Override
public Map<String, String[]> getParameterMap() {
final Map<String, String[]> parameterMap = request.getParameterMap();
Map<String, String[]> newMap = new Map<String, String[]>() {
@Override
public int size() {
return parameterMap.size();
} @Override
public boolean isEmpty() {
return parameterMap.isEmpty();
} @Override
public boolean containsKey(Object key) {
return parameterMap.containsKey(key);
} @Override
public boolean containsValue(Object value) {
return parameterMap.containsValue(value);
} @Override
public String[] get(Object key) {
return convertCharset(parameterMap.get(key));
} @Override
public String[] put(String key, String[] value) {
return parameterMap.put(key, value);
} @Override
public String[] remove(Object key) {
return parameterMap.remove(key);
} @Override
public void putAll(Map<? extends String, ? extends String[]> m) {
parameterMap.putAll(m);
} @Override
public void clear() {
parameterMap.clear();
} @Override
public Set<String> keySet() {
return parameterMap.keySet();
} @Override
public Collection<String[]> values() {
return convertCharset(parameterMap.values());
} @Override
public Set<Map.Entry<String, String[]>> entrySet() {
return convertCharset(parameterMap.entrySet());
}
}; return newMap;
} private String convertCharset(String str) {
String newStr;
try {
newStr = new String(str.getBytes(oldCharset), newCharset);
} catch (UnsupportedEncodingException e) {
newStr = str;
}
return newStr;
} private String[] convertCharset(String[] strs) {
String[] newStrs = null;
if (strs != null) {
newStrs = new String[strs.length];
for (int i = 0; i < newStrs.length; i++) {
newStrs[i] = convertCharset(strs[i]);
}
}
return newStrs;
} private Collection<String[]> convertCharset(Collection<String[]> valueCollection) {
Collection<String[]> newCollection = new ArrayList<String[]>();
for (String[] values : valueCollection) {
newCollection.add(convertCharset(values));
}
return newCollection;
} private Set<Entry<String, String[]>> convertCharset(Set<Map.Entry<String, String[]>> entrySet) {
Set<Map.Entry<String, String[]>> newSet = new HashSet<Map.Entry<String, String[]>>();
for (final Map.Entry<String, String[]> entry : entrySet) {
Map.Entry<String, String[]> newEntry = new Map.Entry<String, String[]> () {
@Override
public String getKey() {
return entry.getKey();
}
@Override
public String[] getValue() {
return convertCharset(entry.getValue());
}
@Override
public String[] setValue(String[] value) {
return entry.setValue(value);
}
};
newSet.add(newEntry);
}
return newSet;
} }

过滤器:

package com.huey.hello.filters;

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.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest; import com.huey.hello.wrapper.CharsetServletRequestWrapper; @WebFilter(filterName="charsetFilter", urlPatterns = {"/*"},
initParams = {
@WebInitParam(name = "oldCharset", value = "ISO-8859-1"),
@WebInitParam(name = "newCharset", value = "UTF-8"),
})
public class CharsetFilter implements Filter { private String oldCharset;
private String newCharset; @Override
public void init(FilterConfig filterConfig) throws ServletException {
oldCharset = filterConfig.getInitParameter("oldCharset");
newCharset = filterConfig.getInitParameter("newCharset");
} @Override
public void destroy() {
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(newCharset);
response.setContentType("text/plain;charset=" + newCharset); HttpServletRequest httpRequest = (HttpServletRequest) request;
CharsetServletRequestWrapper requestWrapper = new CharsetServletRequestWrapper(httpRequest, oldCharset, newCharset);
chain.doFilter(requestWrapper, response);
} }

Servlet & JSP - Decorating Requests and Responses的更多相关文章

  1. NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    今天调试SSM框架项目后台JSOn接口,报出来一个让人迷惑的错误:NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config 上网查了一下别人的博 ...

  2. MVC开发模式之Servlet+jsp+javaBean

    Servlet+jsp+JavaBean组合开发是一种MVC开发模式,控制器Controller采用Servlet.模型Model采用JavaBean.视图View采用JSP. 1.Web开发的请求- ...

  3. springMVC: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config

    springMVC开发web的时候,报错:java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config 原因:未引入jstl ...

  4. Struts框架——(一)用Servlet + JSP演示Struts基本原理

    一. 用Servlet + JSP演示Struts基本原理 struts是开源项目.它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web应用的MVC的应用框架.Stru ...

  5. Javabean+servlet+JSP(html)实例应用

    大家都知道Javabean+servlet+JSP是最简单的MVC模式.的确,在一个小型的项目中,这个模式完全够用. 它优雅并且简洁.加上jQueryui的完美展示效果,让这个模式看起来非常合适.当然 ...

  6. 报错:严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [/index.jsp (line: 13, column: 20) No tag "textfiled" defined in tag library imported with prefix

    严重: Servlet.service() for servlet [jsp] in context with path [/20161116-Struts2-6] threw exception [ ...

  7. servlet+jsp+java实现Web 应用

    servlet+jsp+java实现Web 应用 用java来构建一个web应用是特别容易的事情,jsp和php很像,可以嵌套在html中.程序的结构很简单,也很清楚,本文主要记录下大概的开发过程和环 ...

  8. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  9. 在Eclipse中配置Tomcat 创建和运行Servlet/JSP

    在Eclipse中配置Tomcat 创建和运行Servlet/JSP 步骤一:在Eclipse中配置Tomcat(注意下载Eclipse IDE for Java EE Developers) (1) ...

随机推荐

  1. apache开源项目--lucence

    Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.Lucene的目的是为软件开发人员提供一个简单易用 ...

  2. 在 ASP.NET MVC 中使用 HTTPS (SSL/TLS)

    某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到https(SSL/TLS)来提高安全性.本文介绍了如何在ASP.NET MVC中强制某action使用https和如何进行向https页面 ...

  3. LoadRunner脚本优化之—参数化迭代介

    在LoadRunner的脚本优化时,有时发送给服务器的请求参数化时,服务器返回的内容也会和参数化的内容相对应,例如发送的请求带有查询key=123,则服务器也会返回含有123相关的内容.这时我们在使用 ...

  4. C#中属性简写原理

    1. 属性简写时不能只有get或者set 原因: 如果只有get,那么没有办法给其赋值,所有也就没法get到值: 如果只有set,没有意义,因为根本没法获取到这个值.

  5. TextField笔记

    今天写scrollPanel组件,碰到一个问题:textfield自动什么时候会调节高度. 在创建TextField的时候,我制定了文本的height属性. 之后,无论怎么设置文本,height总是不 ...

  6. bat 批处理 字符串 截取

    由于项目中配置项太多,经常有同事在配置xml的时候,讲 配置的路径搞错,先需要搞一个脚本,可以自动将路径截取出来, 晚上收集了点资料,暂时先上几个 bat 后面留着 ,具体实现. @echo off ...

  7. linux驱动程序之电源管理之标准linux休眠和唤醒机制分析(二)

    三.pm_test属性文件读写 int pm_test_level = TEST_NONE; static const char * const  pm_tests[__TEST_AFTER_LAST ...

  8. bitset位图讲解

    bitset可以用来处理位图问题,用位可以大大减少占用的空间内存,但是位图问题适合处理不重复的,在一定范围内的整数问题.用两个位图可以处理只出现一次问题 #include <bitset> ...

  9. jQuery技术内幕电子版5

    4. 转换HTML代码为DOM元素 先创建一个文档片段DocumentFragment,然后调用方法jQuery.clean(elems, context, frag-ment, scripts)将H ...

  10. HW3.25

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...