一.介绍mvc框架
1.什么是mvc框架?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC结构
- Model:是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
- View:是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
- Controller:是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC是一个框架模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式
- Model:常用javabean去实现,通过各种类来对数据库的数据进行获取,并封装在对象当中。
- View:常用JSP来实现,通过可直接观察的JSP页面来展示我们从数据库中获取的数据。
- Controller:常用servlet来实现,通过servlet来获取经过javabean包装过的对象(已存入数据库中的数据),然后再发送数据传输到JSP界面。
1.不能跨层调用; 2.只能由上往下进行调用:View -> Controller -> Model
2.为什么要在企业中使用?
在企业中使用MVC框架有以下几个主要原因:
1. 分离关注点:MVC框架将应用程序分为模型(Model)、视图(View)和控制器(Controller)。这种分离关注点的设计使得代码的职责清晰明确。模型负责处理业务逻辑和数据操作,视图负责呈现用户界面,控制器处理用户输入和协调模型和视图之间的交互。通过这种分离,不同的开发人员可以专注于各自的领域,提高了代码的可维护性和可理解性。
2. 可重用性:MVC框架鼓励将逻辑和表示分离。这使得模型和视图可以独立于特定的应用需求进行开发,从而提高了代码的可重用性。模型可以在不同的应用程序中使用,视图可以根据需要进行替换或重新设计,同时保持与模型的兼容性。
3. 可扩展性:MVC框架使得应用程序的不同组件可以相对独立地进行开发和扩展。通过这种结构,可以轻松添加新的功能或修改现有的功能,而无需对整个应用程序进行重构。这种可扩展性使得企业能够快速响应变化的需求,并保持代码的可维护性和稳定性。
4. 并行开发:使用MVC框架可以实现并行开发。开发人员可以独立地在模型、视图和控制器之间工作,而无需等待其他人员完成其任务。这种并行开发的方式可以显著提高开发效率,缩短项目的交付时间。
总之,企业中使用MVC框架可以带来分离关注点、可重用性、可扩展性和并行开发的好处。这些优势有助于提高代码质量、开发效率和应用程序的可维护性,使企业能够更好地应对不断变化的业务需求。
3. 三层架构和MVC的区别
三层架构和MVC是常见的软件架构模式,用于组织应用程序的代码。它们的区别如下:
1. 结构不同:
- 三层架构: 三层架构将应用程序分为表示层、业务逻辑层和数据访问层。表示层处理用户界面和交互,业务逻辑层处理应用程序的逻辑功能,数据访问层处理与数据存储的通信。
- MVC: MVC将应用程序分为模型、视图和控制器。模型处理数据和业务逻辑,视图负责呈现界面,控制器处理用户输入并协调模型和视图之间的交互。
2. 关注点不同:
- 三层架构: 三层架构注重层次化和分离关注点的概念。它的目标是将不同层次的代码分开,并使其易于维护和扩展。
- MVC: MVC注重分离关注点和可重用性。它的重点是通过分离数据、逻辑和显示来实现更好的代码组织和可维护性。
3. 独立性不同:
- 三层架构: 每个层级在三层架构中相对独立,可以单独开发和部署。业务逻辑层和数据访问层可以独立于表示层进行更改和测试。
- MVC: MVC模式中,模型、视图和控制器之间存在更紧密的耦合。它们紧密协作,通过事件和消息传递来保持同步。
简而言之,三层架构和MVC在结构、关注点和独立性等方面有所区别。三层架构更注重层次化组织和分离关注点,而MVC更注重分离关注点和可重用性。选择何种架构取决于应用程序的需求和开发团队的偏好。
4.所以你知道他们的区别了吗?
二.分析mvc框架代码和缺陷
1.利用mvc架构的缺点
1. 学习曲线较陡:对于初学者来说,理解和应用MVC架构可能需要一些时间和努力。它的概念和分层结构可能会对初学者造成一些困惑,因此需要一定的学习曲线。
2. 复杂性增加:随着应用程序规模的增大,MVC架构可能会变得复杂。随着功能和模块的增加,控制器的逻辑可能变得庞大,导致代码可读性和维护性降低。此外,为了维持低耦合性,可能需要引入更多的接口和事件处理机制,增加了代码的复杂性。
3. 逻辑交叉问题:在某些情况下,模型、视图和控制器之间的逻辑交叉可能增加。特别是当应用程序的要求变得复杂时,可能会出现需要在多个组件之间共享逻辑或需要跨组件通信的情况。这可能导致模块之间耦合性增加,降低了架构的可扩展性。
4. 视图与模型的依赖:在一些情况下,视图可能会依赖于模型的特定结构或属性。这种依赖关系可能导致模型的更改需要同时更新视图,增加了维护成本和出错的可能性。
5. 可能过于灵活:MVC架构的灵活性也可能成为缺陷。在没有明确规定的情况下,开发人员可能会有多种选择来实现同一个功能,导致代码的风格和结构不一致。
6. 性能问题:由于MVC架构中涉及到多个组件之间的交互,可能会产生额外的开销和延迟。尤其是在大型和复杂的应用程序中,可能需要更多的资源和处理时间来协调模型、视图和控制器之间的通信。
尽管MVC架构有一些缺陷,但它仍然是一种被广泛采用的架构模式,特别适用于中大型的应用程序开发。通过合理的设计和实践,许多缺陷可以被解决或减轻。
2.自我总结
在使用这个模式时,经常回去做很多重复的工作,以及在编码时,会出现很多重复的代码!在实现的时候还要调用各种方法,步骤繁琐,费时间!
三.利用自定义mvc框架去优化三层架构
3.1流程图
3.2思路
在Eclipse中使用MVC架构来优化JSP页面的增删改查操作的流程如下:
1. 创建模型(Model)
- 在Eclipse中创建一个Java类,例如UserModel,用于管理用户数据。
- UserModel类可以包含与用户数据相关的方法,例如添加用户、删除用户、更新用户等。
2. 创建控制器(Controller)
- 在Eclipse中创建一个Java类,例如UserController,作为控制器。
- UserController类负责接收用户请求,并调用模型中的方法来处理这些请求。
- 使用@WebServlet注解配置UserController类以便访问该控制器。
3. 创建JSP视图(View)
- 在Eclipse中创建一个JSP页面,例如user.jsp,用于显示用户界面和接收用户输入。
- 在user.jsp页面中,使用HTML和JSTL标签来展示用户信息并提供表单用于接收用户输入。
4. 绑定模型和视图
- 在UserController类中创建一个UserModel对象,与模型进行绑定。
- 通过调用UserModel对象的方法,从模型中获取用户数据或执行增删改查操作,并将结果传递到JSP视图中进行展示。
5. 实现增删改查功能
- 在UserController类中实现相应的方法,例如addUser、deleteUser、updateUser等,用于处理增删改查操作。
- 这些方法中,调用UserModel对象的方法来执行相应的操作,并将结果存储到HttpServletRequest对象中供JSP页面使用。
6. 在JSP页面中展示结果
- 在user.jsp页面中,通过调用JSTL标签或使用EL表达式,从HttpServletRequest对象中获取控制器传递过来的数据,并将其展示给用户。
通过上述步骤,你可以在Eclipse中使用MVC架构来优化JSP页面的增删改查操作。控制器负责接收用户请求并调用模型处理数据,模型负责处理数据操作,视图负责展示用户界面。这种分离架构使得代码结构更清晰、模块化,提高了代码的复用性和可维护性。
3.2.1老版本 方法
1.(版本1)每次对于一个表格进行(增加,删除,修改,查看)操作,都要写一个servelt
缺点:非常复杂,每一次增加一个功能就要增加一个servelt,代码重复
2.(版本2) 每次对于一个表格进行(增加,删除,修改,查看)操作,只写一个servelt
缺点:但是每次增加一个操作就要改变原有的代码块
就是要增加条件分支
package com.lz.servelt; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //@WebServlet("/book.action") public class BookServelt extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String methodName = request.getParameter("methodName"); if ("add".equals(methodName)) { add(request,response); }else if ("del".equals(methodName)) { del(request,response); } else if ("upd".equals(methodName)) { upd(request,response); } else if ("Ck".equals(methodName)) { Ck(request,response); } private void Ck(HttpServletRequest request, HttpServletResponse response) { System.out.println("ck....方法"); } private void upd(HttpServletRequest request, HttpServletResponse response) { System.out.println("upd....方法"); } private void del(HttpServletRequest request, HttpServletResponse response) { System.out.println("del....方法"); } private void add(HttpServletRequest request, HttpServletResponse response) { System.out.println("add....方法"); } }
3.(版本3)通过反射实现
缺点:解决了,增加条件分支,但是在项目中,反射代码也是重复的
package com.lz.servelt; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //@WebServlet("/book.action") public class BookServelt extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String methodName = request.getParameter("methodName"); try { Method m = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class); m.setAccessible(true); m.invoke(this, request,response); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void Ck(HttpServletRequest request, HttpServletResponse response) { System.out.println("ck....方法"); } private void upd(HttpServletRequest request, HttpServletResponse response) { System.out.println("upd....方法"); } private void del(HttpServletRequest request, HttpServletResponse response) { System.out.println("del....方法"); } private void add(HttpServletRequest request, HttpServletResponse response) { System.out.println("add....方法"); } }
3.2.2新版本 (通过反射实现)标签有优化
1.建立中央控制器
package com.lz.fraamework; 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.lz.servelt.bookAction; /** * 对应图中的 ActionServelt:中央控制器 * * @author lzzxq * */ @WebServlet("*.action") public class DispathServelt extends HttpServlet { public Map<String, Action> actionMap = new HashMap<String, Action>(); @Override public void init() throws ServletException { actionMap.put("/book",new bookAction()); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String methodName = request.getParameter("methodName"); // http:lolaoch/80./s // 获取浏览器路径的book String uri = request.getRequestURI(); uri = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf(".")); Action action = actionMap.get(uri); action.ececute(request, response); } }
2.建立子控制器
package com.lz.fraamework; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.lz.servelt.bookAction; /** * 处理浏览器发出的请求 * @author lzzxq * */ public class Action { protected void ececute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String methodName = request.getParameter("methodName"); try { Method m = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class, HttpServletResponse.class); m.setAccessible(true); m.invoke(this, request,response); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3继承action
package com.lz.servelt; 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; import com.lz.fraamework.Action; public class bookAction extends Action{ private void Ck(HttpServletRequest request, HttpServletResponse response) { System.out.println("ck....方法"); } private void upd(HttpServletRequest request, HttpServletResponse response) { System.out.println("upd....方法"); } private void del(HttpServletRequest request, HttpServletResponse response) { System.out.println("del....方法"); } private void add(HttpServletRequest request, HttpServletResponse response) { System.out.println("add....方法"); } }
4.最终效果图