为什么80%的码农都做不了架构师?>>>
一、传统方式配置Spring MVC
(1)导入jar包
需要导入如下的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
(2)配置web.xml
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/"。
(3)配置springMVC-servlet.xml
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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://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
(1)在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>
三、知识扩展
(1)重要的接口和类介绍
DispatcherServlet:前置控制器,默认会接收全部请求。
HandlerMapping接口:用于处理请求的映射。
DefaultAnnotationHandlerMapping:HandlerMapping接口的实现,用于把一个URL映射到具体的Controller类上。
HandlerAdapter接口:用于处理请求到Action的映射。
AnnotationMethodHandlerAdapter:HandlerAdapter接口的适配器,用于把一个URL请求映射到对应Controller类的Action上。
ViewResolver接口:用于解析View。
InternalResourceViewResolver:ViewResolver接口的实现,用于把ModelAndView的逻辑视图名解析为具体的View。