文章目录
Maven依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
Spring MVC核心类 DispatcherServlet 的作用
- DispatcherServlet的全名是
org.springframework.web.servlet.DispatcherServlet
,它在程序中充当着前端控制器的角色。在使用时,只需将其配置在项目的web.xml
文件中
配置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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意
- 如果没有通过元素配置,则应用程序会默认去
WEB-INF
目录下寻找以servletName-servlet.xml
方式命名的配置文件,这里的servletName
指下面的springmvc
- 如果
<init-param>
元素存在并且通过其子元素配置了Spring MVC
配置文件的路径,则应用程序在启动时会加载配置路径下的配置文件
@Controller注解类型
org.springframework.stereotype.Controller
注解类型用于指示Spring类的实例是一个控制器,其注解形式为@Controller
- 注解在使用时不需要再实现
Controller
接口,只需要将@Controller
注解加入到控制器类上,然后通过Spring的扫描机制找到标注了该注解的控制器即可 - 例子如下
import org.springframework.stereotype.Controller;
...
@Controller
public class FirstController{
...
}
Spring的配置文件
<?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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置处理器Handle,映射“/firstController”请求 -->
<context:component-scan
base-package="com.hlq" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 设置后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
注意
- 使用注解方式时,程序的运行需要依赖Spring的AOP包,因此需要向lib目录中添加spring-aop-..*.RELEASE.jar,否则程序运行时会报错
@RequestMapping注解的使用
Spring
通过@Controller
注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的- 使用
@RequestMapping
注解类型,它用于映射一个请求或一个方法。使用时,可以标注在一个方法或一个类上
- 标注在方法上:作为请求处理方法在程序接收到对应的URL请求时被调用
@Controller
public class FirstController{
@RequestMapping(value="/firstController")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
...
return mav;
}
}
可以通过地址:http://localhost:8080/chapter12/firstController
访问该方法
- 标注在类上:该类中的所有方法都将映射为
相对于类级别的请求
,表示该控制器所处理的所有请求都被映射到value
属性值所指定的路径下
@Controller
@RequestMapping(value="/hello")
public class FirstController{
@RequestMapping(value="/firstController")
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) {
...
return mav;
}
}
请求路径将变为:http://localhost:8080/chapter12/hello/firstController
@RequestMapping的属性
- @RequestMapping注解除了可以指定value属性外,还可以指定其他一些属性,如下表所示
- 表中所有属性都是可选的,但其默认属性是value。当value是其唯一属性时,可以省略属性名
- @RequestMapping(value="/firstController")
- @RequestMapping("/firstController")
组合注解
- Spring框架的4.3版本中,引入了新的组合注解,来帮助简化常用的HTTP方法的映射,并更好的表达被注解方法的语义
- @GetMapping:匹配GET方式的请求
- @PostMapping:匹配POST方式的请求
- @PutMapping:匹配PUT方式的请求
- @DeleteMapping:匹配DELETE方式的请求
- @PatchMapping:匹配PATCH方式的请求
以@GetMapping为例
该组合注解是@RequestMapping(method=RequestMethod.GET)的缩写,它会将HTTP GET请求映射到特定的处理方法
@RequestMapping(value="/user/{id}",method=RequestMethod.GET)
public String selectUserById(String id){
...
}
使用@GetMapping注解后的简化代码
@GetMapping(value="/user/{id}")
public String selectUserById(String id){
...
}
请求处理方法的参数和返回类型
Spring MVC所支持的常见方法返回类型
- ModelAndView 可以添加Model数据,并指定视图
- String 可以跳转视图,但不能携带数据
- void 在异步请求时使用,它只返回数据,而不会跳转视图
- 返回字符串,为视图
@RequestMapping(value="/firstController")
public String handleRequest(HttpServletRequest request,
HttpServletResponse response, Model model) {
model.addAttribute("msg", "这是我的第一个Spring MVC程序"); //通过Model参数类型,即可添加需要在视图中显示的属性
return "/WEB-INF/jsp/first.jsp";
}
2.redirect 重定向。例如,在修改用户信息操作后,将请求重定向到用户查询方法
@RequestMapping(value="/update")
public String update(HttpServletRequest request,HttpServletResponse response, Model model){
...
return "redirect:queryUser";
}
- forward 请求转发。例如,用户执行修改操作时,转发到用户修改页面
@RequestMapping(value="/toEdit")
public String update(HttpServletRequest request,HttpServletResponse response, Model model){
...
return "forward:editUser";
}
ViewResolver(视图解析器)
Spring MVC
中的视图解析器负责解析视图。可以通过在配置文件中定义一个ViewResolver
来配置视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
- 逻辑视图名只需设置为“first”,而不再需要设置为“/WEB-INF/jsp/first.jsp”,在访问时视图解析器会自动的增加前缀和后缀
表单提交的例子
- 访问页面输入表单的信息
- 使用 Controller层 进行转发
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<!-- 需要是 整个项目的路径 -->
<form action="/CH12-SpringMVCAnnotation/hello/login" method="post">
用户名:<input type="text" name="userName"/> <br/>
密码:<input type="password" name="password"/> <br/>
<input type="submit" value="SUBMIT"/>
</form>
</body>
</html>