自定义mvc原理
目录
二. 什么是MVC:
三.具体实现:
1.编写中央处理器的servlet
2.Action接口定义
3.实现Action的接口定义:
4.实现子控制器:
5.请求分发功能
6.运行结果:
7.代码完善:
7.1使用配置文件配置action
7.2.晚上中央处理器:
一:自定义mvc框架工作原理图:
ActionSevlet:中央控制器(主要作用于控制一个或者多个子控制器Action去处理请求)
核心组件说明:
- 中央控制器(ActionServlet): 负责接收所有的请求,并分别给控制器具体处理。
- 子控制器(Action):负责处理中央处理器分配的请求
- 视图(view): jsp页面,负责显示
- 模型(Model): 负责业务处理逻辑
二. 什么是MVC:
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。 它是一种软件设计典范。
用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。
- 模型(model): 它是应用程序的主体部分,主要包括业务逻辑模块(web项目中的dao类)和数据模块(pojo类)。pojo一般可以叫做实体域模型,dao和service称为过程域模型。
- 视图(view): 用户与之交互的界面、在web中视图一般由jsp,html组成,其他的还包括android,ios等等。
- 控制器(controller): 接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不做任何处理只是起到了一个连接的做用。
不足的地方:
- 增加系统结构和实现的复杂性。对于简单的界面,严格遵守MVC,需要使模型、视图与控制器分离,增加系统复杂性
- 视图和控制器之间的关系太过紧密了
三.具体实现:
1.编写中央处理器的servlet
/** * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求 * @author Administrator */ public interface Action { /** * 处理请求 * @param request 请求 * @param response 响应 * @return String 返回转发或重定向的jsp页面名称 */ String exeute(HttpServletRequest request, HttpServletResponse response); }
2.Action接口定义
/** * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求 * @author Administrator */ public interface Action { /** * 处理请求 * @param request 请求 * @param response 响应 * @return String 返回转发或重定向的jsp页面名称 */ String exeute(HttpServletRequest request, HttpServletResponse response); }/** * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求 * @author Administrator */ public interface Action { /** * 处理请求 * @param request 请求 * @param response 响应 * @return String 返回转发或重定向的jsp页面名称 */ String exeute(HttpServletRequest request, HttpServletResponse response); }
3.实现Action的接口定义:
/** * 每个子控制器必须实现该接口,负责处理中央处理器分配的请求 * @author Administrator */ public interface Action { /** * 处理请求 * @param request 请求 * @param response 响应 * @return String 返回转发或重定向的jsp页面名称 */ String exeute(HttpServletRequest request, HttpServletResponse response); }
4.实现子控制器:
public class BookAction implements Action { @Override public String exeute(HttpServletRequest request, HttpServletResponse response) { return "bookList"; } }
public class StudentAction implements Action { @Override public String exeute(HttpServletRequest request, HttpServletResponse response) { // TODO Auto-generated method stub return "students"; } }
5.请求分发功能
** * 中央控制器,负责接收所有的请求并分别给控制器具体处理 * @author Administrator */ @WebServlet("*.action") public class ActionDispatchServlet extends HttpServlet { //用于保存path与action子控制器的映射 public static Map<String, Action> actionMap = new HashMap<>(); static { actionMap.put("/studentAction", new StudentAction()); actionMap.put("/bookAction", new BookAction()); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { doPost(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) { String servletPath = request.getServletPath(); String path = servletPath.split("\\.")[0]; Action action = actionMap.get(path); String rpath = action.exeute(request, response); System.out.println(rpath); } }
6.运行结果:
7.代码完善:
7.1使用配置文件配置action
studentAction是在上面定义的,如图所示:
type是全新命名,如图所示:、
name是jsp的名字:
后面的path就是jsp的权限命名
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE config[ <!ELEMENT config (action*)> <!ELEMENT action (forward*)> <!ELEMENT forward EMPTY> <!ATTLIST action path CDATA #REQUIRED type CDATA #REQUIRED > <!ATTLIST forward name CDATA #REQUIRED path CDATA #REQUIRED redirect (true|false) "false" > ]> <config> <action path="/studentAction" type="org.lisen.mvc.action.StudentAction"> <forward name="students" path="/students/studentList.jsp" redirect="false"/> </action> </config>
7.2.晚上中央处理器:
@WebServlet("*.action") public class ActionDispatchServlet extends HttpServlet { //用于保存path与action子控制器的映射 //public static Map<String, Action> actionMap = new HashMap<>(); private static ConfigModel configModel; static { //actionMap.put("/students", new StudentAction()); //actionMap.put("/books", new BookAction()); configModel = ConfigModelFactory.getConfigModel(); } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { doPost(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String servletPath = request.getServletPath(); String path = servletPath.split("\\.")[0]; Action action = getActionByPath(path); String name = action.exeute(request, response); ForwardModel forwardModel = getForwardModel(path, name); if (forwardModel.isRedirect()) { response.sendRedirect(request.getContextPath() + "/" + forwardModel.getPath()); } else { request.getRequestDispatcher(forwardModel.getPath()).forward(request, response); } } //通过请求路径获取对应的action实例 private Action getActionByPath(final String path) { ActionModel action = configModel.find(path); try { Class<?> clazz = Class.forName(action.getType()); return (Action)clazz.newInstance(); } catch (Exception e) { throw new RuntimeException("创建Action实例异常"+e.getMessage(), e); } } public ForwardModel getForwardModel(String path, String name) { return configModel.find(path).find(name); } }
~ 小团子: 博主的文章细节很到位,兼顾实用性和可操作性,感谢博主的分享,期待博主持续带来更多好文,同时也希望可以来我博客指导我一番!
~ 小团子: 亲爱的博主,我必须说,您的博客内容真是太棒了!您的深入见解和详尽的解释使得复杂的主题变得简单易懂。您的文章对于我这样的读者来说,无疑是一份宝贵的学习资料。您的写作风格非常吸引人,每一篇文章都充满了热情和活力。您的用词准确,表达清晰,让人一读难忘。我非常喜欢您在博客中分享的实用技巧和经验,这些对我在工作中遇到的问题提供了很大的帮助。
CSDN-Ada助手: AI 写作助手上线啦!限免 4 天,快来创作试试功能吧~https://editor.csdn.net/md/?not_checkout=1&utm_source=blog_comment_recall
Kyle Charlton: 这个fliter是什么
CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/613653252。