国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - springmvc @RequestBody String類型參數(shù)的使用

springmvc @RequestBody String類型參數(shù)的使用

2022-03-05 15:18zoyation Java教程

這篇文章主要介紹了springmvc @RequestBody String類型參數(shù)的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springmvc @RequestBody String類型參數(shù)

通過如下配置:

 <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <property name="supportedMediaTypes">
          <list>
              <value>text/html;charset=UTF-8</value>
              <value>application/json;charset=UTF-8</value>
          </list>
      </property>
  </bean>
  <!-- 啟動SpringMVC的注解功能,完成請求和注解POJO的映射 -->
  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
      <property name="messageConverters">
          <list>
              <ref bean="mappingJacksonHttpMessageConverter"/>
              <!-- JSON轉(zhuǎn)換器 -->
          </list>
      </property>
  </bean> 

在spring mvc的Controller層使用@RequestBody接收Content-Type為application/json的數(shù)據(jù)時(shí),默認(rèn)支持Map方式和對象方式參數(shù)

@RequestMapping(value = "/[code]/saveUser", method = RequestMethod.POST)
  @ResponseBody
  public JsonResult saveUser(@PathVariable("code") Integer code, @RequestBody Map<String, Object> datas,@RequestBody User user) {
  。。。
  }

如果是一個(gè)參數(shù)時(shí)也需要用個(gè)Map或者對象處理,使用String會報(bào)解析錯(cuò)誤,具體看:AbstractJackson2HttpMessageConverter的方法read(Type type, Class

@Override
  public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
          throws IOException, HttpMessageNotReadableException {
      JavaType javaType = getJavaType(type, contextClass);
      return readJavaType(javaType, inputMessage);
  }
  private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) {
      try {
          return this.objectMapper.readValue(inputMessage.getBody(), javaType);
      }
      catch (IOException ex) {
          throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);
      }
  }

為了讓@RequestBody支持String參數(shù)(目前只支持接收單個(gè)參數(shù))

重寫org.springframework.http.converter.json.MappingJackson2HttpMessageConverter類

package com.test.converter.json
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
/**
* 處理@RequestBody注解為String的情況,只支持接收單個(gè)參數(shù)的情況
* Created by test
* Date:2017/1/4
* Time:17:33
*/
public class CustomerMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
  @Override
  protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
      Class<?> deseriClazz = getClazz(clazz);
      Object param = super.readInternal(deseriClazz, inputMessage);
      return getTrueObject(clazz, param);
  }
  @Override
  public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
          throws IOException, HttpMessageNotReadableException {
      Type deseriType = getType(type);
      Object param = super.read(deseriType, contextClass, inputMessage);
      return getTrueObject(type, param);
  }
  /**
   * 通過返回參數(shù)類型決定是否處理參數(shù),如果是String類型的參數(shù),將解析后的HashMap里的值返回(只支持單個(gè)參數(shù))
   *
   * @param type  返回參數(shù)類型
   * @param param 參數(shù)值
   * @return 實(shí)際參數(shù)值
   */
  private Object getTrueObject(Type type, Object param) {
      if (type == String.class) {
          Object backParam = null;
          if (param != null && param instanceof LinkedHashMap) {
              LinkedHashMap paramMap = (LinkedHashMap) param;
              if (paramMap.size() == 1) {
                  backParam = paramMap.get(paramMap.keySet().iterator().next());
              }
          }
          param = backParam;
      }
      return param;
  }
  /**
   * 獲取解析參數(shù)用的Type
   *
   * @param type 參數(shù)類型
   * @return
   */
  private Type getType(Type type) {
      Type deseriClazz;
      if (type == String.class) {
          //jackson不支持String默認(rèn)用LinkedHashMap
          deseriClazz = LinkedHashMap.class;
      } else {
          deseriClazz = type;
      }
      return deseriClazz;
  }
  /**
   * 獲取解析參數(shù)用的Type
   * @param clazz 參數(shù)類型
   * @return
   */
  private Class<?> getClazz(Class<?> clazz) {
      Class<?> deseriClazz;
      if (clazz == String.class) {
          //jackson不支持String默認(rèn)用LinkedHashMap
          deseriClazz = LinkedHashMap.class;
      } else {
          deseriClazz = clazz;
      }
      return deseriClazz;
  }
}

spring mvc xml配置文件修改:

<bean id="mappingJacksonHttpMessageConverter"
        class="com.test.converter.json.CustomerMappingJackson2HttpMessageConverter">
      <property name="supportedMediaTypes">
          <list>
              <value>text/html;charset=UTF-8</value>
              <value>application/json;charset=UTF-8</value>
          </list>
      </property>
  </bean>

Controller層:

