springmvc的请求

springmvc作为web层的框架,最主要的工作就是获得客户端的请求,最后给客户端进行响应。

1.请求的流程

在这里插入图片描述

SpringMVC框架也是一个基于请求驱动的Web框架,并且使用了前端控制器模式(是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理。首先让我们整体看一下SpringMVC处理请求的流程:

    1、首先用户发送请求,请求被SpringMVC前端控制器(DispatherServlet)捕获;

    2、前端控制器(DispatherServlet)对请求URL解析获取请求URI,根据URI,调用HandlerMapping;

    3、前端控制器(DispatherServlet)获得返回的HandlerExecutionChain,(包括Handler对象以及Handler对象应用的拦截器);

    4、DispatherServlet根据获得的HandlerExecutionChain,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法);

    5、HandlerAdapter根据请求的Handler适配并执行对应的Handler;HandlerAdapter(提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据配置,Spring将做一些额外的工作:

    HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换成为指定的响应信息。

    数据转换:对请求信息进行数据转换。如String转换成Integer、Double等数据格式化;

    数据格式化:如将字符串转换成格式化数字或格式化日期等;

    数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中)

    6、Handler执行完毕,返回一个ModelAndView(即模型和视图)给HandlerAdaptor;

    7、HandlerAdaptor适配器将执行结果ModelAndView返回给前端控制器;

    8、前端控制器接收到ModelAndView后,请求对应的视图解析器;

    9、视图解析器解析ModelAndView后返回对应View;

   10、渲染视图并返回渲染后的视图给前端控制器;

   11、最终前端控制器将渲染后的页面响应给用户或客户端。

2.mvc实现数据请求方式和获得数据细节

在这里插入图片描述

3.mvc实现数据请求方式

3.1基本类型参数

springmvc实现数据请求方式有四种请求方式,第一种基本类型参数,客户端发送给服务器的键值对名称的key要和Controller的save方法的参数名称一致,这样springmvc才会自动帮我们封装。

这里我们要获取客户端返回的请求参数的话,我们Controller的业务方法的形参名称要与请求参数的name一致,这样参数值会自动映射匹配,也就是说,我们客户端的资源路径的参数名称交username和age,那么我们在Controller的save方法中的参数名称也应该是这两个。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-659V3VV9-1681010991694)(C:\Users\JF\AppData\Roaming\Typora\typora-user-images\image-20230407101506502.png)]

在这里我们在形参里面可以将age的类型写成int或者String都行,为什么会这样呢,因为我们写int的时候,springmvc在底层会自动帮我们转换成字符串形式(上次我们在配置文件里面配了<mvc:annotation-driven />这个注解驱动),而我们直接写成String形式也行,本来就要返回字符串形式,而username就不能写成int类型了,因为我们需要的是汉字,如果是int的话,就不能转换。

在这里插入图片描述

最后我们可以在控制台看见服务器获得客户端的请求参数

3.2POJO类型参数

第二种POJO类型参数,请求参数的参数名称与实体内部的属性名一致时,springmvc也会自动封装
在这里插入图片描述

3.3数组类型参数

第三个请求参数的名称与数组的名称一致即可
在这里插入图片描述
这里和前面获得基本数据类型和POJO数据类型是一样的,我们的客户端发送的请求地址的参数name要和Controller的业务方法的数组名称一致。这样springmvc才能帮我们进行参数值的自动映射匹配。

3.4集合类型参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们这里在提交数据时,可以使用POST的方式进行提交数据。因为我们的VO对象中里面是一个集合,我们不好用之前的方式在地址栏去传递数据,所以我们写一个jsp页面用表单的方式提交,我们在input标签的name属性要注意和VO对象的List集合的名称一致,然后指定集合的第几个User对象的username和age即可,这里我们在action里面写我们要将数据提交到哪个页面。

4.获得数据细节

4.1 中文乱码问题

配置全局乱码过滤器
在这里插入图片描述

mvc获取数据细节。第一种中文乱码是当表单的请求方式为POST的时候(Tomcat8.5及其以上版本的GET请求乱码问题已经解决),在客户端输入中文会导致乱码,所以这样我们在web.xml配置一个全局的CharacterEncodingFilter,并且当Filter配置的时候我们设置参数为UTF-8即可。

4.2@RequestParam

在这里插入图片描述

第二个@RequestParam是为了解决当客户端的请求参数名称和服务器中的Controller的方法中参数名称不一致时,我们可以做一个手动映射。
在这里插入图片描述
@RequestParma还有其他两个参数,required代表着,请求参数名称是否包括,如果required是true,那么就要提交参数,如果不提交就出错,反之就不需要提交,defaultValue是当没有指定请求参数时,则使用指定的默认值赋值

4.3@PathVariable

在这里插入图片描述
Restful是一种软件架构风格、设计风格,不是标准,主要是用于客户端和服务器交互的软件,基于这个风格设计的软件可以更简洁,更有层次

Restful风格的请求是使用url+请求方式表示一次请求的目的,GET表示用于获取资源,POST表示新建资源,PUT表示用于更新资源,DELETE表示用于删除资源。

