请求和响应的装饰
Servlet API 中有4个包装类,可以用来改变Servlet请求和Servlet响应的行为。这些包装类允许将任何方法都“包装”在ServletRequest和ServletResponse,或其HTTP对等体中(分别为HttpServletRequest和HttpServletResponse)。这些包装类遵循Decorator或Wrapper模式,要使用它们,需要先了解什么是模式。
Decorator模式
即使没有某一个对象的类的源代码,甚至即便这个类是声明为final的,Decorator模式和Wrapper模式都允许装饰或包装(直白地说,就是修改)这个对象(的行为)。
Decorator模式适用于无法使用继承的情况(比如,所指对象的类为final),或者你不想亲自创建对象,而是想从另一个子系统中获取。例如,Servlet容器创建了一个ServletRequest和一个ResponseResponse,并将它们传给Servlet的Service方法。改变ServletRequest和ServletResponse行为的唯一方法似乎将它, 包装在其他对象中。唯一必须满足的条件是,被装饰对象的类要实现一个接口,并且要包装的方法必须从这个接口处继承。
Servlet Wrapper 类
Servlet API 中提供了4个类,他们很少用到,但是功能非常强大,分别是 ServletRequestWrapper,HttpServletRequestWrapper,ServletResponseWrapper,HttpServletResponseWrapper
这些包装类使用起来非常方便,这些包装类为被包装的对等方法的每一个方法都提供了默认实现。通过继承这些包装类,只需要覆盖想要修改的方法即可。
范例如下:
package cn.com.yuns.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.*;
/**
* @author wsq
* @version AutoCorrectFilter.java 2020/7/31 上午9:13 上午
*/
@WebFilter(filterName = "AutoCorrectFilter", urlPatterns = {"/*"})
public class AutoCorrectFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init AutoCorrectFilter");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
AutoCorrectHttpServletRequestWrapper wrapper = new AutoCorrectHttpServletRequestWrapper(httpServletRequest);
filterChain.doFilter(wrapper, servletResponse);
}
@Override
public void destroy() {
System.out.println("destroy AutoCorrectFilter");
}
/**
* HttpServletRequest 中用户 Http请求中的参数进行空格处理--重写需要的方法
*/
class AutoCorrectHttpServletRequestWrapper extends HttpServletRequestWrapper {
private HttpServletRequest httpServletRequest;
public AutoCorrectHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
httpServletRequest = request;
}
@Override
public String getParameter(String name) {
return autoCorrect(httpServletRequest.getParameter(name));
}
@Override
public String[] getParameterValues(String name) {
return autoCorrect(httpServletRequest.getParameterValues(name));
}
@Override
public Map<String, String[]> getParameterMap() {
final Map<String, String[]> parameterMap = httpServletRequest.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 autoCorrect(parameterMap.get(key));
}
@Override
public String[] put(String key, String[] value) {
return parameterMap.put(autoCorrect(key), autoCorrect(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 autoCorrect(parameterMap.values());
}
@Override
public Set<Entry<String, String[]>> entrySet() {
return autoCorrect(parameterMap.entrySet());
}
};
return newMap;
}
}
private String autoCorrect(String value) {
if (value == null) {
return null;
}
value = value.trim();
int length = value.length();
StringBuilder temp = new StringBuilder();
boolean lastCharWasSpace = false;
for (int i = 0; i < length; i++) {
char c = value.charAt(i);
if (c == ' ') {
if (!lastCharWasSpace) {
temp.append(c);
}
lastCharWasSpace = true;
} else {
temp.append(c);
lastCharWasSpace = false;
}
}
return temp.toString();
}
private String[] autoCorrect(String[] values) {
if (values != null) {
int length = values.length;
for (int i = 0; i < length; i++) {
values[i] = autoCorrect(values[i]);
}
return values;
}
return null;
}
private Collection<String[]> autoCorrect(Collection<String[]> valueCollection) {
Collection<String[]> newCollection = new ArrayList<>();
for (String[] values : valueCollection) {
newCollection.add(autoCorrect(values));
}
return newCollection;
}
private Set<Map.Entry<String, String[]>> autoCorrect(Set<Map.Entry<String, String[]>> entrySet) {
Set<Map.Entry<String, String[]>> newSet = new HashSet<>();
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 autoCorrect(entry.getValue());
}
@Override
public String[] setValue(String[] value) {
return entry.setValue(value);
}
};
newSet.add(newEntry);
}
return newSet;
}
}
JSP页面
<%--
Created by IntelliJ IDEA.
User: wsq
Date: 2020/7/31
Time: 1:20 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>User form</title>
</head>
<body>
<form action="test2.jsp" method="post">
<table>
<tr>
<td>Name:</td>
<td><input name="name"></td>
</tr>
<tr>
<td>Address:</td>
<td><input name="address"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Login">
</td>
</tr>
</table>
</form>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: wsq
Date: 2020/7/31
Time: 1:20 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<title>User form</title>
</head>
<body>
<form action="test2.jsp" method="post">
<table>
<tr>
<td>Name:</td>
<td>${param.name}
(length:${fn:length(param.name)})
</td>
</tr>
<tr>
<td>Address:</td>
<td>${param.address}
(length:${fn:length(param.address)})
</td>
</tr>
</table>
</form>
</body>
</html>











网友评论