Spring MVC 入门教程
一、简介
当请求离开浏览器,其旅程的第一站是Spring的DispatcherServlet。与大多数基于Java的Web框架一样,Spring MVC所有的请求都会通过一个前端控制器Serlvet。前端控制器是常用的Web应用程序模式,在这里一个单实例的Serlvet将请求委托给应用程序的其他组件和执行实际的处理。在Spring MVC中,DispatcherServlet就是这个前端控制器。
DispatcherServlet的任务是将请求发给Spring MVC的控制器。控制器是一个用于处理请求的Spring组件。在典型的应用程序中可能会有多个控制器,DispatcherServlet需要知道应该将请求发送给哪个控制器。所以DispatcherServlet会查询一个或多个处理器映射来确定请求的下一站在哪里。处理器映射会根据请求所携带的URL信息来进行决策。
一旦选择了合适的控制器,DispatcherServlet会将请求发给选中的控制器。请求达到控制器,并等待控制器处理信息。
控制器在完成逻辑处理后,通常会产生一些信息,这些信息需要返回给用户并在浏览器上显示。其中,这些信息被称为模型(model)。不过仅仅给用户返回原始信息是不够的,还需要以友好的方式进行格式化,一般为HTML。所以,信息需要发送给一个视图(view),通常为JSP。
控制器所做到最后一件事是将模型数据打包,并且标示出用户渲染输出的视图名称。它接下来会将请求连同模型和视图名称发送回DispatcherServlet。
这样,控制器就不会与特定的视图相耦合,传递给DispatcherServlet的视图名称并不直接表示某个特定JSP。实际上,他设置并不能确定视图就是JSP。相反,它仅仅传递了一个逻辑名,这个名字将会用来查找用来产生结果的真正视图。DispatcherServlet将会使用视图解析器来将视图名匹配为一个特定的视图实现。
既然DispatcherServlet已经知道由哪个视图渲染结果,那么请求的任务基本已经完成。它的最后一站是视图的实现,在这里它将赴模型数据。请求的任务就完成了。视图将使用模型数据渲染输出,并通知这个输出将相应对象传递给客户端。

二、构建Spring MVC 步骤
1、配置核心前端控制器
Spring MVC的核心是DispatcherServlet,这个Servlet充当Spring MVC的前端控制器。与其他Servlet一样,DispatcherServlet必须在Web应用程序的web.xml文件中进行配置。
1 <servlet> 2 <servlet-name>dispatcher</servlet-name> 3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 4 <load-on-startup>1</load-on-startup> 5 </servlet>
为这个Servlet设置<servlet-name>是很重要的。默认情况下,DispatcherServlet在加载时会从一个基于这个Servlet名字的XML文件中加载Spring应用上下文。在这里,因为Servlet的名字为dispatcher,DispatcherServlet将尝试从一个名为dispatcher-servlet.xml的文件来加载应用上下文。
接下来为DispatcherServlet声明将处理哪些URL。这里,常常更倾向于使用如下配置。
1 <servlet-mapping> 2 <servlet-name>dispatcher</servlet-name> 3 <url-pattern>/</url-pattern> 4 </servlet-mapping>
通过将DispatcherServlet映射到 / ,声明了它会作为默认的Servlet并且会处理所有的请求,包括对静态资源的请求。当然Spring提供了一个很方便的配置,使得我们不必过于担心细节。
2、配置处理器
Spring自带多个处理器映射实现可供选择,包括BeanNameUrlHandlerMapping、ControllerBeanNameHandlerMapping、ControllerClassNameHandlerMapping、RequestMappingHandlerMapping、SimpleUrlHandlerMapping。使用这些处理器映射通常只需在Spring中,配置一个Bean。如果没有找到处理器映射Bean,DispatcherServlet将创建并使用BeanNameUrlHandlerMapping和RequestMappingHandlerMapping。由于我们选择使用基于注解方式控制器类,所以RequestMappingHandlerMapping可满足需求。
在实现注解驱动的Spring MVC并不仅仅是将请求映射到方法上,在构建控制器的时候,我么还需要使用注解将请求参数绑定到控制器的方法参数上进行校验以及信息转换。所以,只是用RequestMappingHandlerMapping还不行,还得在配置文件中加入如下配置以提供注解驱动特性:
<mvc:annotation-driven />
3、定义控制器
1 package com.cnblogs.javalouvre.mvc; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.ui.Model; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestMethod; 7 8 @Controller 9 public class HomeController { 10 11 @RequestMapping(value = { "/", "/home" }, method = RequestMethod.GET) 12 public String displayHomePage(Model model) { 13 model.addAttribute("message", "Hello Ketty!!!"); 14 return "home"; 15 } 16 17 }
尽管HomeController比较简单,其中 @Controller注解表明这个类是一个控制器,所以需要在配置文件中加入组件扫描配置
<context:compent-scan />
@RequestMapping注解表明displayHomePage是一个请求处理方法,它知名这个方法要处理“/”或“/home”路径的请求。
4、配置解析视图
处理请求的最后一件事为用户渲染输出,即设定视图实现。实际上,视图解析器的工作是将逻辑视图的名字与org.springframework.web.servlet.View的实现相匹配。在Spring MVC中,大量使用了约定优于配置的开发模式。InternalResourceView就是一个面向约定的元素。它将逻辑视图名称解析为View对象,而将对象渲染的任务委托给Web应用程序上下文中的一个模板(通常为JSP)。
假设我们已经将应用程序的所有JSP放在“/WEB-INF/view”目录下,那么配置如下:
1 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 2 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 3 <property name="prefix" value="/WEB-INF/view/" /> 4 <property name="suffix" value=".jsp" /> 5 </bean>
其中 viewClass 属性指定可处理JSP中使用JSTL标签的视图。
5、配置应用上下文
前面说了,前端控制器会根据规则找到*-servlet.xml,但如果将所有的配置文件写在这个XML文件中,势必会造成文件庞大、臃肿,将用户服务层、持久层、数据源等的配置分开是个好主意。因此,我们需要使用ContextLoaderListener。
1 <listener> 2 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 3 </listener> 4 <context-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value> 7 classpath:applicationContext.xml 8 </param-value> 9 </context-param>
6、处理文件上传
DispatcherServlet本身并不知道如何处理multipart的表单数据,我们需要在一个multipart解析器把POST请求的multipart数据中这样DispatcherServlet就能将其传给我们的控制器来
为了在Spring中注册multipart解析器,我们需要声明一个实现了MultipartResolver接口的Bean。配置如下
1 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 2 <property name="maxUploadSize" value="500000" /> 3 </bean>
要注意的是,multipart解析器的Bean ID是有意义的。当DispatcherServlet查找multipart解析器的时候,它将会查找ID为multipart的解析器Bean,如果multipart解析器是其他的ID的话,DispatcherServlet将会忽略它。
薔薇猛虎皆成個性,陽光雨露俱是天恩!
浙公网安备 33010602011771号