随着前端,后端,数据库学习的完成,紧接着就是框架了,最近学习了SpringMVC,可以很好的把前后端数据库联系起来,用分层的思想来完成工作。
SpringMVC简介
SpringMVC分别对应着的是M:Model数据模型、V:View视图、C:Controller控制层。
将软件分层达到松耦合的效果,这样进行分层的结构,使得代码分离结构清晰,各层代码,各司其职,易于开发大型项目,这样的设计思想在任何软件的开发过程中都因该适用,各个部分相互独立,互不干扰,都做自己最擅长的的部分,提高代码的复用性!
工作原理图(摘自csdn:"cgblpx")
工作原理简短描述
1,前端控制器DispatcherServlet:
当浏览器发送请求成功后,充当这调度者的角色,负责调度每个组件.
2,处理器映射器HandlerMapping:
根据请求的URL路径,找到能处理请求的类名和方法名
url: http://localhost:8080/hi , 找到Hello类里的hi()
3,处理器适配器HandlerAdapter:
正式开始处理业务,并把返回结果的结果交给DispatcherServlet
4,视图解析器ViewResolver:
找到正确的,能展示数据的视图,准备展示数据
5,视图渲染View:
展示数据
配置名词简介
在JAVA下创建两个包
- Controller:控制层包,用于接收请求和给出相应
- pojo:Model数据层包,用于封装对象,保存数据
还有一个启动类RunApp,用于启动服务,充当服务器。这里需要用到注解@SpringBootApplication在类上添加
而Controller类里需要在类上添加@RestController注解;在类上或者方法上添加@RequestMapping注解,负责控制网页的访问方式,一般在类上加一个为主访问方式,在方法上加一个为副访问方式。
孩子也是刚学啊,只会使用,底层原理都不了解~~~
实战Demo
直接开始实战把,碰到什么知识点讲什么。
一、前端页面的搭建
个人习惯从前端页面开始做起!
使用HBuilder加CSS修饰做一个表单负责给后台提交数据,后台使用JDBC吧数据传输进数据库中保存。
效果图
实现代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>学生信息管理系统</title>
<style type="text/css">
.b{
background-color: blue;
border: blue;
color: white;
}
.c{
background-color: red;
border: red;
color: white;
}
.a{
padding: 0.325rem;
width: 250px;
height: 30px;
}
</style>
</head>
<body>
<h1>学生信息管理系统</h1>
<form action="http://127.0.0.1:8080/stu/add" method="post">
<table border="0" cellspacing="0" cellpadding="">
<tr><td>姓名</td></tr>
<tr><td><input class="a" type="text" placeholder="请输入姓名" name="name" id="" value="" /></td></tr>
<tr><td>年龄</td></tr>
<tr><td><input class="a" type="text" placeholder="请输入姓名" name="age" id="" value="" /></td></tr>
<tr><td>性别:
<input type="radio" class="" name="sex" id="" value="1" checked="checked" />
男
<input type="radio" class="" name="sex" id="" value="0" />
女
</td></tr>
<tr><td>爱好:
<input type="checkbox" name="hobby" id="" value="ppq" checked="checked"/>
乒乓球
<input type="checkbox" name="hobby" id="" value="ps" />
爬山
<input type="checkbox" name="hobby" id="" value="cg" />
唱歌</td></tr>
<tr><td>学历:<select name="edu">
<option value ="1">本科</option>
<option value ="2">硕士</option>
<option value ="3">博士</option>
</select>
</td></tr>
<tr><td>入学日期</td></tr>
<tr><td><input name="intime" type="date" name="" id="" value="" /></td></tr>
<tr align="center"><td >
<input class="b" type="submit" name="" id="" value="保存" />
<input class="c" type="button" name="" id="" value="取消" />
</td></tr>
</table>
</form>
</body>
</html>
知识点:
- 表单头method属性的参数为post,交给程序器处理,而配合使用的就是action属性,它的参数是指包表单提交的数据给到哪里去处理。
- 下面的input语句要注意它们的类型和返回的值,关系到后面对象的创建与数据库的设计
- 返回值如果是汉字需要占用三个空间,而字母或者数字只占用一个空间,所以有些返回值可以用数字或者汉字的英文缩写来替代,节约空间。
- 单选框的name值要一样,否则产生不了单选的效果
二、后端的编写
- 创建一个Maven项目,结构先搭建好
- 创建Controller包存放控制层代码
- 创建一个pojo包存放封装数据的代码
- 在大包下创建一个启动类RunApp负责服务器启动
- 考虑到要用JDBC进行数据传输,所以在pom.xml里添加JDBC的jar包依赖
结构已经搭建完成,接下来进行代码的编写
启动类RunApp
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);
}
}
封装数据类Student
package cn.tedu.pojo;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Arrays;
import java.util.Date;
public class Student {
private String name;
private Integer age;
private Integer sex;
private String[] hobby;
private Integer edu;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date 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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", 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.format.annotation.DateTimeFormat;
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("stu")
public class StudentController {
@RequestMapping("add")
public Object add(Student s) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cgb2106?characterEncoding=utf8", "root","root");
PreparedStatement p = c.prepareStatement("insert into tb_student value(null ,?,?,?,?,?,?)");
p.setObject(1, s.getName());
p.setObject(2, s.getAge());
p.setObject(3, s.getSex());
p.setObject(4, Arrays.toString(s.getHobby()));
p.setObject(5, s.getEdu());
p.setObject(6, s.getIntime());
int i = p.executeUpdate();
p.close();
c.close();
return "数据插入成功";
}
}
知识点:
- pojo类里的成员变量必须和前端的name值写的一样,否则报错
- 定义类型一般都是包装类,就算用户写错或者不写也有默认值,不会报错
- 浏览器提交的日期默认是String类型,需要用@DateTimeFormati进行格式的转换参数列表里写格式,如下:
-
@DateTimeFormat(pattern = "yyyy-MM-dd")
- 注意@RequstMapping后面括号里写的访问方式一定要和前端页面相呼应
- 在方法里写JDBC用安全传输器,避免SQL注入的风险,代码如下:
-
PreparedStatement p = c.prepareStatement("insert into tb_student value(null ,?,?,?,?,?,?)"); p.setObject(1, s.getName()); p.setObject(2, s.getAge()); p.setObject(3, s.getSex()); p.setObject(4, Arrays.toString(s.getHobby())); p.setObject(5, s.getEdu()); p.setObject(6, s.getIntime()); int i = p.executeUpdate();
- 设置值用Object类型,多态的体现,什么类型都可以,但是不能乱给,要符合数据库的设计
- 数组返回的是地址值,需要用Arrays.toString
- 最后注意资源的释放,节省空间
三、数据库的设计
设计图
知识点:
- 名字必须与前后端一致
- 类型合理设置,注意char和varchar的使用区别
- 给表设置主键的增加以及自增以及非空选项
四、结果展示
到此结束了,还有许多需要改进的地方以及对SpringMVC框架理解后面慢慢拓深自己的技术栈!
后面学习Spring和Mybatis。