首頁 > 軟體

SpringMvc請求處理引數 和 響應資料處理的範例詳解

2022-09-04 18:03:49

1、請求處理引數

1.1 請求引數 @RequestParam

1.1.1 不使用 @RequestParam 註解

請求引數處理,不使用引數註解:
1.如果請求引數名和請求處理的形參名一致,springMvc 框架會自動將你的請求引數名對應的引數值,繫結到請求方法的形參中,方法內就可以直接使用,不用手動獲取;

2.如果你的請求沒有攜帶引數,不會報錯,只不過,請求處理方法的形參值都是null或其他值,如果請求處理方法形參是一個實體引數,原理和單個型別引數一致(只要請求引數名和實體名一致也可以自動繫結);

測試不使用 @RequestParam 註解

@RequestMapping("/testSpringMvcNoRequestParam")
public String testSpringMvcNoRequestParam( String userId,String userName){

    System.out.println(String.format("------ 請求引數:uid :%s ,uname:%s------",userId,userName));

    return "success";
}

測試 請求不帶引數

測試 請求帶引數

1.1.3 使用 @RequestParam 註解

@RequestParam 只能寫在請求方法的形參上;
required = false 設定引數不是必傳;
defaultValue 預設值;

  • 1.如果請求處理方法,形參前,只增加了此註解,沒有指定任何屬性:
    • 作用:當前形參必傳,且引數名形參名必須一致,如果不一致,引數繫結失敗,請求直接報400錯誤,提示你的引數沒有提供;
  • 2.如果請求處理方法,形參前,只增加了此註解,並新增了value屬性值
    • 作用:請求的引數名必須和value屬性指定的名稱一致,此value屬性可以省略(只寫 請求引數別名時,如果有其他的屬性,value屬性必須指定);
  • 3.如果要取消每個引數的必傳校驗,可以給此註解增加屬性 required=false(預設是true,必傳),引數可以不傳,不需要引數值的繫結;
  • 4.如果某個引數必傳,但是為了防止請求沒有攜帶此引數,可以通過指定屬性defaultValue增加預設值,如果呼叫當前請求方法處理,沒有提供引數,自動使用預設值,繫結到方法的對應形參中;

測試

@RequestMapping("/testSpringMvcRequestParam")
public String testSpringMvcRequestParam(@RequestParam("uid") String userId,
                                        @RequestParam(value = "uname",required = false,defaultValue = "KH96-mvc") String userName,
                                        @RequestParam String userPwd){

    System.out.println(String.format("------ 請求引數:uid :%s ,uname:%s,uPwd:%s------",userId,userName,userPwd));

    return "success";
}

測試結果

1.2 請求頭引數 @RequestHeader

請求頭引數@RequestHeader:

  • 處理請求頭攜帶引數;
  • 作用:從請求頭中獲取引數,根據別名或者引數形參名,將請求頭對應引數值,繫結到請求處理方法的形參中,直接使用,用法跟@RequestParam類似,也可以指定是否必傳,預設值;

測試

@RequestMapping("/testSpringMvcNoRequestHeader")
public String testSpringMvcNoRequestHeader(@RequestHeader(value = "token",required = false,defaultValue = "KH96_mvc") String token){

    System.out.println(String.format("------ 請求頭引數:token :%s ------",token));

    return "success";
}

測試結果

1.3 Cookie 引數 @CookieValue

@CookieValue:

從cookie中獲取引數,根據別名或者引數形參名,將請求頭對應引數值,繫結到請求處理方法的形參中,直接使用,用法跟@RequestParam,@RequestHeader類似,也可以指定是否必傳,預設值;

測試

@RequestMapping("/testSpringMvcCookieValue")
public String testSpringMvcCookieValue(@CookieValue("JSESSIONID") String sessionId){

    System.out.println(String.format("------ 請求cookie引數:JSESSIONID :%s ------",sessionId));

    return "success";
}

測試結果:

1.4 實體引數

請求引數處理 實體引數:
自動將請求引數自動將實體的屬性名與形參繫結,原理和單個引數型別一致;

測試

@RequestMapping("/testSpringMvcBeanParam")
public String testSpringMvcBeanParam(UserVO userVO){

    System.out.println(String.format("------ 請求實體引數:userVO :%s ------",userVO));

    return "success";
}

測試結果

1.5 原生servlet的API介面作為請求引數

用法和javaWeb截斷學習的用法完全一致;

