1.BaseServlet
package czb.utils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/**
* 对HttpServlet 进行扩展
*/
public abstract class BaseServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException {
// 设置post中文乱码问题
request.setCharacterEncoding("UTF-8");
// 接受用户请求的方法
String methodName = request.getParameter("metd");
if (methodName == null ||methodName.trim().equals("")) {
methodName= "execute";
}
try {
// 反射出子类的方法
Method method = this.getClass().getMethod(methodName,
HttpServletRequest.class, HttpServletResponse.class);
if(request.getMethod().equals("GET")) {// 如果是get才包装
request= newMyServletRequest(request);
}
// 调用子类的方法
method.invoke(this, request, response);
}catch(Exception e) {
thrownew RuntimeException(e);
}
}
public abstract void execute(HttpServletRequest request,
HttpServletResponseresponse) throwsException;
}
2 对HttpServletRequest包装的类
class MyServletRequest extends HttpServletRequestWrapper {
//private HttpServletRequest request;此处不用声明成员直接使用父类就行,可
//模仿HttpServletRequestWrapper
//public HttpServletRequestWrapper(HttpServletRequest request) {super(request);}
public MyServletRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(Stringname) {
Stringvalue = super.getParameter(name);
try {
value= new String(value.getBytes("ISO-8859-1"),
super.getCharacterEncoding());
}catch(UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return value;
}
// 增强getPamaterValues方法
@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"),
super.getCharacterEncoding());
}catch(UnsupportedEncodingException e) {
throw new Run timeException(e);
}
}
return values;
}
// 修改getParmentetMap
@Override
public Map<String,String[]> getParameterMap() {
Map<String,String[]> map = super.getParameterMap();
// 只需要获取value
Iterator<String[]>it = map.values().iterator();
while (it.hasNext()) {
String[]values = it.next();
for (int i = 0; i < values.length; i++) {
try {
values[i]= newString(values[0].getBytes("ISO-8859-1"),
super.getCharacterEncoding());
}catch(UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
return super.getParameterMap();
}
}
3.BaseServlet的实现类
package czb.servlet;
import czb.utils.BaseServlet;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public classStudServlet extends BaseServlet {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
String name = request.getParameter("name");
System.err.println("1:"+name);
String[] vals=request.getParameterValues("name");
System.err.println("2:"+vals[0]);
Map<String,String[]> map = request.getParameterMap();
System.err.println("3:"+map.get("name")[0]);
}
}
4.显示
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
</head>
<body>
<form action="StudServlet" method="post">
Name:<input type="text" name="name"id="nm">
<input type="submit" value="提交">
</form>
<br/>
<a href="javascript:_go();">GO</a>
</body>
<script type="text/javascript">
function_go(){
var nm=document.getElementById("nm").value;
var url = "StudServlet?name="+nm;
//对url进行编码
url=encodeURI(url);
alert(url);
window.location=url;
}
</script>
</html>