spring和springmvc的注解
Spring和Spring MVC的注解都非常多,这个很难几句话说清楚,
给你看下轻量级java web企业应用实战,主要就是讲SSM整合开发的这本书的部分目录。
6.6 请求映射与参数处理 510
6.6.1 HandlerMapping与处理映射 510
6.6.2 SimpleUrlHandlerMapping的功能与用法 511
6.6.3 @RequestMapping注解及其变体 512
6.6.4 处理方法允许的返回值类型 515
6.6.5 @RequestParam注解与MultiValueMap 516
6.6.6 使用@PathVariable获取路径变量的值 520
6.6.7 使用@PathVariable处理正则表达式 523
6.6.8 路径模式 524
6.6.9 使用@MatrixVariable处理Matrix变量 526
6.6.10 使用@RequestHeader获取请求头的值 529
6.6.11 异步处理 5306.6.12 使用DeferredResult支持异步处理 534
6.6.13 使用@ModelAttribute修饰方法本身 536
6.6.14 使用@ModelAttribute修饰方法参数 539
6.7 将数据传给视图页面 541
6.7.1 Model、ModelMap和RedirectAttributes 541
6.7.2 使用@SessionAttributes添加session属性 542
6.8 RESTful服务支持 544
6.8.1 RESTful简介 544
6.8.2 @RequestBody与@ResponseBody注解 546
6.8.3 HttpMessageConverter与消息转换 550
6.8.4 转换XML数据 553
6.8.5 使用@RestController修饰RESTful控制器 557
6.8.6 @CrossOrigin注解与跨域请求 557
看这目录你就知道你这个问题覆盖的内容多么丰富了。
spring mvc 常用注解详解
前言
现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。
Spring mvc 介绍
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发
image.png
spring mvc 常用注解详解
@Controller
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 等一些注解用以定义请求URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。其标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。此外我们还需要将controller注册到spring里
@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径,作用于方法上,表明该处理器的请求地址=父路径+方法上url+method,其拥有6个属性
1、 value, method;定义处理器访问的具体体质
value: 指定请求的实际地址,指定的地址可以是URI Template 模式;
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、consumes,produces 定义处理器内容类型
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers 定义处理器处理类型
params: 指定request中必须包含某些参数值,才让该方法处理!
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:
@requestParam
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
@ResponseBody
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json等)使用;
@RequestBody
该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。
spring mvc 拦截器配置
preHandle:预处理回调方法,返回值:true表示继续流程,false表示流程中断(如登录检查失败),不会继续续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
spring mvc 静态资源放问配置
image.png
spring mvc 文件上传
前端
后端
spring mvc 工作流程详解
image.png
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
如果你也对Java架构比如分布式、微服务、源码分析、性能优化、高并发高可用等技术感兴趣可以在手机上面私信我,回复「架构」二字即可免费领取一套价值3880的架构资料哦。
springmvc的注解都有哪些
一、@Controller 控制层 ,通常我们所说的action层
Controller控制器是通过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型然后将试图呈献给用户。Spring MVC 使用 @Controller 定义控制器,它还允许自动检测定义在类路径下的组件并自动注册。
二、@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性
value, method;consumes,produces;params,headers
三、@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
四、@ModelAttribute和 @SessionAttributes
代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。@SessionAttributes即将值放到session作用域中,写在class上面。
五、@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。
六、@requestParam
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue
= "0", required = false, value = "isApp";defaultValue 表示设置默认值,required
铜过boolean设置是否是必须要传入的参数,value
值表示接受的传入的参数类型。
七、@ResponseBody
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
八、@Component
相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议。
九、@Repository
用于注解dao层,在daoImpl类上面注解。
【SpringMVC】MyBatis多表操作与注解开发
想象一下你在淘宝,在购买东西后会有个订单支付的页面,下单后用户和订单就关联起来了,同时订单有一个唯一的编号叫订单号。用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
即 order对user是一对一的,反过来,user对order是一对多的
select * ,o.id oid from orders o,user u where o.uid=u.id
这个查询结果看起来很怪,有很多个id,不着急,后面我们在进行配置文件的配置的时候可以将id忽略。
User和以前一样
测试
或者通过
association 标签配置user
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
select *,o.id oid from user u,orders o where u.id = o.id
打印结果
再来假设一个场景,小明是一个学生,他同时是班干部和学生会的干部,而学生会干部可以有多个学生,这样学生和学生会干部表就构成了多对多的关系
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
要实现这种多对多的关系,我们不仅需要role角色表,也需要一个中间表,用户和角色表之间的桥梁——用户id和角色id对应的表。
select u.*,r.*,r.id rid,u.id uid from user u left join user_role ur on u.id=ur.uid inner join role r on ur.rid=r.id
或
select * from user u,user_role ur,role r where u.id = ur.uid and ur.rid =r.id
User类添加
UserMapper接口添加
配置sqlMapperConfig.xml,给Role增加别名
这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。
我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
修改MyBatisTest.java,将公共操作抽取出来
删除了之后,我们没有了配置文件了呀,那怎么做呢。
我们之前在sqlMapperConfig.xml里面配置了
删除了之后我们就得加载映射关系,指定接口所在的包
没有问题!说明可以运行。
实现复杂关系映射之前我们可以在映射文件中通过配置resultMap来实现,使用注解开发后,我们可以使用
@Results注解,@Result注解,@One注解,@Many注解
组合完成复杂关系的配置
前面我们用配置文件的方式实现了order和user的一对多查询,同样的我们也可以使用注解实现。
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
对应的sql语句:
测试
两个都可以正常运行。
我们上面的查询方式是一次查两张表,但是我们也可以通过查order表获取uid,再通过uid去查user表,这种方法怎么实现呢?
不知道你还记不记得,前面我们使用了association进行order和user表的一对一查询的封装,前面图中提到了@One属性,就是它的一种替代
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
可能这种方式用的比较多
对应的sql语句:
给OrderMapper.java增加一个查询方法
修改UserMapper.java
但是这种方法,其实是查到了所有的user,其中有些有orderList,原因在于这其实是一种按顺序的查询方式,先查了user表再查了order表
和
select *,o.id oid from user u,orders o where u.id = o.id 是不一样的
再来回顾一下多对多的查询
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
对应的sql语句:
这样子,就有个很怪的问题,注解查询每次都返回了全部的user,我不需要这么多的user啊,我只想要和role关联的那几个user,这会是一个好的方法吗。
SpringMVC 部分注解
@RequsetMapping()注解 属性含义:
1.value=" "
2.method="RequestMethod.post/get"
3.params={"username=123"}
4.headers:规定请求头:和params能写简单的表达式
5.路径下的占位符
写法:在路径的地方写一个{变量名}
6. @RequestMapping("/a/{id}")
获取时通过 @pathVariable("id")String id 进行获取
7. @RequestParam() 参数 == request.getParams(" ")
8. @RequestHeader() 信息头参数 == request.getHeader(" ")
public String getHeader(@RequestParam("username")String username , @RequestHeader("User-Agent")String headInfo){}
9. @CookieValue :获取cookie的值:
10.提交数据中文乱码:
1). 请求乱码:
get请求:改Tomcat server.xml 在8080端口设置 URIEncoding="UTF-8"
Connector URIEncoding="UTF-8" connectionTimeout="20000" port="9989" protocol="HTTP/1.1" redirectPort="8443"/
post请求:修改web.xml
注意:配置的CharacterEncodingFilter 需要在其他Filter之前
2). 响应乱码:
response.setContentType("text/hxml,charset=utf-8)
spring mvc注解有哪些
@Controller
该注解用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象
@RequestMapping
该注解是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
@PathVariable
该注解用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。
@CookieValue
该注解用来获取Cookie中的值;
@RequestParam
该注解用于将请求参数区数据映射到功能处理方法的参数上