框架: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即可。
框架:SpringMVC常用注解总结相关推荐
- SpringMVC-学习笔记03【SpringMVC常用注解】
Java后端 学习路线 笔记汇总表[黑马程序员] SpringMVC-学习笔记01[SpringMVC概述及入门案例][day01] SpringMVC-学习笔记02[参数绑定及自定义类型转换] Sp ...
- springmvc常用注解
转载自 springmvc常用注解 第一部分 一.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请 ...
- springmvc常用注解与类型转换
springmvc常用注解与类型转换 一:前置 spring -servlet.xml 注入 <!-- 启用spring mvc 注解 --><context:annotation- ...
- springmvc php,SpringMVC 常用注解
SpringMVC 常用注解 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...
- springmvc常用注解标签详解
参考:https://www.cnblogs.com/leskang/p/5445698.html 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由Disp ...
- [转]springmvc常用注解标签详解
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
- spring : springmvc常用注解标签详解(转)
新的项目,新的学习,好久没用这些注解了,同时在学习使用shiro ,lucene 等等.在网上找了些博文,感谢作者的总结和分享. 欢迎交流,言归正传: 1.@Controller 在SpringMVC ...
- SpringMVC常用注解详解
先说扫描注解 <context:component-scan base-package = "" /> component-scan 默认扫描的注解类型是 @Compo ...
- Spring的常用注解,SpringMVC常用注解
spring注解 作用 IOC @Component 进行标注,所有层通用 @Repository 用于dao层实现类进行标注 @Service 用于Service层实现类进行标注 @Controll ...
最新文章
- 新 IDE 出现,程序员迎来危机?
- SpringMVC-快速入门
- 6部BBC “教材级” 地理纪录片,有生之年必看系列!
- 机器学习_决策树_ID3算法_C4.5算法_CART算法及各个算法Python实现
- MySQL数据库无完整备份删库,除了跑路还能怎么办?
- 华为鸿蒙系统好在哪,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
- MinIO客户端快速入门指南
- 用公式求e^x的近似值
- 18复变函数的积分(四)
- System.out.println 在idea控制台输出的中文乱码问题
- TCP相关面试题总结
- 一个创业公司CEO的85条感悟
- 希望 线段树 01背包
- 【图像融合】基于matlab小波变换遥感图像融合【含Matlab源码 744期】
- 大数据概述(尚硅谷)
- mysql查询同时选修了两门_查找同时选修了C01及C02两门课程的学生姓名及学号
- 显示随机森林多元回归结果
- 2021SC@SDUSC山东大学软件学院软件工程应用与实践--YOLOV5代码分析(十三)metrics.py-1
- 迁移系统至固态硬盘的采坑回顾
- python3 文字合成语音MP3
热门文章
- Android之ProgressBar读取文件进度解析
- android面试小结
- MVC Action Filters 总结
- Java中log4j控制写入日志开关
- Mac OS 错误代码 -8072的可行解决方法
- shell脚本例子集锦
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 1 Week 2 assignment2_1
- 机器学习入门笔记:(4.3)SMO算法
- php性能测试下载,PHP性能测试工具xhprof安装与使用方法详解
- java lambda 局部变量_java Lambda表达式访问局部变量详细介绍