十 SpringBoot-SpringMvc使用详解

10.1 @Controller&@RequestMapping&@ResponseBody

  1. @Controller

    @Controller 是Spring框架提供的注解。

    @Controller标识的类,该类代表控制器类(控制层/表现层)。
    这里控制层里面的每个方法,都可以去调用@Service标识的类(业务逻辑层),@Service标识的类中的方法可以继续调用@Resposity标识的接口实现类(Dao层/持久层)。

  2. @RequestMapping

    在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求.

  3. @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()));
    }
}
<!DOCTYPE html>
<!--这里加入了相应的命名空间,以免使用时会报错-->
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 userlist
 <!--使用标签获取后台传的数据,jsp用得是jstl,thymeleaf有自己的语法-->
 <div th:text="${msg}"></div>
<!--<div th:for=""></div>-->
</body>
</html>

测试:

​ localhost:8080/emp1/index

localhost:8080/emp1/list/obj

localhost:8080/emp1/list/array

image-20201227091625997

10.2 @RestController

​ @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()));
    }
}

10.3 @RequestMapping&@XxxMapping

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

10.4@RequestParam&@RequstBody&@PathVariale

  1. @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类型的请求,比如向表单插入单条数据,但是这样不支持批量插入数据。

    image-20201227093703361

    后端参数接收:后端使用集合来接受参数,灵活性较好,如果url中没有对参数赋key值,后端在接收时,会根据参数值的类型附,赋一个初始key(String、long ……)

    image-20201227093824062

  2. @RequstBody

    • @RequestBody接收的参数是来自RequestBody中,即请求体。

    • @RequestBody一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。

    • 一般用于Post请求,它把前端的json数据传到后端,后端进行解析。

      image-20201227093427115

      @PostMapping("save")
      public void save(@RequestBody Student student) {
          studentRepository.saveOrUpdate(student);
      }
      
  3. @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);
      }
      

10.5 SpringMVC Restful编程

10.5.1 什么是restful

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
}

10.5.2 restful好处

  1. 拥有http的优点

    本身就是http,无状态,不用关心两次访问上下文.

  2. 透明性,暴露资源存在

    看到命令就知道要做什么了

  3. 充分利用 HTTP 协议本身语义。

    原来只用get,post,现在连delete和put等

10.5.3 特征

  1. 资源使用名词表示

    资源是通过url描述,也就是在url不要出现动词

  2. 使用http动词来描述

    get 获取 post新增 put修改 delete删除 patch批量操作

  3. json:数据传输方式之一

    ​ 对象:{}

    ​ 数组:[{},{}]

10.5.4 SpringMVC实现

@GetMapping("xx")
@PostMapping("xx")
@DeleteMapping
@PutMapping
@RequestMapping(value = "xx",method = RequestMethod.POST)

10.5.5 crud案例

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

10.6 小结

​ 本章节讲了SpringMVC的一些常用的语法和Restful,都是企业中经常使用的功能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值