概念
SpringMVC是ssm框架中的第一个s
框架( Framework ):预定义了一些设计参数(类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程),以便于应用设计者或实现者能集中精力于应用本身的特定细节
主要的职责:接受浏览器发来的请求,给浏览器发送响应的数据
遵循了MVC的设计模式:好处是可以把代码松耦合,提高代码的复用性
MVC的全称:M是Model模型,用来封装数据
V是View视图,用来展示数据
C是Controller控制器,用来写业务代码
过程
共分为五个部分:前端控制器,处理器映射器,处理器适配器,视图解析器和视图渲染
前端控制器(DispatcherServlet):
当前端发送请求成功后,他作为调度者的身份去调度各个组件
处理器映射器(HandlerMapping):
根据请求的url路径,找到能够处理的类和方法
处理器适配器(HandlerAdaptor):
真正的开始业务,处理数据,并把返回的结果交给DispatcherServlet
视图解析器(ViewResolver):
找到正确的视图,准备展示数据
视图渲染View
展示数据
![](https://i-blog.csdnimg.cn/blog_migrate/e11d3cac52239788d68e3d7651c3da1f.png)
SpringMVC的入门案例
为了方便管理代码,在SpringMVC项目中创建Module,创建好的Module需要先写一个启动服务器的类
package cn.tedu.mvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
@SpringBootApplication//标记着这是spring boot的启动类
//@Controller
public class RunApp {
public static void main(String[] args) {
SpringApplication.run(RunApp.class);
}
}
SpringMVC的响应数据
SpringMVC的主要功能是接受请求,响应数据
最重要的两个注解:
@RestController:只能定义在类上
@RequestMapping("car"):规定了url如何访问这个类,既可以定义在类上,也可以定义在方法上
package cn.tedu.mvc;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//完成springmvc的角色,接受请求,给出响应
@RestController//标记这个类是一个控制器
@RequestMapping("car")//规定了url如何访问这个类
public class HelloController {
@RequestMapping("get")//规定了url如何访问这个方法
public String show(){
return "123";
}
@RequestMapping("test")
public boolean test(){
return true;
}
@RequestMapping("get2")
public Car show2(){
Car c=new Car();
c.setId(321);
c.setName("狼");
c.setColor("pink");
c.setType("冷酷的");
c.setPrice(999.99);
return c;//返回的是JSON字符串
}
@RequestMapping("get3")
public int[] show3(){
int[] a={1,2,34,54,22};
return a;
}
}
SpringMVC解析数据
提交数据共有8种方式,最重要的是get和post
get方法
可以利用单元测试方法自己解析数据,也可以利用SpringMVC提供的方法
利用SpringMVC提供的方法:
第一种方法:传入的参数变量名必须与地址栏的变量名相同
第二种方法:直接传入对应值的类对象,返回时,只需返回对象名即可
package cn.tedu.mvc;
import org.junit.Test;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//SpringMVC解析get请求参数
@RestController//接受请求做出响应
@RequestMapping("get")
public class GetController {
//http://localhost:8080/get/param2?id=1&name=张三&type=X6&color=red&price=18.8
@RequestMapping("param3")
public Car param3(Car c){
return c;
}
//http://localhost:8080/get/param2?id=1&name=张三&age=18
@RequestMapping("param2")
public String param2(int id,String name,int age){
return id+name+age;
}
@RequestMapping("param")
public String param(int id,String name,int age){
return "你的请求参数里id="+id+"名字为:"+name+"年龄为:"+age;
}
@Test//单元测试方法
public void get01(){
String url="http://localhost:8080/car/get3/id=1&name=张三&age=18";
String[] s=url.split("\\?")[0].split("&");
for (String a :s) {
String date=a.split("=")[1];
System.out.println(date);
}
}
}
restful方法
//解析restful传递的参数:简化了get方式参数的写法
@RequestMapping("get2/{id}/{name}")
//{x}--通过获取访问路径中携带的参数,并交给变量x保存
//@PathVariable--获取{}中间变量的值
public String get2(@PathVariable Integer id,
@PathVariable String name){
return id+name;
}
post方法
需要在前端的url中,写好要使用的控制类和方法
后端只需创建好对于的属性类
student类:
package cn.tedu.pojo;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Arrays;
import java.util.Date;
//是Model层,用来封装数据,就是一个pojo(封装属性+get/set)
public class Student {
private String name;
private Integer age;//若为int,当值为空时,会抛出异常
private Integer sex;
private String[] hobby;
private Integer edu;
//浏览器上提交的日期默认是String类型,2023/3/25
//需要将String的日期转为Date日期
//pattern属性规定了日期的格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date intime;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", hobby=" + Arrays.toString(hobby) +
", edu=" + edu +
", intime=" + intime +
'}';
}
public Date getIntime() {
return intime;
}
public void setIntime(Date intime) {
this.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;
}
}
解析数据,并插入数据库
package cn.tedu.controller;
import cn.tedu.pojo.Student;
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.util.Arrays;
@RestController
@RequestMapping("stu")
//控制层,用于接受请求,做出响应
public class StudentController {
@RequestMapping("add")
public Object get(Student s) throws Exception {
//实现入库insert-jdbc
//修改pom.xml文件,添加jar包的坐标
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url="jdbc:mysql://localhost:3306/user";
Connection c = DriverManager.getConnection(url, "root", "123");
//3.获取传输器
String sql="insert into tb_student values (null ,?,?,?,?,?,?)";
PreparedStatement ps = c.prepareStatement(sql);
ps.setString(1,s.getName());
ps.setInt(2,s.getAge());
ps.setObject(3,s.getSex());
//数组不能直接存入数据库,需要变成串入库
ps.setObject(4, Arrays.toString(s.getHobby()));
ps.setObject(5,s.getEdu());
ps.setObject(6,s.getIntime());
ps.executeUpdate();//执行增删改的SQL
System.out.println("恭喜你!数据成功了");
return s;
}
}
常见错误
404:Not Found 未找到页面,一般为url中的路径出错
400:url中对应的参数类型与方法中的参数类型不同
500:IDEA中服务出现了问题(抛出了异常)