@RequestMapping("testSpringMvcServletAPI")
public  void testSpringMvcServletAIP(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws IOException, ServletException {
    //獲取請求方式
    System.out.println(String.format("------ 請求方式:%s ------",request.getMethod()));

    //獲取請求引數
    System.out.println(String.format("------ 請求引數:%s ------",request.getParameter("userTel")));

    //手動轉發
    // request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request,response);

    //獲取session物件
    //手動新增引數
    HttpSession sessionHad = request.getSession();

    //sessionHad.setAttribute("userTel",request.getParameter("userTel"));

    //方式2;直接將HttpSession物件宣告在請求處理方法的形參中,可以自動獲取 session

    //重定向到
    //        response.sendRedirect("http://www.baidu.com");

}

2、響應資料處理

2.1 ModelAndView

ModelAndView 的資料模型放在request的作用域中,檢視模型,放在request.getRequestDispatcher(字首+檢視名字+字尾);

結論:SpringMVC框架的前端核心控制器,會自動將返回的ModelAndView物件中的資料模型,新增到request作用域中使用內部轉發方式,轉發到目標檢視;

測試

@RequestMapping("/testSpringMvcModelAndView")
public ModelAndView testSpringMvcModelAndView(String userEmail){

    //建立一個 ModelAndView 物件
    ModelAndView mav = new ModelAndView();

    //新增模型資料
    mav.addObject("uemail",userEmail);
    //可以新增多個模型資料,內部使用ModelMap集合存放的
    mav.addObject("uage",18);

    //設定目標檢視
    mav.setViewName("ok");

    //返回  ModelAndView 物件
    return  mav;

}

測試結果

2.2 Map

要求:使用map返回模型資料,必須將map宣告在請求處理方法的形參中,定義在方法的內部是無效的;

總結:

  • 1.springMVC底層在呼叫目標請求處理方法前,會自動建立一個Model介面的隱含物件作為模型資料儲存物件,如果目標請求處理方法定義了一個map介面自動將隱含物件使用參照傳遞方式傳遞到目標請求處理方法中,方法體內就可以直接新增模型資料
  • 2.SpringMvc底層,在呼叫完你的請求處理方法後,不管返回什麼型別,都會被轉換為一個ModelAndView物件

測試

@RequestMapping("/testSpringMvcMap")
public  String testSpringMvcMap(String userEmail, Map<String,Object> map){

    //輸出map的目標型別
    System.out.println(map.getClass().getName());
    //org.springframework.validation.support.BindingAwareModelMap

    //新增模型資料
    map.put("uemail",userEmail);

    //返回目標檢視名稱
    return "ok";

}

測試結果

2.3 Model

Model,可以新增模型資料;
必須將 Model 宣告在請求處理方法的形參中,定義在方法的內部是無效的,用法跟Map 一致;

測試

@RequestMapping("/testSpringMvcModel")
public  String testSpringMvcModel(String userEmail, Model model){

    //新增模型資料
    model.addAttribute("uemail",userEmail);

    //返回目標檢視名稱
    return "ok";

}

測試結果

2.4 forward: 轉發 和 redirect: 重定向

2.4.1forward 轉發

只需要在返回的檢視名稱前,增加一個字首:forward 即可,直接轉發到目標資源;
當前請求處理方法中的模型物件可以帶走;

@RequestMapping("/testSpringMvcForward")
public String testSpringMvcForward(Map<String,Object> map){

    //轉發頁面跳轉
    //return "forward:/forward.jsp";

    //轉發到其他請求中
    //return "forward:/testSpringMvcModel?userEmail=123@qq.com";

    //自定義轉發,攜帶模型資料
    map.put("uaddr","nj_wd_kh96");

    return "forward:/testSpringMvcModel?userEmail=123@qq.com";
}

2.4.2 redirect 重定向

只需要在返回的檢視名稱前,增加一個字首:redirect 即可,不做檢視解析器,直接重定向

注意,重定向,當前請求處理方法中的模型物件不能帶走

@RequestMapping("/testSpringMvcRedirect")
public String testSpringMvcRedirect(){

    //重定向頁面跳轉
    //return "redirect:/redirect.jsp";

    //重定向 可以重定向到 其他請求中
    return "redirect:/testSpringMvcModel?userEmail=123@qq.com";

}

2.5 @ResponseBody

返回JSON資料;

  • 注意:返回不需要手動轉換為json字串,直接返回物件;
  • @ResponseBody 將返回請求處理方法返回的源物件資料,直接轉換為json格式字串,返回,不走檢視解析;
  • 注意:必須增加Jackson依賴的jar包,否者報錯,且必須要增加註解掃描<mvc:annotation-driven></mvc:annotation-driven> 才可以;
  • 位置:可以寫在請求處理方法上或者類上,寫在類上,就是對當前類中所有請求處理方法生效,寫在方法上,只有對當前方法生效;

2.5.1 jar包

<!-- JSON begin -->
<!--jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.4</version>
</dependency>
<!--jackson-->
<!-- JSON end -->

2.5.2 設定

<beans xmlns=
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    <!-- 開啟MVC 的註解掃描 -->
    <mvc:annotation-driven></mvc:annotation-driven>

</beans>

2.5.3 測試

@RequestMapping("/testSpringMvcJson")
@ResponseBody
public UserVO testSpringMvcJson(){

    //模擬獲取去使用者詳情物件
    UserVO userVO = new UserVO();

    userVO.setUserId("KH96_01");
    userVO.setUserName("GKC");
    userVO.setUserPwd("123");

    return userVO;

}

測試結果

到此這篇關於SpringMvc請求處理引數 和 響應資料處理的文章就介紹到這了,更多相關SpringMvc請求處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com