@RequestMapping(value = "/delUser", method = RequestMethod.POST)
  @ResponseBody
  public JsonResult delUser(@RequestBody String id) {
  。。。
  }

 

springmvc用Map接收請求參數(shù)分析

第一種情況,什么也不設(shè)置,無參數(shù)傳遞

注解為 @Controller @RequestMapping

springmvc @RequestBody String類型參數(shù)的使用

可以看到傳遞的為SpringMVC的BindingAwareModelMap類型,SpringMVC中的隱含模型就是這個(gè)類型,其作用域等價(jià)于 request 域,當(dāng)添加Model、ModelMap參數(shù)時(shí),SpringMVC實(shí)際傳入的就是這個(gè)隱含模型;向這個(gè)隱含模型種設(shè)置值后,在返回的頁面中就能通過request域取值。

第二種情況,加個(gè)參數(shù)試試 => .../testmap?test1=2342

結(jié)果類型還是一樣,且參數(shù)不會被傳入,當(dāng)然使用request肯定能取出來。

springmvc @RequestBody String類型參數(shù)的使用

第三種情況,給Map參數(shù)添加@RequestParam注解

1、Get請求 =>http://localhost:8080/ssm/v2/testmap?test1=234234

成功傳入了參數(shù),注意這個(gè)Map類型為LinkedHashMap,而不是隱含模型了

springmvc @RequestBody String類型參數(shù)的使用

再添加個(gè)Model參數(shù)看看,隱含模型中依然沒有值

所以添加@RequestParam注解后,SpringMVC會將 Get 請求中封裝進(jìn)對應(yīng)的參數(shù)中,如果參數(shù)是Map就封裝稱LinkedHashMap而不再傳入隱含模型

springmvc @RequestBody String類型參數(shù)的使用

2、Post請求, 再測試測試Post請求

與Get的結(jié)果一致:參數(shù)無@RequestParam注解時(shí),Map接收隱含模型;添加@RequestParam注解時(shí),Map接收LinkedHashMap;隱含模型中無值。

springmvc @RequestBody String類型參數(shù)的使用

第四種情況,給Map參數(shù)添加@RequestBody注解,且請求方式為Post

出乎意料的也成功傳入了,與@RequestParam注解結(jié)果類似,也是LinkedHashMap

springmvc @RequestBody String類型參數(shù)的使用

springmvc @RequestBody String類型參數(shù)的使用

復(fù)雜點(diǎn)的Json數(shù)據(jù)也能解析接收成功

springmvc @RequestBody String類型參數(shù)的使用

springmvc @RequestBody String類型參數(shù)的使用

小結(jié)一下吧

SpringMVC處理請求用Map類型接收參數(shù)時(shí),如果參數(shù)無注解,則會傳入BindingAwareModelMap類型,等價(jià)于Model、ModelMap參數(shù);

參數(shù)添加@RequestParam注解時(shí),會將參數(shù)包裝稱LinkedHashMap對象,參數(shù)的key為Map的key,參數(shù)值為Map的key,支持Get、Post方法(應(yīng)該支持Put、Delete,沒有測,倆方法與Post類似);

添加@RequestBody注解時(shí),接收J(rèn)son類型數(shù)據(jù),也會包裝成LinkedHashMap對象,該注解不支持Get請求,Get請求沒有請求體不能傳Json。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/yangxingzou/article/details/54092578

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人免费毛片aaaaaa片 | 日韩成人免费av | 国产精品久久久久精 | 日韩欧美在线观看 | 国产一区二区三区视频 | 在线精品亚洲欧美日韩国产 | 日本三级中文在线电影 | 成年人在线观看免费视频 | 精品久久久久久久久久久 | 天天操天天干天天爽 | 精品国产乱码久久久久久丨区2区 | 日韩欧美综合 | 91免费版在线观看 | 久久精品国产亚卅av嘿嘿 | 国产99久久精品一区二区永久免费 | 午夜精品久久久久久久久 | 国产精品美女久久久久久久网站 | 国产成人片| 日韩国产在线 | 婷婷国产 | 欧美高潮 | 来个一级毛片 | 欧美日韩中文字幕在线 | 亚洲久草 | 一区二区不卡视频 | 国产一级片播放 | 成人免费视频观看视频 | 99这里只有精品视频 | 国产欧美综合一区二区三区 | 国产综合视频 | 福利视频在线 | 韩日精品一区 | 国产精品一区二区不卡 | 黄色一级毛片在线观看 | 精品久久久久久久人人人人传媒 | 国产一区二区三区欧美 | 日韩高清电影 | 欧美日韩国产在线 | 999精品在线 | 国产一区二区免费 | 欧美激情一区二区三级高清视频 |