这段时间一直在着手于RESTful风格的接口设计。springmvc的RESTful风格的url是通过@RequestMapping 及@PathVariable annotation提供的。为此我好好研究了一下关于Springmvc请求这方面的内容,也借鉴了前人的经验写下这篇博客,记录下我的学习心得。
一、@RequestMapping简介
@RequestMapping是用来映射URL,它可用在类定义处和方法定义处。我们映射的url是相对于根目录而言的,如代码所示:
package com.gray.user.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gray.user.entity.User;
import com.gray.user.service.impl.UserServiceImpl;
@Controller
@RequestMapping("/test")
public class LoginController {
@Autowired
private UserServiceImpl userService;
@RequestMapping("/dologin.do") //url
public String dologin(User user, Model model){
if(userService.doUserLogin(user)){
model.addAttribute("successMsg", "登陆成功!");//返回到页面所夹带的参数
model.addAttribute("name", user.getUsername());
return "/success";//返回的页面
}else{
model.addAttribute("failMsg", "用户不存在或密码错误!");
return "/fail";
}
}
}
dologin方法所映射的url地址我们写成 http://localhost:9090/test/dologin.do
关于RequestMapping这个注解,里面一共有6个属性
1.value
指定请求的实际地址;
2.method
指定请求的method类型, GET、POST、PUT、DELETE等;
3.consumes
指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
4.produces
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
5.params
指定request中必须包含某些参数值;
6.headers
指定request中必须包含某些指定的header值;
二、@PathVariable简介
当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。
三、@RequestBody简介
该注解用于读取Request请求的body部分数据,这主要是通过spring的消息转换器messageConverter实现的,首先我们需要在配置文件里面配上这个bean,通过已经配置的消息转换器把相应的数据转换成要传入的对象进而绑定到方法的参数中。
四、@RequestParam简介
在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法,我们可以对传入参数指定参数名,前端传进来的参数名要和这个value值一致。我们也可以通过required=false或者true来要求@RequestParam配置的前端参数是否一定要传。
五、@ResponseBody简介
和@RequestBody相似的用法,根据配置的消息转换器将对象转换为指定格式后,写入到Response对象的body数据区。
六、@CookieValue简介
从Http请求头中的Cookie提取指定的某个Cookie。
七、常见注解用法实例
- 关于@RequestMapping
- value
value是默认属性,即@RequestMapping("/dologin.do")和@RequestMapping(value="/dologin.do")是等价的。
- method
@RequestMapping(value = {"/ws/createEmployeeBasic","/ws/updateEmployeeBasic"}, method = RequestMethod.POST)
注:mapping的value是可以写多个的。
- consumes
consumes="application/json",就是需要参数以json格式传进来我才能接收。如1的代码所示,随后我们把传进来的数据通过@RequestBody转换成我要的对象。
- produces
@RequestMapping(value="/test.do",produces="application/json;charset=UTF-8"),和上面那个用法差不多。两者区别就是前者只管请求,后者两个都管。
- params
@RequestMapping(value="/dologin.do",params={"user=gray","pwd=111111"})
这种写法就限制了只有当传进来的参数user=gray并且pwd=111111时才能映射到下面的方法,否则报404。
- headers
老实说这个用法我几乎没用过。它用于指定请求头里面的参数,限客户端的请求。如:
@RequestMapping(value="/dologin.do", headers="Host=localhost:9090")
这种写法就是限制了只有本机发来的请求才接收。
2.关于@RequestBody和@PathVariable
在这里我要说一下,带占位符的url,是Spring 3.0的新功能,我在项目中实现restful风格的url就是根据这个来实现的。
例如:
{token}等需要通过@PathVariable注解将占位符中的参数绑定到方法的参数中。@RequestMapping(value = "/ws/OEmployeeBasic/{token}/{timestamp}", method = RequestMethod.POST, consumes="application/json") @ResponseBody public void pageList( @RequestBody Employee emp, @PathVariable String token, @PathVariable String timestamp, HttpServletRequest request, HttpServletResponse response){ ...... }
3.关于@ResponseBody
在springmvc的开发中,所有返回数据的请求都需要加上这个注解。如:
@RequestMapping("/myEspPageList.do") @ResponseBody public Object myPageList(Employee emp, HttpServletRequest request, HttpServletResponse response){ Object obj = super.pageList(emp, request, response); return obj; }
4.关于@RequestParam
差不多常用的和我项目中用过都一一列举出来的。方便大家学习。正如上面所说的,返回页面是不需要加 @ResponseBody。@RequestMapping("/empTableList.do") public String list(Model model,@RequestParam(value="tabs",required=false)Integer tabs){ if (tabs == null || tabs > 3 || tabs < 0) tabs = 0; // tabs只允许0/1/2/3,默认为0 model.addAttribute("tabs",tabs); return "/configuration/basetable_list"; }