框架:SpringMVC常用注解总结
在项目学习的过程中,使用到了哪些注解呢?
1:@RequestMapping
RequestMapping可以注解到类或者方法上,可以用来处理请求地址的映射。
注:注解于类上,说明该类中所有的响应请求方法都是以该注解地址为父路径的。
RequestMapping有几个属性,把最重要的几个分成以下3个类:
1) value, method;
value:
指定的请求地址,或者URI模式的地址。
具体实现如下:
A:具体类:@RequestMapping(value="/user/roles/)
B:含某个变量的类:@RequestMapping(value="/user/roles/{uid})
在声明方法时:
publicStringgetProduct(@PathVariable("uid") Long uid){
}
则把声明的参数“uid”与形参uid所绑定,此时取得的形参是地址传递的uid参数。
C:含有正则表达式的类Method:
Method:
制定请求的方法,GET,POST等,若无声明,则默认几个常见的都可以。如GET、POST、PUT、DELETE等都可以取得。
4: @GetMapping
@GetMapping是一个组合注解,是@RequestMapping(method= RequestMethod.GET)的缩写。该注解将HTTP Get 映射到特定的处理方法上。
所以此处个人的理解,@GetMapping可以算是@RequestMapping的子集,可能该说法不是很严谨,但是我个人暂时是这么理解的。
1. 哪一些情况下,浏览器会发送get请求
a. 直接在浏览器地址栏输入某个地址
b. 点击链接
c. 表单默认的提交方式
2.特点:
a. 请求参数会添加到请求资源路劲的后面,只能添加少量参数
b. 请求参数会显示在浏览器地址栏,路由器会记录请求地址
5:@PostMapping
1. 哪一些情况下,浏览器会发送post请求
a. 设置表单method = "post"
2.特点:
a. 请求参数添加到实体内容里面,可以添加大量的参数(也解释了为什么浏览器地址栏不能发送post请求,在地址栏里我们只能填写URL,并不能进入到Http包的实体当中)
b. 相对安全,但是,post请求不会对请求参数进行加密处理(可以使用https协议来保证数据安全)。
6:RequestBody
如果传输的是单层json对象,我们后台可以直接用 @RequestParam接收
$.ajax({
type : "post",
dataType : "json",
url : "/testRequestBody",
data:{
name:"韦德",
age:35
},
success : function(result) {
}
});
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestParamMap<String, Object> map) {
System.out.println(map);// {name=韦德, age=35}
return"index";
}
如果传输的是多层嵌套json对象,这个时候会就会出现数据丢失问题
@RequestBody很好的解决了这个问题,它会把前台传输过来的json转化为后台对应的对象
$.ajax({
type : "post",
dataType : "json",
url : "/testRequestBody",
contentType:"application/json",
data:JSON.stringify({
name:"韦德",
win:[2006,2012,2013],
age:35
}),
success : function(result) {
}
});
@RequestMapping("/testRequestBody")
public StringtestRequestBody(@RequestBodyMap<String, Object> map) {
System.out.println(map);//{name=韦德, win=[2006, 2012, 2013], age=35}
return"index";
}
需要注意的是前台需要指定contentType为"application/json"
同时要把json对象转化为String,否则后台不能识别
7:@ResponseBody
@ResponseBody注解到方法上,直接传回结果(字符串)
ajax请求返回json格式,往常我们这样做
privatevoid writeJson(HttpServletResponseresponse,Object object) {
String json =JSON.toJSONString(object);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = null;
try {
out = response.getWriter();
out.write(json);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
这个时候 @ResponseBody就派上用场了,只需要一个注解,全部搞定
$.ajax({
type : "post",
dataType : "json",
url : "/testResponseBody",
success : function(result) {
console.info(result);
}
});
@RequestMapping("/testResponseBody")
@ResponseBody
public Map<String, Object>testRequestBody(){
Map<String,Object> result = new HashMap<String,Object>();
result.put("name", "韦德");
result.put("age", 35);
return result;
}
前台console输出
{
"age": 35,
"name": "韦德"
}
说一些个人的看法,非技术层面上的,一个 API 何时用 GET、POST 甚至 PUT 请求。
首先引入一个副作用的概念,副作用指当你发送完一个请求以后,网站上的资源状态没有发生修改,即认为这个请求是无副作用的。比如注册用户这个请求是有副作用的,获取用户详情可以认为是无副作用的。
再引入一个幂等性的概念,幂等是说,一个请求原封不动的发送N次和M次(N不等于M,N和M都大于1)服务器上资源的状态最终是一致的。比如发贴是非幂等的,重放10次发贴请求会创建10个帖子。但修改帖子内容是幂等的,一个修改请求重放无论多少次,帖子最终状态都是一致的。(前提是同一个修改操作重复10次)
唠叨了这么多,回过头来,何时用 PUT POST GET DELETE:
GET:无副作用,幂等
PUT:副作用,幂等
POST:副作用,非幂等
DELETE:副作用,幂等
这么看的话,DELETE 和 PUT 请求好像毫无区别。为了进一步区分这些请求方式的应用场景,我们再引入一个技术特性,request body,就是大家广为流传的 "POST 请求传输数据量比较大“ 这一说法的来源。
POST/PUT 请求可以通过传递 request body 来发送大量的数据,而 GET/DELETE 不能。
所以上面的表格需要再加一项:
GET:无副作用,幂等,不可带 Request Body
PUT:副作用,幂等,可以带 Request Body
POST:副作用,非幂等,可以带 Request Body
DELETE:副作用,幂等,不可带 Request Body
2) params,headers
params:
指定request中必须包含某些参数值,才让该方法处理。
headers:
指定request中必须包含某些指定的header值,才能让该方法处理请求。
3) consumes,produces
consumes:
指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;
produces:
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
2:@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:
3: @RequestParam
@RequestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),
它有三个常用参数:defaultValue = "0", required = false,value="isApp";
defaultValue 表示设置默认值,required通过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
形式如项目中的:
public ObjectuserMemberShop(@RequestParam(required= false,value="corpId")IntegercorpId,
@RequestParam("uid")Longuid){
}
参考一篇文章,其中讲了@controller、@service、@repository注解,自己复制下再总结下自己的一些想法。
如果一个类带了@controller、@service、@repository注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了。
首先:
Controller层使用@Controller注解
Service层使用@Service注解
Dao层使用@Repository注解
@Controller可注解于类上,声明该类为SpringMVC的Controller对象。
简单说:被@Controller注解的类是一个控制器,该类的方法是相应的动作。
@Service可注解于类上,
简单说:
1.声明该类是一个bean。如
@Service
@Scope("prototype")
public class Zoo
2.Zoo.java在bean中的id是"zoo",即类名且首字母小写
例:@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action。
dao层使用@repository注解
@Repository可注解于类上,
@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。
当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,
就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。