@PATHVARIABLE、@REQUESTPARAMと@SESSIONATTRIBUTESの違い


概要:
handler methodパラメータは一般的な注釈をバインドし、彼らが処理したRequestの異なる内容部分によって4種類に分けられます:(主に一般的なタイプを説明します)
A、requet uri部分(ここではuri templateのvariableを指し、queryString部分を含まない)を処理する注記:@PathVariable;
B、request header部分を扱う注記:@RequestHeader,@CookieValue;
C、request body部分を扱う注記:@RequestParam,@RequestBody;
D、処理attributeタイプは注記:@SessionAttributes,@ModelAttribute;
 
1、 @PathVariable 
@RequestMapping URI templateスタイルを使用してマッピングされる場合、someUrl/{paramId}のparamIdは、@Pathvariable注記によってメソッドのパラメータに伝達された値をバインドすることができる.
サンプルコード:
[java] view plaincopyprint?
@Controller  
@RequestMapping(“/owners/{ownerId}”)  
public class RelativePathUriTemplateController {  
  
  @RequestMapping(“/pets/{petId}”)  
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {      
    // implementation omitted   
  }  
}  
上のコードはURI templateの変数ownerIdの値とpetIdの値をメソッドのパラメータにバインドします.メソッドパラメータ名とバインドするuri templateで変数名が一致しない場合は、@PathVariable("name")でuri templateの名前を指定する必要があります.
2、 @RequestHeader、@CookieValue
@RequestHeader注記は、Requestリクエストheader部分の値をメソッドのパラメータにバインドできます.
サンプルコード:
Requestのheaderセクションです.
Host                    localhost:8080  
Accept                  text/html,application/xhtml+xml,application/xml;q=0.9  
Accept-Language         fr,en-gb;q=0.7,en;q=0.3  
Accept-Encoding         gzip,deflate  
Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7  
Keep-Alive              300  
@RequestMapping(“/displayHeaderInfo.do”)  
public void displayHeaderInfo(@RequestHeader(“Accept-Encoding”) String encoding,  
                              @RequestHeader(“Keep-Alive”) long keepAlive)  {  
}  
上のコードは、request header部分のAccept-Encodingの値をパラメータencodingにバインドし、Keep-Alive headerの値をパラメータkeepAliveにバインドします.
@CookieValueは、Requestヘッダのcookieに関する値をメソッドのパラメータにバインドできます.
たとえば、次のCookie値があります.
JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84 
パラメータバインドのコード:
@RequestMapping(“/displayHeaderInfo.do”)  
public void displayHeaderInfo(@CookieValue(“JSESSIONID”) String cookie)  {  
}  
つまり、JESSIONIDの値をパラメータクッキーにバインドします.
3、@RequestParam, @RequestBody
@RequestParam 
A)Request.getParameter()で取得したStringを単純タイプに直接変換できる場合(String->単純タイプの変換操作はConversionServiceで構成された変換器で行います).requestを使うからです.getParameter()方式でパラメータを取得するので、get方式でqueryStringの値を処理したり、post方式でbody dataの値を処理したりすることができます.
B)Content-Type:application/x-www-form-urlencoded符号化されたコンテンツを処理するためのコミット方式GET、POST;
C)この注釈には2つの属性がある:value、required;valueは、入力する値のid名を指定し、requiredはパラメータがバインドされる必要があるかどうかを示すために使用されます.
サンプルコード:
@Controller  
@RequestMapping(“/pets”)  
@SessionAttributes(“pet”)  
public class EditPetForm {  
    @RequestMapping(method = RequestMethod.GET)  
 public String setupForm(@RequestParam(“petId”) int petId, ModelMap model) {  
       Pet pet = this.clinic.loadPet(petId);  
   model.addAttribute(“pet”, pet);  
   return “petForm”;  
   }  
@RequestBody
この注記は、アプリケーション/json、アプリケーション/xmlなど、application/x-www-form-urlencodedで符号化されていないコンテンツを処理するためによく使用される.
HandlerAdapter構成のHttpMessageConvertersを使用してpost data bodyを解析し、対応するbeanにバインドします.
FormHttpMessageConverterが構成されているため、application/x-www-form-urlencodedのコンテンツを処理するためにも使用でき、処理後の結果はMultiValueMapに格納されます.この場合、特定のニーズで使用されます.詳細はFormHttpMessageConverter apiを参照してください.
サンプルコード:
[java] view plaincopyprint?
@RequestMapping(value = “/something”, method = RequestMethod.PUT)  
public void handle(@RequestBody String body, Writer writer) throws IOException {  
  writer.write(body);  
}    
4、@SessionAttributes, @ModelAttribute
@SessionAttributes:
この注記は、HttpSessionのattributeオブジェクトの値をバインドするために使用され、メソッドのパラメータで使用しやすいです.
この注記にはvalue、typesの2つのプロパティがあり、名前とタイプで使用するattributeオブジェクトを指定できます.
サンプルコード:
[java] view plaincopyprint?
@Controller  
@RequestMapping(“/editPet.do”)  
@SessionAttributes(“pet”)  
public class EditPetForm {  
    // …   
}  
@ModelAttribute
この注釈には2つの用法があり、1つは方法に用いられ、1つはパラメータに用いられる.
メソッドに使用する場合:通常@RequestMappingを処理する前に、バックグラウンドからクエリーを要求するmodelをバインドするために使用されます.
パラメータに使用する場合:名前に対応して、対応する名前の値を注釈のパラメータbeanにバインドするために使用します.バインドする値は次のとおりです.
A)@SessionAttributesが有効なattributeオブジェクト上;
B)@ModelAttributeメソッド上で指定されたモデルオブジェクトに使用されます.
C)上記の2つのケースがない場合、newはバインドする必要があるbeanオブジェクトを1つ作成し、requestで名前に応じて値をbeanにバインドします.
使用方法@ModelAttributeのサンプルコード:
[java] view plaincopyprint?
// Add one attribute   
// The return value of the method is added to the model under the name “account”   
// You can customize the name via @ModelAttribute(“myAccount”)   
  
@ModelAttribute  
public Account addAccount(@RequestParam String number) {  
    return accountManager.findAccount(number);  

この方式の実際の効果は,@RequestMappingのメソッドを呼び出す前にrequestオブジェクトのmodelにput("account",Account);
パラメータに使用される@ModelAttributeのサンプルコード:
[java] view plaincopyprint?
@RequestMapping(value=“/owners/{ownerId}/pets/{petId}/edit”, method = RequestMethod.POST)  
public String processSubmit(@ModelAttribute Pet pet) {  
     
}  
まず@SessionAttributesにバインドされているPetオブジェクトがあるかどうかをクエリーし、ない場合は@ModelAttributeメソッドレベルでPetオブジェクトがバインドされているかどうかをクエリーし、ない場合はURI templateの値を対応する名前でPetオブジェクトの各属性にバインドします.