SpringMVC请求和视图配置 蔚落 2022-05-24 06:16 178阅读 0赞 SpringMVC以简单高效著称,它可以处理多种数据请求格式和响应多种视图,只需要几个简单的配置即可,具体配置如下。 首先,在SpringMVC的servlet配置文件中添加标签:。该标签是注解驱动的意思。其实SpringMVC内置了一些对象视图转换器类,包括xml、json、string等。当声明该标签时,表示使用SpringMVC内置的一系列默认转换器。那么SpringMVC到底怎么区分要使用xml还是json转换器呢?这就是 @RequestMapping 注解中consumes和produces两个属性的作用所在了。简单的说,SpringMVC根据consumes的值,选择合适的转换器来解析请求参数为类对象,根据produces的值,选择合适的转换器来将类对象转换成返回的视图数据格式(json、xml等),这大概就是“注解驱动”的意义吧。 一、请求数据格式配置 1. 请求数据格式为表单格式,即 key=value,那么 1.1. http请求头部信息包含: “Content-Type:application/x-www-form-urlencoded” 1.2. 数据格式为 key1=value1&key2=value2… 1.3. SpringMVC的controller方法中请求参数注解配置为 @RequestParam Map 这种情况下,SpringMVC会将请求参数以键值对的形式保存到配置的 Map中,使用的时候只需要按key取值即可,示例如下, 请求头部信息: ![请求头部信息:][70] 请求参数: ![请求参数:][70 1] SpringMVC配置和打印结果如下: ![配置和打印验证:][70 2] 2. 请求数据格式为json格式,那么 2.1. http请求头部信息包含:“Content-Type:application/json” 2.2. 数据格式为json格式 2.3. SpringMVC的controller方法中请求参数配置为 @RequestBody Object object,其中 Object为请求数据对应的java类 这种情况下,SpringMVC会将请求参数转换成指定的 Object类的一个实例对象,并传递给controller方法的参数,使用的时候只需要调用get方法即可,示例如下, 请求头部信息: ![请求头部信息:][70 3] 请求参数: ![请求参数:][70 4] SpringMVC配置和打印验证如下: ![配置和打印验证:][70 5] 1. 请求数据格式为xml格式,那么 3.1. http请求头部信息包含:“Content-Type:application/xml” 3.2. 数据格式为xml格式 3.3. SpringMVC的controller方法中参数配置为 @RequestBody Object object,其中 Object为请求数据对应的java类。 3.4. object类需要使用 jaxb 注解。因为SpringMVC是使用 jaxb 规范进行xml和对象之间的转化的。 这种情况下,SpringMVC会将请求参数转换成指定的 Object类的一个实例对象,并传递给controller方法的参数,使用的时候只需要get即可,示例如下, 请求头部信息: ![请求头部信息:][70 6] 请求参数: ![请求参数:][70 7] Object类注解: ![Object类注解:][Object] SpringMVC配置和打印验证: ![配置和打印验证:][70 8] 二、响应视图配置 1. 响应一个页面 1.1. 这种情况下直接在controller方法中返回页面的web全路径即可,所谓web全路径,是指页面所在目录相对于web根目录之间的路径。SpringMVC会自动根据该路径找到页面响应给客户端。示例如下: jsp源码页面: ![jsp源码页面:][jsp] SpringMVC写法: ![SpringMVC写法:][SpringMVC] 抓包响应内容: ![抓包响应内容:][70 9] 1.2. 当然,一般来讲我们的页面目录可能有几层,如果每一个方法都写全路径未免有些多余,那么SpringMVC为我们考虑到了这个问题,只需要增加一个配置,就可以省去路径前后相同的部分。配置方法如下, 在SpringMVC的servlet配置文件中添加: ![配置前后缀:][70 10] 那么这样配置之后,我们的controller方法返回值只需要写路径中区别于其它路径不同的部分即可,但是需要保证prefix+return值+suffix拼接的结果是一个有效的路径,**注意文件目录分隔符‘/’**。 配置了路径前后缀的controller写法: ![这里写图片描述][70 11] 抓包的返回结果内容跟前面完全一致,就不贴图了。 2 . 响应json数据 2.1. 对controller方法使用注解 @ResponseBody 2.2. 对controller方法的 @RequestMapping 注解的produces属性配置 “application/json” 2.3. 设置controller方法的返回值为 Object 类 这种情况下,SpringMVC会将方法返回的Object类对象解析成json对象的字符串并响应给客户端,示例如下, SpringMVC写法: ![SpringMVC写法:][SpringMVC 1] 抓包结果: ![抓包结果:][70 12] 3 . 响应xml数据 3.1. 对controller方法使用注解 @ResponseBody 3.2. 对controller方法的 @RequestMapping 注解的produces属性配置 “application/xml” 3.3. 设置controller方法的返回值类型为 Object类 3.4. 对Object返回值类型使用 jaxb注解,原因同上述请求xml数据 这种情况下,SpringMVC会将方法返回的Object类对象解析成xml对象的字符串并响应给客户端,示例如下, SpringMVC写法: ![SpringMVC写法:][SpringMVC 2] 抓包结果: ![抓包结果:][70 13] 上述的都是一些正常情况下的配置方式,不过大家可能注意到,上述的请求参数配置方法中,都没有出现consumes的配置,那么就牵涉到一些异常情况,SpringMVC是怎么处理的。异常情况包括: ①请求的时候Content-Type不传,SpringMVC怎么处理? ②请求的时候consumes省略? ③Content-Type与consumes配置的值不一致? ④produces省略呢? 其实,对于这些情况,SpringMVC有些会报错,有些会有优先级策略,具体的可以自己去尝试。总之,对于所有的controller,显示声明其请求和响应的数据格式,并与实际的数据格式保持一致,这样就能万无一失了。 [70]: /images/20220524/da7d532eba0440639305ea9a47b8c0e1.png [70 1]: /images/20220524/766741239b434c84b2d77ca3c44e2ab1.png [70 2]: /images/20220524/058a750920a34a1e9dcc889efb6e5b89.png [70 3]: /images/20220524/829f73cf8b9f40feb0edc10ad739205d.png [70 4]: /images/20220524/3e80eba8e8be47feaa335ab6d859cc34.png [70 5]: /images/20220524/74b469fedc624124a2b15369f01d0e7b.png [70 6]: /images/20220524/891ab9e046324314b69d7a341515e7a7.png [70 7]: /images/20220524/ad05ddbf608746fe83e25c113b65783f.png [Object]: /images/20220524/d7365cce83814a828ace179ae41b3a06.png [70 8]: /images/20220524/503ee2285db242dfaea3d9f2c8110d74.png [jsp]: /images/20220524/52cb0963f06141dc9bde47d29ddb3f60.png [SpringMVC]: /images/20220524/3fbb3ad7db9f4ecdbeab1dc57f3c3e10.png [70 9]: /images/20220524/c95acfdbe95b4cd384b58a9bef2f3c6a.png [70 10]: /images/20220524/d16894bd010e4510a579cca21b2cba50.png [70 11]: /images/20220524/5c44de1363a143249d0dc217922fc33e.png [SpringMVC 1]: /images/20220524/8b6cc7ac8357438ba83a0372865118bf.png [70 12]: /images/20220524/2beeeae7f40440fd80d147bf9146819d.png [SpringMVC 2]: /images/20220524/951febf42af348f0abab1d333ac8f4b4.png [70 13]: /images/20220524/125f3313739549a38656263342efa9eb.png
还没有评论,来说两句吧...