前面已经有了委派模式的简单案例使用,这次写一个案例,模拟spring中是如何使用这种设计模式的
首先创建几个类,分别代表不同的controller(也就是控制器,里面几乎不需要什么内容)代码如下
package springmvc; /** * 模拟不同的控制器 * @author lp */ public class MemberController { public void getMemberById(String id){} }
package springmvc; /** * 模拟不同的控制器 * @author lp */ public class OrderController { public void getOrderById(String id){ } }
package springmvc; /** * 模拟不同的控制器 * @author lp */ public class SystemController { public void logout(){ } }
后面就比较简单了,写一个DisptcherServlet
package springmvc; import springmvc.MemberController; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * 前端控制器 * @author lp */ public class DispatcherServlet extends HttpServlet { //定义所有的映射集合 private List<Handler> handlerMapping=new ArrayList<>(); //初始化 public void init()throws ServletException { try { //利用反射模拟从某一个控制器获取内容 Class<?> memberControllerClass = MemberController.class; //放入集合 handlerMapping.add(new Handler() .setController(memberControllerClass.newInstance()) .setMethod(memberControllerClass.getMethod("getMemberById", new Class[]{String.class})) .setUrl("/web/getMemberById.json")); }catch (Exception e){ } } //执行处理 private void doDispatcher(HttpServletRequest request, HttpServletResponse response){ //获取请求的url,每个url对应一个servlet,url浏览器输入 String uri=request.getRequestURI(); //servlert拿到url以后,进行判断和选择,根据用户请求找到对应类里面的方法 //通过拿到的url去handlerMapping Handler handler=null; for (Handler h:handlerMapping ) { if(uri.equals(h.getUrl())){ handler=h; break; } } //将具体任务分发给对应的方法 Object object=null; try { object=handler.getMethod().invoke(handler.getController(),request.getParameter("id")); }catch (IllegalAccessException e){ e.printStackTrace(); }catch (InvocationTargetException e){ e.printStackTrace(); } //获取方法执行的结果,通过response返回 // response.getWriter().write(); } //service方法 protected void service(HttpServletRequest request,HttpServletResponse response){ try { doDispatcher(request,response); }catch (Exception e){ e.printStackTrace(); } } //内部类控制器 class Handler{ private Object controller; private Method method; private String url; public Object getController(){ return controller; } public Handler setController(Object controller){ this.controller=controller; return this; } public Method getMethod(){ return method; } public Handler setMethod(Method method){ this.method=method; return this; } public String getUrl(){ return url; } public Handler setUrl(String url){ this.url=url; return this; } } }