控制層接受參數


關於Controller 方法可以接收參數使用@RequestBody、@RequestParam、@ModelAttribute、JSONObject、HttpEntity 等方式

1. requestParam

這個最簡單,也就是傳遞參數值

如:

   @RequestMapping("/info")
    public Map<String, String> getInfo(@RequestParam String name) {
        Map<String, String> map = new HashMap<>();
        map.put("nameIs", name);
        return map;
    }

注:如果參數前寫了@RequestParam(xxx),那么前端必須有對應的xxx名字才行(不管其是否有值,當然可以通
       過設置該注解的required屬性來調節是否必須傳),如果沒有xxx名的話,那么請求會出錯,報400。

 

2 . RequestBody

@RequestBody主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的);GET方式無請求體,所以使用@RequestBody接收數據時,前端不能使用GET方式提交數據,而是用POST方式進行提交。在后端的同一個接收方法里,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多只能有一個,而@RequestParam()可以有多個。

a、@requestBody注解。一般情況下來說常用其來處理application/json類型。

b、通過@requestBody可以將請求體中的JSON字符串綁定到相應的bean上,當然,也可以將其分別綁定到對應的字符串上。

詳情參考https://blog.csdn.net/justry_deng/article/details/80972817

 

3.@ModelAttribute

被@ModelAttribute注釋的方法會在此controller每個方法執行前被執行,因此對於一個controller映射多個URL的用法來說,要謹慎使用

a. 用在方法上

    一個控制器可以擁有多個@ModelAttribute方法。同個控制器內的所有這些方法,都會在@RequestMapping方法之前被調用。

        1) 方法通過返回值的方式默認地將添加一個屬性;

        2) 方法接收一個Model對象,然后可以向其中添加任意數量的屬性。

b. 用在方法參數上

    標注在方法參數上的@ModelAttribute說明了該方法參數的值將由model中取得。如果model中找不到,那么該參數會先被實例化,然后被添加到model中。在model中存在以后,請求中所有名稱匹配的參數都會填充到該參數中。

        1) 它可能因為@SessionAttributes標注的使用已經存在於model中。

        2) 它可能因為在同個控制器中使用了@ModelAttribute方法已經存在於model中。

        3) 它可能是由URI模板變量和類型轉換中取得的。

        4) 它可能是調用了自身的默認構造器被實例化出來的。

 
4.JSONObject
JSONObject-lib包是一個beans,collections,maps,java arrays和xml和JSON互相轉換的包。
 
 
5.HttpEntity 
HttpEntity類是一個本身很簡單的類。
HttpEntity相當於一個消息實體,內容是http傳送的報文(這里可以說是html,css等等文件)。這里只需要知道它是用來表征一個http報文的實體就行了,用來發送或接收。

而一般使用HttpEntity時,都是將它轉化為json

1. 以一個Post請求為例,代碼如下:

 public CloseableHttpResponse post(String url , String entityString , HashMap<String , String> headermap) 
 2             throws ClientProtocolException, IOException {
 3         //創建一個可關閉的 httpClient對象
 4         CloseableHttpClient httpClient = HttpClients.createDefault();
 5         //創建一個HttpPost的請求對象
 6         HttpPost httpPost = new HttpPost(url);
 7         //設置payload
 8         httpPost.setEntity(new StringEntity(entityString));
 9         //加載請求頭到HttpPost對象
10         for (Map.Entry<String , String> entry : headermap.entrySet()) {
11             httpPost.addHeader(entry.getKey(), entry.getValue());
12         }
13         //發送post請求
14         CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
15         return httpResponse;
16     }

2. 發送Post請求后,我們會得到一個CloseableHttpResponse。接下來,我們提取狀態碼(status):

int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();

3. 提取返回實體(httpEntity):

 HttpEntity entity = closeableHttpResponse.getEntity();
 System.out.println(entity);

此時的輸出結果為:

4. HttpEntity 轉化為 String:

String responseEntity = EntityUtils.toString(entity);
System.out.println(responseEntity);

此時的輸出結果為String格式,提取code、message等值,只能通過字符串截取:

5. String 轉化為 JsonObject:

1 JSONObject jsonObject = JSON.parseObject(responseEntity);
2 System.out.println(jsonObject);

此時的輸出結果為JsonObject格式:

6. 提取code、message的值:

1 String responseCode = jsonObject.getString("code");
2 String responseMessage = jsonObject.getString("message");

7. 提取orderId:

復制代碼
1 //由於info的值是json格式(或可理解為key-value集合),提取info的值為JSONObject格式
2 JSONObject infoObject = jsonObject.getJSONObject("info");
3 //重復步驟6,提取orderId
4 String orderId= jsonObject.getString("orderId");
5 //或通過將infoObject轉化為HashMap,再進行提取orderId
6 HashMap<String, Object> info = new HashMap<String, Object>();
7 info = JSON.parseObject(String.valueOf(infoObject), new TypeReference<HashMap<String, Object>>() {});
8 String orderId = info.get("orderId").toString();
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM