在我的上篇博客中《Spring MVC简介》中,我们做了一个特别简单的项目,来大概描述了一下Spring MVC的原理和处理请求的流程,但是我们是通过让controller包下的类通过实现Controller接口来实现的控制器,这个控制器可以处理单一的请求
但是如果我们有多个请求的话,就需要创建多个类来继承Controller接口,这就比较复杂,所以在实际开发中我们推荐使用 注解 来进行开发
Spring MVC常用注解
@Controller
注解
如果有多个请求,需要在springmvc.xml文件中配置多个映射关系,并且还需要建立多个JavaBean作为控制器来进行请求的处理。若业务复杂,这样并不合适。最常用的解决方式是使用Spring MVC提供的一键式配置方法<mvc:annotation-driven/>
,通过注解的方式来进行Spring MVC开发,配置此标签后Spring MVC会帮助我们自动做一些注册组件之类的事情。
我们修改之前的springmvc.xml的配置文件
我们将之前的配置的和URL请求同名的那个Bean删除后对后续的代码做如下修改:
新增两句:
<context:component-scan base-package="com.westos"/>
<mvc:annotation-driven/>
对视图解析器进行修改
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/ch06/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
完整的springmvc.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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/spring-mvc.xsd
">
<context:component-scan base-package="com.westos"/>
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/ch06/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
<mvc:annotation-driven/>
配置该标签会自动注册 处理器映射器 和 处理器适配器 两个Bean,Spring MVC需要通过这两个Bean来实现对@Controller
和@RequestMapping
等注解的支持,从而找出URL与handler method的关系并予以关联。换言之,完成在Spring容器中这两个Bean的注册是Spring MVC为控制器分发请求的必要支持<context:component-scan base-package="com.westos"/>
配置该标签是对包进行扫描,实现注解驱动Bean的定义,同时将Bean自动注入容器中使用,也就是标注了Spring MVC注解的Bean生效,如果没有此标签,那么标注@Controller的Bean仅仅是一个普通的JavaBean,而不是一个可以处理请求的控制器- 在视图解析器中我们添加了前缀和后缀,这样可以将控制器方法返回的的逻辑视图名称渲染为物理视图
在完成对springmvc.xml的修改后,我们将controller包下的类进行相应的修改
package com.westos.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping(value = "/hello")
public ModelAndView hello(){
System.out.println("Hello Annptation Spring MVC");
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "注解实现Spring MVC程序");
mv.setViewName("first");
return mv;
}
}
至此项目修改完成,我们可以启动项目,因为之前的Tomcat已经配置完成,所以我们不需要对Tomcat进行修改,直接将项目发布即可
但是遇到了问题index.jsp界面正常
但当请求hello时发生了错误
后来经过在网上查阅相关解决方法得知是springmvc.xml文件的头部关于mvc的相关配置信息有误,我们将springmvc.xml之前的
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/spring-mvc.xsd
修改为
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
修改后将项目再次发布
index.jsp界面成功,请求hello
测试成功
在上述代码中,使用@Controller
注解对HelloController类进行标注,使其成为一个可以处理http请求的控制器;使用@RequestMapping
注解映射一个请求的处理方法,来对hello()
方法进行标注,确定hello()
对应的URL,如果我们还需要添加其他请求直接在HelloController类下添加方法即可 ,当然方法需要使用@RequestMapping
注解来标注
@RequestMapping
注解
Spring通过@Controller
注解找到相应的控制器类后需要知道控制器内部对每一个请求是如何处理的,这就需要 @RequestMapping
注解, @RequestMapping
注解的作用是为控制器指定可以处理哪些URL请求,该注解可以标注在一个方法或者一个类上
标注在类上时,该类的所有方法都将映射为相对于类级别的请求;标注在方法上时,该方法将成为一个处理请求处理方法
我们对之前的HelloController类进行修改
package com.westos.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value = "/hhh")
public class HelloController {
@RequestMapping(value = "/hello")
public ModelAndView hello(){
System.out.println("Hello Annptation Spring MVC");
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "注解实现Spring MVC程序");
mv.setViewName("first");
return mv;
}
}
修改完成后发布项目
直接请求hello
报错,我们需要在hello请求前面加上hhh
访问成功,这就是在类上和方法上加 @RequestMapping
注解的区别
当然 @RequestMapping
注解不只有value这一个参数,详解如下
- value属性
该属性是@RequestMapping
注解的默认属性,因此如果有唯一的value属性的话,可以省略属性名,用来映射处理请求的方法,但如果超过一个属性,就需要写上属性名 - method属性
该属性用来指示方法仅仅处理哪些http请求,可以支持一个或多个请求方式