熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring MVC 框架方法入參的介紹

2013-11-23 20:06:47  來源: Java開源技術 

  Spring MVC 框架中你可以按任意順序定義請求處理方法的入參(除了 Errors 和 BindingResult 必須緊跟在命令對象/表單參數後面以外)Spring MVC 會根據反射機制自動將對應的對象通過入參傳遞給請求處理方法這種機制讓開發者完全可以不依賴 Servlet API 開發控制層的程序當請求處理方法需要特定的對象時僅僅需要在參數列表中聲明入參即可不需要考慮如何獲取這些對象下面列舉下spring mvc支持的處理方法參數
    * Java 基本數據類型 和String
    默認情況下將按名稱匹配的方式綁定到 URL 參數上可以通過 @RequestParam 注解改變默認的綁定規則
    * Request or response objects (Servlet API)
    Request或者response 對象 (Servlet API)選擇任意的request或者response類型例如ServletRequest HttpServletRequest
    * Session object (Servlet API)
    session對象(Servlet API)構成類型有HttpSession這個類型的參數增強了當前通信的session因此這個參數永遠不會null
    注意session通道不是線程安全的特別是在Servlet環境下如果允許多個請求訪問session的情況下建議將AnnotationMethodHandlerAdapter的synchronizeOnSession屬性設置為true
    * orgsprntextrequestWebRequest or orgsprntextrequestNativeWebRequest Allows for generic request parameter access as well as request/session attribute access without ties to the native Servlet/Portlet API
    使用spring封裝的WebRequest或者NativeWebRequest與使用原生的Servlet/Portlet API不相上下
    *javautilLocale
    用於獲得當前的請求區域
    *javaioInputStream / javaioReader for access to the requests content This value is the raw InputStream/Reader as exposed by the Servlet API
    值為原始的InputStream/Reader被Servlet API 可以借此訪問 request 的內容
    *javaioOutputStream / javaioWriter for generating the responses content This value is the raw OutputStream/Writer as exposed by the Servlet API
    用於產生響應的內容以此操作 response 的內容
    *javasecurityPrincipal containing the currently authenticated user
    包含當前認證的用戶
    Spring 增加了一個@ PathVariable注解來支持可變的請求路徑
    *@PathVariable annotated parameters for access to URI template variables
    用於注解參數對應到地址欄的變量參數
    例如
    Java代碼
    @RequestMapping(value=/owners/{ownerId} method=RequestMethodGET)
    public String findOwner(@PathVariable(ownerId) String ownerId Model model) {
    // implementation omitted
    }
    訪問地址/owners/{ownerId} 指定了訪問變量名稱為ownerId當控制器處理這個請求的時候ownerId的值被設置到請求的地址欄
    例如當請求來自/owners/fred值fred被綁定到訪問方法的參數String ownerId
    *@RequestParam
    用於注解參數到Servlet 請求的參數參數值對應到控制器方法中聲明的參數

  Java代碼
    @RequestMapping(method = RequestMethodGET)
    public String setupForm(@RequestParam(id) int petId ModelMap model) {
    Pet pet = thisclinicloadPet(petId)
    modeladdAttribute(pet pet)
    return petForm;
    }
    例如請求的參數id對應到方法中的petId
    *@RequestHeader
    注解參數用於具體的Servlet請求的http頭部參數值被轉換到生命的方法參數類型
    請求頭部信息例如ConnectionAcceptLanguageAcceptCharset等
    Java代碼
    public void displayHeaderInfo(@RequestHeader(Connection) String connection@RequestHeader(AcceptEncoding) String encoding) {
    Systemoutprintln(connection: + connection)
    Systemoutprintln(AcceptEncoding: + encoding)
    }
    *@RequestBody
    *HttpEntity<?>
    *javautilMap / orgspringframeworkuiModel / orgspringframeworkuiModelMap
    它綁定 Spring MVC 框架中每個請求所創建的潛在的模型對象它們可以被 Web 視圖對象訪問(如 JSP)用於增強傳遞到web視圖頁面的model也就是說他們作為方法的參數後頁面視圖就可以直接根據key來取得相應的值
    springframeworkvalidationErrors / orgspringframeworkvalidationBindingResult
    BindingResult繼承於Errors為屬性列表中的命令/表單對象的校驗結果返回錯誤信息到頁面設置為方法參數後在視圖頁面上可以直接獲取
    BindingResult result必須和@ModelAttribute同時使用並且參數要緊挨著否則會報錯Errors/BindingResult argument declared without preceding model attribute異常
    如下例報錯 正常
    //test:
    Java代碼
    @RequestMapping(params=method=result
    public String processSubmit(User user
    Model model BindingResult result) {
    return /demo/listBoard;
    }
    //test:
    Java代碼
    @RequestMapping(params=method=result
    public String processSubmit(@ModelAttribute(user) User user
    Model model BindingResult result) {
    return /demo/listBoard;
    }
    //test:
    Java代碼
    @RequestMapping(params=method=result
    public String processSubmit(@ModelAttribute(user) User user
    BindingResult resultModel model) {
    return /demo/listBoard;
    }
    * orgspringframeworkwebbindsupportSessionStatus status handle for marking form processing as complete which triggers the cleanup of session attributes that have been indicated by the @SessionAttributes annotation at the handler type level
    可以通過該類型 status 對象顯式結束表單的處理這相當於觸發 session 清除其中的通過 @SessionAttributes 定義的屬性
    例子使用 SessionStatus 控制 Session 級別的模型屬性
    Java代碼
    @RequestMapping(method = RequestMethodPOST)
    public String processSubmit(@ModelAttribute Owner owner
    BindingResult result SessionStatus status) {//<
    new OwnerValidator()validate(owner result)
    if (resulthasErrors()) {
    return ownerForm;
    }
    else {
    thisclinicstoreOwner(owner)
    statussetComplete()//<
    return redirect:/ownerdo?ownerId= + ownergetId()
    }
    }
    processSubmit() 方法中的 owner 表單對象將綁定到 ModelMap 的owner屬性中result 參數用於存放檢驗 owner 結果的對象
    而 status 用於控制表單處理的狀態在 ② 處我們通過調用 statussetComplete() 方法
    該 Controller 所有放在 session 級別的模型屬性數據將從 session 中清空


From:http://tw.wingwit.com/Article/program/Java/ky/201311/27944.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.