Spring: POJO容器。AOP各个层次之间的结藕
Spring MVC: 分离模型与视图
Spring Data: 数据存储
Spring Security: 集成了第三方技术
类似的技术:struts,JSF,MVC
解决的问题:分离模型层(M)与视图层(V)
怎么分离:提供控制层(C)
@Controller: 控制器
@RestController: RESTful控制器
@ResponseBody: 响应体,返回数据(json),不是视图名
@RequestBody: 请求体,获得Http请求头的负载(json/xml)并填充层对象
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PathVariable: 路径变量,/user/{name}/address/{id}
路径代表资源,方法代表资源的操作。
1.RESTful API+Vue ClI(前后端分离) ------推荐-----
2.RESTful API+static(HTML,CSS,JS) ------今天写的---
3.Controller+模板引擎(JSP,JSTL,Thymeleaf)
package com.newer.work;
/**
* POJO
* @author Admin
*
*/
public class Course {
int id;
String title;
String info;
public Course() {
}
public Course(int id, String title, String info) {
super();
this.id = id;
this.title = title;
this.info = info;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Course [id=" + id + ", title=" + title + ", info=" + info + "]";
}
}
package com.newer.work;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* RESTful风格API(开发接口)
*
* 建议: URL中加入/api/版本号的前缀
* @author Admin
*
*/
@RestController
@RequestMapping("/api/v1/course")
public class CourseController {
// Get "/course"
@GetMapping
public List findAll() {
return Db.selectAll();
}
@GetMapping("/{id}")
public Course load(@PathVariable int id) {
// Course c=new Course();
// c.setId(id);
return Db.selectById(id);
}
// 接收HTTP请求Body中的JSON数据,必须使用@RequestBody注解
@PostMapping
public Course create(@RequestBody Course c) {
// 存储
// c.setId(999);
Course course=Db.insert(c);
// 数据库中保存的对象
return course;
}
// @RequestBody从HTTP请求头中读取数据(JSON)填充一个Course类型对象
@PutMapping("/{id}")
public ResponseEntity update(@PathVariable int id,@RequestBody Course c) {
// 更新
Db.update(id, c);
// Http响应头中的状态码
// 1xx 信息中
// 2xx 成功
// 3xx 重定向
// 4xx 客户端错误
// 5xx 服务端错误
return new ResponseEntity("Http响应主体",HttpStatus.OK);
}
@DeleteMapping("/{id}")
public boolean remove(@PathVariable int id) {
// 删除
return Db.delete(id);
}
}
package com.newer.work;
import java.util.ArrayList;
import java.util.List;
/**
* 模拟数据库
* @author Admin
*
*/
public class Db {
// 计数器,类变量
static int count=1000;
// 集合,表
static ListcourseTable=new ArrayList<>();
static {
courseTable.add(new Course(1,"vue","前端框架"));
courseTable.add(new Course(3,"JS","前端框架"));
courseTable.add(new Course(7,"redis","数据存储"));
}
/**
* 返回所有数据
* @return
*/
public static ListselectAll(){
return courseTable;
}
/**
* 返回课程编号等于id的课程
*
* @param id 课程编号
* @return 匹配的课程或null
*/
public static Course selectById(int id) {
Course c=null;
for(Course course:courseTable) {
if(course.getId()==id) {
c=course;
break;
}
}
return c;
}
/**
* 插入一条数据
*
* @param c 新课程
* @return
*/
public static Course insert(Course c) {
// 数据库存储后才生成id
// 第一个值是1001
c.setId(++count);
courseTable.add(c);
return c;
}
/**
* 根据id删除记录
*
* @param id 编号
* @return boolean 成功删除返回true,否则返回false
*/
public static boolean delete(int id) {
Course d=null;
// 删除不要用foreach
for (int i = 0; i < courseTable.size(); i++) {
Course course=courseTable.get(i);
if(course.getId()==id) {
courseTable.remove(i);
break;
}
}
// 是否成功删除
return d!=null;
}
/**
* 更新编号为id的数据
* @param id 编号
* @param c 新数据
*/
public static void update(int id,Course c) {
// 更新不要用foreach
for (int i = 0; i < courseTable.size(); i++) {
Course course=courseTable.get(i);
if(course.getId()==id) {
// 更新
course.setTitle(c.getTitle());
course.setInfo(c.getInfo());
break;
}
}
}
}
package com.newer.work;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
// Get "/"--->"index.html"
@GetMapping("/")
public String home() {
return "index.html";
}
@GetMapping("/course")
public String course() {
// 请求转发到"/"--->index.html
// return "/";
// 响应重定向"/"---地址栏改变
// 状态码302.
return "redirect:/";
}
}
package com.newer.work;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WorkApplication {
public static void main(String[] args) {
SpringApplication.run(WorkApplication.class, args);
}
}
Spring Boot+Vue
服务端&前端在一起
Spring Boot+ Vue+axios
编号
课程
描述
操作
{{c.id}}
{{c.title}}
{{c.info}}
#显示Spring MVC 日志信息
logging.level.web=debug
#显示请求头详细信息
spring.http.log-request-details=true