网站首页 > 基础教程 正文
参考
《Spring_Boot_2精髓_从构建小系统到架构分布式大系统》
1.RequestMapping 属性
- value:请求的URL的路径,支持URL模板、正则表达式
- method:HTTP请求方法,有GET、POST、PUT等
- consumes:允许的媒体类型(Media Types),如consumes="application/json",对应于请求的HTTP的Content-Type
- produces:相应的媒体类型,如 produces=“application/json” ,对应于HTTP的Accept字段
- params:请求的参数,如params=“action=update”
- headers:请求的HTTP头的值,如 header="myHeader=myValue"
1.1.value说明
value属性用于匹配一个URL映射,value支持简单的表达式匹配:
@RequestMapping(value="/get/{id}.json")
也可以使用类似Ant的通配符来对URL进行映射,比如:
@RequestMapping(path="/user/all/*.json")
Ant路径表达式
Ant用符号 "*" 来表示匹配任意字符,用 "**" 表示统配任意路径,用 "?" 来匹配单个字符。
如果一个请求有多个@RequestMapping能够匹配,通常是更具体的匹配会作为处理此请求的方法。
- 有通配符的低于没有通配符的,比如/user/add.json 比 /user/*.json 优先匹配
- 有 ** 通配符的低于有 * 通配符的
URL映射也可以使用${}来获得系统的配置或者环境变量,通常用于Controller路径是通过配置文件设定的情况:
@RequestMapping("/${query.all}.json")
1.2.consumes和 produces
属性consumes意味着请求的HTTP头的Content-Type媒体类型与consumes的值匹配才能调用此方法。
@GetMapping(value="/consumes/test.json", consumes="application/json")
produces属性对应于HTTP请求的Accept字段,只有匹配得上的方法才能被调用。
@GetMapping(path="/user/{userid}", produces=MediaType.APPLICATION_JSON_UTF8_VALUE )
通常浏览器都会将Accept设置为*.* ,因此通过浏览器直接访问"/user/l",浏览器总是返回id为1的用户信息,井转成JSON格式。
1.3.params和header匹配
可以从请求参数或者HTTP头中提取值来进一步确定调用的方法,有以下三种形式:
- 如果存在参数,则通过
- 如果不存在参数,则通过
- 如果参数等于某一具体值,则通过
@PostMapping(path="update.json",params= "action=save") @PostMapping(path="update.json",params= "action=update")
header和params一样:
@PostMapping(path="update.json",headers= "action=update")
2.方法参数
Spring的Controller方法可以接受多种类型参数,比如我们看到的path变量,还有MVC的Model。除此之外,方法还能接受以下参数。
- @PathVariable,可以将URL中的值映射到方法参数中。
- Model,Spring中通用的MVC模型,也可以使用Map和ModelMap作为渲染视图的模型。为视图提供数据。
- ModelAndView,包含了模型(数据)和视图路径的对象。
- JavaBean,将HTTP参数映射到JavaBean对象。
- MultipartFile,用于处理文件上传。
- @ModeIAttribute,使用该注解的变量(方法返回变量)将作为Model的一个属性。通常用在某个方法上,该方法将在请求方法执行之前被执行,可以用于特定数据初始化。
- WebRequest或者NativeWebRequest,类似ServletRequest,但做了一定封装。
- java.io.InputStream和java.io.Reader,用来获取ServletAPI中的lnputStream/Reader。
- java.io.OutputStreamIjava.io.Writer,用来获取ServletAPI中的OutputStream/Writer。
- HttpMethod,枚举类型,对应于HTTPMethod,如POST、GET.@MatrixVariable,矩阵变量。
- @RequestParam,对应于HTTP请求的参数,自动转化为参数对应的类型。
- @RequestHeader,对应于HTTP请求头参数,自动转化为对应的类型。
- @RequestBody,自动将请求内容转为指定的对象,默认使用HtψMessageConverters来转化。
- @RequestPart,用于文件上传,对应于HTTP协议的multipart/form-data。
- @SessionAttribute,该方法标注的变量来自于Session的属性。
- @RequestAttribute,该标注的变量来自于request的属性。
- @InitBinder,用在方法上,说明这个方法会注册多个转化器,用来个性化地将HTTP请求参数转化成对应的Java对象,如转化为日期类型、浮点类型、JavaBean等,当然,也可以实现WebBindinglnitializer接口来用于SpringBoot应用所需要的dataBinder。
- BindingResult和Errors,用来处理绑定过程中的错误。
这里部分含义比较明确,限于篇幅不做详细讲解,下面会对常用的PathVariable、Model、ModelAndView、JavaBean、文件上传、ModelAttribute进行讲解。
3.WebMvcConfigurer
WebMvcConfigurer使用来全局定制化Spring Boot的MVC特性。开发者通过实现WebMvcConfigurer 接口来配置应用的MVC全局特性。
@Configuration public class MvcConfigurer implements WebMvcConfigurer{ // 拦截器 public void addInterceptors(InterceptorRegister registry){} //跨域访问配置 public void addCorsMappings(CorsRegistry registry){} //格式化 public void addFormatters(FormatterRegistry registry){} // URI到视图的映射 public void addViewControllers(ViewControllerRegistry registry){} //其他更多全局定制接口 }
3.1.拦截器
需要实现HandlerInterceptor接口,之后将该类注册到容器中(通过上面的方式):
public void addInterceptors(InterceptorRegistry registry){ // 增加一个拦截器,检查会话,URL以admin开头的都是用此拦截器 registry.addInterceptor(new SessionHandlerInterceptor()).addPathPatterns("/admin/**"); }
3.2.跨域访问
允许所有跨域访问:
public void addCorsMappings(CorsRegistry registry){ registry.addMapping("/**"); }
仅仅允许来自domain2.com的跨域访问,并且限定访问路径为/api、方法是POST或GET。
public void addCorsMappings(CorsRegistry registry){ registry.addMapping("/api/**") .allowedOrigins("http://domain2.com") .allowedMethods("POST", "GET"); }
跨域原理简单理解就是发起跨域请求的时候,浏览器会对请求域返回的响应信息检查HTTP头,如果Access-Control-Allow-Origin 包含了自身域,则表示允许访问。否则报错,这就是allowedOrigins的作用。
3.3.格式化
HTTP请求映射到Controller方法的参数上后,Spring会自动进行类型转化。对于日期类型的参数,Spring默认并没有配置如何将字符串转为日期类型。为了支持可按照指定格式转为日期类型,需要添加一个DateFormatter类:
public void addFormatters(FormatterRegistry registry){ registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss")); }0
DateFormatter类实现将字符串转为日期类型java.util.Date。
4.视图技术
4.1.Redirect和Forward
常而言,Controller会返回一个图名称,比如以btl结尾的视图会交给Beet!模板引擎渲染。有些情况下,Controller会返回客户端一个HTTPRedirect重定向请求,希望客户端按照指定地址重新发起一次请求,比如客户登录成功后,重定向到后台系统首页。再比如客户端通过POST提交了一个名单,可以返回一个重定向请求到此订单明细的请求地址。这样做的好处是,如果用户再次刷新页面,则访问的是订单详情地址,而不会再次提交订单。
Controller中重定向可以返回以 "redirect:" 为前缀的URI:
return "redirect:/order/detail.html?orderId=" + orderId;
在ModelAndView中设置带有"redirect:"前缀的URI:
new ModelAndView("redirect:/order/detail.html?orderId=" + orderId);
或直接使用RedirectView类:
RedirectView view = new RedirectView("/order/detail.html?orderId="+orderId)
Spring MVC也支持forward前缀,用来在Controller执行完毕后,在执行另一个Controller方法。
@RequestMapping("/bbs") public String index(){ return "forward:/bbs/module/1-1.html"; } ? @RequestMapping("/bbs/module/{type}-{page}") public ModelAndView module(@PathVariable int type,@PathVariable int page){ }
5.通用错误处理
在Spring Boot中,Controller中抛出的异常默认交给了/error处理,应用程序可以将/error映射到一个特定的Controller中处理来代替Spring Boot的默认实现,应用可以继承AbstractErrorControoler来同义处理系统的各种异常。
猜你喜欢
- 2024-10-16 web前端移动端最流行的网页布局技术:flexbox弹性布局学习详解
- 2024-10-16 美团团购订单系统优化记 美团团购订单系统优化记录怎么删
- 2024-10-16 6.8 Apache访问控制 控制用户访问apache目录的配置文件
- 2024-10-16 快速学会html表单提交(php) html提交表单到php
- 2024-10-16 Django开发教程(七) django开发工具
- 2024-10-16 前端配置prettier,eslint ,stylelint
- 2024-10-16 电脑绝技教你22天学精Csharp之第十八天HTML和CSS补充3
- 2024-10-16 HTML部分第四章——HTML常用标签 html标签大全及用法图解
- 2024-10-16 基于Django+mysql的点餐系统设计-第八篇(H5主页调试-静态页面)
- 2024-10-16 什么是 Promise.all 什么是suv汽车
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)