web.xml的配置
<!-- 配置前端控制器 前端控制器(DispatcherServlet)--> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- ContextconfigLocation配置springmvc加载的配置文件 适配器、处理映射器等 --> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/classes/spring/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <!-- 1、.action访问以.action结尾的 由DispatcherServlet进行解析 2、/,所有访问都由DispatcherServlet进行解析 --> <url-pattern>/</url-pattern> </servlet-mapping>
在<servlet-mapping>中url如果是.action,前端控制器就只会拦截以.action结尾的请求,并不会理会静态的文件。对静态页面的控制就要通过其他的手段。以/作为url的话就会拦截所有的请求,包括静态页面的请求。这样的话就可以拦截任何想要处理的请求,但是有一个问题。如果拦截了所有的请求,如果不在拦截器中做出相应的处理那么所有静态的js、css以及页面中用到的图片就会访问不到造成页面无法正常显示。但这可以通过静态资源的配置来解决这个问题。
配置spring容器: <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/classes/spring/applicationContext-*.xml</param-value></context-param> 其中applicationContext-*.xml包含3个配置文件,是springIoC容器的具体配置。后面会提到。 配置一个监听器: <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener> web.xml的完整配置是这样的: <?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <!-- 404错误拦截 --> <error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page> <!-- 500错误拦截 --> <error-page> <error-code>500</error-code> <location>/error500.jsp</location> </error-page> <!-- 加载spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/classes/spring/applicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置前端控制器 --> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- ContextconfigLocation配置springmvc加载的配置文件 适配器、处理映射器等 --> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/classes/spring/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <!-- 1、.action访问以.action结尾的 由DispatcherServlet进行解析 2、/,所有访问都由DispatcherServlet进行解析 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 解决post乱码问题的过滤器 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>welcome.jsp</welcome-file> </welcome-file-list></web-app> 看到配置文件中多了两块内容,一个是error page是用来友好的处理错误的,可以使用错误代码来区别并跳转到相应的处理页面。这段配置代码最好放到最前面,在前端控制器拦截之前处理。 还有一块内容是一个解决post乱码问题的过滤器,拦截post请求并编码为utf8。 springmvc.xml的配置 视图解析器的配置: <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 使用前缀和后缀 --> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property></bean> 在Controller中设置视图名的时候会自动加上前缀和后缀。 Controller的配置 自动扫描方式,扫描包下面所有的Controller,可以使用注解来指定访问路径。 <!-- 使用组件扫描的方式可以一次扫描多个Controller --><context:component-scan base-package="com.wxisme.ssm.controller"> 也可以使用单个的配置方式,需要指定Controller的全限定名。 <bean name="/queryUser.action" class="com.wxisme.ssm.controller.Controller1"/> 配置注解的处理器适配器和处理器映射器: <!-- 注解的处理器适配器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/><!-- 注解的处理器映射器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 也可以使用下面的简化配置: <!-- 配置注解的处理器映射器和处理器适配器 --><mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> 配置拦截器,可以直接定义拦截所有请求,也可以自定义拦截路径。 <mvc:interceptors> <!-- 直接定义拦截所有请求 --> <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean> <!-- <mvc:interceptor> 拦截所有路径的请求 包括子路径 <mvc:mapping path="/**"/> <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean> </mvc:interceptor> --> </mvc:interceptors> 配置全局异常处理器 <!-- 定义全局异常处理器 --> <!-- 只有一个全局异常处理器起作用 --> <bean id="exceptionResolver" class="com.wxisme.ssm.exception.OverallExceptionResolver"></bean> 配置文件上传数据解析器,在上传文件时需要配置。 <!--配置上传文件数据解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>9242880</value> </property> </bean> 还可以配置一些自定义的参数类型,以日期类型绑定为例。 <!-- 自定义参数类型绑定 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <!-- 日期类型绑定 --> <bean class="com.wxisme.ssm.controller.converter.DateConverter"/> </list> </property> </bean> 上面提到过如果在配置前端控制器时拦截了所有的请求,不做特殊处理就会导致部分静态资源无法使用。如果是这种情况就可以使用下面的配置来访问静态资源文件。 <mvc:resources mapping="/images/**" location="/images/" /><mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" /><mvc:resources mapping="/imgdata/**" location="/imgdata/" /> 也可以使用默认,但是需要在web.xml中配置。 <!-- 访问静态资源文件 --> <!-- <mvc:default-servlet-handler/> 需要在web.xml中配置--> 完全可以不拦截所有路径,大可避免这个问题的发生。 完整的配置大概是这样的,需要注意xml文件的命名空间,有时候会有影响的。 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:jee="http://www.springframework.org/schema/jee"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 使用前缀和后缀 --> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- 使用组件扫描的方式可以一次扫描多个Controller --> <context:component-scan base-package="com.wxisme.ssm.controller"> </context:component-scan> <!-- 配置注解的处理器映射器和处理器适配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 自定义参数类型绑定 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <!-- 日期类型绑定 --> <bean class="com.wxisme.ssm.controller.converter.DateConverter"/> </list> </property> </bean> <!-- 访问静态资源文件 --> <!-- <mvc:default-servlet-handler/> 需要在web.xml中配置--> <mvc:resources mapping="/images/**" location="/images/" /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/imgdata/**" location="/imgdata/" /> <!-- 定义拦截器 --> <mvc:interceptors> <!-- 直接定义拦截所有请求 --> <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean> <!-- <mvc:interceptor> 拦截所有路径的请求 包括子路径 <mvc:mapping path="/**"/> <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean> </mvc:interceptor> --> </mvc:interceptors> <!--配置上传文件数据解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>9242880</value> </property> </bean> <!-- 定义全局异常处理器 --> <!-- 只有一个全局异常处理器起作用 --> <bean id="exceptionResolver" class="com.wxisme.ssm.exception.OverallExceptionResolver"></bean> </beans>