三大框架之SpringMVC学习之路

本文详细介绍了SpringMVC的概念、MVC设计模式以及SpringMVC的架构,通过案例展示了如何使用SpringMVC展示汽车数据,包括创建控制器、处理HTTP请求、数据绑定以及使用Ajax测试。此外,还讲解了如何将数据存入数据库,以及创建前端表单提交数据到后端和数据库的操作步骤。
摘要由CSDN通过智能技术生成

1 SpringMVC

1.1 SpringMVC概念

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

  • springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
  • springmvc是一个基于mvc的web框架。
  • springmvc 表现层:方便前后端数据的传输
  • Spring MVC 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层

1.2 什么是MVC

  • MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
  • 是将业务逻辑、数据、显示分离的方法来组织代码。
  • MVC主要作用是降低了视图与业务逻辑间的双向偶合。
  • MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
    在这里插入图片描述
    Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
    View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
    Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

1.3 SpringMVC架构(MVC设计模式在BS系统下的应用)

SpringMVC是Spring的一部分,如图:
在这里插入图片描述
Spring MVC的特点:

  • 轻量级,简单易学
  • 高效 , 基于请求响应的MVC框架
  • 与Spring兼容性好,无缝结合
  • 约定优于配置
  • 功能强大:RESTful、数据验证、格式化、本地化、主题等
  • 简洁灵活

Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。
DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解形式进行开发,十分简洁;

SpringMVC的核心架构:
图一:
在这里插入图片描述
图二:
在这里插入图片描述

具体流程:

(1)首先浏览器发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

(2)DispatcherServlet——>HandlerMapping,处理器映射器将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象;

(3)DispatcherServlet——>HandlerAdapter,处理器适配器将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;

(4)HandlerAdapter——>调用处理器相应功能处理方法,并返回一个ModelAndView对象(包含模型数据、逻辑视图名);

(5)ModelAndView对象(Model部分是业务对象返回的模型数据,View部分为逻辑视图名)——> ViewResolver, 视图解析器将把逻辑视图名解析为具体的View;

(6)View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构;

(7)返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

1.4 案列:展示汽车数据

1.4.1 需求

访问本地链接:http://localhost:8080/car/get后网页得到关于汽车相关信息的JSON数据,如汽车品牌名字,汽车颜色等信息。

1.4.2 创建Maven Module项目

右键工程名——>new——>Module——>选择Maven,然后next——>输入项目名称,然后finish。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4.2 创建相关包

依次点击刚刚创建的Maven项目——>src——>main——>java,右键java包,选择new——>package,创建包。
在这里插入图片描述
在这里插入图片描述
右键刚刚创建的cn.tedu包,选择new——>package,创建包。

在这里插入图片描述
重复上述操作,再次创建一个包。最后结构如下。
在这里插入图片描述

1.4.3 创建Java项目

1.创建程序运行类RunApp1

右键cn.tedu包,new——>java class。
在这里插入图片描述
内容如下:

package cn.tedu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication//标识为springboot项目
public class RunApp1 {
    public static void main(String[] args) {
       //全新的启动方式,执行run方法会自动启动集成的tomcat中间件,运用了反射机制,类名.class。
        SpringApplication.run(RunApp1.class);
    }
}

@SpringBootApplication注解标识为springboot项目

2.创建汽车Car类

右键pojo,new——>java class。
在这里插入图片描述
内容如下:

package cn.tedu.pojo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
public class Car {
    private Integer id;
    private String name;
    private String color;
    private Double price;
    public Car(Integer id, String name, String color, Double price) {
        this.id = id;
        this.name = name;
        this.color = color;
        this.price = price;
    }

    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 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 + '\'' +
                ", color='" + color + '\'' +
                ", price=" + price +
                '}';
    }
}

3.创建CarController类

右键controller,new——>java class。
在这里插入图片描述
内容如下:

package cn.tedu.controller;
import cn.tedu.pojo.Car;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//接受浏览器的请求 并返回json数据
@RequestMapping("car")//地址栏组成部分,指明访问端口里的哪个类
public class CarController {
    @RequestMapping("get1")//地址栏组成部分,指明访问类里的哪个方法,方法有参数则需要传参。
    public Car getCar1(Car car){
        System.out.println(car);
        return car;
    }
    @RequestMapping("get2/{x}/{y}/{z}/{w}")//提供占位符,简化网址输入方式
    public String getCar2(@PathVariable Integer x,
                         @PathVariable String y,
                         @PathVariable String z,
                         @PathVariable Double w){
        System.out.println(new Car(x,y,z,w));
        return "id = "+x+",name = "+y+",color = "+z+",price = "+w;
    }
}

1.5 测试

1.5.1 打开端口

回到程序运行类RunApp1,运行程序。
在这里插入图片描述
出现此界面表示程序运行成功。

1.5.2 网页输入地址

打开chrome浏览器,地址栏输入http://localhost:8080/car/get1?id=110&name=bmw&color=black&price=999999.99999
回车后显示结果如下:
在这里插入图片描述
在这里插入图片描述
更改地址测试简化地址的输入方式,地址栏输入http://localhost:8080/car/get2/120/tsl/white/66666.66666回车后显示如下内容:
在这里插入图片描述
在这里插入图片描述

1.5.3 使用Ajax测试

创建html,内容如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="jquery-1.8.3.min.js"></script>
		<script>
			function a(){
				$.ajax({
					type: "get", //要使用的请求方式
					url: "http://localhost:8080/car/get1", //要使用的请求路径 
					data:{
							"id":"222", //要拼接的数据
							"name":"eee",
							"color":"ddd",
							"price":"2222.222"
							},
					dataType:"json",
					success: function(data){ //成功时的方案 
						console.log(data);//显示出返回的数据
					},
				})				
			}
		</script>
		
	</head>
	<body>
		<a onclick="a();" href="#">ddd</a>
		//点击事件按钮,点击ddd时执行a()函数
	</body>
