DispatcherServlet 简介及配置

2016-11-17 17:03:23   最后更新: 2016-11-17 17:03:23   访问数量:463




上一篇日志中,我们介绍了 Spring MVC 的基本概念及执行流程,并创建了最基本的 hello world 项目

Spring MVC 简介及 Hello World 项目创建

上篇日志中介绍了一个非常重要的组件 -- DispatcherServlet,并且在 web.xml 中创建了默认的 DispatcherServlet 的配置

本篇日志中,我们就来介绍一下 Spring3.0 以后支持的通过 java 代码来配置 DispatcherServlet 的配置方法

 

我们已经知道,DispatcherServlet 最重要的工作是接收请求并转发给特定的 Controller,因此首先需要配置的是 url 映射

DispatcherServlet 启动时,会创建 Spring 应用上下文,并加载配置文件或配置类中所声明的 bean,因此我们需要在 DispatcherServlet 的配置中指定 bean 所在的配置文件或 java Configuration 类,这些 bean 包含 web 组件的 bean,如 Controller、视图解析器及处理器映射

在 Spring Web 应用中,还会有另一个应用上下文,用来加载驱动应用后端的中间层和数据层组件的其他 bean,这些 bean 由 ContextLoaderListener 创建的应用上下文来加载

 

XML 配置

上述配置在上一篇日志中有相应的介绍(web.xml):

<!-- Handles all requests into the application --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:ApplicationContext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>appServlet</servlet-name> <!-- 定义 DispatcherServlet --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/ServletContext.xml</param-value> <!-- Servlet 的配置文件 --> </init-param> <load-on-startup>1</load-on-startup> <!-- 启动优先级,为 1 则与 Sevletp 容器一起启动 --> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> <!-- 拦截 URL 模式(此处拦截所有 URL) --> </servlet-mapping>

 

 

如上所述,我们在 DispatcherServlet 配置中加载了两个应用上下文配置,分别是 Spring 应用上下文 ApplicationContext.xml 以及 Spring Web 项目中需要使用的另一个上下文配置:ServletContext.xml

 

当我们需要启动 spring mvc 的供能时,只需要在 ServletContext.xml 中写入:

<mvc:annotation-driven/>

 

 

Java 代码配置

Spring3.1 提供了使用 java 代码来进行上述配置,这可能是更加易于理解的方式

 

  • DispatcherServlet 初始化配置

Spring 会扫描整个工程,并将所有扩展了 AbstractAnnotationConfigDispatcherServletInitializer 的类都自动配置为 DispatcherServlet 和 Spring 应用上下文配置,因此,我们首先需要做的就是创建配置类并继承 AbstractAnnotationConfigDispatcherServletInitializer,当然, 类名我们可以任意取

package com.techlog.test.configuration; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; /** * DispatcherServlet 初始化配置 * Created by techlog on 2016/11/17. */ public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { /** * @return Spring 应用上下文配置类 */ @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; } /** * @return Servlet Web 上下文配置类 */ @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { WebConfig.class }; } /** * @return 匹配的 URL 模式 */ @Override protected String[] getServletMappings() { return new String[] { "/" }; } }

 

 

  • Servlet Web 上下文配置

接下来,我们来创建上面用到的 WebConfig.class

package com.techlog.test.configuration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /** * Web 组件 Bean 配置 * Created by techlog on 2016/11/17. */ @Configuration @EnableWebMvc @ComponentScan("com.techlog.test") public class WebConfig extends WebMvcConfigurationSupport { @Override protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }

 

 

@EnableWebMvc 注解与上文提到的 <mvc:annotation-driven/> 功能是一样的

@ComponentScan 注解则与 <context:component-scan base-package="com.techlog.test"/> 的功能是一样的

接下来我们只要在 WebConfig 中加入我们需要的 Bean 声明即可,可以参考:

spring 实现基本 xml 配置注解化

 

我们重写了 configureDefaultServletHandling 方法,这个方法是用来指定处理静态资源请求的 Servlet 的,我们调用 configurer.enable() 方法将对静态资源的请求转发到 Servlet 容器中默认的 Servlet 处理而不是使用 DispatcherServlet 本身来处理这些请求

 

  • Spring 应用上下文配置

接下来,我们需要创建 Spring 应用上下文配置类 RootConfig.class

package com.techlog.test.configuration; 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; /** * Spring 应用上下文配置 * Created by techlog on 2016/11/17. */ @Configuration @ComponentScan(basePackages = "com.techlog.test", excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) }) public class RootConfig { }

 

 

RootConfig 中我们就可以创建和定义 Spring 应用所需要的 Bean 了,同时,我们在 @ComponentScan 注解的属性中配置排除了对所有 WebMVC 配置的扫描

 

接下来,与上一篇日志中一样,我们还是来创建一个 Hello World 页面

首先,在 WebConfig 配置中,我们需要加入 jsp 配置的 Bean:

@Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/view/"); resolver.setSuffix(".jsp"); resolver.setExposeContextBeansAsAttributes(true); return resolver; }

 

 

然后我们创建一个 Controller:

package com.techlog.test.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * 用于测试 Controller * Created by techlog on 2016/11/17. */ @Controller public class TestController { @RequestMapping("/home") public String home() { return "home"; } }

 

他与上一篇日志中创建的 Controller 是一样的

 

最后,只需要在 /WEB-INF/view/ 目录下创建我们的 home.jsp:

<html> <body> <h1>Hello World!</h1> </body> </html>

 

 

用 tomcat 启动我们的项目,访问 http://localhost:8080/home 就可以看到 Hello World! 页面了

 

<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.techlog.test</groupId> <artifactId>springtest</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>springtest Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <maven.compiler.plugin.version>3.5.1</maven.compiler.plugin.version> <spring.version>4.2.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</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-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgument>-parameters</compilerArgument> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> <version>${maven.compiler.plugin.version}</version> </plugin> </plugins> </build> </project>

 

 






技术帖      controller      mvc      config      龙潭书斋      java      spring      springmvc      jsp      servlet      dispatcherservlet     


京ICP备15018585号