SpringMvc

1.SpringMVC 框架介绍

1.1概述

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一 般不用),Struts2(一般老项目使用)等。

SpringMVC就是基于MVC设计模式来实现的。

我们的POJO就是Model层,我们的JSP就是视图层,我们的Controller就是控制层。

现在主流基于SSM三大框架开发都是在MVC上继续演化,又分为持久层DAO,业务层Service,控制层Controller。持久层用来和数据库读写ORM,业务层用来处理复杂的业务逻辑,控制层用来处理MVC的控制。

1.2 MVC模型

用来进行分层的结构,这样代码分离结构清晰,各层代码,各司其职,易于开发大型项目。

MVC(Model模型、View视图、Control控制层),将软件进行分层达到松耦合的效果。

通用的软件编程思想, 在MVC设计模式中认为, 任何软件都可以分三层:控制层(Controller)、数据处理模型(Model)、负责展示数据的视图(View)。

在MVC设计思想中要求一个符合MVC设计思想的软件应该保证上面这三部分相互独立,互不干扰,每一个部分只负责自己擅长的部分。如果某一个模块发生变化,应该尽量做到不影响其他两个模块。提高代码的可读性,实现程序间的松耦合、提高代码复用性。
在这里插入图片描述

1.3 性能超群

简单易用性能佳
在这里插入图片描述

1.4 工作原理

在这里插入图片描述
过程简单描述 😗***

客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据(Moder)->将得到视图对象返回给用户.

更具体一些的描述 😗***

1、用户发送请求至前端控制器DispatcherServlet。

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、DispatcherServlet调用HandlerAdapter处理器适配器。

5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、Controller执行完成返回ModelAndView。

7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、DispatcherServlet响应用户。

2. 案例:展示汽车数据

从springmvc2.5开始引入注解方式,特别到了3.0就全面引入注解方式,号称xml零配置。spring3.0配置注解引入后也就是这个点成为了它和struts2的分水岭。随着springmvc的成熟,struts2开始落幕,趋于被市场淘汰。

2.1需求

访问链接: http://localhost:8080/car/get

得到JSON数据: {“id”:718,“name”:“保时捷”,“type”:“Cayman T”,“color”:“红色”,“price”:641000.0}

2.2 创建Maven module

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 创建RunApp.java


