SpringMVC RESTful

不羁的心 提交于 2020-02-02 08:37:14

 

RESTful是web应用的一种设计风格、开发方式。

以根据product_id查询产品信息为例。

 

 

原来的写法

@org.springframework.stereotype.Controller
public class ProductController{

    @RequestMapping("/queryProduct")
    public ModelAndView queryStudent(int product_id) {
        ModelAndView mav = new ModelAndView("product_info");
        //此处省略调用dao层获取产品信息,得到Product类的实例product
        //将数据传给视图,展示产品信息
        mav.addObject("product", product);
        return mav;
    }

}

 

请求地址:

http://.../queryProduct?product_id=1

 

 


 

 

RESTful风格的写法

@org.springframework.stereotype.Controller
public class ProductController{

    @RequestMapping("/product/{product_id}")
    public ModelAndView queryStudent(@PathVariable int product_id) {
        ModelAndView mav = new ModelAndView("product_info");
        //此处省略调用dao层获取产品信息,得到Product类的实例product
        //将数据传给视图,展示产品信息
        mav.addObject("product", product);
        return mav;
    }

}

 

请求地址:

http://.../product/1

 

原来是映射为queryProduct、saveUser,动词+名词;

RESTful风格是映射为product、user,名词。

 

原来使用 ?参数名=参数值  来传参数,

RESTful是直接把参数值写成下一级路径的形式 , /1。

 

 

 

    @RequestMapping("/product/{product_id}")
    public ModelAndView queryStudent(@PathVariable int product_id) {
       
    }

在@RequestMapping中,用{ }来接收对应位置上的值,{ }中随便写一个变量名,用这个变量来接收值。注意是{ },不是#{ },也不是${ }。

映射地址时会自动把{ }部分换为相应的值。

并且,SpringMVC会把{ }的值赋给业务方法中@PathVariable修饰的参数

 

 

怎么赋值?

    @RequestMapping("/product/{product_type}/{product_id}")
    public ModelAndView queryProduct(@PathVariable String type,@PathVariable("product_id") int product_id) {
        
    }

如果业务方法的参数名和{ }中的变量名相同,直接用@PathVariable修饰参数即可,SpringMVC会自动把值赋给同名的参数。

如果不相同,需要用@PathVariable("  ")指定这个参数要使用哪个{ }的值。参数通过@PathVariable(" ")与某个{ }绑定。

 

 

这种写法还是比较常见的,比如把产品类型、产品id传过去:

http://.../product/phone/5
http://.../product/computer/9

手机这个大类的第五款产品,电脑这个大类的第9款产品。

 

再比如把搜索的关键字传过去:

http://.../search/chy

 

比如说查看某用户、的某类型、的第几篇文章,把用户id、类型、文章id传过去,请求参数甚至可以用来拼接视图名:

https://www.cnblogs.com/chy18883701161/p/12249175.html

 

 

映射的url地址随着请求参数的变化而变化,带{ }的这个@RequestMapping映射地址只是一个模板,所以又叫做url模板映射。

 

 


 

 

 

http://.../user/1

addUser、deleteUser、updateUser、queryUser,业务方法众多,总不能都映射为/user吧。

 

 

    @RequestMapping(value = "/user/{user_id}",method = RequestMethod.GET)
    public ModelAndView queryProduct(@PathVariable int user_id) {

    }

不是可以指定HTTP请求方式吗,4个方法都映射为/user,以HTTP请求方式来区分CRUD:

  • get   查询
  • put   添加
  • delete   删除
  • post   更新

使用ajax发请求时,根据操作类型使用对应的HTTP请求方式。

这种方式不常用,因为国内基本只用get、post。

 

 

可以使用@RequestMapping(),在里面指定HTTP请求方式,也可以直接使用对应的注解:

    @RequestMapping(value = "/user/{user_id}",method = RequestMethod.GET)
    
    @GetMapping("/user/{user_id}")

完全等价。

4种HTTP请求都有对应的注解。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!