春AOPのように、Spring MVCのコントローラはまた、主に4つの音を伴うの通知に追加することができます:
グローバルインターセプタコントローラを識別するために、重要な役割に基づいて、•ControllerAdvice @、それはコントロールを対応する適用されますデバイス。
•@ InitBinder、コントローラパラメータを許可するように設定する場合、いくつかのカスタムコントロールを追加し、許可POJOパラメータを構築する方法です。
コントローラの例外で登録することができます•@ exceptionHandlerの、コントローラは、例外を登録しているとき、それは法にジャンプします。
•@ ModelAttributeは、それはコントローラのメソッドで実行するデータモデル、タグ付け方法は、オブジェクトを返すとき、それはデータモデルに保存されるためのコメントです。
リスト16-19:コントローラの通知
パッケージcom.ssm.chapter15.controller.advice。 // 識別制御部に通知し、対応するパケットを特定します 輸入org.springframework.beans.propertyeditors.CustomDateEditor。 輸入org.springframework.ui.Model。 輸入org.springframework.web.bind.WebDataBinder。 輸入org.springframework.web.bind.annotation.ControllerAdvice。 輸入org.springframework.web.bind.annotation.ExceptionHandler。 輸入org.springframework.web.bind.annotation.InitBinder。 輸入org.springframework.web.bind.annotation.ModelAttribute。 輸入java.text.SimpleDateFormatの。 輸入java.util.Date; @ControllerAdvice(basePackages = { "com.ssm.chapter15.controller.advice" }) パブリック クラスCommonControllerAdvice { // パラメータに対応するカスタムHTTP処理ルール @InitBinder 公共 ボイドinitBinder(WebDataBinderバインダー)の{ // クライアントがCustomDateEditorカスタムエディタである、日付タイプをフォーマットするため // 空有効にするかどうかを示す、そのブールパラメータ (binder.registerCustomEditorを。DATEのクラス、新しい新しい CustomDateEditor(新しい新しいてSimpleDateFormat( "MM-DD-YYYYのHH:MM:SS")、偽に))。 } //は、リターンオブジェクトと、オブジェクトが中に記憶され、データ・モデルを処理 @ModelAttribute 公共 ボイドpopulateModel(モデルモデル){ model.addAttribute( "プロジェクト名"、 "第15章" ); } // 例外処理、制御方法は、例外が発生したとき、同じビューで応答することができる傍受するよう @ExceptionHandler(例外。クラス) パブリック文字列例外(){ 戻り「例外」。 } }
リスト16-20:テストコントローラ通知
パッケージcom.ssm.chapter15.controller.advice。 輸入org.apache.http.client.utils.DateUtils。 輸入org.springframework.format.annotation.NumberFormat。 輸入org.springframework.stereotype.Controller。 輸入org.springframework.ui.Model。 輸入org.springframework.web.bind.annotation.RequestMapping。 輸入org.springframework.web.bind.annotation.ResponseBody。 インポートのjava.math.BigDecimal; 輸入java.util.Date; 輸入java.util.HashMapを; 輸入java.util.Map; @コントローラ @RequestMapping( "/アドバイス" ) のパブリック クラスMyAdviceController { / ** * のhttp:// localhostを:?8081 /アドバイス/ test.do日= 2017年6月23日%2018:12:00&量= 123,456.78 * @Paramの日付、方法は@initBinderバインディング登録フォームを持っています * @Param モデルデータモデル、@ ModelAttribute方法は、最初の要求の方法で実行されます * @returnのマップ * / @RequestMapping( "/テスト" ) @ResponseBody 公共の地図<文字列、オブジェクト> testAdvice(日付、@NumberFormat(パターン= "##、###。00" )BigDecimalの量、モデルモデル){ 地図 <文字列、オブジェクト> =、地図新しい新しい HashMapの<文字列、オブジェクト> (); // 通知@ModelAttribute注釈方法は、コントローラの前に実行されるので、これはデータに取られるので map.put(「PROJECT_NAME」、モデル。.asMap()( "プロジェクト名" GET )); // map.put( "DATE"、DateUtils.format(DATE、 "MM-DD-YYYY")); map.put( "DATE"、DateUtils.formatDate (DATE、 "MM-DD-YYYY" )); map.put( "量" 、量); リターンマップ。 } / ** *テストの異常。 * / @RequestMapping( "/例外" ) 公共 無効例外(){ スロー 新新のRuntimeException( "例外ジャンプテスト" ); } }
コントローラは、(@Controller注)また、INIT-バインダー、@ exceptionHandlerの、@ ModelAttribute @使用することができます。それは、現在のコントローラに対してのみ有効であることに注意してください
16-21リスト:テスト@ModelAttribute
パッケージcom.ssm.chapter15.controller。 輸入com.ssm.chapter15.pojo.Role。 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.stereotype.Controller。 輸入org.springframework.web.bind.annotation.ModelAttribute。 輸入org.springframework.web.bind.annotation.RequestMapping。 輸入org.springframework.web.bind.annotation.RequestParam。 輸入org.springframework.web.bind.annotation.ResponseBody。 @コントローラ @RequestMapping(値 = "/ role2の" ) パブリック クラスRole2Controller { // @Autowired // プライベートRoleService roleService = NULL; / ** *実行するコントローラメソッドに入る前に、文字オブジェクトデータモデルを保存するために重要な役割として、データベースクエリの役割を開始 * * @param 上記のID番号の役割を * @return 角色 * / @ModelAttribute( "ロール" ) 公的役割initRole(@RequestParam(値= "ID" =必須偽)ロングID){ // 判断ID是否为空 であれば(ID == NULL || ID <1 ){ 戻り ヌル。 } // ロールロール= roleService.getRole(ID); ロールロール= 新しい新しい役割(ID、 "シューター"、 "リモート物理的な出力" ); 戻り値の役割。 } / ** * のhttp:// localhostを:8081 / role2の/ getRoleFromModelAttribute.do ID = 1? * * @Paramの文字オブジェクトの役割は、データモデルから取得されます * @Return ロールオブジェクト データモデルから抽出された* @ModelAttributeの注釈データ * / @RequestMapping(値 = "getRoleFromModelAttribute" ) @ResponseBody 公的役割getRoleFromModelAttribute(@ModelAttribute(「ロール」)の役割の役割){ 返す役割を、 } }
表16-2わずか数例外マッピングコードに名前を付けるために、実際より、の定義はorg.springframework.http.HttpStatus列挙クラスのソース見ることができ
、リスト16-22のコード:カスタム例外を
パッケージcom.ssm.chapter15.exception。 // 春のMVCの例外マッピングを追加し、コードが例外マッピングコードを表し、それは例外の理由を示した理由 輸入org.springframework.http.HttpStatus。 輸入org.springframework.web.bind.annotation.ResponseStatus。 @ResponseStatus(コード = HttpStatus.NOT_FOUND、理由=「例外の役割を見つけることができません!」) パブリック クラスを RoleException 延びのRuntimeExceptionを{ プライベート 静的 最終 長い serialVersionUIDの= 5040949196309781680L 。 }
SpringMVC例外コードは、コード注釈@ResponseStatusを構成することによりマッピングすることができ、その理由を配置することにより、異常な構成の理由を理解することができます。異常の定義以来、私たちは、例外を使用する必要があります。ほとんどの場合、あなたはJavaが提供する...例外を処理するためのcatch ... finally文を試すことができます。Spring MVCのも、例外を処理する方法を提供します。
リスト16-23:RoleExceptionが異常な使い方
パッケージcom.ssm.chapter15.controller。 輸入com.ssm.chapter15.exception.RoleException。 輸入com.ssm.chapter15.pojo.Role。 輸入org.springframework.stereotype.Controller。 輸入 org.springframework.web.bind.annotation *。; @コントローラ @RequestMapping(値 = "/ roleE" ) パブリック クラスRoleExceptionController { / ** * のhttp:// localhostを:8081 / roleE / notFound.do ID = 1? * * @paramのID * @return * / @RequestMapping( "NOTFOUND" ) @ResponseBody パブリックロールNOTFOUND(ロングID){ // 役割役割= roleService.getRole(ID); ロールロール= 新しい新しい役割(ID、 "シューター"、 "リモート物理的出力" )。 役割 = ヌル; //はRoleExceptionスロー情報の役割を見つけることができません IF(役割== nullの){ スロー 新しい新しいRoleExceptionを(); } リターン役割。 } // 現在のコントローラRoleException例外が発生し、処理が入る @ExceptionHandler(RoleException クラス) パブリック文字列HandleRoleException(RoleException E){ //は非友好的回避、指定されたページを返す リターン「例外」を、 } }