一.概述
SSM框架里,第一个S就是指SpringMVC,是一个框架
是Spring框架的一个后续产品,遵循了MVC的设计模式,保证了程序间的松耦合
1. SpringMVC的主要作用:
(1)接受请求(解析请求参数)
(2)做出响应
2. MVC的设计模式:
(1)M是model模型,用来封装数据
(2)V是view视图,用来展示数据
(3)C是controller控制层,用于控制浏览器
能提升代码的复用性,可读性,实现程序的松耦合
3. 重要注释
@RestController
@RequestMapping()
@PathVariable
二.工作原理
1.前端控制器DispatcherServlet
当浏览器发送请求成功后,充当着调度者的作用,负责调度每个组件;
2.处理器映射器HandlerMapping
根据请求的url路径,找到能处理请求的类名和方法名;
如:url:http://localhost:8080/hello,找到HelloController类中的hello
3.处理器适配器HanlderAdapter
正式开始处理业务,并将返回结果交给DispatcherServlet;
4.视图解析器ViewResolver
找到正确的,能展示数据的视图,准备展示数据;
5.视图渲染View
展示数据。
三.SpringMVC的响应测试
1.概述
SpringMVC可以接受请求,做出响应数据,类型可以非常丰富
2.测试
创建启动类RinApp,用来启动服务器
package com.yu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//标志着这是一个启动类
@SpringBootApplication
public class RunApp {
public static void main(String[] args) {
SpringApplication.run(RunApp.class,args);
}
}
创建一个类,补充方法,用来接收请求和给出响应
package com.yu.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//完成springmvc的角色,接收请求和给出响应
//是MVC设计模式里的C控制器
@RestController
//标记着这个类是一个controller控制器+接收请求
@RequestMapping("run")
public class HelloController {
@RequestMapping("get")//规定了url怎么访问这个方法
public String get(){
return "Hello Springmvc";
}
}
成功启动RunApp类,在浏览器中访问http://localhost:8080/run/get
创建student类,进行属性封装并提供全参构造,重写toString方法
package com.yu.pojo;
public class Student {
private Integer id;//使用引用类型变量来封装数据,可以避免一些异常
private String name;
private Integer age;
private String sex;
private String address;
public Student(Integer id, String name, Integer age, String sex, String address) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
}
public Student() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
创建studentController
package com.yu.controller;
import com.yu.pojo.Student;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("student")
public class StudentController {
//访问http://http://localhost:8080/student/get1
@RequestMapping("get1")
public Student getStu1(){
Student student = new Student();
student.setId(1);
student.setName("张三");
student.setAge(18);
student.setSex("男");
student.setAddress("北京");
return student;
}
@RequestMapping("get2")
public Student getStu2(){
return new Student(2,"李四",20,"女","上海");
}
@RequestMapping("get3")
public void getStu3(Integer id){
System.out.println("数据添加成功,id="+id);
}
//访问http://localhost:8080/student/get4?id=13&name=王五
@RequestMapping("get4")
public void getStu4(Integer id,String name){
System.out.println("数据添加成功,id="+id+",name="+name);
}
@RequestMapping("get5")
public void getStu5(Student stu){
System.out.println(stu);
}
}
四.springMVC的请求
请求方式有八种,常见的就是get、post、restful
1、GET
向特定的资源发出请求,并返回实体,有固定的写法,而且数据有最大长度,超出就不行。 如:http:/localhost:880/get/student?id=1&name=张三&age=18
2、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立/已有资源的修改。
3、RESTFul
为了简化GET请求的写法,可以使用RESTFul方式。
用法:需要使用注解@PathVariable来获取请求路径中的参数值,@PathVariable用来绑定值。通过{}来获取路径中传递来的值。
如:http://localhost:8080/student/get6/11/李四
//http://localhost:8080/student/get6/11/李四
@RequestMapping("get6/{id}/{name}")
public void getStu6(@PathVariable Integer id ,
@PathVariable String name){
System.out.println("数据添加成功,id="+id+",name="+name);
}
五.利用jdbc把接受到的参数入库
1.准备form表单
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>学生信息管理系统MIS</title>
<link href="css/stuform.css" rel="stylesheet"/>
</head>
<body>
<!-- 利用表单,向服务器发送数据
默认是get提交,通过method属性修改提交方式
action属性,指定提交位置
-->
<form method="post" action="http://localhost:8080/student/add">
<div id="box">
<center><h2>学生信息管理系统MIS</h2></center>
<div id="name">姓名:</div>
<div id="namet">
<input type="text" placeholder="请输入姓名" name="name"/>
</div>
<div id="age">年龄:</div>
<div id="aget">
<input type="number" placeholder="请输入年龄" name="age" />
</div>
<div id="sex">
性别:(单选框)
<input type="radio" name="sex" value="1"/>男
<input type="radio" name="sex" value="0" checked="checked"/>女
</div>
<div id="hobby">
爱好:(多选)
<input type="checkbox" name = "hobby" value="ppq" checked="checked"/>乒乓球
<input type="checkbox" name = "hobby" value="ps"/>爬山
<input type="checkbox" name = "hobby" value="cg"/>唱歌
</div>
<div id="education">
学历(下拉框)
<select name="edu">
<option value="1">本科</option>
<option value="2">研究生</option>
<option value="3">博士后</option>
</select>
</div>
<div id="date">
入学日期:
<input type="date" name="intime" value="intime" />
</div>
<div id="but">
<input type="submit" name="submit" value="保存" id="sub"/>
<input type="button" name="cancel" value="取消" id="can"/>
</div>
</div>
</form>
</body>
</html>
2.准备Student2类
package com.yu.pojo;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Arrays;
import java.util.Date;
//是Model层,用来封装数据,就是一个pojo(封装的属性+get/set)
public class Student2 {
//属性(成员变量):变量类型 变量名
//提交数据的类型 页面上name属性的值
//能用引用类型就不用基本数据类型,避免了一些异常
private String name;
private Integer age;
private Integer sex;
private String[] hobby;
private Integer edu;
//浏览器中提交的数据默认为字符串
//日期为2021/8/12,报错404,
// 需要将string类型的日期转为date类型
//pattern属性规定了日期的格式y表示年M表示月d表示日
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date intime;
//get set toString
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", hobby=" + Arrays.toString(hobby) +
", edu=" + edu +
", intime=" + intime +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public Integer getEdu() {
return edu;
}
public void setEdu(Integer edu) {
this.edu = edu;
}
public Date getIntime() {
return intime;
}
public void setIntime(Date intime) {
this.intime = intime;
}
}
4.添加JDBC的jar包依赖
<!--添加jdbc的jar包依赖
generate—>dependency—>输入mysql-connector
也可以是alt+insert,出现弹窗,输入mysql-connector-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
</dependencies>
5.利用JDBC把接收的参数入库
package com.yu.controller;
import com.yu.pojo.Student2;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
@RestController
@RequestMapping("student2")
public class Student2Controller {
@RequestMapping("add")
public Object add(Student2 stu){
Connection c = null;
PreparedStatement p = null;
try {
String url = "jdbc:mysql:localhost:3306/student?characterEncoding=utf-8";
c = DriverManager.getConnection(url,"root","root");
String sql = "insert into tb_student values(null,?,?,?,?,?,?)";
p = c.prepareStatement(sql);
p.setObject(1,stu.getName());
p.setObject(2,stu.getAge());
p.setObject(3,stu.getSex());
/*getHobby()得到的是一个数组,不能直接存入数据库,需要变成串*/
p.setObject(4, Arrays.toString(stu.getHobby()));
p.setObject(5,stu.getEdu());
p.setObject(6,stu.getIntime());
int n = p.executeUpdate();
if (n != 0){
System.out.println("添加成功!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
p.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
c.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return stu;
}
}