目录
思维导图:
1、什么是mvc
全名:Model View Controller,模型视图控制器,是一种软件设计的典范。其中Model(模型层)、View(视图层)、Controller(控制层)它是一种软件设计典范,用于业务逻辑处理、数据、界面显示分离。用业务逻辑、数据和界面显示分离的方法来组织代码,在需要程序进行改动时不需要重新修改代码,达到减少代码的作用。
常用模式:
model1:jsp+jdbc
model2:mvc
我的理解:不使用mvc我们会创建很多个servlet分别来实现增加,删除...操作,各司其职。mvc就
像是一个通用的servlet,其中组成有一个中央控制器,根据我们的请求不同来实现不同的业务逻
辑。前端的请求进入mvc进过一系列处理(取数据并不和中央控制器产生联系)之后将结果反馈给
界面。很明显的诠释了业务逻辑,数据和显示界面分离这句话。
2、三层架构和MVC的区别?
三层架构是一个经典的分层思想,将开发模式分为三层,每个人专注自己擅长模块即可
MVC是一种设计模式,其目的是让html和业务逻辑分开
3、MVC结构?
V(视图层)
C(控制层)
M(模型层)注:1)不能跨层调用;
2)只能由上往下进行调用;View -> Controller -> Model
4.自定义MVC工作原理图
*.action 调度 截取*(请求路径名) 处理具体业务逻辑
JSP -----------> Servlet(中央控制器)--------------------->Action(子控制器)--->Model(Dao、DB)
5.MVC实现
mvc组成部分
①XML模型ConfigModelFactory:面对对象的思想操作我们的XML文件,修改XML来实现不同的逻辑。②中央控制器DispathServlet:处理所有请求,分配给具体的子控制器实现业务。
③子控制器Action(接口):对子控制器的一种约束。
④增强子控制器ActionSupport:所有具体子控制器的父类,实现Action接口。
⑤模型驱动ModelDriver(泛型接口):具体的子控制器实现后实现返回子控制指定类型的对象,在中央控制器
中使用BeanUtils类对具体的子控制器类中定义的对象通过请求对象req进行初始化。
案例1:
1)创建抽象类Action,定义抽象方法execute(处理具体逻辑)
2)创建HelloAction并继承抽象类Action,重写execute方法
3)在ActionServlet中定义私有Map<String,Action>(根据不同请求路径名调用不同逻辑处理Action类)
4)在ActionServlet中的init方法初始化Map集合
map.put('请求路径','逻辑处理Action类')
5)在ActionServlet中的doPost方法中处理请求ActionServlet:
package com.zking.mvc.framework; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zking.mvc.action.AddAction; import com.zking.mvc.action.HelloAction; /** * 中央控制器(接收请求、分发请求:注意:不做具体核心业务逻辑处理) * Servlet implementation class ActionServlet */ public class ActionServlet extends HttpServlet { //问题: //1)使用Map<String,Action>方式需要一个个手动配置请求路径的对应关系? //2)子控制器类Action只能完成一个核心业务逻辑处理? //保存请求路径名对应的子控制器类Action //Key=请求路径名 //value=具体的子控制器类Action private Map<String,Action> actions=new HashMap(); @Override public void init() throws ServletException { // TODO Auto-generated method stub super.init(); //初始化action actions.put("/helloAction", new HelloAction()); actions.put("/addAction", new AddAction()); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 思路:http://localhost:8080/mvc/xxx.action //1.获取请求路径*.action //request.getrequestURI //request.getContextPath //例如:XXX.action String requestURL = request.getServletPath(); //2.截取请求路径名* //例如:/xxx int start=requestURL.indexOf("/"); int end=requestURL.lastIndexOf("."); String requestName = requestURL.substring(start, end); //3.根据请求路径名获取对应的子控制器类Action Action action = actions.get(requestName); //4.将请求委托给子控制器Action处理 action.execute(request, response); } }
Action:
package com.zking.mvc.framework; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 子控制器类,做具体的核心业务逻辑处理 * @author zjjt * */ public abstract class Action { public abstract void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; }
addaction:
package com.zking.mvc.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zking.mvc.framework.Action; public class AddAction extends Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("AddAction"); Integer num1 = Integer.parseInt(request.getParameter("num1")); Integer num2 = Integer.parseInt(request.getParameter("num2")); Integer result=num1+num2; request.setAttribute("result", result); request.getRequestDispatcher("/rs.jsp").forward(request, response); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>mvc</display-name> <servlet> <servlet-name>actionServlet</servlet-name> <servlet-class>com.zking.mvc.framework.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>actionServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>