</html>

执行结果如下:
在这里插入图片描述
在这里插入图片描述

1.6 数据存入数据库

1.6.1 创建car数据表

可以直接进入Navicat,创建car数据表。
在这里插入图片描述

1.6.2 引入JDBC

在pom.xml中增加依赖,
在这里插入图片描述

1.6.3 代码编写

在CarController类中添加save()方法。

@RestController
@CrossOrigin
@RequestMapping("car")
public class CarController {
    @RequestMapping("save")
    public void sava(Car car) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//注册驱动
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/school?serverTimezone=UTC","root","root");//创建连接
        String sql = "insert into car values(?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);//获取传输器
        ps.setInt(1,car.getId());
        ps.setString(2,car.getName());
        ps.setString(3,car.getColor());
        ps.setDouble(4,car.getPrice());
        ps.executeUpdate();//执行SQL
        ps.close();//关闭资源
        conn.close();
        System.out.println(car);

    }
}

1.6.4 查看效果

运行启动类RunApp。运行HTML文件。点击ddd。
在这里插入图片描述
查看car数据表。
在这里插入图片描述

1.7 前端表单数据提交到后端和数据库

1.7.1 创建学生信息表单

HTML文件:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<link rel="stylesheet" href="stu.css" />
	<body>
		<!-- form表单,可以把数据提交给服务器 -->
		<form action="http://localhost:8080/student/save" method="post">
			<table bgcolor="aquamarine" align="left" border="">
				<th height="50px" align="center"><font size="5" color="black">学生信息管理系统</font></th>
				<tr>
					<td>姓名:</td>
				</tr>
				<tr>
					<td><input type="text" placeholder="请输入姓名" name="user"/></td>
				</tr>
				<tr>
					<td>年龄</td>
				</tr>
				<tr>
					<td><input type="number" placeholder="请输入年龄" name="age"/></td>
				</tr>
				<tr>
					<td>性别:(单选框)
						<input type="radio" name="sex" value="1"/><!-- 选男就用1表示 -->
						<input type="radio" name="sex" value="2"/></td>										
				</tr>
				<tr>
					<td>爱好:(多选)
					<input type="checkbox" name="hobby" value="ppq" />乒乓球
					<input type="checkbox" name="hobby" value="ps" />爬山
					<input type="checkbox" name="hobby" value="cg" />唱歌</td>
				</tr>
				<tr>
					<td>学历:(下拉框)
					<select name="edu">
					<option value ="1">专科</option>
					<option value ="2">本科</option></select></td>
				</tr>
				<tr>
					<td>入学日期:</td>
				</tr>
				<tr>
					<td><input type="date" name="intime" /></td>
				</tr>
				<tr>
					<td id="s">
						<input type="submit" value="保存" />
						<input type="reset" value="取消"/>
					</td>
				</tr>		
			</table>			
		</form>
	</body>
</html>

CSS文件:

		tr{
			height: 30px;
		}
		input[type="submit"]{
			background-color: #0000FF;
			width: 50px;
			height: 30px;
			color: #FFFFFF;
			border: 2px solid #ff55ff;
			
		}
		input[type="reset"]{
			background-color: #ff55ff;
			width: 50px;
			height: 30px;
			border: 2px solid blue;
			color: white;
		}
		input[type="text"]{
			height: 25px;
			width: 280px;
			color: #FF55FF;
		}
		input[type="number"]{
			height: 25px;
			width: 280px;
			color: #FF55FF;
		}
		input[type="radio"]{
			margin-left: 10px;
		}
		

在这里插入图片描述

1.7.2 创建学生类、学生控制类

在这里插入图片描述
Student类:
注意修改特殊数据类型。

package cn.tedu.pojo;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Arrays;
import java.util.Date;
public class Student {
    private String user;
    private Integer age;
    private Integer sex;
    private String[] hobby;//注意getHobby()要特殊处理
    private Integer edu;
    //页面提交的日期都是String类型,需要自己手动变成Date类型,加一个@DateTimeFormat注解
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date 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() {
    	String str = "";
    	if(hobby==null){
			return "null";
		}
		for (int i = 0;i < hobby.length;i++){
			str += hobby[i];
			if(i<hobby.lenth-1){
				str += ",";
			}
		}
        return str;
    }

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

    @Override
    public String toString() {//重写toString()方法,否则将打印地址值。
        return "Student{" +
                "user='" + user + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", hobby=" + Arrays.toString(hobby) +
                ", edu=" + edu +
                ", intime=" + intime +
                '}';
    }
}

StudentController类:

package cn.tedu.controller;

import cn.tedu.pojo.Student;
import org.springframework.web.bind.annotation.CrossOrigin;
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;
@RestController
@CrossOrigin
@RequestMapping("student")
public class StudentController {
    @RequestMapping("save")
    public Student save(Student stu) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/school?serverTimezone=UTC", "root", "root");
        String sql = "insert into student1 values(null,?,?,?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,stu.getUser());
        ps.setInt(2,stu.getAge());
        ps.setInt(3,stu.getSex());
        ps.setString(4,stu.getHobby());
        ps.setInt(5,stu.getEdu());
        long time = stu.getIntime().getTime();//日期格式特殊处理,因为后端和数据库里面的数据类型不匹配
        Date date = new Date(time);
        ps.setDate(6, date);
        ps.executeUpdate();
        ps.close();
        conn.close();
        System.out.println(stu);

    }
}

1.7.3 测试结果

向学生信息表里填写信息,然后点击保存。
在这里插入图片描述

在这里插入图片描述

数据库内容:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值