servlet实现MVC

来源:互联网 发布:微信公众号淘宝客制作 编辑:程序博客网 时间:2024/06/10 01:56

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;}}


0 0