JavaEE已经给我们提供了一个HttpServletRequestWrapper类,它就是HttpServletRequest的包装类,但它做任何的增强!你可能会说,写一个装饰类,但不做增强,其目的是什么呢?使用这个装饰类的对象,和使用原有的request有什么分别呢?
HttpServletRequestWrapper类虽然是HttpServletRequest的装饰类,但它不是用来直接使用的,而是用来让我们去继承的!当我们想写一个装饰类时,还要对所有不需要增强的方法做一次实现是很心烦的事情,但如果你去继承HttpServletRequestWrapper类,那么就只需要重写需要增强的方法即可了。
3 代码EncodingRequest
public class EncodingRequest extends HttpServletRequestWrapper {
private String charset;
public EncodingRequest(HttpServletRequest request, String charset) {
super(request);
this.charset = charset;
}
public String getParameter(String name) {
HttpServletRequest request = (HttpServletRequest) getRequest();
String method = request.getMethod();
if(method.equalsIgnoreCase("post")) {
try {
request.setCharacterEncoding(charset);
} catch (UnsupportedEncodingException e) {}
} else if(method.equalsIgnoreCase("get")) {
String value = request.getParameter(name);
try {
value = new String(name.getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
}
return value;
}
return request.getParameter(name);
}
}
EncodingFilter
public class EncodingFilter extends HttpFilter {
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
String charset = this.getInitParameter("charset");
if(charset == null || charset.isEmpty()) {
charset = "UTF-8";
}
response.setCharacterEncoding(charset);
response.setContentType("text/html;charset=" + charset);
EncodingRequest res = new EncodingRequest(request, charset);
chain.doFilter(res, response);
}
}
web.xml
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.itcast.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
文件上传下载 文件上传概述 1 文件上传的作用
例如网络硬盘!就是用来上传下载文件的。
在智联招聘上填写一个完整的简历还需要上传照片呢。
2 文件上传对页面的要求上传文件的要求比较多,需要记一下:
1. 必须使用表单,而不能是超链接;
2. 表单的method必须是POST,而不能是GET;
3. 表单的enctype必须是multipart/form-data;
4. 在表单中添加file表单字段,即<input type=”file”…/>
<form action=http://www.likecs.com/"${pageContext.request.contextPath }/FileUploadServlet" method=http://www.likecs.com/"post"enctype=http://www.likecs.com/"multipart/form-data">
用户名:<input type=http://www.likecs.com/"text" name=http://www.likecs.com/"username"/><br/>
文件1:<input type=http://www.likecs.com/"file" name=http://www.likecs.com/"file1"/><br/>
文件2:<input type=http://www.likecs.com/"file" name=http://www.likecs.com/"file2"/><br/>
<input type=http://www.likecs.com/"submit" value=http://www.likecs.com/"提交"/>
</form>
3 比对文件上传表单和普通文本表单的区别
通过httpWatch查看“文件上传表单”和“普通文本表单”的区别。
l 文件上传表单的enctype=”multipart/form-data”,表示多部件表单数据;
l 普通文本表单可以不设置enctype属性:
Ø 当method=”post”时,enctype的默认值为application/x-www-form-urlencoded,表示使用url编码正文;
Ø 当method=”get”时,enctype的默认值为null,没有正文,所以就不需要enctype了。
对普通文本表单的测试:
<form action=http://www.likecs.com/"${pageContext.request.contextPath }/FileUploadServlet" method=http://www.likecs.com/"post">
用户名:<input type=http://www.likecs.com/"text" name=http://www.likecs.com/"username"/><br/>
文件1:<input type=http://www.likecs.com/"file" name=http://www.likecs.com/"file1"/><br/>
文件2:<input type=http://www.likecs.com/"file" name=http://www.likecs.com/"file2"/><br/>
<input type=http://www.likecs.com/"submit" value=http://www.likecs.com/"提交"/>
</form>