学习笔记 7.2 MVC概述.doc_第1页
学习笔记 7.2 MVC概述.doc_第2页
学习笔记 7.2 MVC概述.doc_第3页
学习笔记 7.2 MVC概述.doc_第4页
学习笔记 7.2 MVC概述.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

7.2 MVC概述比较Servlet和JSP可以看出,Servlet是在Java代码中嵌入HTML,而JSP则是在HTML中嵌入Java代码,两者的优缺点正好互补,如表7-1所示。表7-1ServletJSP编写Java代码容易困难编写HTML代码困难容易如果仅使用Servlet,则虽然应用程序逻辑编写简单,但是,编码输出的页面极其难以维护;如果仅使用JSP,则虽然简化了页面设计,但大量的Java代码将使得应用程序逻辑难以维护。因此,若能将Servlet和JSP结合使用,使得Servlet和JSP各司其职,就能大大降低Web应用程序的开发难度。MVC(Model-View-Controller)即模型-视图-控制器,这种模式最早由Smalltalk语言引入,作为应用程序界面的标准设计模式,其应用范围极为广泛。MVC模式通过将显示界面分为3个核心模块(模型、视图和控制器),分别负责不同的任务,协作完成一次完整的请求/响应。图7-15显示了MVC模式的响应流程。随着Web应用开发的兴起,MVC也被引入了Web应用程序中。由于Servlet是纯Java代码,因此适合担任控制器,控制请求的流程。Servlet通过查询模型的状态,获得需要的数据,然后传递结果给视图,由视图将页面渲染出来,返回给用户。由于JSP主要是HTML标签,因此适合作为视图,仅负责渲染出结果页面。受到HTTP协议的限制,模型的状态如果发生了更改,无法主动通知视图,因此,每次请求必须由浏览器发起。相对于传统的主动MVC模式,在Web应用程序中必须使用被动的MVC模式,如图7-16所示。在JavaEE Web模型中,一个HTTP请求可以以3种转发方式。(1)Forward:将一个请求传递给另一个组件处理,可以是Servlet或JSP,而当前的组件将不再继续处理请求。这也是MVC模式中转发请求让视图来渲染模型时使用的方式。(2)Include:将一个请求传递给另一个组件处理,但是其处理结果将被包含在当前组件的输出页面中,通常,Include方式用来包含网站每个页面都共享的页眉和页脚,但是许多网页编辑工具本身就支持页面模板,因此,Include方式的使用并不多。(3)Error:当处理请求发生了异常时,将被导向到指定的错误页面。JavaEE平台上已经有许多成熟的Web MVC框架,例如,Struts和WebWork,其原理大同小异。在介绍如何使用Spring的MVC框架前,有必要首先弄清楚MVC的实现原理。根据MVC的设计思想,一个完整的HTTP请求需要经过以下几步处理。 所有的HTTP请求都将映射到一个Servlet上。 Servlet根据URL选择合适的Controller来处理请求,获得返回的Model和View。 Servlet将Model绑定到Request中,然后交给View渲染。 View将渲染后的页面返回给用户,完成请求处理。由于存在多个控制器,如果直接用Servlet作为控制器,则需要实现多个Servlet,这会导致非常复杂的配置和大量的重复代码。因此,通常将Servlet作为一个请求入口,或者称之为前置控制器(Front Controller),然后根据URL选择一个合适的控制器处理,具体流程如图7-17所示。由于Servlet需要知道URL和控制器的映射关系,所以还需要首先抽象出Controller。通常,在Web MVC框架中,我们将抽象的Controller称为控制器,将负责接收用户请求的Servlet称为前置控制器或请求转发器(DispatcherServlet)。下面,我们在Eclipse中建立一个SimpleMVC项目,自己动手实现一个最简单的MVC流程,如图7-18所示。图7-187.2.1 设计Controller根据面向接口编程的良好实践,首先定义一个Controller接口。public interface Controller ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;Controller需要返回视图和将要由视图渲染的Model。视图通常是JSP页面,因此,返回JSP页面的路径即可,而Model可以简单地使用Map来实现。由于一个方法只能返回一个对象,因此,有必要将Model和View一起返回。设计ModelAndView如下。public class ModelAndView private String view; private Map model; public ModelAndView(String view, Map model) this.view = view; this.model = model; public String getView() return view; public Map getModel() return model; 下一步是实现一个具体的TestController,它从request中获得URL的参数,然后生成Model并返回ModelAndView。public class TestController implements Controller public ModelAndView handleRequest(HttpServletRequest request, HttpServlet Response response) throws Exception String name = request.getParameter(name); if(name=null) name = world; Map model = new HashMap(); model.put(message, This is a TestController.); model.put(greet, Hello, + name + !); model.put(time, new Date().toString(); / 返回的JSP视图路径是/test.jsp: return new ModelAndView(/test.jsp, model); 在实现了Controller后,现在需要定义的就是如何在Servlet中控制整个请求的处理流程。7.2.2 实现请求转发通常,我们把接收所有请求的Servlet命名为DispatcherServlet,在SimpleMVC项目中,我们把所有以“.cmd”结尾的URL都映射到DispatcherServlet,然后在DispatcherServlet中,根据URL选择合适的Controller,实现请求转发。我们假定现在定义了两个Controller:TestController和LoginController,其对应的URL分别是“/test.cmd”和“/login.cmd”,在DispatcherServlet中处理如下。public class DispatcherServlet extends HttpServlet private ServletContext context; private Map controllers; / 初始化DispatcherServlet: public void init(ServletConfig config) throws ServletException context = config.getServletContext(); / 将URL和对应的Controller关联起来: controllers = new HashMap(); controllers.put(/test.cmd, new TestController(); controllers.put(/login.cmd, new LoginController(); 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); if(controller=null) / 没有找到合适的Controller处理请求,直接返回一个404错误: response.sendError(404); return; try / 将请求交给Controller处理: ModelAndView mv = controller.handleRequest(request, response); / 将Model绑定到Request中: Map model = mv.getModel(); Set 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); catch(Exception e) / 处理过程中发生异常,返回一个500错误: response.sendError(500); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / POST请求的处理方式和GET一样: doGet(request, response); DispatcherServlet将Controller返回的Model绑定到Request,然后使用forward()将Request交给JSP页面渲染。在JSP页面中,只需要使用JSP标签把Model的数据显示出来,因此,不需要也不应该嵌入任何Java代码。test.jsp页面源码如下。 TestController -> test.jsp /test.cmd (TestController) -> test.jsp Message: Greet: Time: 如果用户请求URL“/test.cmd?name=spring”,则整个请求按照以下流程处理,如图7-18所示。LoginController则稍微复杂一点,它根据登录是否成功来决定返回哪一个ModelAnd View。public class LoginController implements Controller public ModelAndView handleRequest(HttpServletRequest request, HttpServlet Response response) throws Exception String username = request.getParameter(username); String password = request.getParameter(password); if(admin.equals(username) & password.equals(password) / 登录成功,将转入/welcome.jsp: Map model = new HashMap(); model.put(username, username); model.put(greet, Welcome!); model.put(time, new Date().toString(); return new ModelAndView(/welcome.jsp, model); / 登录失败,将转入/loginFailed.jsp: Map error = new HashMap(); error.put(message, Login failed.); error.put(time, new Date().toString(); return new ModelAndView(/loginFailed.jsp, error); 为了能在Resin中测试我们自己实现的这个SimpleMVC,需要在web.xml中注册DispatcherServlet,由于JSP页面还使用了JSTL标签库,因此,还要在web.xml中注册标签库。 dispatcher example.chapter7.DispatcherServlet 0 dispatcher *.cmd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论