```java
package cn.tedu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;


@SpringBootApplication
@Controller
public class RunApp {
    public static void main(String[] args) {
        SpringApplication.run(RunApp.class);
    }
}


2.4 Car.java

package cn.tedu.pojo;

//Model对象,也称为POJO

//保时捷718 Cayman T,红色,641000元起
public class Car {
	private Integer id;		//718
	private String name;		//保时捷
	private String type;		//Cayman T
	private String color;		//红色
	private Double price;	//641000
	
	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 String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [id=" + id + ", name=" + name + ", type=" + type + ", color=" + color + ", price=" + price + "]";
	}
}


2.5 CarController.java

package cn.tedu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.tedu.pojo.Car;

@RestController
@RequestMapping("/car")
public class CarController {
	@RequestMapping("/get")
	public Car get() {
		//保时捷718 Cayman T,红色,641000元起
		Car car = new Car();
		car.setId(718);
		car.setName("保时捷");
		car.setType("Cayman T");
		car.setColor("红色");
		car.setPrice(641000.0);
		
		return car;
	}
}


2.6 测试

访问:http://localhost:8080/car/get

执行结果:

{"id":718,"name":"保时捷","type":"Cayman T","color":"红色","price":641000.0}

3.处理请求参数

3.1 概述

当客户端打开浏览器要访问服务器时,可能会带着一些http请求参数过来.

这时,服务器需要获取http参数进行业务处理,如何处理http请求并获取参数呢?

总共有8种,重点时两种方式:GET方式和POST方式.

3.2GET方式

向特定的资源发出请求,并返回实体.有固定的写法.而且数据有最大长度,超出就不行
例如:
http://localhost:8080/car/insert?id=1&name=张三&age=18

package cn.tedu.mvc;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//springmvc框架核心:接受请求
@RequestMapping("car")//规定浏览器用什么规则访问资源
public class CarController {
    //http://localhost:8080/car/get
    @RequestMapping("get")//规定浏览器用什么规则访问资源
    public String get(){
       return "欢迎~";//直接把结果返回给浏览器展示
    }
    //携带着请求参数: http://localhost:8080/car/insert?id=666
    //要求:如果方法有参数,调用时必须传入参数,否则500报错
    //要求:参数列表里分为参数类型(参考地址栏里的参数的类型666)
    // 参数名(参考地址栏里的参数名id)
    @RequestMapping("insert")
    public void insert(Integer id){
        System.out.println(id);
    }
    //http://localhost:8080/car/save?id=666&price=9.9
    @RequestMapping("save")
    public String save(int id,String name,double price){
        return id+name+price ;//给浏览器返回数据做展示
    }

//http://localhost:8080/car/find?id=666&name=BMW&price=9.9&color=red
    @RequestMapping("find")
//问题:想要解析很多请求参数太时,方法的参数列表太长...
//public String find(Integer id,String name,Double price,String color){
    public Car find(Car a){
        return a;//把a值的返回给浏览器
    }
}



总结
在这里插入图片描述

3.3POST方式

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

3.4RESTFul方式(推荐)

为了简化GET请求的写法,可以使用RESTFul方式,用法:

1、需要使用注解@PathVariable来获取请求路径中的参数值,@PathVariable用来绑定值

2、通过{???}获取路径中传递来的值

3、以前GET的访问方式即将被简化成:

http://localhost:8080/car/insert/1/张三/18

package cn.tedu.mvc;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("student")
public class StudentController {
//get方式:http://localhost:8080/student/save?id=666&name=jack&age=20
    @RequestMapping("save")
    public String save(Integer id,String name,Integer age){
        return id+name+age;
    }

//restful方式:http://localhost:8080/student/save2/666/jack/20
    @RequestMapping("save2/{id}/{name}/{age}")
  //{id}用来获取地址栏中的数据,并交给id变量保存--专门用来获取restful方式提交的数据
    public String save2(@PathVariable Integer id,
  //@PathVariable用来绑定地址栏里声明的变量的值,并交给同名变量保存
                        @PathVariable String name,
                        @PathVariable Integer age){
        return id+name+age;
    }

}


4.处理Get请求的参数

4.1编写后端程序

如果页面的名称和后台形参的名称不一致,可以使用@RequestParam(“页面名称”),就必须指定值.

package cn.tedu.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.tedu.pojo.Car;

@RestController//接受请求,返回json数据
@RequestMapping("/car/")
public class CarController {
	//2,通过GET请求,传入参数并接收处理
		//访问 http://localhost:8080/car/add?id=10,必须设置id的值否则报错,?拼接是固定语法
	@RequestMapping("add")
	public void add(int id) {
		System.out.println("数据添加成功,id="+id);
	}
		//访问 http://localhost:8080/car/save?id=90&name=tony ,设置多个参数值时用&连接
	@RequestMapping("save")
	public void save(int id,String name) {
		System.out.println("数据保存成功,id="+id+",name="+name);
	}

	//访问 http://localhost:8080/car/obj?id=100&name=BMW&color=red
	@RequestMapping("obj") 
	public void obj(Car c) {//处理一个对象的参数
		System.out.println(c);
	}
	//3,优化GET传参的restful方式
		//GET方式访问: http://localhost:8080/car/insert?id=1&name=张三&age=18
		//restful方式访问: http://localhost:8080/car/insert/1/张三/18
	@RequestMapping("insert/{x}/{y}/{z}")
//restful配合@PathVariable注解一起用,使用{资源名}获取传过来的值
	public void insert(@PathVariable int x,
						@PathVariable String y,
						@PathVariable int z) {
		System.out.println("数据插入成功,id="+x+",name="+y+",age="+z);
	}
	
	@RequestMapping("g2/{name}/{age}/{sex}")
	//restful获取地址栏中的参数值,并自动封装给了User对应的属性
    public String get2(User u){
        return ""+u;
    }
}


4.2编写前端程序

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>前后端关联</title>
    </head>
    <body>
        <a href="http://localhost:8080/car/restful/3/1">点我</a>
    </body>
</html>


5.处理Post请求的参数

5.1架构图

激动吧,前行吧,终于我们要学一种常规的方式,和ajax不同,它是表单自身提供的一种方式,可以实现前台请求提交给后台系统,经过后台系统处理后,进行展现。
在这里插入图片描述

5.2项目结构

在这里插入图片描述

5.3接收参数

处理一个参数,比如:id
处理多个参数,比如:id,name,hobby
处理对象,比如:Student数据
url的RESTFul形式

5.4准备stuform.html

在这里插入图片描述

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试 表单提交数据</title>
		
		<style>
			/* 设置输入框的宽度高度 */
			.a{
				width:300px;
				height: 30px;
			}
			/* 设置保存按钮 */
			#btn1{
				background-color: #0000FF;/* 背景色 */
				border-color: #0000FF;/* 边框色 */
				color: white;/* 文字颜色 */
				width: 60px;/* 宽度高度 */
				height: 30px;/* 宽度高度 */
			}
			/* 设置取消按钮 */
			#btn2{
				background-color: hotpink;/* 背景色 */
				border-color: hotpink;/* 边框色 */
				color: white;/* 文字颜色 */
				width: 60px;/* 宽度高度 */
				height: 30px;/* 宽度高度 */
			}
		</style>
	</head>
	<body>
<!--提交数据的要求:用form标签+有submit按钮+有name属性-->
		<form method="post" action="http://localhost:8080/student/save">
			<h1>学生信息管理系统MIS</h1>
			<table>
				<tr>
					<td>姓名:</td>
				</tr>
				<tr>
					<td>
						<input class="a" type="text" placeholder="姓名..." name="user" />
					</td>
				</tr>
				<tr>
					<td>年龄:</td>
				</tr>
				<tr>
					<td>
						<input class="a" type="number" placeholder="年龄..." name="age" />
					</td>
				</tr>
				<tr>
					<td>
						性别:(单选框)
						<input type="radio" name="sex" value="1" checked="checked"/><input type="radio" name="sex" value="0"/></td>
				</tr>
				<tr>
					<td>
						爱好:(多选)
						<input type="checkbox" name="hobby" value="ppq" checked="checked"/>乒乓球
						<input type="checkbox" name="hobby" value="ps"/>爬山
						<input type="checkbox" name="hobby" value="cg"/>唱歌
					</td>
				</tr>
				<tr>
					<td>
						学历:(下拉框)
						<select name="edu">
							<option value="0">小学</option>
							<option value="1">初中</option>
							<option value="2">高中</option>
							<option value="3">本科</option>
							<option value="4">博士</option>
						</select>
					</td>
				</tr>
				<tr>
					<td>入学日期:</td>
				</tr>
				<tr>
					<td>
						<input type="date" name="intime"/>
					</td>
				</tr>
				<tr>
					<td>
						<button type="submit" id="btn1">保存</button>
						<button type="reset" id="btn2">取消</button>
					</td>
				</tr>
			</table>
		</form>
	</body>
</html>



创建Maven Module

在这里插入图片描述
创建启动类

package cn.tedu;
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);
    }
}


5.5准备Student.java

注意:: 日期属性要加注解,@DateTimeFormat(pattern=“yyyy-MM-dd”),否则400错误

package cn.tedu.pojo;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Arrays;
import java.util.Date;
//提供的属性用来: 封装 浏览器发来的数据
//要求:
// 1,变量名 必须和 网页中name属性的值 一样
// 2,变量类型 必须和 浏览器提交的数据类型 一样
public class Student {
    //?user=jack&age=20&sex=1
    private String user;
    private Integer age;
    private Integer sex;
    private String[] hobby;
    //用来保存,浏览器提交来的多个爱好ppq ps cg
    private Integer edu;

    //问题:原因是浏览器上选的日期是String类型:2021/10/17
    //无法把String类型的日期变成 java.util.Date类型,报错400!!!!
    // @DateTimeFormat用来转换日期的格式.y表示年M表示月d表示日
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date intime;
    //get set toString
    @Override
    public String toString() {
        return "Student{" +
                "user='" + user + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", hobby=" + Arrays.toString(hobby) +
                ", edu=" + edu +
                ", intime=" + intime +
                '}';
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    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;
    }
}


5.6准备StuController.java

package cn.tedu.controller;

import cn.tedu.pojo.Student;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("student")
public class StudentController {

    //http://localhost:8080/student/save
    @RequestMapping("save")
    public String save(Student s){
        return "访问成功!"+s;
    }

}


–6,总结
在这里插入图片描述

5.7日期数据的处理

把页面上的intime日期数据,交给后台处理.由于页面的数据都当做String类型处理,所以交给后台处理时,会抛出400错误.需要使用注解进行类型转换.并指定日期格式:

//页面报400 IllegalArgumentException: String->Date

@DateTimeFormat(pattern="yyyy-MM-dd";)

private java.util.Date intime;

public Date getIntime() {

	return intime;

}

public void setIntime(Date intime) {

	this.intime= intime;

}

5.8改造成Ajax访问

–1,把form标签的内容改成:
–2,把提交按钮的内容改成:
–3,添加ajax代码:

<script src="jquery-1.8.3.min.js"></script>
<script>
	function fun(){
		$.ajax({
			url:"http://localhost:8080/stu/add",
			data:$("#f1").serialize(),
			success:function(data){
				console.log(data);
			}
		})
	}
</script>

–4,修改Controller代码并添加@CrossOrigin注解

5.9练习
–1,解析请求参数
制作一个前端HTML网页

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>浏览器向 服务器发起请求</title>
	</head>
	<body>
		<a href="http://localhost:8080/order/get?id=10&price=100&name=phone">练习1</a>
		<a href="http://localhost:8080/order/find/2">练习2</a>
		<a href="http://localhost:8080/order/save/10/100/phone">练习3</a>
	</body>
</html>


SpringMVC框架解析请求参数

package cn.tedu.mvc;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//MVC的C层Controller控制器,用来接受请求 给出响应
//总结:浏览器提交数据方式
//get:把数据用?进行拼接,多个数据之间用&连接(?id=10&price=100)
     //java程序解析请求参数:在方法的参数列表中,依次解析(或者封装成java对象)
//restful:可以简化get提交数据(/10/100)
    //java程序解析请求参数:使用{变量}来解析地址栏里的数据
        //+使用@PathVariable获取变量的值
@RestController
@RequestMapping("order")
public class OrderController {
//http://localhost:8080/order/get?id=10&price=100&name=phone
    @RequestMapping("get")
    public String get(Integer id,Double price,String name){
        return id+""+price+name ;
    }
    //http://localhost:8080/order/find
    @RequestMapping("find/{id}")
    public Integer find(@PathVariable Integer id){
        return id;
    }
    //http://localhost:8080/order/save/10/100/phone
    @RequestMapping("save/{id}/{price}/{name}")
    public String save(@PathVariable Integer id,
                       @PathVariable Double price,
                       @PathVariable String name){
        return id+price+name ;
    }
}


Restful解析参数的练习
–1,创建类

package cn.tedu.mvc;

import com.sun.org.apache.xpath.internal.operations.Or;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//MVC的C层Controller控制器,用来接受请求 给出响应
//总结:浏览器提交数据方式
//get:把数据用?进行拼接,多个数据之间用&连接(?id=10&price=100)
     //java程序解析请求参数:在方法的参数列表中,依次解析(或者封装成java对象)
//restful:可以简化get提交数据(/10/100)
    //java程序解析请求参数:使用{变量}来解析地址栏里的数据
        //+使用@PathVariable获取变量的值
@RestController
@RequestMapping("order")
public class OrderController {
//http://localhost:8080/order/get?id=10&price=100&name=phone
    @RequestMapping("get")
// public String get(Integer id,Double price,String name){
    public Order get(Order o){
        return o;
    }
    //http://localhost:8080/order/find
    @RequestMapping("find/{id}")
    public Integer find(@PathVariable Integer id){
        return id;
    }
    //http://localhost:8080/order/save/10/100/phone
    @RequestMapping("save/{id}/{price}/{name}")
//    public String save(@PathVariable Integer id,
//                       @PathVariable Double price,
//                       @PathVariable String name){
    //注意:restful解析参数时,标准是两步: {变量}+@PathVariable获取变量的值
    //但是,参数列表如果是一个java对象,就不许加@PathVariable否则500异常!!
    public String save(Order o){
        //jdbc入库
        return o+"" ;
    }
}


–2,创建Order类

package cn.tedu.mvc;

public class Order {
    private Integer id;
    private Double price;
    private String name;
    //get set toString
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", price=" + price +
                ", name='" + name + '\'' +
                '}';
    }
}


–3,创建前端网页

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>浏览器向 服务器发起请求</title>
	</head>
	<body>
		<a href="http://localhost:8080/order/get?id=10&price=100&name=phone">练习1</a>
		<a href="http://localhost:8080/order/find/2">练习2</a>
		<a href="http://localhost:8080/order/save/10/100/phone">练习3</a>
		
		<!-- 
		<button @click="fun()">点我提交数据</button>
			优化:
			点击按钮,发起axios请求,访问后端java程序,
			java程序解析请求参数拿着参数,入库.
		 -->
		
	</body>
</html>


扩展把数据入库
–0,添加jdbc的jar包
修改pom.xml文件,添加jar包的坐标.
1, 整个工程的pom.xml文件: 作用在每个Module里 --作用范围大
2, Module的pom.xml文件: 只作用在当前的Module里 --作用范围小

找到dependencies标签,添加以下代码:
 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>

–1,改造StudentController类

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;

@RestController
@RequestMapping("student")
public class StudentController {
    //http://localhost:8080/student/save
    @RequestMapping("save")
    public String save(Student s) throws Exception {
        //TODO JDBC入库
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取连接(url user pwd)
        String url= "jdbc:mysql://localhost:3306/cgb2108?characterEncoding=utf8";//指定要连接哪个数据库
        String user= "root" ; //使用的用户名
        String pwd= "root" ; //使用的密码
        Connection c = DriverManager.getConnection(url, user, pwd);
        //3,获取传输器(用新传输器,高效安全,先执行SQL骨架)
        String sql = "insert into tb_student values(null,?,?,?,?,?,?)";
        PreparedStatement ps = c.prepareStatement(sql);
        //TODO 给SQL里的?设置参数--s.getXxx获取数据
        ps.setString(1,s.getUser());
        ps.setInt(2,s.getAge());
        ps.setInt(3,s.getSex());
  //s.getHobby()获取到了数组,入库,数据库不认识数组,需要变成字符串才能入库,否则500
        ps.setObject(4, Arrays.toString( s.getHobby() ) );
        ps.setObject(5,s.getEdu());
        ps.setObject(6,s.getIntime());
        //4,执行SQL(insert)
        ps.executeUpdate();
        //5,关闭资源
        ps.close();
        c.close();
        System.out.println("数据入库成功!");
        return "访问成功!"+s;
    }
}



–2,创建表

CREATE TABLE tb_student(
  id INT PRIMARY KEY AUTO_INCREMENT,
  USER VARCHAR(100),
  age INT,
  sex INT,
  hobby VARCHAR(200),
  edu INT,
  intime DATE
)

–3,总结

在这里插入图片描述

6.总结

6.1springmvc和struts2比较

在这里插入图片描述

6.2MVC和SSM的关系

在这里插入图片描述
在这里插入图片描述

6.3SpringMVC常用的注解

@Controller 标识是一个Controller,Spring包扫描创建实例

@RequestMapping 请求后的映射路径

@PathVariable 标识接收单个参数

@ResponseBody 返回对象利用jackson工具类转换为json字符串

@RequestParam 参数名和请求参数名称不同时使用,可以设置默认值

笔记补充:

开发步骤: 1,导入SpringMVC相关的jar包(被Springboot整合了) 2, 使用注解开发

3、struts2的最大的缺点:不安全,有致命的安全漏洞
4、以前的mvvm是vue的思想分层的方式 ,而mvc是spring框架的分层思想,最终的目的都是为了分层,实现代码的松 耦合
5、JSP:最古老的方式,效率最高,但是性能太低,且没有实现松耦合
6、最好使用引用类型,因为基本类型得话需要传参数
7、成员变量需要进行封装,不然作用范围太大,多线程时不安全 ,但是被封装时只能被本类被访问,且需要提供get,set方法,tostring
8、创建maven module,右键-new -Module-选择Maven-next-设置module name-finish
9、携带着请求参数: http://localhost:8080/car/insert?id=666
要求:如果方法有参数,调用时必须传入参数,否则500报错
要求:参数列表里分为参数类型(参考地址栏里的参数的类型666)
参数名(参考地址栏里的参数名id)
10、问题:想要解析很多请求参数太时,方法的参数列表太长…
创建一个类来进行数据的封装,再把这个类里面的数据 封装给一个变量(这个类里面的数据都为私有,所以得提供get,set方法)
11、实现步骤
1.根据地址栏里面的数据来找到这个类(访问的第一个路径)
2.找到这个方法(需要访问的第二个路径)
3.把数据都解析出来并封装给a
4.把解析到的所有数据返回给浏览器
5.解析每个数据依次赋值给对应名称的属性
12、{id}用来获取地址栏中的数据,并交给id变量保存–专门用来获取restful方式提交的数据
14、@PathVariable用来绑定地址栏里声明的变量的值,并交给同名变量保存
15、MVC的C层Controller控制器,用来接受请求 给出响应
16、总结:浏览器提交数据方式
get:把数据用?进行拼接,多个数据之间用&连接(?id=10&price=100)
java程序解析请求参数:在方法的参数列表中,依次解析(或者封装成java对象)

restful:可以简化get提交数据(/10/100)
java程序解析请求参数:使用{变量}来解析地址栏里的数据
+使用@PathVariable获取变量的值

17、前端提交数据的要求:用form标签+有submit按钮+有name属性
18、pojo里面提供的属性用来: 封装 浏览器发来的数据
要求:
1,变量名 必须和 网页中name属性的值 一样
2,变量类型 必须和 浏览器提交的数据类型 一样

19、问题:原因是浏览器上选的日期是String类型:2021/10/17
无法把String类型的日期变成 java.util.Date类型,报错400!!!
@DateTimeFormat用来转换日期的格式.y表示年M表示月d表示日

20、需要保存多个数据时,就用数据,用来保存,比如浏览器提交来的多个爱好ppq ps cg
21、在springMVC看i昂加中,如若采用得时jdbc入库的方式,
若pojo里面被封装的ABCDE属性中,假如中间的C出问题了,那在controller里面的jdbc中给sql设置参数时,
就只能获取到pojo中B属性的位置,因为后面DE属性由于C属性出了问题,会导致读取不到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值