SpringMVC 概述
springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整合。
springmvc 是一个基于 mvc 的 web 框架,方便前后端数据的传输. Spring MVC 拥有控制器,接收外部请求,解析参数传给服务层.
SpringMVC 运行流程
流程如下:
- 用 户 向 服 务 器 发 送 请 求 , 请 求 被 Spring 前 端 控 制 ServeltDispatcherServlet 捕获;前端控制器DispatcherServlet接收请求后,调用处理器映射HandlerMapping。
- 处理器映射器 HandlerMapping 根据请求的 url 找到处理该请求的处理器Handler ( 即 Controller ) , 将 处 理 器 Handler 返 回 给 前 端 控 制 器DispatcherServlet。
- DispatcherServlet 根 据 获 得 的 Handler , 选 择 一 个 合 适 的HandlerAdapter。 在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:
HttpMessageConveter: 将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息 数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double等 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult 或 Error 中 - Handler(自己的控制器)执行完成后,向 DispatcherServlet 返回一个ModelAndView 对象;
- 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet ;
- ViewResolver 结合 Model 和 View,来渲染视图
- 将渲染结果返回给客户端。
搭建 SpringMVC
1.导入相关jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.配置 DispatcherServlet 在 web.xml 文件中配置 DispatcherServlet 配置 spring 核心请求分发器
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Spring.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.开启 SpringMVC 注解
<mvc:annotation-driven></mvc:annotation-driven>
导包进入spring.xml配置文件中
<import resource="spring_mvc.xml"></import>
控制器类搭建
@Controller 用于标记在一个类上,使用它标记的类就是一个 SpringMVC Controller 对象. Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用了@Controller 标识的类,然后将类加入到 Spring IOC 容器中,注入依赖。 @RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方法上。
搭建代码以及搭建的三种方法
package com.qn.ssm.controller;
import com.qn.ssm.model.Admin;
import com.qn.ssm.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping(path = "/admin")
public class AdminController {
@Autowired
AdminService adminService;
@PostMapping(path = "/getAdmin")
public void getAdmin(Admin admin, Integer flag){
System.out.println(admin);
}
}
Service层配置
package com.qn.ssm.service;
import com.qn.ssm.dao.AdminDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AdminService {
@Autowired
AdminDao adminDao;
@Transactional
public void saveAdmin(){
adminDao.saveAdmin();
}
}
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="admin/getAdmin?id=1&name='zhangsan'">admin</a>
<form method="post" action="admin/getAdmin">
<input type="text" name="account">
<input type="text" name="password">
<input type="text" name="age">
<input type="text" name="birthday">
<input type="submit">
</form>
</body>
</html>
还有我们事先搭建的Admin类
package com.qn.ssm.model;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class Admin {
private Integer id;
private String account;
private String password;
private Integer age;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Admin{" +
"id=" + id +
", account='" + account + '\'' +
", password='" + password + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
现在开始测试
超简易界面
输入数据,进行提交,查看返回
发现报错,这是为什么呢 ?
发现是在提交birthday时因为类型无法转换,所以无法输出,我们要在这里对时间的输出格式进行规范化
@DateTimeFormat(pattern = "YYYY-MM-dd")
private Date birthday;
再次测试
输出成功
参数绑定与类型转换
如果请求参数比较多,通常是将这些参数放到一个实体中,然后只需要在处理器方法上定义这个实体作为参数。HandlerAdapter 会将这个对象的实例创建出来,然后从请求参数中取出这些参数然后放到实体对象中,需要注意的是请求参数的名字需要与实体类中的属性一一对应,只有对应的属性才会提取参数的值。
过滤静态资源文件
<mvc:default-servlet-handler/>
当 DispatcherServlet 的 url 配置为/时 需要添加此配置,能够访问静态资源 例如.jpg,.js,.css 带有后缀名文件。 在 springMVC-servlet.xml 中配置后,会在 Spring MVC 上下文中定义一个 org.springframework.web.servlet.resource.DefaultServletHttpRequest Handler,它会像一个检查员,对进入 DispatcherServlet 的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理
中文乱码处理
我们发现在提交请求的时候,如果输入的是中文,处理器方法获取到之后是乱码。乱码产生的原因在 Java Web 课程中已经讲解过了,解决的方法就是添加一个过滤器,为 request 对象设置编码集。SpringMVC 中已经为我们提供了这个过滤器,只需要在 web.xml 中配置好即可
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
总结式流程图
|