SpringMVC

文章目录

  • 概述
  • 工作原理
  • 解析请求参数
    • 处理请求参数方式
    • 准备
    • SpringMVC解析get及restful的方式请求参数
    • SpringMVC框架解析post提交的数据
      • 扩展把数据入库
  • 总结
    • springmvc和struts2比较
    • MVC和SSM的关系
    • SpringMVC常用的注解
  • 五,Git
    • –1,概述
    • –2,使用步骤
    • –3,执行以下命令:
    • –4,检查是否成功:
    • –5,查看上传的数据

概述

是Spring团队的产品,遵循MVC设计模式
MVC设计模式: 最终实现松耦合
M是Model是模型层,用来封装数据
V是View是视图层,用来展示数据
C是Controller是控制层, 接受浏览器发来的请求,并做出数据的响应
SpringMVC框架用来接受请求 + 做出响应
SpringMVC_第1张图片

工作原理

涉及五个组件:
1,前端控制器DispatcherServlet: 接受请求,并且调度
2,处理器映射器HandlerMapping: 根据地址栏的写法,找到能处理这次请求的类和方法
3,处理器适配器HandlerAdapter: 真正开始找到方法,执行方法体处理业务,并返回结果
4,视图解析器ViewResolver: 找到能够展示数据的页面
5,视图渲染View: 把数据展示在页面上
SpringMVC_第2张图片

解析请求参数

处理请求参数方式

浏览器发送数据给服务器有八种方式
SpringMVC_第3张图片

  • get 的数据.在地址栏展示,用?拼接的参数
    例如:
    http://localhost:8080/car/insert?id=1&name=张三&age=18
  • RESTFul方式(推荐)
    为了简化GET请求的写法,可以使用RESTFul方式,用法:
    1、需要使用注解@PathVariable来获取请求路径中的参数值,@PathVariable用来绑定值
    2、通过{???}获取路径中传递来的值
    3、以前GET的访问方式即将被简化成:
    http://localhost:8080/car/insert/1/张三/18
  • post的数据,安全不在地址栏展示
    开发步骤: 1,导入SpringMVC相关的jar包(被Springboot整合了) 2, 使用注解开发

准备

创建maven module
SpringMVC_第4张图片
右键-new -Module-选择Maven-next-设置module name-finish
准备启动类
SpringMVC_第5张图片

package cn.tedu.mvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication//启动类,用来启动Module
public class RunApp {
    public static void main(String[] args) {
        //利用springboot启动当前类
        SpringApplication.run(RunApp.class);
    }
}

准备资源

package cn.tedu.mvc;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//springmvc框架核心:接受请求
public class CarController {
    //规定浏览器用什么规则访问资源
    @RequestMapping("get")
    public String get(){
       return "欢迎~";
    }
}

SpringMVC解析get及restful的方式请求参数

测试:http://localhost:8080/car/get
–1,测试

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对应的属性
	//注意:restful解析参数时,标准是两步: {变量}+@PathVariable获取变量的值
    //但是,参数列表如果是一个java对象,就不许加@PathVariable否则500异常!!
    public String get2(User u){
        return ""+u;
    }
}

–2,总结
SpringMVC_第6张图片

SpringMVC框架解析post提交的数据

–1,创建网页,提供表单
SpringMVC_第7张图片

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 method="post" action="http://localhost:8080/student/save">
			<h1>学生信息管理系统MISh1>
			<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>



–2,创建Maven Module
SpringMVC_第8张图片

–3,创建启动类

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


–4,创建StudentController解析请求参数

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
    @PostMapping("save")
    public String save(Student s){
        return "访问成功!"+s;
    }

}


–5,创建Student类

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


–6,总结
SpringMVC_第9张图片

扩展把数据入库

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

找到dependencies标签,添加以下代码:
 <dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>5.1.48version>
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,总结
SpringMVC_第10张图片

总结

springmvc和struts2比较

SpringMVC_第11张图片

MVC和SSM的关系

SpringMVC_第12张图片
SpringMVC_第13张图片

SpringMVC常用的注解

@Controller 标识是一个Controller,Spring包扫描创建实例
@RequestMapping 请求后的映射路径
@PathVariable 标识接收单个参数
@ResponseBody 返回对象利用jackson工具类转换为json字符
@RequestParam 参数名和请求参数名称不同时使用,可以设置默认值

五,Git

–1,概述

package cn.tedu.ioc;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
//junit单元测试方法:测试一段代码的结果@Test
@Test
public void get(){
//1,读取配置文件–参数是配置文件的名字
ClassPathXmlApplicationContext spring =
new ClassPathXmlApplicationContext(
“spring.xml”);
//2,获取对象–参数是配置文件里,bean标签的id的属性值
Object o = spring.getBean(“hello”);
//cn.tedu.spring.Hello@4550bb58
System.out.println(o);
}
}

–2,使用步骤

1,创建本地仓库: E:\workspace\gitee,用来存即将上传的代码
2,创建远程仓库: 存你上传的代码.去码云官网创建一个开源的仓库(设置仓库名字)
3,上传前,先保证本地仓库有东西能传别空着
4,正式上传:需要在本地仓库的位置执行Git命令
SpringMVC_第14张图片

–3,执行以下命令:

git config --global user.name "cgblpx"
git config --global user.email "[email protected]"
mkdir cgb210801
cd cgb210801
git init
在本地仓库中,创建文件1.txt
git add .
git commit -m "first commit"
git remote add origin https://gitee.com/cgblpx/cgb210801.git
git push -u origin master
第一次上传的话,输入Gitee注册时的账号和密码就行了

–4,检查是否成功:

SpringMVC_第15张图片

–5,查看上传的数据

打开Gitee网站,多刷新几次,就看到上传的内容了

你可能感兴趣的:(restful,java,mvc)