而@PathVariable是用在Restful风格的请求(url地址+请求方式)中,这里请求参数不是以问号键值对的形式传过去的,而是直接将参数放在url地址上即可还要配合是哪种请求方式。

在这里插入图片描述
分析:这里注意我们在客户端发送的请求数据的zhangsan是我们要传给服务器的数据,那我们就需要在@RequestMapping使用一个占位符进行匹配工作,接着我们需要让springmvc框架去帮我们获取这个占位符得到的参数,我们就需要使用@PathVariable这个注解,在这个注解当中,我们String的username就是我们获取的zhangsan,但是在这之前我们需要解析这个占位符,所以我们就需要让@PathVariable注解来帮助我们,我们在这个@PathVariable参数里面的value写一个和占位符一模一样的名称即可。

注意这里我们是使用GET请求方式,我们还可以再@RequestMapping的参数里面去指定我们要使用哪种请求方式

4.4 自定义类型转换器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义类型转换器,我们在进行参数封装时,不管是基本数据类型,还是POJO类型,还是数组类型,我们的springmvc会帮我们自动进行类型转换,但是有些类型springmvc不能帮我们解决,此时我们就需要自己动手配置,这里一般有三个步骤,第一步是创建一个类型转换器去实现Converter<String, Date>接口,第一个参数是我们原始的数据,第二个参数是我期望转换的数据类型,第二步就是我们需要在springmvc中进行注册转换器,第三步就是mvc的注解驱动中去引入转换器

4.5获得Servlet的相关API

在这里插入图片描述

第四个是获得Servlet的相关API,我们直接在Controller的save方法中的参数中直接注入我们想要注入的对象即可,比如HttpServletRequest,HttpServletResponse等

4.6 获得请求头信息@RequestHeader

在这里插入图片描述
这里我们在web阶段的时候也学习了如何去获取请求头,web阶段是通过request的getHeader方法,name就是需要传入的头名称,而在我们springmvc框架里面请求的头的名称写在参数value里,所以这里value就相当于name,而required就是是否必须携带请求头。
在这里插入图片描述

注意在@RequestHeader的参数value这里,这个value的值必须和客户端的请求头里面的参数名称一样,这里我们设置成Use-Agent,而required是true时,我们的请求头的名称就必须要写,此时在我们的服务器端就会打印在Use-Agent的信息

4.7@CookieValue

在这里插入图片描述
在这里插入图片描述
这里有人可能会问,我都有获取请求头的注解方式了,我为什么还要专门去获取Cookie的注解呢,因为我们请求头是获取Cookie的后面一大串,就是黄颜色标记的地方,而红色标记的地方就是Cookie注解获取的更深入一层的代码,这就是区别

这里的@CookieValue和前面的@RequestHeader是一样的,也有两个参数,value的名称就是和客户端的Cookie的key是一样的,在客户端一般key都是JSESSIONID,一般Cookie也是以键值对的方式展现的,

4.8文件上传-客户端表单实现

在这里插入图片描述
文件上传客户端一般有三要素,一个是表单项type是file,第二个就是表单的提交方式是post,第三个表单的enctype属性是多部分表单形式。
在这里插入图片描述
这里我们在upload这个jsp文件里面创建一个表单,该表单的资源跳转路径我们使用动态获取虚拟目录,表单的提交方式是post,第三件事就是表单的enctype属性是多部分表单形式。

在这里插入图片描述
我们使用表单上传文件时,必须让 表单的 enctype 等于 multipart/form-data。当form表单修改为多部分表单时,request获取数据的方法基本都失效了,因为request在get某某方法时,获得的是url编码方式的表单提交,当enctype的表单数据提交时使用的编码类型,默认使用"application/x-www-form-urlencoded",如果是使用POST请求,则请求头中的content-type指定值就是该值。如果表单中有上传文件,编码类型需要使用"multipart/form-data",类型,才能完成传递文件数据。

当form表单的entype的取值为Mutilpart/form-data时,请求正文内容就变成了多部分形式,而不是键值对,第一个表单数据name属性的name就是标签input的name,表单项最终要在客户端输入值,这个值就是zhangsan,第二个表单数据的值aaabbb就是上传的文件内容。

服务器在获得到数据之后,可能会存数据库或者其他操作。

4.9服务端要接收客户端传的文件

在这里插入图片描述
单文件上传有三个步骤,

1.在pom.xml中导入fileupload和IO坐标

2.在springmvc中配置文件上传解析器

3.在UserServlet中编写文件上传代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们获得请求参数时,参数名只要和客户端发送请求的参数名一致即可,这里注意在upload.jsp这个form表单里面的input标签的name值要和Controller方法中的参数名称一致

4.10多文件上传的代码实现

在这里插入图片描述
这里多文件上传和单文件上传的原理其实是一样的,无非是在form表单里面多了表单项,这里我们将文件的name名改为uploadFile2即可,接着我们去Controller的save22方法里面注入另外一个MultipartFile即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的方法适用于上传的文件比较少的情况下,如果出现上传很多的文件,我们最好选用将多个文件存入一个数组,在用数组的方式遍历即可,注意这里我们在upload.jsp页面当中,form表单的name属性的值是一样的,然后我们Controller的save方法里面注入的是一个MultipartFile数组,接着在方法里面进行for循环即可

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值