MVC设计模式开发Web
MVC概述
MVC即 Model-View-Controller 的缩写,是按照职责划分模块一种设计模式,其中Model是核心。
Model:模型。负责执行实际的业务,包含数据操作,可以向视图推送数据
view:视图。向用户展示数据或效果并接收用户的请求
Controller:控制器。接收视图的请求、控制流程、选择视图展示数据
MVC适用范围
MVC适合大型应用的开发。清晰的职责划分,有利于复杂项目的开发,并提高代码健壮性和可重用性。
MVC设计模式开发Web
在请求/响应方式的Web应用中,模型无法向视图推送消息。MVC帮助Web开发实现了前后端分离,视图就是前端的页面,控制器和模型属于后端,前后端之间的数据交流使用JSON格式。
``
运作流程````
运作流程
- 前端页面接收用户输入并向服务器发送请求
- 服务器接收请求和请求的数据并选择适当的控制器执行服务
- 控制根据需要调用模型完成业务
- 控制器选择视图展示结果
?? ?控制器可以自己实现一些简单的业务,但它主要还是用于控制业务流程,清晰的职责划分对于复杂的项目十分有益
模仿Spring MVC框架搭建一个简单的模型
后端有四个重要的部件:
-
DispatcherServlet:仅作为接收前端请求的入口,不控制业务流程,具体流程交给专门的控制器完成。
-
Controller:控制流程调用模型,得到结果后选择相应的视图展示给用户
-
JavaBean/EJB:模型,实现具体业务,例如CRUD...
-
RequestMapping:DispatcherServlet作为请求的统一入口,是如何选择适当Controller执行业务流程呢?这就要建立URL请求和Controller之间的映射关系,使用Java注解和反射来建这个映射。
伪代码
DispatcherServlet
@WebServlet(urlPatterns = "*",loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
初始化RequestMapping中的映射信息;
}
<span class="hljs-meta">@Override
<span class="hljs-function"><span class="hljs-keyword">protected <span class="hljs-keyword">void <span class="hljs-title">service<span class="hljs-params">(HttpServletRequest req, HttpServletResponse resp) <span class="hljs-keyword">throws ServletException, IOException {
<span class="hljs-comment">//获取请求的uri
String uri = req.getRequestURI();
Object o = 调用RequestMapping的方法将uri映射到Controller ;
Methon m = ... ;
其他 others = ...;
<span class="hljs-comment">//调用Controller
<span class="hljs-keyword">try {
Object result = method.invoke(object, req, resp);
<span class="hljs-keyword">switch (根据映射中的信息选择) {
<span class="hljs-keyword">case 视图: 从result中获取视图地址;
<span class="hljs-keyword">case 数据: 维持请求使用的视图,仅返回数据;
... ...
}
} <span class="hljs-keyword">catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
<span class="hljs-function"><span class="hljs-keyword">private <span class="hljs-keyword">void <span class="hljs-title">responseView<span class="hljs-params">(HttpServletRequest req, HttpServletResponse resp, String result) <span class="hljs-keyword">throws IOException {
resp.sendRedirect(result);
}
<span class="hljs-function"><span class="hljs-keyword">private <span class="hljs-keyword">void <span class="hljs-title">responseText<span class="hljs-params">(HttpServletRequest req, HttpServletResponse resp, String result) <span class="hljs-keyword">throws IOException {
PrintWriter writer = resp.getWriter();
writer.println(result);
}
}
RequestMapping
public class RequestMapping {
//存储映射的集合
private static Map map = new HashMap<>();
<span class="hljs-comment">//获取映射服务
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">static MVCMapping <span class="hljs-title">get<span class="hljs-params">(String uri) {
<span class="hljs-keyword">return map.get(uri);
}
<span class="hljs-comment">//加载映射
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">static <span class="hljs-keyword">void <span class="hljs-title">load<span class="hljs-params">() {
读取配置文件;
类加载器加载获取配置文件中Controller对象的实例;
<span class="hljs-keyword">for (循环条件) {
<span class="hljs-keyword">if (Controller的方法包含的信息) {
放入map集合建立映射关系;
}
}
}
}
Controller
public class DemoController {
@注解(信息:方法对应的url)
public T methonName(HttpServletRequest req, HttpServletResponse resp) {
控制业务流程,调用模型;
return T;
}
@注解(信息:方法对应的url)
其他方法{
}
}
文章参考书籍:
《Tomcat与Java Web开发技术详解》孙卫琴