要想理解SpringMVC的配置,首先要理解SpringMVC处理请求的原理:
1️⃣请求离开浏览器之后,第一站会来到DispatcherServlet,然后DispatcherServlet会查询一个或多个处理器映射,然后根据映射将请求任务发送给SpringMVC的控制器(通常用注解@Controller标识的类)。
2️⃣控制器处理完成之后,会有需要返回给用户的信息,这些信息称为模型,控制器要的最后一件事是将模型数据打包,并标出用于渲染输出的视图名,接下来控制器会将模型和逻辑视图名发送回DispatcherServlet(这样控制器就不会和特定的视图相耦合)。
3️⃣DispatcherServlet会使用视图解析器(view resolver)将逻辑视图名匹配为一个特定的视图实现(jsp或其他);
4️⃣视图将模型数据渲染输出,这个输出会通过响应对象传递给客户端。
SpringMVC通常会用到两个应用上下文,DispatcherServlet和ContextLoaderListener:
DispatcherServlet加载包含web组件的bean:处理器映射、控制器、视图解析器;
ContextLoaderListener负责加载应用中其他bean:这些bean通常是驱动后端的中间层和数据层组件。
配置SpringMVC有三种方式: Java配置(不使用web.xml)、XML配置(web.xml读取基于xml的配置方案)、通过xml和Java混合配置(web.xml读取基于java的配置方案)
完整的配置在github上:
https://github.com/hefrankeleyn/learning-area/tree/master/006Spring/springmvc-conf-java
https://github.com/hefrankeleyn/learning-area/tree/master/006Spring/springmvc-conf-xml
https://github.com/hefrankeleyn/learning-area/tree/master/006Spring/springmvc-conf-xml-java
首先引入maven:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>4.3.18.RELEASE</spring.version>
<aspectj.version>1.9.2</aspectj.version>
<javaee-api.version>7.0</javaee-api.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- spring 的核心容器: Beans、Core、 Context、 Expression、 Context support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- AspectJ Spring AOP中要使用AspectJ的切点表达式语言来定义切点 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!-- spring webmvc-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--
用于解决: Error:(19, 8) java: 无法访问javax.servlet.ServletException
找不到javax.servlet.ServletException的类文件
-->
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>${javaee-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- spring 测试-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
方案一:Java的配置方式:
通过继承 AbstractAnnotationConfigDispatcherServletInitializer来定义webAppInitializer
/**
* 通过 Java配置两个 Spring上下文: DispatcherServlet 和 ContextLoadListener
* 跟踪SpringMVC的请求
*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 这个方法使用来配置 ContextLoadListener
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
/**
* 这个方法是用来配置 DispatcherServlet
* @return 返回带有@Configuration 注解的类
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
/**
* DispatcherServlet 的映射,将DispatcherServlet映射到“/”
* @return 返回带有@Configuration 注解的类
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
WebConfig,用来配置DispatcherServlet
/**
* 启动组件扫描
* 启动SpringMVC
*/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"config"})
public class WebConfig extends WebMvcConfigurerAdapter {
/**
* 配置视图解析器
* @return
*/
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
/**
* 配置静态资源处理器
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
RootConfig, 用来配置 ContextLoadListener
@Configuration
@ComponentScan(basePackages = {"com.hef"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}
方案二:XML的配置方案,web.xml 读取基于xml的配置方案
第一步:配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 设置根上下文配置位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/root-context.xml</param-value>
</context-param>
<!-- 注册ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 注册DispatcherServlet
如果不指定初始化参数,DispatcherServlet会根据 servlet的名字找到一个文件,并给予该文件加载应用上下文
因此,这里如果不配置初始化参数,DispatcherServlet 会从 /WEB-INF/appServlet-context.xml 文件中
加载其应用上下文。
配置初始化参数的时候一定注意顺序,将 init-param 放在 load-on-startup 上面
-->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第二步:配置root-context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
第三步:配置servelt-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
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">
<annotation-driven/>
<context:component-scan base-package="com.hef"/>
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/"/>
<beans:property name="suffix" value=".jsp"/>
</beans:bean>
<resources mapping="/resources/**" location="/resources/"/>
<!--
<view-controller path="/" view-name="home"/>
-->
</beans:beans>
方案三:web.xml 读取基于Java的Spring配置
步骤一:配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 使用基于Java的配置 -->
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.hef.config.RootConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.hef.config.WebConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
步骤二:配置RootConfig.java
package com.hef.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(basePackages = {"com.hef.controller"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}
步骤三:配置WebConfig.java
package com.hef.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.hef.config")
public class WebConfig extends WebMvcConfigurerAdapter {
/**
* 配置视图解析器
* @return
*/
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("WEB-INF/views/");
viewResolver.setSuffix(".jsp");
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
/**
* 配置静态资源处理器
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
本文介绍了SpringMVC的配置方法,包括Java配置、XML配置和两者混合的配置方式。详细讲解了DispatcherServlet如何处理请求,以及SpringMVC中的两个应用上下文作用。提供了GitHub上的完整配置示例链接。
981

被折叠的 条评论
为什么被折叠?



