MVC框架,SpringMVC
文章目录
MVC框架会处理类似如下相同的技术需求:
- HTTP URL映射到Controller某个方法。
- HTTP参数映射到Controller方法的参数上,比如参数映射到某个Java对象,或者上传附件映射到某个File对象上;
- 参数的校验;
- MVC错误处理;
- MVC如何调用视图;
- MVC中如何序列化对象成JSON;拦截器等高级定制。
使用Controller
MVC框架有时候返回的是JSON字符串,如果想直接返回内容而不是视图名,则需要在方法上使用@ResponseBody
@RequestMapping("/index.json")
public @ResponseBody String say(){
return "hello world";
}
RequestBody注解直接将返回的对象输出到客户端,如果是字符串,则直接返回,如果不是,则默认使用Jackson序列号成JSON字符串后输出。
URL映射到方法
@RequestMapping
可使用@RequestMapping来映射URL,比如/test到某个Controller类,或者是某个具体的方法。通常类上的注解@RequestMapping用来标注请求的路径,方法上的@RequestMapping注解进一步映射特定URL到具体的处理方法。
RequestMapping有多个属性来进一步匹配HTTP请求到Controller方法。分别是:
- value:请求的URL的路径,支持URL模板、正则表达式。
- method:HTTP请求方法,有GET、POST、PUT等。
- consumes:允许的媒体类型,如consumes=“application/json”,对应于请求的HTTP的Content-Type。
- produces:响应的媒体类型,如produces=“application/json”,对应于HTTP的Accept字段。
- params:请求的参数,如params=“action=update”。
- headers:请求的HTTP头的值,如hearder=“myHeader=myValue”。
URL路径匹配
属性value用于匹配一个URL映射,value支持简单的表达式来匹配:
@RequestMapping(value="/get/{id}.json")
public @RequestBody User getById( @PathVariable("id") Long id ){
return userService.getUserById(id);
}
//注解@PathVariable作用在方法参数上,表示该参数的值来自于URL路径。
Ant路径表达式
Ant用符号"*"来表示匹配任意字符,用**来表示统配任意路径,用?来匹配单个字符。
如果一个请求有多个@RequestMapping能够匹配,通常是更具体的匹配会作为处理此请求的方法。
- 有通配符的低于每一通配符的,比如.user/add.json比/user/*.json优先匹配;
- 有**通配符的低于有*通配符的。
URL映射也可以使用${}来获得系统的配置或者环境变量,通常用于Controller路径是通过配置文件设定的情况。
@RequestMapping(/${query.all}.json)
@RequestBody
public List<User> all(){
return userService.allUser();
}
HTTP method匹配
@RequestMapping提供method属性来映射对应HTTP的请求方法,通常HTTP请求方法有如下内容:
- GET,用来获取URL对应的内容。
- POST,用来向服务器提交信息。
- HEAD,同GET,但不返回消息体,通常用于返回URL对应的元信息,如过期时间等。搜索引擎通常用HEAD来获取网页信息。
- PUT,同POST,用来向服务器提交信息,但语义上更像一个更像操作,同一个数据,多次PUT,也不会导致数据发生改变。
- DELETE,删除对应的资源信息。
- PATCH,类似PUT,表示信息的局部更像。
Spring提供了简化后@RequestingMapping,提供了新的注解来表示HTTP方法:
- GetMapping
- PostMapping
- PutMapping
- DeleteMapping
- PatchMapping
consumes和produces
属性consumes意味着请求的HTTP头的Content-Type媒体类型与consumes的值匹配,才能调用此方法。
@GetMapping(value="/consumes/test.json",consumes = "application/json" )
@ResponseBody
public User forJson(){
return userService.queryById(11);
}
这里映射指定请求的媒体类型是application/json,此方法接受一个AJAX请求,如果通过浏览器直接访问,则报错,因为通过浏览器访问,通常并没有设置Content-Type,所以说null不支持。
为了成功调用上述Controller方法,AJAX调用必须设置Content-Type为application/json,如下代码:
$.ajax({
type: "get",
url: "/consumes/test.jgon",
contentType: "application/json",
.....
});
produces 属性对应于HTTP请求的Accept字段,只有匹配上的方法才能被调用。
@GetMapping(path = "/user/{userId}"), produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public User getUser(@Pathvariable Long userId,Model model){
return userService.getUserById(userId);
}
通常浏览器都会将Accept设置为*.*,因此通过浏览器直接访问"/user/1",浏览器总是返回id为1的用户信息,并转成JSON格式。
params和header匹配
可从请求参数或者HTTP头中提取值来进一步确定调用的方法,有三种形式:
- 如果存在参数,则通过
- 如果不存在参数,则通过
- 如果参数等于某一个具体值,则通过。。
@PostMapping( path = "/updata.json", params = "action=save")
@ResponseBody
public void saveUser(){
...
}
@PostMapping( path = "/updata.json", params = "action=update")
@ResponseBody
public void saveUser(){
...
}
header与params一样。
@PostMapping( path = "/updata.json", params = "action=save")
@ResponseBody
public void saveUser(){
...
}
方法参数
Spring的Controller方法可以接受多种类型参数,如path,还有MVC的Model。此外,还有:
- @PathVariable,将URL中的值映射到方法参数中。
- Model,Spring中通用的MVC模型,可使用Map和ModelMap作为渲染视图的模型。
- ModelAndView:包含了模型和视图路径的对象。
- JavaBean:将HTTP参数映射到JavaBean对象。
- MultipartFile:用于处理文件上传。
- @ModelAttribute:使用该注解的变量将作为Model的一个属性。
- @RequestParam:对应于HTTP请求的参数,自动转化为参数对应的类型。
- @RequestHeader:对应于HTTP请求头参数,自动转化为对应的类型。
- @RequestBody:自动将请求内容转为指定的对象。
- @SessionAttribute:该方法标注的变量来自于Session的属性。
- @InitBinder,用在方法上,说明这个方法会注册多个转化器,用来个性化地将HTTP请求参数转化成对应的Java对象,如转化为日期类型,浮点类型,JavaBean等。
WebMvcConfigurer
WebMvcConfigurer用来全局定制化Spring Boot的MVC特性。
@Configuration
public class MvcConfigurer implements WebMvcConfigurer {
//拦截器
public void addInterceptors(InterceptorRegistory registry){
}
//跨域访问设置
public void addCorsMappings(CorsRegistry registry){
}
//格式化
public void addFormatters(FormatterRegistry registry){
}
//URI到视图的映射
public void addViewControllers(ViewControllerRegistry registry){
}
}
拦截器
通过addInterceptors方法可以设置多个拦截器,比如对特定的URI设定拦截器以检查用户是否登录,打印处理用户请求耗费的时间等。
public void addInterceptors(InterceptorRegistry registry){
//增加一个拦截器,检查会话,URI以admin开头的都是要此拦截器
registry.addInterceptor(new SesssionHandlerInterceptor()).addPathPatterns("/admin/**");
}
class SessionHandlerInterceptor implements HandlerInterceptor{
class boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler)
throws Exception{
User user = (User) request.getSeesion().getAttribute("user");
if(user == null){
//如果没有登录,重定向到login.html
response.sendRedirect("/login.html");
return false;;
}
return true;
}
public void postHandle(
HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView)
throws Exception{
//Controller方法处理完毕后,调用此方法
}
@Override
public void afterCompletion(
HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex)
throws Exception{
//页面渲染完成后调用此方法,通常用来清除某些资源。
}
}
跨域访问
Spring Boot提供了对CORS的支持,可以实现addCorsMappings接口来添加特定的配置:
@Override
public void addCorsMappings(CoresRegistry registry){
registry.addMapping("/**");
}
允许所有跨域访问,或者更为精细,如:
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/api/**")
.allowwedOrigins("http://domain2.com")
.addwebMethods("POST","GET");
}
注册Controller
应用有时候没有必要为一个URL指定一个Controller方法,可以直接将URI请求转到对模板的渲染上,
@RequestMapping("/"){
public String index(){
return "/index.btl";
}
}
可以直接通过ViewControllerRegistry注册一个:
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index.html").setViewName("/index.btl");;
registry.addRedirectViewController("/**/*.do","index.html");
}
对于index.html的请求,设置返回的视图为index.btl。
所有以.do结尾的请求重定向到/index.html请求。
MVC框架,SpringMVC的更多相关文章
- Spring MVC 简述:从MVC框架普遍关注的问题说起
任何一个完备的MVC框架都需要解决Web开发过程中的一些共性的问题,比如请求的收集与分发.数据前后台流转与转换,当前最流行的SpringMVC和Struts2也不例外.本文首先概述MVC模式的分层思想 ...
- springmvc执行原理及自定义mvc框架
springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中 ...
- Struts和SpringMVC两种MVC框架比较
基于Web的MVC framework在J2EE的世界内已是空前繁荣.TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC框架 ...
- Spring MVC篇一、搭建Spring MVC框架
本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中ja ...
- Spring MVC 框架的架包分析,功能作用,优点
由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...
- 从零开始学 Java - 搭建 Spring MVC 框架
没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...
- 【WEB】初探Spring MVC框架
Spring MVC框架算是当下比较流行的Java开源框架.但实话实说,做了几年WEB项目,完全没有SpringMVC实战经验,乃至在某些交流场合下被同行严重鄙视“奥特曼”了.“心塞”的同时,只好默默 ...
- 框架SpringMVC笔记系列 二 传值
主题:SpringMVC(第一节中再回顾复习一次) 学习资料参考网址: 1.http://www.icoolxue.com 2.http://haohaoxuexi.iteye.com/blog/13 ...
- 框架SpringMVC笔记系列 一 基础
主题:SpringMVC 学习资料参考网址: 1.http://www.icoolxue.com 2.http://aokunsang.iteye.com/blog/1279322 1.SpringM ...
随机推荐
- 耗子大叔弹窗来自百度搜索引擎导流的弹窗JS源码赏析
刚看到https://coolshell.cn/articles/9308.html 耗子大叔评价梁斌站点被百度封杀事件言论 然后在自己个人网站酷壳网站上发布了一段JS代码 当请求来自百度导流过来 ...
- 元旦在家撸了两天Seata源码,你们是咋度过的呢?
撸Seata源码 2020年12月31日晚23点30分,我发了2020年的最后一个朋友圈:假期吃透Seata源码,有组队的吗? 不少小伙伴都来点赞了, 其中也包括Seata项目的发起人--季敏大佬哦! ...
- 聊一聊这个总下载量36039K的XSS-NPM库,是如何工作的?
上篇文章这一次,彻底理解XSS攻击讲解了XSS攻击的类型和预防方式,本篇文章我们来看这个36039K的XSS-NPM库(你没有看错就是3603W次, 36039K次,36,039,651次,数据来自h ...
- Adnc如何本地调试 - 一个轻量级的.Net Core微服务开发框架
前言 Adnc是一个轻量级的.Net Core微服务开发框架,同样适用于单体架构系统的开发. 如果只是想本地调试,只需要安装必备软件,必备软件除开发工具外,其它软件建议大家都使用`do ...
- 转载-notepad++ zend-coding使用
转载-notepad++ zend-coding使用 zen-Coding是一款快速编写HTML,CSS(或其他格式化语言)代码的编辑器插件,这个插件可以用缩写方式完成大量重复的编码工作,是web ...
- Let's Encrypt SSL证书申请
当前环境: 阿里云CoreOS 所绑定的域名,解析管理也在阿里这儿,在该文档中使用 example.com 作为示例. Docker 镜像 acme.sh:2.8.8 nginx 申请证书并使用 使用 ...
- Solon rpc 之 SocketD 协议
1. 简介 SocketD 是一种二进制的点对点通信协议,是一种新的网络通信第七层协议.旨在用于分布式应用程序中.从这个意义上讲,SocketD可以是RSocket等其他类似协议的替代方案.它的消息协 ...
- WebApi 中请求的 JSON 数据字段作为 POST 参数传入
使用 POST 方式请求 JSON 数据到服务器 WebAPI 接口时需要将 JSON 格式封装成数据模型接收参数.即使参数较少,每个接口仍然需要单独创建模型接收.下面方法实现了将 JSON 参数中的 ...
- 通过实例学习 PyTorch
通过范例学习 PyTorch 本博文通过几个独立的例子介绍了 PyTorch 的基础概念. 其核心,PyTorch 提供了两个主要的特征: 一个 n-维张量(n-dimensional Tensor) ...
- 牺牲速度来节省内存,Redis是觉得自己太快了吗
前言 正常情况下我们选择使用 Redis 就是为了提升查询速度,然而让人意外的是,Redis 当中却有一种比较有意思的数据结构,这种数据结构通过牺牲部分读写速度来达到节省内存的目的,这就是 zipli ...