SpringMVC注解与XML配置解析

本文最后更新于:1 年前

SpringMVC注解解析

@RequestMapping

@RequestMapping 注解用于建立请求 URL 和处理请求方法之间的对应关系。(将请求虚拟地址映射到具体的方法上)

使用位置

类上

请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。

方法上

请求 URL 的第二级访问目录,与类上的使用 @ReqquestMapping 标注的一级目录一起组成访问虚拟路径。

属性

value

用于指定请求的URL,它和path属性的作用是一样的。

  • method

    用于指定请求的方式。

params

用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。

  • params = {“username”},表示请求参数必须有username

  • params = {“moeny!100”},表示请求参数中money不能是100

组件扫描

SpringMVC 基于 Spring 容器,所以在进行 SpringMVC 操作时,需要将 Controller 存储到 Spring 容器中,如果使用 @Controller 注解标注的话,就需要使用 <context:component-scan base-package=“cc.gaojie"/> 进行组件扫描。

组件扫描的另一种方式(不常用):

1
2
3
4
5
<!--Controller的组件扫描-->
<context:component-scan base-package="cc.gaojie">
<!--表示只扫描 cc.gaojie 包下的 Controller 注解-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
1
2
3
4
5
<!--Controller的组件扫描-->
<context:component-scan base-package="cc.gaojie">
<!--表示扫描 cc.gaojie 包下除 Controller 外的注解-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

SpringMVC的XML配置解析

视图解析器

Spring提供了多个视图解析器:

  • InternalResourceViewResolver(默认)
  • UrlBasedViewResolver

SpringMVC有默认组件配置,默认组件都是在DispatcherServlet.properties配置文件中配置的,该配置文件地址为 org/springframework/web/servlet/DispatcherServlet.properties,该文件中配置了默认的视图解析器 InternalResourceViewResolver,如下:

1
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

翻看该解析器源码,可以看到该解析器的默认设置,如下:

重定向与转发前缀

转发前缀(默认值)

我们在跳转时, return "succes.jsp" 中省略了默认缺省的 forward: 转发前缀,表示通过请求转发的方式加载视图文件,访问时地址不变,依然为 …/quick

重定向前缀

重定向前缀为:redirect: ,表示通过重定向的方式加载视图文件,访问时地址改变为 …/success.jsp

image-20220402160008336

自定义视图前后缀

如上图所示,当资源都在同一文件夹下时,每次转发或重定向都需要手动指定文件夹和扩展名,比较麻烦。我们可以自己配置内部资源视图解析器,自定义视图的前后缀。

InternalResourceViewResolver配置

在 spring-mvc.xml 中配置内部资源视图解析器,通过属性注入的方式修改视图的的前后缀:

1
2
3
4
5
6
<!--配置内部资源解析器-->
<bean id="viewResolve" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--跳转时自动拼接前缀和后缀: /jsp/+...+.jsp -->
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

跳转时省略前缀和后缀:

1
2
3
4
5
6
@RequestMapping(value = "/quick", method = RequestMethod.GET, params = {"username"})
public String sava() {
System.out.println("Controlle/jsp/+...+.jspr save running……");
//在跳转时省略前缀和后缀----/jsp/success.jsp
return "success";
}

UrlBasedViewResolver配置

UrlBasedViewResolver配置方法与InternalResourceViewResolver相同,只不过 UrlBasedViewResolver 需要依赖 jstl依赖。

  1. 添加JSTL的依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
    </dependency>
  2. 配置视图解析器

    1
    2
    3
    4
    5
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
    </bean>

处理器映射器

不同的处理器映射器对URL处理的方式也不相同,使用对应的处理器映射器之后我们的前端请求规则也需要发生相应的变化

SpringMVC提供的处理器映射器:

  • BeanNameUrlHandlerMapping 根据控制器的ID访问控制器
  • SimpleUrlHandlerMapping 根据控制器配置的URL访问(默认)

在SpringMVC的配置文件中通过bean标签声明处理器映射器;

  • 配置BeanNameUrlHandlerMapping

    1
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
  • 配置SimpleUrlHandlerMapping

    1
    2
    3
    4
    5
    6
    7
    8
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
    <props>
    <prop key="/aaa">bookController</prop>
    <prop key="/bbb">studentController</prop>
    </props>
    </property>
    </bean>