框架: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",即类名且首字母小写

框架:SpringMVC常用注解总结

 

例:@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action。
dao层使用@repository注解

@Repository可注解于类上,

框架:SpringMVC常用注解总结

 

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。
当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,

就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。