前言
SpringMVC的核心是前端控制器,关于Springmvc不再介绍。
搭建SpringMVC
第一步:
在web.xml中配置前端控制器
<servlet>
<servlet-name>spitter</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置处理的URL-->
<servlet-mapping>
<servlet-name>spitter</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
默认情况下,DispathcherServlet在加载时会从一个基于这个Servlet名字的XML文件中加载Spring应用上下文,在这个例子中servlet名字是spitter,DispatcherServlet将尝试从一个名为spitter-servlet.xml的文件(位于WEB-INF目录下)来加载应用上下文。
使用/,前端控制器会处理所有请求,包括对静态资源的请求,这会带来一些麻烦。
在Spring的mvc命名空间种包含一个元素,它会处理静态资源的请求
<!--记住在头声明中要添加mvc命名空间-->
<mvc:resources mapping="/resources/**" location="/resources/" />
使用上面的标签标示所有以/resources路径开头的请求都会自动有应用程序跟目录下的/resources目录提供服务
基于注解的Springmvc
DispatcherServlet需要咨询一个或者多个处理器映射器来明确将请求分发给哪个控制器。Spring自带了多个处理器映射实现供我们选择:
- BeanNameUrlHandlerMapping:根据控制器Bean的名字将控制器映射到URL
- ControllerBeanNameHandlerMapping:和BeanNameUrlHandlerMapping类似,根据控制器Bean的名字将控制器映射到URL。使用该处理器映射实现,Bean的名字不需要遵循URL的约定
- ControllerClassNameHandlerMapping:通过使用控制器的类名作为URL基础将控制器映射到URL
- DefaultAnnotationHandlerMapping:将请求映射给使用@RequestMapping注解的控制器和控制器方法
- SimpleUrlHandlerMapping:使用定义在Spring应用上下文的属性集合将控制器映射到URL
如果没到到处理器映射Bean,Dis怕他cherServlet将创建并使用BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping,我们主要使用基于注解的控制器类,也就是DefaultAnnotationHandlerMapping。
DefaultAnnotationHandlerMapping将请求映射到@RequestMapping注解的方法。我们还需要其他的注解进行参数校验与与转换等工作,只需要在spitter-servlet.xml中加入一行配置,就能使用很多其他注解了。它包括了JSR-303校验支持、信息转换、对域格式化的支持。
<mvc:annotation-driven />
在spitter-servlet.xml中添加配置
<!--自动扫描包-->
<context:component-scan base-package="com.nonobank.controller">
这样,在指包中的类就可以使用@Controller标识为一个控制器,就像@Component标识Bean那样。
视图解析器
主要介绍InternalResolverViewResolver视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/WEB-INF/jsp/" />
<!--设置后缀-->
<property name="suffix" value=".jsp" />
</bean>
默认情况下,InternalResourceViewResolve创建的View对象是InternalResourceView的实例,他只会简单的将请求传递给要渲染的JSP,如果使用了JSTL标签,需要设置viewClass属性将InternalResourceView替换为JstlView
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/view/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
配置SpringMVC上下文
ContextLoaderListener是一个Servlet监听器,它能够加载其他的配置文件到一个Spring应用上下文中。在web.xml中添加如下配置
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
接下来需要告诉ContextLoaderListener需要加载哪些配置文件,如果没有指定,上下文加载器会查找/WEB-INF/applicationContext.xml这个Spring配置文件。配置方式如下
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spitter-security.xml
classpath:service-context.xml
classpath:persistence-context.xml
classpath:dataSource-context.xml
</param-value>
</context-param>
contextConfigLocation参数指定了一个路径列表,除非特别声明,路径是相对于应用程序根目录的。
@RequestMapping注解
指定控制器对应的URL路径。默认参数为路径名。如果不指定路径名,则被标注的方法会处理类级别@RequestMapping注解所指定的路径。
params属性指定请求必须包含的参数
method属性指定请求的方法