自己写架构笔记(3)----控制器分离思想
2018-01-24 22:27
351 查看
1、控制器分离思想
在一个软件系统中,会存在大量的JSP和Servlet,如果JSP和Servlet直接打交道,叫做紧耦合。而控制器分离就是将所有Servlet进行按功能划分责任。
其中一个控制器是核心,负责接收所有的请求,然后将请求,依据业务描述分配给其他业务控制器,进行流程处理。
如下图所示:
jsp通过核心控制器跳转到相应的servlet。核心控制器接收所有的请求,然后负责将请求转达给相应的servlet。
2、控制器分离思想的最简单例子
我们首先写一个最简单的页面,这个页面包含许多的跳转按钮,每当点击一次按钮,就会触发核心控制器,然后由核心控制器去分配任务给servlet。先看一下main.jsp的效果,和实际代码:
<%@ page language="java" pageEncoding="GBK"%> <html> <head> <title>Insert title here</title> </head> <body> <form action="" method="post"> <table border="1" width="45%" align="center"> <tr> <td> <input type="submit" name="next" value="a1010" formaction="/neubase/a1010.html"> </td> <td> <input type="submit" name="next" value="a1011" formaction="/neubase/a1011.html"> </td> <td> <input type="submit" name="next" value="a1020" formaction="/neubase/a1020.html"> </td> <td> <input type="submit" name="next" value="a1021" formaction="/neubase/a1021.html"> </td> <td> <input type="submit" name="next" value="a1022" formaction="/neubase/a1022.html"> </td> <td> <input type="submit" name="next" value="a1023" formaction="/neubase/a1023.html"> </td> </tr> </table> </form> </body> </html>
在写完main.jsp之后,要去写一个能够将所有的请求汇集到一起的核心控制器,在这里我们先写一个BaseServlet,能够获得所有的请求,像之前所写的,我们将跳转到的servlet命名为a1010.html这样的格式,我们只要把这个核心servlet的url设置为”*.html”,那么只要遇到以html结尾的请求,都会跳转过来,我们在利用获得uri来获得具体请求的servlet的路径,如:/neu/a1010.html,在这里,我们去截取出a1010,就可以得知该请求是请求的A1010Servlet,那么接下来怎么去调用这个相应的servlet呢?我们先看一下代码:
package com.neusoft.web.support; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class BaseServlet */ @WebServlet("*.html") public class BaseServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //获取URI String uri=request.getRequestURI(); //System.out.println(uri); //获取uri中最后一个斜杠的索引 int index=uri.lastIndexOf("/"); //System.out.println(index); //从uri截取需要访问的控制器的名称 String uriBaseName=uri.substring(index+1).replace(".html",""); System.out.println(uriBaseName); //控制器包基础路径 String basePath="com.neusoft.web.impl."; //定义目标控制器的名称 String controllerName=basePath+uriBaseName.toUpperCase()+"Servlet"; System.out.println(controllerName); //将目标控制器,进行类型回溯,转换成对应的接口类型 BaseController controller= (BaseController)Class.forName(controllerName).newInstance(); //通过接口调用目标控制器的execute方法 controller.execute(); } catch(Exception ex) { request.setAttribute("msg", "网络故障!"); ex.printStackTrace(); } //调回到目标页面 request.getRequestDispatcher("/main.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
如以上代码所示,我们在截取玩之后,又获得了相应的servlet的路径,然后我们利用了一个接口,再来调用接口中的方法,我们再来看一下接口(控制器),和一个具体的servlet:
package com.neusoft.web.support; public interface BaseController { /** * 目标控制器中的流程处理方法 * < * 所有目标控制器,通过该方法,取代doGet * > * @return * @throws Exception */ String execute()throws Exception; }
A1010Servlet:
package com.neusoft.web.impl; import com.neusoft.web.support.BaseController; public class A1010Servlet implements BaseController { public A1010Servlet() { System.out.println("create A1010Servlet"); } @Override public String execute() throws Exception { System.out.println("A1010Servlet 开始工作"); return null; } }
在上面的A1010Servlet,只是一个普通的java类,实现了一个接口,继承了该接口中的excute方法(之后在此方法里去实现doGet实现的所有要求,实现消灭servlet,只用普通的类),所以我们在BaseServlet中,采用父类的变量引用子类的实例,父类变量决定做什么,子类的实例决定怎么做,也就是采用接口的变量引用某个A1010Servlet的实例,然后该具体的Servlet去决定具体的功能实现,实现了控制器分离的思想,BaseServlet接收所有的请求,然后将具体的请求去调用具体的类,实现功能点。
相关文章推荐
- 自己写架构笔记(2)----jdbc编码技巧与架构设计
- 【SQL Server学习笔记】13:用SQL做分离DB、附加DB、架构、分区表
- 自己写架构笔记(6)----程序设计中的“O”(PO/VO/BO/DAO/DTO)
- .net分层架构思想(彻底分离每个层)
- 《linux设备驱动开发详解》笔记——12linux设备驱动的软件架构思想
- spring之业务分离思想笔记
- 《Linux4.0设备驱动开发详解》笔记--第十二章:Linux设备驱动的软件架构思想
- 【Gstreamer学习笔记】Gstreamer架构设计思想
- 自己对Z-stack的架构一些理解(仅作学习笔记,有错误希望大家能指出来,初学Z-Stack菜鸟一只)
- 自己写架构笔记(5)----面向切面编程简述
- .net分层架构思想(彻底分离每个层)
- 我的架构演化笔记 13:自己动手写Nutch-index插件导入数据到MongoDB
- MVVM架构~前台后台分离的思想与实践
- 自己写架构笔记(1)----忽略以往的javabean+servlet模式
- Gstreamer学习笔记----Gstreamer架构设计思想
- .NET简谈分层架构思想(彻底分离每个层)——后补
- .NET简谈分层架构思想(彻底分离每个层)
- .NET简谈分层架构思想(彻底分离每个层)――后补
- .net简谈分层架构思想(彻底分离每个层)——后补