根据MVC的设计思想,自己动手做一个简单的MVC流程。从而加深对Spring MVC的理解。
我们知道MVC(Model-View-Controller)即模型-视图-控制器, Struts,Spring MVC都是采用了这种模式。
根据MVC的设计思想,一个完整的HTTP请求需要经过以下几步。
1,所有的HTTP请求都将映射到一个Servlet上。
2, Servlet根据URL选择合适的Controller来处理请求,获得返回的ModeView。
3, Servlet将Model绑定到Request中,然后交给View渲染。
4, View将渲染后的页面返回给用户,完成请求处理。
由于存在多个控制器,如果直接用Servlet作为控制器,则需要实现多个Servlet,这会导致非常复杂的配置和大量的重复代码。因此,通常将Servlet作为一个请求入口,或者称之为前置控制器,然后根据URL选择一个合适的控制器处理。
下面,我们在Eclipse中建立一个SimpleMVC项目,自己动手实现一个最简单的MVC流程.
我们知道所有的请求会映射到一个Servlet上,然后这个Servlet根据URL与控制器的映射关系在选择合适的控制器来处理。所有我们可以先抽象出一个Controller接口。所有的控制器都实现这一接口,这也面向接口编程的好习惯。
public interface Controller {
//只有一个方法.处理请求的方法
ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response);
}
Controller需要返回视图和将要由视图渲染的Model。视图通常是JSP页面,因此,返回JSP页面的路径即可,而Model可以简单地使用Map来实现。由于一个方法只能返回一个对象,因此,有必要将Model和View一起返回。设计ModelAndView如下。
public class ModelAndView {
private String view;
private Map<String, Object> model;
public ModelAndView(String view, Map<String, Object> model) {
this.view = view;
this.model = model;
}
public String getView() {
return view;
}
public Map<String, Object> getModel() {
return model;
}
}
下面设计具体的控制器。我们先设计一个LoginController,这是用来处理登录请求的控制器。
public class LoginController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) {
String username = request.getParameter("username");
String password = request.getParameter("password");
if("123".equals(username) && "123".equals(password)) {
// 登录成功,将转入/welcome.jsp:
Map<String, Object> model = new HashMap<String, Object>();
model.put("username", username);
model.put("password", password);
model.put("time", new Date().toString());
return new ModelAndView("/welcome.jsp", model);
}
// 登录失败,将转入/loginFailed.jsp:
Map<String, Object> error = new HashMap<String, Object>();
error.put("message", "Login failed.");
error.put("time", new Date().toString());
return new ModelAndView("/loginFailed.jsp", error);
}
}
这个控制器实现了Controller接口,当我们以http://xxxxxx/login.do这种请求时。
Servlet根据url映射关系(下面会说到)会调用LoginController来处理。
String username = request.getParameter("username");
取得/login.do?username=xxx这种形式传来的参数。进行用户名密码验证,如果成功就返回model(返回页面展示用的数据)和view(返回的页面名称),我们在这里用Map封装了返回的数据并和view(/welcome.jsp)一起返回给前置控制器(Servlet),最终由前置控制器来完成将页面传回给用户。
接下来我们设计另一个控制器LogoutController,主要用来处理用户退出
public class LogoutController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) {
Map<String, Object> model = new HashMap<String, Object>();
model.put("message", "loguot success...");
model.put("time", new Date().toString());
// 返回的JSP视图路径是"/logout.jsp":
return new ModelAndView("/logout.jsp", model);
}
}
这个控制器和上面一样,也是返回一个model和view.view其实就是返回给用户的页面。Model就是页面上要用来显示的数据。
接下来我们设计最重要的前端控制器servlet,它主要用来处理请求转发,根择不同的url选择合适的控制器来进行处理。我们给这个控制器命保为DispatcherServlet;
public class DispatcherServlet extends HttpServlet {
private ServletContext context;
private Map<String, Controller> controllers;
//初始化DispatcherServet
public void init(ServletConfig config) throws ServletException {
context = config.getServletContext();
// 将URL和对应的Controller关联起来:
controllers = new HashMap<String, Controller>();
//login.do的请求将交由LoginController控制器处理
controllers.put("/login.do", new LoginController());
//logou.do的请求将交由LogoutController控制器处理
controllers.put("/logout.do", new LogoutController());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String contextPath = request.getContextPath();
String uri = request.getRequestURI().substring(contextPath.length());
Controller controller = controllers.get(uri);
ModelAndView mv = controller.handleRequest(request, response);
// 将Model绑定到Request中:
Map<String, Object> model = mv.getModel();
Set<String> keys = model.keySet();
for (String key : keys)
request.setAttribute(key, model.get(key));
// 获得JSP视图的路径:
String jsp = mv.getView();
// 转发给JSP视图渲染:
context.getRequestDispatcher(jsp).forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
从代码中可以看出DispatcherServlet继承HttpServet。
里面的初始化方法中(init),创建了一个Map,controllers.put("/login.do", new LoginController());这句说明了url和控制器的映射关系。当/login.do的请求过来时。就会用LoginController来进行处理
String contextPath = request.getContextPath();
取得当前系统的路径。如你的访问是http://localhsot:8080/SampleMvc/login.do,那么会返回/SampleMvc。String uri = request.getRequestURI().substring(contextPath.length());request.getRequestURI()取得当前系统请求的url,如你的访问是http://localhsot:8080/SampleMvc/login.do,那么会返回/SampleMvc/login.do。调用.substring方法后就得到了/login.do.还记得我们上面controllers.put("/login.do", new LoginController())这句吗,这样我们得到了/login.do的请求,servlet根据此关系就能知道调用那个控制器来处理了
Controller controller = controllers.get(uri);
ModelAndView mv = controller.handleRequest(request, response);
得到具体的控制器。调用控制器进行处理后返回model和view。接下来把model中的数据绑定在request中,供页面展示这此数据。
context.getRequestDispatcher(jsp).forward(request, response);返回页面给用户
web.xml中的配置
<servlet>
<servlet-name>dispatcherservlet</servlet-name>
<servlet-class>com.lee.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherservlet</servlet-name>
<url-pattern>*.do</url-pattern
</servlet-mapping>
接下来我们可以分别用
http://localhost/SampleMvc/login.do?username=123&password=123和
http://localhost/SampleMvc/logout.do测试
分享到:
相关推荐
C# MVC权限框架 包含工作流程 用户管理 菜单管理 部门管理 权限管理 前端采用layui 数据库房屋采用EF,
本文将Ajax技术与MVC模式紧密结合,设计了一个新的MVC框架。应用该框架后,客户端请求基本都是Ajax请求。本文首次采用了Container这一概念,并提出了Container树结构信息的表示法,设计了针对该表示法的解析及生成算法。...
Unity 工具类 之 简单的 MVC 框架使用实现简单的案例demo 1、单例类,保证整个场景中只有一个类管理相关类; 2、MVC 每个 每个独立成快,又有简单的联系; 3、MVC 框架简单如下图; 4、换种形式的 MVC 业务流程 ...
mvc框架源码以及mvc.jar和mvc框架的开发流程
asp.net mvc框架整体流程图,提供给大家以供参考
《ASP.NET MVC 5 框架揭秘》以一个模拟ASP.NET MVC内部运行机制的“迷你版MVC框架”作为开篇,其目的在于将ASP.NET MVC真实架构的“全景”勾勒出来。接下来《ASP.NET MVC 5 框架揭秘》以请求消息在ASP.NET MVC框架...
轻量级MVC框架:基于Java开发,包含89个文件,包括25个Java类文件、21个HTML文件、11个JavaScript文件、7个XML配置文件、7个JSP页面、4个.gitignore文件、3个CSS样式文件、1个LICENSE文件、1个Markdown文档和1个...
mvc开发流程,从0开始练手,到自己做一个mvc框架,里面有一些smart模板引擎分离思想,供大家参考,文档篇
蒋金楠编*的《ASP.NET MVC5框架揭秘》以一个 模拟ASENET MVC内部运行机制的“迷你版MVC框架” 作为开篇,其目的在于将ASENET MVC真实架构的“全 景”勾勒出来。接下来本书以请求消息在ASENET MVC 框架内部的流向为...
《ASP.NET MVC 5 框架揭秘》以一个模拟ASP.NET MVC内部运行机制的“迷你版MVC框架”作为开篇,其目的在于将ASP.NET MVC真实架构的“全景”勾勒出来。接下来本书以请求消息在ASP.NET MVC框架内部的流向为主线将相关的...
蒋金楠编的《ASP.NET MVC5框架揭秘》以一个 模拟ASENET MVC内部运行机制的“迷你版MVC框架” 作为开篇,其目的在于将ASENET MVC真实架构的“全 景”勾勒出来。接下来本书以请求消息在ASENET MVC 框架内部的流向为...
蒋金楠编*的《ASP.NET MVC5框架揭秘》以一个 模拟ASENET MVC内部运行机制的“迷你版MVC框架” 作为开篇,其目的在于将ASENET MVC真实架构的“全 景”勾勒出来。接下来本书以请求消息在ASENET MVC 框架内部的流向为...
《ASP.NET MVC 5 框架揭秘》以一个模拟ASP.NET MVC内部运行机制的“迷你版MVC框架”作为开篇,其目的在于将ASP.NET MVC真实架构的“全景”勾勒出来。接下来本书以请求消息在ASP.NET MVC框架内部的流向为主线将相关的...
分类专栏: java框架 文章标签: spring mvc spring mybatis 作用: SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为controller层,service层,mapper层三层,通常称为三层...
《ASP.NET MVC 5 框架揭秘》以一个模拟ASP.NET MVC内部运行机制的“迷你版MVC框架”作为开篇,其目的在于将ASP.NET MVC真实架构的“全景”勾勒出来。接下来《ASP.NET MVC 5 框架揭秘》以请求消息在ASP.NET MVC框架...
本课程将使用 PHP 实现一个简单的 MVC 框架,包含模型、...通过本课程的学习,可以了解MVC框架的基本原理和运行流程,学习面向对象编程和MVC设计模式,并学习开发中的一些注意事项。对其他框架学习有很大的帮助作用。
自定义mvc框架,了解mvc开发流程,进一步深入了解mvc框架的作用,方便开发工作
eFrameWork(asp.net)开发框架(以下简称框架)是E客开发团队(EKETEAM以下简称e客)从业十余年开发...11.提供简单的审批流程设置。 12.提供DEMO,方便学习和展示框架。 13.图像文件自动处理功能。 14.丰富的数据编辑组件。
《ASP.NET MVC 5 框架揭秘》以一个模拟ASP.NET MVC内部运行机制的“迷你版MVC框架”作为开篇,其目的在于将ASP.NET MVC真实架构的“全景”勾勒出来。接下来本书以请求消息在ASP.NET MVC框架内部的流向为主线将相关的...
强大的前台结合mvc框架完美实现web模板,适用于中小企业开发,数据库可以采用MySQL或SQLserver,数据库自动生成,无需用户操作,内置优秀文档详细的配置流程