第十二篇:Spring MVC的核心类和注解
前言
spring2.5之前,只能使用实现Controller接口的方式来开发一个控制器,如第十一篇。在spring2.5之后,新增了基于注解的控制器以及其他一些常用的注解。
1、前端控制器(DispatcherServlet)
DispatcherServlet全名org.springframework.web.servlet.DispatcherServlet,在程序中充当前端控制器。
---------------------------------------项目名\WebContent\WEB-INF\web.xml---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0">
<servlet>
<!-- 配置前端过滤器 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 初始化时加载配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!-- 表示容器在启动时立即加载Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
解说:(两个都是可选元素,即可有可无,使用根据实际情况来)
<init-param>:如果存在且通过子元素配置了spring mvc路径,则应用程序启动时会加载配置路径下的配置文件,在这里即springmvc-config.xml。如果没有<init-param>则默认去WEB-INF下面找如下方式命名的配置文件(servletName-servlet.xml,-servlet.xml固定写法)。
<load-on-startup>1</load-on-startup>,如果为1则在应用程序启动时立即加载该Servlet,否则应用程序会在第一个Servlet请求时加载该Servlet。
2、控制器(Controller)注解类型
org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,其注解形式:@Controller。
该注解不需要通过实现接口方式来实现。步骤一:直接把注解@Controller 添加到相应类;步骤二:在配置文件中开启注解使注解生效;步骤三加入相应jar包即可,如运行时依赖spring的AOP的jar包spring-aop-4.3.6.RELEASE.jar;
--------------------开启注解,使注解生效(一般情况下spring mvc配置文件为springmvc-config.xml)--------------------
<!-- 指定需要扫描的包 -->
<context:component-scan base-package="com.itheima.controller" />
3、@RequestMapping注解的使用
@RequestMapping(value="/firstController")与@RequestMapping("/firstController")一样(后者意思:其所有属性都是可选,只有唯一默认value时可以省略value)
3.1、原由:spring通过@Controller方式找到spring类后,还需要知道控制器内部对每个请求是如何处理的,即需要注解@RequestMapping。
3.2、使用:@RequestMapping注解可以标注在一个方法或一个类上,当然两者含义也不同。
- 标注在类上:该类的所有方法都将映射为相对于类级别的请求,输入网址链接http://localhost:8080/项目名/@RequestMapping注解中value值这里即/helllo。如http://localhost:8080/项目名/helllo/firstController
- 标注在方法上:该方法将成为一个请求处理方法,它会在程序中接收对应的URL请求时被调用。如http://localhost:8080/项目名/firstController
package com.itheima.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 控制器类
*/
@Controller
@RequestMapping(value="/hello")//标注在类上
public class FirstController{
@RequestMapping(value="/firstController")//标注在方法上
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) throws Exception {
// 向模型对象中添加数据
model.addAttribute("msg", "这是我的第一个Spring MVC程序");
// 返回视图页面
return "first";
}
}
3.3、@RequestMappin注解属性
属性名 | 类型 | 描述 |
name | String | 可选属性,用于为映射指定别名 |
value | String[] | 可选属性,标注在一个类或一个方法上,说明在上面2 |
method | RequestMothod[] | 可选属性,用于指定该方法处理那种类型的请求方式。请求方式:GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE和TARCE。使用如RequestMothod.GET。当然也支持多个请求方式,通过{}写成数组的形式,请求方式与请求方式之间用逗号(,)分开 |
params | String[] | 可选属性,用于指定Request中必须包含某些参数值,才能通过该方法处理请求 |
headers | String[] | 可选属性,用于指定Request中必须包含某些指定的header的值,才能通过该方法处理请求 |
consumes | String[] | 可选属性,用于指定处理请求的提交内容的类型(Content-type),比如application/json、 text/html等 |
produces | String[] | 可选属性,用于指定返回内容类型,返回内容类型必须是request请求头(Accept)中所包含的类型 |
4 、组合 注解
- @GetMapping,匹配GET方式请求
- @PostMapping,匹配POSt方式请求
- @PutMapping,匹配PUT方式请求
- @DeleteMapping,匹配DELETE方式请求
- @PatchMapping,匹配PATCH方式请求
4.1、 传统的@RequestMapping注解使用,但组合注解可以简化代码
//标注在方法上,RequestMethod.GET只匹配GET请求方式
@RequestMapping(value="/hello/{id}", method=RequestMethod.GET)
public String FirstController(String id) {//String id接收,,/hello/{id}中参数id传过来的值。
....
}
4.2、组合注解使用@GetMapping(这里只用@GetMapping举例)
//标注在方法上,@GetMapping只匹配GET请求方式
@GetMapping(value="/hello/{id}")
public String FirstController(String id) {//String id接收,,/hello/{id}中参数id传过来的值。
....
}
5、请求处理方法的参数类型和返回类型
Spring MVC支持的常见的方法返回类型如下
- ModelAndView
- Model
- Map
- View
- String
- void
- HttpEntity<?>和ReponseEntity<?>
- Callable<?>
- DeferredResult<?>
举例: 这里只举String类型例子
/**
* 控制器类
*/
@Controller
@RequestMapping(value="/hello")
public class FirstController {
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) throws Exception {
// 向模型对象中添加数据
model.addAttribute("msg", "这是我的第一个Spring MVC程序");
// 返回视图页面
return "first";// @RequestMapping注解请求方式返回String类型
}
}
6、redirect重定向和forward请求转发(两者区别:https://www.cnblogs.com/Qian123/p/5345527.html)
//redirect请求转发,请求转发到hello.jsp中,这里只有hello是因为视图解析器。。地址栏url是新的url
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) throws Exception {
...
// 重定向请求路径
return "redirect: hello";
}//forward请求转发,请求转发到hello.jsp中,这里只有hello是因为视图解析器。。地址栏url不变
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) throws Exception {
...
// 请求转发
return "forward: hello";
}
7、视图解析器(ViewResolver)(/WEB-INF/jsp/路径下,以.jsp 结尾所以上面才有直接return "first";// @RequestMapping注解请求方式返回String类型。访问时视图解析器会自动添加前缀和后缀)
<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
8、举例
步骤一:导入相应jar包
步骤二:配置前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>步骤三:编写控制器类(使用注解方式)
package com.itheima.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 控制器类
*/
@Controller
@RequestMapping(value="/hello")
public class FirstController{
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) throws Exception {
// 向模型对象中添加数据
model.addAttribute("msg", "这是我的第一个Spring MVC程序");
// 返回视图页面
return "first";
}
}
步骤四:配置spring mvc配置文件springmvc-config.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 指定需要扫描的包 -->
<context:component-scan base-package="com.itheima.controller" />
<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
步骤五:编写视图first.jsp
在/WEB-INF/jsp/路径下编写first.jsp
步骤六:启动eslipse中tomcat服务器(tomcat启动教程: https://blog.csdn.net/qq_31935419/article/details/81267301)
启动成功,打开浏览器输入url:http://localhost:8080/项目名/hello/firstController 。
学习《Java EE企业级应用开发教程》(出版社:中国工信出版社集团 人民邮电出版社 )
注:个人小结,供自己以后复习