@Controller
@Controller 是Spring框架提供的注解。
@Controller标识的类,该类代表控制器类(控制层/表现层)。
这里控制层里面的每个方法,都可以去调用@Service标识的类(业务逻辑层),@Service标识的类中的方法可以继续调用@Resposity标识的接口实现类(Dao层/持久层)。
@RequestMapping
在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求.
@ResponseBody
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
package org.yaosang.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class Employee {
private Long id;
private String name;
private Date birthDay;
public Employee() {
}
public Employee(Long id, String name, Date birthDay) {
this.id = id;
this.name = name;
this.birthDay = birthDay;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//对返回的日期进行格式化
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", birthDay=" + birthDay +
'}';
}
}
package org.yaosang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.yaosang.domain.Employee;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
//@Controller标识的类,该类代表控制器类(控制层/表现层)。
@Controller
//使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求.
@RequestMapping("/emp1")
public class Employee1Controller {
//1 响应视图
//完整的访问路径/user1/user1
//method指定http的访问方式,默认是GET可以是GET,POST,DELETE等
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String index(Model model){
model.addAttribute("msg","吊得很");
//返回页面路径
return "list";
}
//2 响应json数据对象
@RequestMapping(value = "/list/obj",method = RequestMethod.GET)
//responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,
//写入到response对象的body区,通常用来返回JSON数据或者是XML数据
@ResponseBody
public Employee getEmployee(){
//返回页面路径
return new Employee(1L,"zs",new Date());
}
//2 响应json数据对象
@RequestMapping(value = "/list/array",method = RequestMethod.GET)
//responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,
//写入到response对象的body区,通常用来返回JSON数据或者是XML数据
@ResponseBody
public List<Employee> getEmployees(){
//返回页面路径
return Arrays.asList(new Employee(1L,"zs",new Date()));
}
}
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
userlist
<div th:text="${msg}">div>
body>
html>
测试:
localhost:8080/emp1/index
localhost:8080/emp1/list/obj
localhost:8080/emp1/list/array
@RestController 也是Spring框架提供的注解。(Spring4.0之后新增的)
@RestController 注解相当于 @Controller + @ResponseBody 合在一起的作用。
Controller类中的方法返回值,默认是json对象,也就是相当于@Controller里面的方法上添加了@ResponseBody
如果方法返回值,需要跳转,那么方法的返回类型必须是View 或者ModelAndView.
domain和list.html不变
package org.yaosang.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import org.yaosang.domain.Employee;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
//@RestController 注解相当于 @Controller + @ResponseBody 合在一起的作用。
@RestController
@RequestMapping("/emp2")
public class Employee2Controller {
//1 响应视图
//如果方法返回值,需要跳转,那么方法的返回类型必须是View 或者ModelAndView.
@RequestMapping(value = "/index",method = RequestMethod.GET)
public ModelAndView index(Model model){
model.addAttribute("msg","吊得很");
//返回页面路径
return new ModelAndView("list");
}
//使用@RestController,Controller类中的方法返回值,默认是json对象,
// 就是相当于@Controller里面的方法上添加了@ResponseBody
//2 响应json数据对象
@RequestMapping(value = "/list/obj",method = RequestMethod.GET)
public Employee getEmployee(){
//返回页面路径
return new Employee(1L,"zs",new Date());
}
//2 响应json数据对象
@RequestMapping(value = "/list/array",method = RequestMethod.GET)
public List<Employee> getEmployees(){
//返回页面路径
return Arrays.asList(new Employee(1L,"zs",new Date()));
}
}
Http的请求方式有很多种的比如get,post,delete等,我们可以通过@RequestMapping的method来表示
@RequestMapping(value = "/index",method = RequestMethod.GET)
后来,在Spring4.3中引进了新注释,来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
只要是Spring4.3以后的版本建议使用后面这种。改造Employee2Controller如下:
package org.yaosang.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import org.yaosang.domain.Employee;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
//@RestController 注解相当于 @Controller + @ResponseBody 合在一起的作用。
@RestController
@RequestMapping("/emp3")
public class Employee3Controller {
//1 响应视图
//如果方法返回值,需要跳转,那么方法的返回类型必须是View 或者ModelAndView.
@GetMapping("/index")
public ModelAndView index(Model model){
model.addAttribute("msg","吊得很");
//返回页面路径
return new ModelAndView("list");
}
//使用@RestController,Controller类中的方法返回值,默认是json对象,
// 就是相当于@Controller里面的方法上添加了@ResponseBody
//2 响应json数据对象
@GetMapping(value = "/list/obj")
public Employee getEmployee(){
//返回页面路径
return new Employee(1L,"zs",new Date());
}
//2 响应json数据对象
@GetMapping(value = "/list/array")
public List<Employee> getEmployees(){
//返回页面路径
return Arrays.asList(new Employee(1L,"zs",new Date()));
}
}
@RequestParam
@RequestParam接收的参数是来自于RequestHeader中,即请求头。
@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。
一般用于Get请求,常见的URL:http://localhost:8080/test/findByIdAndName?id=1&name=zhangsan”
@RequestMapping("findById")
public Student findByIdAndName(@RequestParam("id") long id, @RequestParam("name") String name) {
return null;
}
也可以用Post类型的请求,比如向表单插入单条数据,但是这样不支持批量插入数据。
后端参数接收:后端使用集合来接受参数,灵活性较好,如果url中没有对参数赋key值,后端在接收时,会根据参数值的类型附,赋一个初始key(String、long ……)
@RequstBody
@RequestBody接收的参数是来自RequestBody中,即请求体。
@RequestBody一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。
一般用于Post请求,它把前端的json数据传到后端,后端进行解析。
@PostMapping("save")
public void save(@RequestBody Student student) {
studentRepository.saveOrUpdate(student);
}
@PathVariale
使用@PathVariable接收参数,参数值需要在url进行占位,前端传参的URL
一般也是用于Get请求,URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
localhost:8010/student/findById/1
@GetMapping("findById/{id}")
public Student findById(@PathVariable("id") long id) {
return studentRepository.findById(id);
}
Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,
用HTTP动词(GET,POST,DELETE,PUT,PATCH(批量操作))描述操作。
get http://127.0.0.1:8080/user/1 获取用户
delete http://127.0.0.1:8080/user/1 删除用户
put http://127.0.0.1:8080/user/ 修改用户
{
Id:1
Name:zs
}
Post http://127.0.0.1:8080/user/ 添加用户{
Name:zs
}
拥有http的优点
本身就是http,无状态,不用关心两次访问上下文.
透明性,暴露资源存在
看到命令就知道要做什么了
充分利用 HTTP 协议本身语义。
原来只用get,post,现在连delete和put等
资源使用名词表示
资源是通过url描述,也就是在url不要出现动词
使用http动词来描述
get 获取 post新增 put修改 delete删除 patch批量操作
json:数据传输方式之一
对象:{}
数组:[{},{}]
@GetMapping("xx")
@PostMapping("xx")
@DeleteMapping
@PutMapping
@RequestMapping(value = "xx",method = RequestMethod.POST)
@RestController //@Controller+@ResponseBody(转换json)
@RequestMapping("/department")
public class DepartmentController {
@Autowired
private IDepartmentService departmentService;
//传对象就用@RequestBody
@PutMapping //添加或修改
public AjaxResult addOrUpdate(@RequestBody Department department) {
try {
if (department.getId() != null) {
departmentService.update(department);
} else {
departmentService.add(department);
}
return AjaxResult.me();
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage("保存失败!" + e.getMessage());
}
}
@DeleteMapping("/{id}") // /department/1
public AjaxResult delete(@PathVariable("id") Long id) {
try {
departmentService.delete(id);
return AjaxResult.me();
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.me().setSuccess(false).setMessage("删除失败!" + e.getMessage());
}
}
@GetMapping("/{id}")
public Department get(@PathVariable("id") Long id){
return departmentService.getById(id);
}
@GetMapping
public List<Department> getAll(){
return departmentService.getAll();
}
//axios get不支持传对象
@PostMapping
public PageList<Department> list(@RequestBody DepartmentQuery query){
return departmentService.queryPage(query);
}
}
AjaxResult :前台调用返回的数据
/**
* 有些controller的操作以后的返回,只关心成功与否,以及失败了的原因
* 而且应该返回值是json数据。 {success:true/false,message:"系统错误“,resultObj:{}}
* 方案1; 后台拼接字符串返回 太麻烦,代码可读性差
* 方案2: 其实可以使用spirngmvc的自动转换json的功能
* 第一步:封装对象
* 封装一个对象,里面有两个属性 success ,message
* 到时候我构造一个对象返回,spirngmvc会自动帮我转换。
*
* 第二步:默认构造函数
*
* //成功的时候调用
public AjaxResult() {
}
//失败的时候调用
public AjaxResult(String message) {
this.success = false;
this.message = message;
//第三步:配置链式编程
//第四步:除了成功与否,还需要带一些额外数据到前台
}
*
*/
@Data
public class AjaxResult {
private boolean success = true;
private String message = "操作成功!";
private Object resultObj;
private Serializable sessionId;
public boolean isSuccess() {
return success;
}
//链式编程,可以继续. 设置完成后自己对象返回
public AjaxResult setSuccess(boolean success) {
this.success = success;
return this;
}
public AjaxResult setResultObj(Object resultObj){
this.resultObj = resultObj;
return this;
}
public String getMessage() {
return message;
}
public AjaxResult setMessage(String message) {
this.message = message;
return this;
}
//默认成功
public AjaxResult() {
}
//失败调用
public AjaxResult(String message) {
this.success = false;
this.message = message;
}
//不要让我创建太多对象
public static AjaxResult me(){
return new AjaxResult();
}
public static void main(String[] args) {
AjaxResult.me().setMessage("xxx").setSuccess(false);
}
}
本章节讲了SpringMVC的一些常用的语法和Restful,都是企业中经常使用的功能