、常用注解
1.1 RequestParam
1.1.1 使用说明
作用: 把请求中指定名称的参数给控制器中的形参赋值。
属性:
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
1.1.2 使用示例
1.2 RequestBody
1.2.1 使用说明
作用:
用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。 get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是true。当取值为 true 时,get 请求方式会报错。如果取值为false,get 请求得到是 null。
1.2.2 使用示例
1.3 PathVaribale
1.3.1 使用说明
作用:
用于绑定 url 中的占位符。例如:请求url中/delete/{id},这个{id}就是url占位符。是springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。
1.3.2 使用示例
1.3.3 REST 风格 URL
什么是 rest:
REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统, 比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之 一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。
它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。
restful 的优点:它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
restful 的特性:
资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。 它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。 比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二 进制格式。
状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。 HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT、 DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
1.3.4 基于 HiddentHttpMethodFilter 的示例
作用: 由于浏览器 form 表单只支持 GET 与 POST 请求,而 DELETE、PUT 等 method 并不支持,Spring3.0 添 加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持 GET、POST、PUT 与 DELETE 请求。
使用方法:
第一步:在 web.xml 中配置该过滤器。
第二步:请求方式必须使用 post 请求。
第三步:按照要求提供_method 请求参数,该参数的取值就是我们需要的请求方式。
1.4 RequestHeader
1.4.1 使用说明
作用: 用于获取请求消息头。
属性: value:提供消息头名称
required:是否必须有此消息头
注: 在实际开发中一般不怎么用。
1.5 CookieValue
1.5.1 使用说明
作用: 用于把指定 cookie 名称的值传入控制器方法参数。
属性: value:指定 cookie 的名称。
required:是否必须有此 cookie。
1.5.2 使用举例:
1.6 ModelAttribute
1.6.1 使用说明
作用:
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
1.7 SessionAttribute
1.7.1 使用说明
作用: 用于多次执行控制器方法间的参数共享。
属性: value:用于指定存入的属性名称
type:用于指定存入的数据类型。
二、响应数据和结果视图
2.1 返回值分类
2.1.1 字符串
2.1.2 void
Servlet 原始 API 可以作为控制器中方法的参数: @RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) throws Exception { }
在 controller 方法形参上可以定义 request 和 response,使用 request 或 response 指定响应结果:
1、使用 request 转向页面,如下:
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
2、也可以通过 response 页面重定向: response.sendRedirect("testRetrunString")
3、也可以通过 response 指定响应结果,例如响应 json 数据: response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json 串");
2.1.3 ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
示例代码:
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
ModelAndView mv=new ModelAndView();
mv.addObject("username", "张三");
mv.setViewName("success");
return mv;
}
2.2 转发和重定向
2.2.1 forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:
@RequestMapping("/testForward")
public String testForward() {
System.out.println("AccountController 的 testForward 方法执行了");
return "forward:/WEB-INF/pages/success.jsp";
}
注意:如果用了formward:则路径必须写成实际视图url,不能写逻辑视图。
它相当于“request.getRequestDispatcher("url").forward(request,response)”使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
2.2.2 Redirect 重定向
2.3 ResponseBody 响应 json 数据
2.3.1 使用说明
作用: 该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据,如:json,xml 等,通过Response响应给客户端
2.3.2 使用示例
需求: 使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。
前置知识点: Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包。
jsp 中的代码:
控制器中的代码:
三、SpringMVC 实现文件上传
3.1 文件上传的回顾
3.1.1 文件上传的必要前提
3.1.2 文件上传的原理分析
3.1.3 借助第三方组件实现文件上传
3.2 springmvc 传统方式的文件上传
3.2.1 说明
传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。 并且上传完成之后,浏览器可能跳转。
3.2.2 实现步骤
3.2.2.1 第一步:拷贝文件上传的 jar 包到工程的 lib 目录
3.2.2.2 第二步:编写 jsp 页面
3.2.2.3 第三步:编写控制器
3.2.2.4 第四步:配置文件解析器
3.3 springmvc 跨服务器方式的文件上传
3.3.1 分服务器的目的
在实际开发中,我们会有很多处理不同功能的服务器。例如:
应用服务器:负责部署我们的应用
数据库服务器:运行我们的数据库
缓存和消息服务器:负责处理大并发访问的缓存和消息
文件服务器:负责存储用户上传文件的服务器。
分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。
3.3.2 准备两个 tomcat 服务器,并创建一个用于存放图片的 web 工程
3.3.3 拷贝 jar 包
3.3.4 编写控制器实现上传图片
3.3.5 编写 jsp 页面
3.3.6 配置解析器
开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个基于springmvc的快速生成url和参数 的IDEA 插件——Restful Fast Request。
Restful Fast Request是一个基于springmvc的帮助你快速生成url和参数 的IDEA 插件。同时也是一个http client工具,只需按一下方法左侧的火箭小图标,插件会自动生成方法的url和参数显示在工具窗口,再点击发送请求即可在IDEA内完成API调试,并且可以保存历史请求,方便多次使用调试。
Restful Fast Request功能:
安装:
在IDEA插件Plugins中直接搜索Restful Fast Request
使用示例:
点击Send and download
API列表name取值:
1.如果方法使用了swagger的@io.swagger.annotations.ApiOperation,则取该注解的value值
2.如果没有swagger直接修饰,则取方法的javaDoc描述
3.如果意思都没有则返回New Request
API的name值支持修改
保存的请求默认会放入Default Group中,支持拉拽放入别的组
如果你已经保存一个请求,但是想彻底重新修改其中的参数,那么你可以选择该操作
必须是先生成方法url及参数后,点击工具栏
如果你的请求需要一个token而token可以通过一个登陆接口得到,那么你可以不用每次手动添加,只需要访问一下登录接口再通过以下操作来处理
更多内容大家可自行前往阅读。
开源地址:fast-request: IntelliJ plugin Restful Fast Request一个基于springmvc的帮助你快速生成url和参数的IDEA 插件。IDEA 版postman工具
— 完 —
1.1 SpringMVC三大核心组件
1.HandlerMapping处理器映射器:建立地址与方法的映射。
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
2.HandlerAdapter处理器适配器:根据地址调用方法。
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
3.ViewResolver 视图解析器:处理ModelAndView数据和视图。
ViewResolver通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
1.2 SpringMVC执行流程图
流程图
1.3 Spring执行流程具体步骤(参考图)
1.用户发送请求至前端控制器DispatcherServlet。
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
5.执行处理器(Controller层,也叫后端控制器)。
6.Controller执行完成返回数据和视图(ModelAndView)。
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9.ViewReslover解析后返回具体的View视图(JSP / HTML)。
10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11.DispatcherServlet响应用户,用户看到界面和数据。
1.4 总结流程
Spring MVC所有的请求都经过DispatcherServlet来统一分发。DispatcherServlet将请求分发给Controller之前,需要借助于Spring MVC提供的HandlerMapping定位到具体的Controller。
HandlerMapping接口负责完成客户请求到Controller映射。
Controller接口将处理用户请求,这和Java Servlet扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView(数据和视图)对象给DispatcherServlet前端控制器。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
返回的视图需要通过ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从而将相应结果渲染给客户。
SpringMVC中默认提供的三大组件有可能过时,我们可以手动设置这三大组件,一般只需要设置ViewResolver 视图解析器,设置它的前缀prefix和后缀suffix
2.1 手动一个个的设置处理器映射器(不推荐)
<!--方式1:手动一个个设置 -->
<!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
2.2 模型驱动配置处理器映射器和处理器适配器,配置视图解析器【***】
<!--方式2:配置处理器映射器和处理器适配器 -->
<!-- 在选择mvc标签时,一定要选择最后的路径是/mvc的选项 -->
<!-- 这行配置可以替换掉上边的两行配置(一步步设置) -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀和后缀 相当于 //WEB-INF/jsp/Xxx.jsp-->
<!--定义页面路径的前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--定义页面路径的后缀-->
<property name="suffix" value=".jsp"/>
</bean>
2.3【注意】如果mvc标签无效,头文件模板。
<mvc:annotation-driven/>无效,可能是头文件不对,下面是一个参考。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
SpirngMVC的执行流程,其实非常简单。 核心三大处理器处理器映射器(HandlerMapping) 处理URL找到对应处理器(Handler),并将其返回给前端控制器。
如果你还没有掌握这些技术,可以点赞+转发后私信回复【Java】来获取完整的体系资料。
*请认真填写需求信息,我们会在24小时内与您取得联系。