引言
一、MVC是什么?它的核心理念是什么?
MVC将应用程序分为三个核心组件:模型、视图和控制器。模型负责管理数据和业务逻辑,视图负责展示数据给用户,控制器作为中介协调模型和视图之间的交互。
二、自定义MVC的优势有哪些?
相较于传统MVC框架,自定义MVC具有以下优势:
- 灵活性:自定义MVC允许开发人员根据具体需求灵活定义和组织模型、视图和控制器。
- 可扩展性:自定义MVC框架可以根据应用程序的变化进行扩展和定制。
- 可定制性:自定义MVC允许开发人员根据业务需求进行定制,以满足特定的应用程序要求。
三、自定义MVC的实现步骤
- 模型的实现:定义模型类和接口,处理数据的存储和操作,包括业务逻辑的处理。
- 视图的实现:创建视图类和接口,展示模型中的数据给用户,处理用户的操作和输入。
- 控制器的实现:定义控制器类和接口,接收视图和用户的输入,调度模型的处理逻辑和数据更新,更新视图以反映新的状态。
五、模型(Model)的实现细节
模型(Model)的实现细节:
- 数据存储和管理:模型负责处理数据的存储和管理。这可以通过使用数据库、文件系统或内存等持久化手段来实现。模型类应该包含读取、写入、更新和删除数据的方法。
- 业务逻辑处理:模型类应该包含处理业务逻辑的方法。这些方法可以根据具体的需求来实现,例如数据验证、计算统计数据、执行复杂的业务规则等。
- 数据访问:模型类可以通过数据访问对象(如DAO、Repository)来访问底层数据存储。数据访问层应该提供标准的CRUD(创建、读取、更新、删除)操作,并处理与数据存储相关的细节,如连接数据库、执行SQL语句等。
- 业务领域的封装:模型类可以通过聚合关系、继承或其他方式来封装业务领域的相关概念。这样可以将业务逻辑和数据操作组织成更具可读性和可维护性的代码结构。
- 事件和通知:模型类可以使用事件和通知机制来通知其他组件(如控制器或观察者)关于数据的变化。这样可以实现松耦合和即时的数据更新。
四、案例
4.1 利用xml建模反射优化
package com.yuan.framework; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.yuan.framework.model.ActionModel; import com.yuan.framework.model.ConfigModel; import com.yuan.framework.model.ConfigModelFactory; @WebServlet("*.action") public class DispathServlet extends HttpServlet{ public Map<String, Action> map = new HashMap<>(); private ConfigModel configModel; @Override public void init() throws ServletException { try { configModel = ConfigModelFactory.build("mvc.xml"); } catch (Exception e) { e.printStackTrace(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //http://localhost:8080/Y1_J2EE_Web/book.action String uri = req.getRequestURI(); uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf(".")); ActionModel actionModel = configModel.pop(uri); if(actionModel==null) throw new RuntimeException("action not config"); Action action; try { action = (Action) Class.forName(actionModel.getType()).newInstance(); action.execute(req, resp); } catch (Exception e) { e.printStackTrace(); } } } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27 • 28 • 29 • 30 • 31 • 32 • 33 • 34 • 35 • 36 • 37 • 38 • 39 • 40 • 41 • 42 • 43 • 44 • 45 • 46 • 47 • 48 • 49 • 50 • 51 • 52 • 53 • 54 • 55 • 56 • 57 • 58 • 59
4.2 优化方法调用结果集跳转问题
4.2.1 中央控制器优化
package com.yuan.framework; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.yuan.framework.model.ActionModel; import com.yuan.framework.model.ConfigModel; import com.yuan.framework.model.ConfigModelFactory; import com.yuan.framework.model.ForwardModel; @WebServlet("*.action") public class DispathServlet extends HttpServlet{ public Map<String, Action> map = new HashMap<>(); private ConfigModel configModel; @Override public void init() throws ServletException { try { configModel = ConfigModelFactory.build("/mvc.xml"); } catch (Exception e) { e.printStackTrace(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //http://localhost:8080/Y1_J2EE_Web/book.action String uri = req.getRequestURI(); uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf(".")); ActionModel actionModel = configModel.pop(uri); if(actionModel==null) throw new RuntimeException("action not config"); Action action; try { action = (Action) Class.forName(actionModel.getType()).newInstance(); String execute = action.execute(req, resp); ForwardModel forwardModel = actionModel.pop(execute); if(forwardModel!=null) { boolean redirect = forwardModel.isRedirect(); String path = forwardModel.getPath(); if(redirect) { resp.sendRedirect(req.getContextPath()+"/"+path); }else { req.getRequestDispatcher(path).forward(req, resp); } } } catch (Exception e) { e.printStackTrace(); } } } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27 • 28 • 29 • 30 • 31 • 32 • 33 • 34 • 35 • 36 • 37 • 38 • 39 • 40 • 41 • 42 • 43 • 44 • 45 • 46 • 47 • 48 • 49 • 50 • 51 • 52 • 53 • 54 • 55 • 56 • 57 • 58 • 59 • 60 • 61 • 62 • 63 • 64 • 65 • 66 • 67 • 68 • 69 • 70 • 71 • 72
4.2.2 Action父类优化
package com.yuan.framework; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 子控制区 * @author yuanh * */ public class Action { public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String methodName = req.getParameter("methodName"); String res = ""; try { //拿到方法名 Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class); method.setAccessible(true);//打开方法权限 res = (String) method.invoke(this, req,resp);//设置属性和值 } catch (Exception e) { e.printStackTrace(); } return res; } } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17 • 18 • 19 • 20 • 21 • 22 • 23 • 24 • 25 • 26 • 27 • 28 • 29 • 30 • 31 • 32 • 33 • 34