目录
思维导图:
1、什么是mvc
2、三层架构和MVC的区别?
3、MVC结构?
4.自定义MVC工作原理图
5.MVC实现
思维导图:
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
三层架构是一个经典的分层思想,将开发模式分为三层,每个人专注自己擅长模块即可
MVC是一种设计模式,其目的是让html和业务逻辑分开
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(根据不同请求路径名调用不同逻辑处理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;
public class ActionServlet extends HttpServlet {
//问题:
//1)使用Map方式需要一个个手动配置请求路径的对应关系?
//2)子控制器类Action只能完成一个核心业务逻辑处理?
//保存请求路径名对应的子控制器类Action
//Key=请求路径名
//value=具体的子控制器类Action
private Map 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());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, 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;
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
mvc
actionServlet
com.zking.mvc.framework.ActionServlet
actionServlet
*.action
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
*.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(根据不同请求路径名调用不同逻辑处理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; public class ActionServlet extends HttpServlet { //问题: //1)使用Map方式需要一个个手动配置请求路径的对应关系? //2)子控制器类Action只能完成一个核心业务逻辑处理? //保存请求路径名对应的子控制器类Action //Key=请求路径名 //value=具体的子控制器类Action private Map 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()); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub this.doPost(request, 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; 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
mvc actionServlet com.zking.mvc.framework.ActionServlet actionServlet *.action index.html index.htm index.jsp default.html default.htm default.jsp



