springMVC 是 spring 框架的一个模块,springMVC 和 spring 无需通过中间整合层进行整合。
springmvc 是一个基于 mvc 的 web 框架,方便前后端数据的传输. Spring MVC 拥有控制器,接收外部请求,解析参数传给服务层.
流程如下:
1.导入相关jar包
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.2.2.RELEASEversion>
dependency>
2.配置 DispatcherServlet 在 web.xml 文件中配置 DispatcherServlet 配置 spring 核心请求分发器
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:Spring.xmlparam-value>
init-param>
<load-on-startup>0load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-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;
/*
1. value path 都是为类和方法指定映射地址. 是一个数组.
可以配置多个地址,value = {"/test","/test1"}
method 设置哪些请求方式可以访问此方法 ,如果没有设置,那么所有请求都可以
也可以使用@PostMapping(value = "/test") 或者 @GetMapping(value = "/test");来指定
@GetMapping(value = "/test")
@RequestMapping(value = {"/test","/test1"},method = RequestMethod.GET)
public void test(){
System.out.println("访问到了控制层");
//adminService.saveAdmin();
}*/
/*
2. springMVC可以将HttpServletRequest request,HttpServletResponse 直接注入到我们方法中
@GetMapping(path = "/getAdmin")
public void getAdmin(HttpServletRequest request, HttpServletResponse response){
System.out.println(request.getParameter("id"));
System.out.println(request.getParameter("name"));
}
*/
/* 3. 如 果 请 求 参 数 的 名 称 与 处 理 器 方 法 中 的 参 数 名 称 相 同 , 那 么 在 使 用
@RequestParam 绑定的时候,可以省略参数,甚至连@RequestParam 都可以省略*/
/* @GetMapping(path = "/getAdmin")
public void getAdmin(@RequestParam("id") Integer adminid,
@RequestParam("name") String adminName,
@RequestHeader("User-Agent") String User_Agent){
System.out.println(adminid);
System.out.println(adminName);
System.out.println(User_Agent);
}*/
/*@GetMapping(path = "/getAdmin")
public void getAdmin(Integer id,String name){
System.out.println(id);
System.out.println(name);
}*/
/*@PostMapping(path = "/getAdmin")
public void getAdmin(Admin admin, Integer flag){
System.out.println(admin);
}*/
@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>Titletitle>
head>
<body>
<a href="admin/getAdmin?id=1&name='zhangsan'">admina>
<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>characterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>