maven的web项目:SpringMVC的配置

本文介绍了SpringMVC的配置方法,包括Java配置、XML配置和两者混合的配置方式。详细讲解了DispatcherServlet如何处理请求,以及SpringMVC中的两个应用上下文作用。提供了GitHub上的完整配置示例链接。

    要想理解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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值