1. 首先,最原始的servlet只能处理一个请求;
2.通过增加一个method=?的一个参数,使得一个servlet能够处理多个不同的请求,这么就导致一个问题:在servlet中会出现大量的if else的判断语句;
3.通过发现:由于传递过来的参数和servlet中的方法名字相同,就可以使用反射来动态的调用方法;
String methodParam = request.getParameter("method");
Method m = this,getMethod(methodParam,"HttpServletRequest","HttpServletResponse");
m.invoke(this,request,response);
4.再一次的优化:由于每个servlet都要使用这个方法,可以把她写在一个公共类(一个继承Servlet的基类)里,(每次有一个请求的时候就会调用这段代码)
如何实现呢?servlet的生命周期:初始化仅仅一次,init()方法也是仅仅执行一次,每次有请求的时候,就会调用service()方法,然后service()根据请求的类型再去调用doGet()还是doPost()方法;所以应该在service()方法里加上上面的代码;
5.此时,每个方法的最后面的跳转都是一样的代码,能不能简化呢?
可以让处理请求的方法返回一个字符串,这个字符串就代表了“返回的视图”,在继承Servlet的基类的service方法中去处理,通过一个约定去判断是客户端跳转还是服务器端跳转,在客户端跳转的字符串上增加“redirect:”;
6.最后的优化:封装请求参数成为一个对象,这里涉及的知识:1.Map<String,String[]> params = req.getParameterMap();2.通过beansUtil这个工具类进行对象的封装
package itat.zttc.shop.util;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.BeanUtils;
public class RequestUtil {
public static Object setParam(Class clz,HttpServletRequest req) {
Map<String,String[]> params = req.getParameterMap();
Set<String> keys = params.keySet();
Object o = null;
try {
o = clz.newInstance();
for(String key:keys) {
String[] vv = params.get(key);
//如果元素的值的长度大于1,表示获取的应该是一个数组
if(vv.length>1) {
BeanUtils.copyProperty(o, key, vv);
} else {
BeanUtils.copyProperty(o, key, vv[0]);
}
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return o;
}
}