Spring MVC 1.1.1. Spring MVC 介绍 1.1.2. Spring3 MVC VS Struts2 ? ? ? ? ? ? 官方的下载网址是:http://www.springsource.org/download Spring MVC 会比 Struts 快,在 Struts 中默认配置了很多缺省的拦截器,在给开发者提 供便利的同时,失去了灵活性和开发效率. Spring mvc 是基于方法的设计, 而 Sturts 是基于类,每次发一次请求都会实例一个 action,每个 action 都会被注入属性,而 spring 基于方法,粒度更细,可控制更强 设计思想上:Struts 更加符合 oop 的编程思想,Spring 是在在 Servlet 上扩展 提供强大的约定大于配置的契约式编程支持 支持 JSR 303 验证规范,实现了基于注解方式的可验证的 Java Bean 1.1. 第一个 MVC 案例 1.1.1. 配置前端过滤器 DispatcherServlet 实际上是一个 Servlet(它继承了 HttpServlet) 。与其它 Servlet 一样, DispatcherServlet 定义在 web 应用的 web.xml 文件中。 DispatcherServlet 处理的 请求必须在同一个 web.xml 文件里使用 url-mapping 定义映射 action org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springMVC.xml 1 action *.action 1.1.2. 创建控制器 控制器的概念是 MVC 设计模式的一部分(确切地说,是 MVC 中的 C) 。应用程序的行为 通常被定义为服务接口, 而控制器使得用户可以访问应用所提供的服务。控制器解析用户 输入,并将其转换成合理的模型数据,从而可以进一步由视图展示给用户。 Spring 以一种 抽象的方式实现了控制器概念,这样可以支持不同类型的控制器。Spring 本身包含表单控 制器、命令控制器、向导型控制器等多种多样的控制器。 Spring 控制器架构的基础是 org.springframework.mvc.Controller 接口其代码如下 /** * 演示了Spring mvcZ中的c, 它负责处理请求并返回合适的模型和视图 * Spring MVC实现的基础 就是这三个概念:Mdel、View(ModelAndView)以及 Controller */ public class FirstController implements Controller { // 构造方法,在启动的时候就创建Action,而且常驻内容,注意与Struts Action生命周 期不同 public FirstController(){ System.out.println("---FirstController()---"); } /* * 必须实现接口定义的方法, 类似Servlet中的request,response * */ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("-----handleRequest-----"); request.setAttribute("pass","admin***"); // 与Struts不同,这里返回的是称为ModelView 由Model与View组成, // 呈现的数据可以存储到Model中,Mode作用域的范围默认为request对象 Map model=new HashMap(); model.put("name","admin"); return new ModelAndView("first",model); } } 可以发现 Controller 接口仅仅声明了一个方法,它负责处理请求并返回合适的模型和 视图。 Spring MVC 实现的基础 就是这三个概念: Mdel 、 View ( ModelAndView )以及 Controller。虽然 Controller 接口是完全抽象的,但 Spring 也提供了许多你可能会用到 的控制器。Controller 接口仅仅定义了每个控制器都必须提供的基本功能: 处理请求并返 回一个模型和一个视图 1.1.3. 配置相关 Bean 文件 1.1.4. 案例 1 总结 ? org.springframework.web.servlet.DispatcherServlet: 用来加载配置文 件 (DispatcherServlet.properties) 的前端控制器 , 此类在项目启动的时候初 始化, 约定大于配置的契约式编程支持的保证, org.springframework.web.servlet.handler.BeanNameUrlHandlerMapp ing: 处理 URL 映射的核心类,根据 Bean 的 name 请求一个 Bean,此 URL 处理器是 默认配置. org.springframework.web.servlet.view.InternalResourceView:处理视图资源的核心类, 觉 定字符串返回哪一个视图资源 SpringMVC 执行流程如下: ? ? ? 1.2. 处理器映射 通过处理器映射,可以将 web 请求映射到正确的处理器(handler)上. Spring 内置了 很多处理器映射策略,例如:SimpleUrlHandlerMapping 或者 BeanNameUrlHandlerMapping 1.2.1. BeanNameUrlHandlerMapping(缺省) BeanNameUrlHandlerMapping 是一个简单但很强大的处理器映射,它将收到的 HTTP 请 求映射到 bean 的名称(这些 bean 需要在 web 应用上下文中定义), 要使用 BeanNameUrlHandlerMapping, 无须(如上所示)在 web 应用上下文中定义它。缺 省情况下 , 如果在上下文中没有找到处理器映射 , DispatcherServlet 会为你创建一个 BeanNameUrlHandlerMapping 1.2.2. SimpleUrlHandlerMapping 另一个更加强大的处理器映射是 SimpleUrlHandlerMapping。 它在应用上下文中可以 进行配置,通过与 Action 的 ID 捆绑 firscontroller 1.3. 视图解析器(ViewResolver) 1.3.1. UrlBasedViewResolver SpringWeb 框架的所有控制器都返回一个 ModelAndView 实例. Sprnig 中的视图以名字 为标识, 视图解析器通过名字来解析视图。Spring 提供了多种视图解析器, 当使用 JSP 作 为视图层技术时,就可以使用 UrlBasedViewResolver。这个视图解析器会将视图名解析成 URL,并将请求传递给 RequestDispatcher 来显示视图 ViewResolver 和 View 是 Spring 的视图处理方式中特别重要的两个接口。 ViewResolver 提供了从视图名称到实际视图的映射。 View 处理请求的准备工作,并将该请求提交给某种 具体的视图技术 1.3.2. InternalResourceViewResolver 作为 UrlBasedViewResolver 的子类, 它支持 InternalResourceView(对 Servlet 和 JSP 的包装) , 以及其子类 JstlView 和 TilesView。 通过 setViewClass 方法,可以指定用于该解 析器生成视图使用的视图类 当 返 回 的 视 图 名 为 test 时 , 这 个 视 图 解 析 器 将 请 求 传 递 给 RequestDispatcher , RequestDispatcher 再将请求传递给/WEB-INF/jsp/test.jsp。 1.3.3. Redirect:前缀 尽管使用 RedirectView 帮我们达到了目的,但是如果控制器生成 RedirectView 的话, 控制器不可避免地要知道某个请求的结果是让用户重定向到另一个页面。这不是最佳的实 现,因为这使得系统不同模块之间结合得过于紧密。 其实控制器不应该过问返回结果是如 何生成的,通常情况下,它应该只关心注入给它的视图名称 解决上述问题的方法是依靠 redirect:前缀。 如果返回的视图名包含 redirect:前缀, UrlBasedViewResolver (以及它的子类) 会知道系统要生成一个 HTTP redirect。 视图 名其余的部分会被当作重定向 URL 这样做的最终结果跟控制器返回 RedirectView 是一样的,但现在控制器只需要和逻辑 上的视图名打交道 return new ModelAndView("redirect:/index.jsp"); 1.3.4. Forward:前缀 我 们 也 可 以 使 用 包 含 有 forward: 前 缀 的 视 图 名 。 这 些 视 图 名 会 被 UrlBasedViewResolver 和 它 的 子 类 正 确 解 析 . 解 析 的 内 部 实 现 是 生 成 一 个 InternalResourceView , 这个视图最终会调用 RequestDispatcher.forward() 方法,将 forward 视图名的其余部分作为 URL return new ModelAndView("forward:/index.jsp"); 1.4. 控制器介绍 1.4.1. Controller 接口介绍 控制器的概念是 MVC 设计模式的一部分, 确切地说, 是 MVC 中的 C 应用程序的行为通常 被定义为服务接口, 而控制器使得用户可以访问应用所提供的服务。控制器解析用户输入, 并将其转换成合理的模型数据,从而可以进一步由视图展示给用户。