4.2.3 Action的子类BootAction的优化
package com.yuan.framework; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Action的子类 主要承载的是Book的增删改查 * @author yuanh * */ public class BookAction extends Action { public String add(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { System.out.println("增加"); return "toList"; } public String del(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { System.out.println("删除"); return "toList"; } public String edit(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { System.out.println("修改"); return "toList"; } public String sellist(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { System.out.println("查询"); return "List"; } } • 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
4.3 优化参数的封装
4.3.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 org.apache.commons.beanutils.BeanUtils; 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(); if(action instanceof ModelDrivern) { ModelDrivern md = (ModelDrivern) action; Object bean = md.getModel(); Map<String, String[]> map = req.getParameterMap(); BeanUtils.populate(bean, map); } 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 • 73 • 74 • 75 • 76 • 77 • 78 • 79 • 80 • 81
六、视图(View)的实现细节
- 界面设计:视图负责定义和设计用户界面。这包括确定布局、选择合适的控件和组件、设定样式和主题等。视图应该与用户交互舒适,并提供良好的用户体验。
- 数据展示:视图负责将模型中的数据展示给用户。这可以通过显示文本、图形、表格或其他形式的界面元素来实现。视图应该负责对数据进行格式化和显示,以便用户能够理解和使用。
- 用户交互:视图应该能够处理用户的输入,如按钮点击、菜单选择、文本输入等。视图可以通过事件监听、回调函数或其他方式来捕获用户交互事件,并将其传递给控制器进行处理。
- 视图更新:当模型中的数据发生变化时,视图应该能够及时更新展示。这可以通过使用观察者模式、绑定机制或其他方式来实现。视图应该根据数据的变化来更新界面元素,以反映最新的数据状态。
- 错误处理:视图应该能够处理异常和错误情况,并向用户提供有意义的错误信息。这包括捕获和处理异常、显示错误提示、弹出对话框等操作,以提供良好的用户体验和错误恢复机制。
- 国际化和本地化:视图应该支持国际化和本地化,在不同的语言和地区提供适当的界面文本、日期时间格式、货币符号等。这可以通过使用资源文件、多语言支持库或其他方式来实现。
七、控制器(Controller)的实现细节
- 7.1 控制器类的创建:创建一个控制器类来实现控制器接口或继承一个抽象的控制器类。控制器类负责处理用户的输入、调度模型方法和更新视图。
- 7.2 用户输入处理:控制器需要获取用户的输入以执行相应的操作。这可以通过各种方式实现,如监听用户界面的事件、接收用户的请求或从视图对象中获取输入。
- 7.3 调度模型方法:控制器通过调用模型的方法对数据和业务逻辑进行处理。可以通过依赖注入或其他方式获取模型对象,并调用合适的方法来操作数据、执行业务逻辑或访问后端服务。
- 7,4 更新视图:控制器负责将处理结果反馈给视图,以更新用户界面。通过调用视图中的方法,将获取到的数据传递给视图进行展示,或者通知视图进行特定的操作。
- 7.5 业务逻辑处理:控制器可以执行一些额外的业务逻辑,例如验证用户的输入、处理异常或决定执行哪个模型方法。这样可以将视图和模型之间的复杂细节封装在控制器中,提高代码的可维护性和可复用性。
- 7.6 控制器与视图交互:控制器需要与视图进行交互来获取用户输入并更新视图。可以通过依赖注入或其他方式获取视图对象,并调用视图的方法来获取用户输入、更新展示内容或触发其他操作。
- 7.7 错误处理:控制器应该能够处理异常和错误情况,以提供良好的用户体验。可以通过捕获异常、显示错误信息或执行适当的恢复操作来处理错误。
- 7.8 控制器的生命周期:控制器的生命周期通常与视图的生命周期相关联。在视图创建时创建控制器实例,在视图销毁时销毁控制器实例。这样可以确保控制器始终与视图保持一致,并且资源的管理更加清晰。
八、自定义MVC的设计模式和最佳实现有哪些?
8.1 原理
自定义MVC(Model-View-Controller)是一种软件架构模式,将应用程序分为模型、视图和控制器三个部分,实现数据、展示和用户交互的分离。模型负责处理数据和业务逻辑,视图负责展示数据给用户,控制器负责协调模型和视图之间的交互。
- 8.1.1 设计模式:在自定义MVC中,可以使用以下设计模式来优化架构和提高灵活性:
- 8.1.2 观察者模式:模型可以使用观察者模式来通知视图更新,当模型数据发生变化时,视图可以自动更新展示。
- 8.1.3 策略模式:控制器可以使用策略模式来选择合适的业务处理逻辑,根据用户的操作和需求来决定调用哪个具体的模型方法。
- 8.1.4 工厂模式:可以使用工厂模式来创建模型和视图的实例,使得代码更具可扩展性和灵活性。
- 8.1.5 模板方法模式:视图可以使用模板方法模式来定义通用的展示逻辑,而具体的展示细节可以由子类来实现。
8.2 最佳实践
在设计和实现自定义MVC时,可以采用以下最佳实践来提升代码质量和可维护性:
- 8.2.1 单一职责原则(SRP):每个类、接口和方法应该只负责一个明确的责任,避免功能耦合和责任过重。
- 8.2.2 依赖倒置原则(DIP):依赖抽象,而不是依赖具体实现。使用接口或抽象类来定义模型、视图和控制器之间的依赖关系,以提高代码的灵活性和可测试性。
- 8.2.3 松耦合和高内聚:模型、视图和控制器之间应该通过接口或抽象类进行交互,减少彼此的直接依赖,以实现松耦合。同时,每个部分内部的代码应该是高内聚的,只处理与自身相关的逻辑。
- 8.2.4 适当的分层和模块化:按照职责对代码进行合理的分层和模块化,使得不同部分的代码互相隔离,并且易于理解、修改和维护。
- 8.2.5 可扩展性和可测试性:通过使用接口、设计模式和最佳实践,使得自定义MVC架构具有良好的可扩展性和可测试性。这样,可以轻松添加新的模型、视图或控制器,并编写单元测试来验证各个部分的功能。
九、架构和扩展性考虑
探讨如何基于自定义MVC架构构建可扩展和易维护的应用程序。讨论接口和抽象的使用,模块化开发的思想,以及如何支持功能扩展和业务变化。
性能和安全性优化
强调性能和安全性在自定义MVC应用程序中的关键,提供一些实践建议,如最小化网络请求、数据缓存、安全的用户认证和授权等。
十、总结
自定义MVC框架就像是一场华丽的舞会,每个成员都有自己的角色:
- 模型(Model)就像是舞会中的舞者,负责展示自己的独特技巧和美丽外表,让人们眼前一亮。
- 视图(View)就像是舞会的舞台,为舞者们提供一个展现自己的舞台,让观众们赞叹不已。
- 控制器(Controller)就像是舞会的舞曲,它通过指挥舞者和音乐的节奏,使整个舞会变得有序而有魅力。
而框架配置和路由,就像是舞会的礼宾部门,负责引导每个舞者的角色和方向,让整个舞会充满喜悦和欢乐。
总之,自定义MVC原理就是让舞者们在舞台上翩翩起舞,让观众们目不转睛,留下美好的回忆。记住,用代码来编排这场华丽的舞蹈吧!