一、传统方式配置Spring MVC
需要导入如下的jar包
junit-3.8.1.jar
spring-core-3.0.5.RELEASE.jar
commons-logging-1.1.1.jar
spring-context-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-aop-3.0.5.RELEASE.jar
aopalliance-1.0.jar
spring-tx-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
spring-webmvc-3.0.5.RELEASE.jar
jstl-1.2.jar
servlet-api-2.5.jar
jsp-api-2.1.jar
web.xml中完整代码如下所示:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Spring3mvc</display-name> <!-- 添加spring3控制器及映射规则 --> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <!-- 默认跳转到根目录下的页面,在这里为index.jsp --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
配置介绍:
关于<servlet-name>springMVC</servlet-name>
此项配置用于配置对应的Servlet的配置文件的名称,具体规则为“servlet-name的标签值-servlet.xml”,如本示例会对应一个“springMVC-servlet.xml”的配置文件。
如果想打破这种默认约定,可以参照如代码段进行配置:
<!-- 添加spring3控制器及映射规则 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springservlet-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
其中,“classpath:”代表根路径是类路径。
关于<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
此项配置用于配置前置控制器,默认由前置控制器接收所有的请求,然后调用相应的Controller和Action,解析和渲染指定的视图并返回相应。
关于<load-on-startup>1</load-on-startup>
此项配置用于配置启动顺序,正常的取值范围是:负整数、0-5。
当为正数时,数值越小,优先级越高。
1代表让这个Servlet随Servletp容器一起启动。
关于<url-pattern>/</url-pattern>
此项配置用于配置servlet路径请求映射。
“/”:代表servlet路径是请求URL去掉context路径,且路径信息为null。
“/xxx”:代表以“/xxx结尾的路径映射”。
“*.xxx”:代表以“xxx”结尾的扩展名映射。如*.do、*.jsp、*.html。如果配置为多项,可以用英文逗号隔开。
“”:用于指定精确映射应用程序contextroot的URL模式。如:http://ip:port/contextroot/
<param-value>/WEB-INF/applicationContext.xml</param-value>
applicationContext.xml是spring的配置文件,常用“applicationContext+名称.xml”的方式来进行命名。
此项配置用于配置applicationContext.xml的路径。
关于存放路径的问题
常见的存放路径有两个,一个是类路径,一个是WEB-INF目录下。
类路径的示例:<param-value>classpath:springservlet-config.xml</param-value>
WEB-INF路径示例:<param-value>/WEB-INF/springservlet-config.xml</param-value>
在有些情况下,xml文件默认是存放在WEB-INF中,所以在配置中可以省略"/WEB-INF/"。
spring-servlet.xml这个名字是因为上面web.xml中<servlet-name>标签配的值为spring
<servlet-name>spring</servlet-name>
命名规则为:<servlet-name>的标签值-servlet.xml
如果改为如下:
<servlet-name>springmvc</servlet-name>
则对应的文件名则为springmvc-servlet.xml。
spring-servlet.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.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" > <!-- 默认的注解映射的支持 --> <mvc:annotation-driven/> <!-- 静态资源映射 --> <mvc:resources mapping="/js/**" location="/WEB-INF/js/" /> <mvc:resources mapping="/css/**" location="/WEB-INF/css/" /> <mvc:resources mapping="/fonts/**" location="/WEB-INF/fonts/" /> <mvc:resources mapping="/plugins/**" location="/WEB-INF/plugins/" /> <mvc:resources mapping="images/**" location="/WEB-INF/images/" /> <!-- 当上面要访问的静态资源不包括在上面的配置中时,则根据此配置来访问 --> <mvc:default-servlet-handler/> <!-- 开启controller注解支持 --> <!-- use-default-filters="false" 只扫描指定的注解 --> <context:component-scan base-package="com.uni2uni.action" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="contentType" value="text/html"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
配置介绍:
a.关于<mvc:annotation-driven/>
此项配置用于开启默认注解的支持。它等效于如下配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
b.关于配置静态资源映射
<mvc:default-servlet-handler/>这行代码用于配置静态资源映射,它等效于如下配置:
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/> <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/> <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>
当实际项目中有新增的配置时,就需要根据实际情况进行扩展了。
c.关于配置注解扫描
<context:component-scan></context:component-scan>用于配置扫描指定包中类中声明的注解。
配置注解扫描的配置方式如下所示:
<context:component-scan base-package="要扫描的包的包名" ></context:component-scan>
常用的注解有:
@Controller
声明Action组件
@Service
声明Service组件
@Repository
声明Dao组件
@Component
泛指组件。
@RequestMapping("/menu")
请求映射
@Resource
用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName")
@Autowired
用于自动化注入,(srping提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class})
事务管理
@ResponseBody
将HTTP请求正文转换为适合的HttpMessageConverter对象。
@Scope("prototype")
设定bean的作用域
如果是多个包名,可以用英文逗号隔开;
可以用*来进行包名的匹配,如com.uni2uni.*;
本例中“use-default-filters”属性默认为true。此时,会扫描指定包下所有的@Component类,并注册成bean。
当不需要扫描这么大粒度的包时,可以将此属性设置为false,并使用<context:exclude-filter>和<context:include-filter>标签指定要排除的或包括的类型。
use-default-filters="false"的情况下,<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描。
d.关于配置视图解析
在本例中,设定视图的路径为”WEB-INF/views“,视图文件的后缀名为”.jsp“。
关于配置视图解析及使用了解即可,后续会详细介绍。
二、Maven方式配置Spring MVC
pom.xml完整代码如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.uni2uni.myapp</groupId> <artifactId>testspring</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>testspring Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-asm</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>3.0.5.RELEASE</version> </dependency> <!-- end spring 核心依赖包 --> <!-- start spring mvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- START SERVLET --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>testspring</finalName> </build> </project>
三、知识扩展
DispatcherServlet:前置控制器,默认会接收全部请求。
HandlerMapping接口:用于处理请求的映射。
DefaultAnnotationHandlerMapping:HandlerMapping接口的实现,用于把一个URL映射到具体的Controller类上。
HandlerAdapter接口:用于处理请求到Action的映射。
AnnotationMethodHandlerAdapter:HandlerAdapter接口的适配器,用于把一个URL请求映射到对应Controller类的Action上。
ViewResolver接口:用于解析View。
InternalResourceViewResolver:ViewResolver接口的实现,用于把ModelAndView的逻辑视图名解析为具体的View。