SpringMVCコア技術


リダイレクトと転送を要求します。
プロセッサが要求処理を完了したら、他のリソースにジャンプすると、転送とリダイレクトを要求する2つのジャンプ方法があります。ジャンプするリソースの種類によって、ページにジャンプするか、他のプロセッサにジャンプするかの2種類に分けることができます。
転送を要求するページについては、WEB-INF中のページであってもよく、リダイレクトされたページは、WEB-INF中のものではなく、リダイレクトはユーザが再度要求を出すのに相当するので、ユーザは直接にWEB-INF中のリソースにアクセスできない。
SpringMVCフレームワークは、元のServletのリクエスト転送およびリダイレクト動作をカプセル化し、簡単な方法で転送およびリダイレクトを実現することができる。forward:転送を表し、request.getRequestDispathcer("xx.jsp").forward();を実現する。redirect:リダイレクトを表し、response.sendRediect("xxx.jsp");を実現する。
転送を要求する
プロセッサ方法はModelAndViewに戻る時、set View Name()で指定されたビューの前にforwardを追加する必要があります。また、この時のビューはビュー解像器と一緒に動作しなくなります。これにより、解像器が配置された時に異なる位置のビューを指定することができます。ビューページは、プロジェクトのルートに対するパスを書き出さなければなりません。forward操作にはビュー解像度は必要ありません。プロセッサ方法はStringに戻り、ビューパスの前にforwardを追加します。ビューのフルパスです。

@RequestMapping(value = "/some",produces = "text/plain;charset=utf-8")
public ModelAndView testForward(String name,Integer age){
    ModelAndView mv = new ModelAndView();
    mv.addObject("name",name);
    mv.addObject("age",age);
    mv.setViewName("forward:/WEB-INF/view/show.jsp");
    return mv;
}
リダイレクトを要求する
プロセッサ方法で返されるビュー文字列の前にredirectを追加すると、リダイレクトジャンプが可能です。

@RequestMapping(value = "/other")
public ModelAndView testRedirect(String name,Integer age){
    ModelAndView mv = new ModelAndView();
    mv.addObject("name",name);
    mv.addObject("age",age);
    mv.setViewName("redirect:/other.jsp");
    return mv;
}
異常処理
注釈@Exception Handlerを使用して、一つの方法を異常処理方法に指定することができます。この注釈はオプションのvalueだけです。クラスの一つです。配列とは、この注釈の方法によって処理される異常クラスを指定するためのものであり、これに一致するものである。注釈された方法では、その戻り値は、ModelAndView、String、またはvoidであってもよく、方法名は任意であり、方法パラメータは、Exceptionおよびそのサブオブジェクト、HttpServlet Request、HttpServletResposeなどであってもよい。システムは自動的にこれらの方法にパラメータを割り当てます。異常処理注解の用法については、直接に異常処理方法をControllerに注釈することもできる。
コードデモンストレーション
ステップ1:2つの異常クラスをカスタマイズします。

public class MyException extends Exception {
    public MyException() {
        super();
    }
    public MyException(String message) {
        super(message);
    }
}

public class AgeException extends MyException {
    public AgeException() {
        super();
    }
    public AgeException(String message) {
        super(message);
    }
}
public class NameException extends MyException {
    public NameException() {
        super();
    }
    public NameException(String message) {
        super(message);
    }
}
第二ステップ:controller方法において、異常を投げかける。

@RequestMapping(value = "exception")
public ModelAndView askForException(String name,Integer age) throws MyException {
    ModelAndView mv = new ModelAndView();
    if(!"zs".equals(name)){
        throw new NameException("     !!!");
    }
    if (age == null || age > 80){
        throw new AgeException("     !!!");
    }
    mv.addObject("name",name);
    mv.addObject("age",age);
    mv.setViewName("show");
    return mv;
ステップ3:3つの異常応答ページを定義します。

nameError.jsp
<br/>
    :${msg}
<br/>
    :${ex.message}
ageError.jsp
<br/>
    :${msg}
<br/>
    :${ex.message}
otherError.jsp
<br/>
    :${msg}
<br/>
    :${ex.message}
ステップ4:グローバル異常処理クラスを定義する

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = NameException.class)
    public ModelAndView nameException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","    zs");
        mv.addObject("ex",ex);
        mv.setViewName("nameError");
        return mv;
    }
    @ExceptionHandler(value = AgeException.class)
    public ModelAndView ageException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","    80  ");
        mv.addObject("ex",ex);
        mv.setViewName("ageError");
        return mv;
    }
    @ExceptionHandler
    public ModelAndView otherException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","    ");
        mv.addObject("ex",ex);
        mv.setViewName("otherError");
        return mv;
    }
}
ステップ5:springにcontrolerとhandlerを配置する注釈スキャン

<!--  Controller    -->
<context:component-scan base-package="school.xauat.controller"></context:component-scan>
<!--       -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
<!--      -->
<mvc:annotation-driven></mvc:annotation-driven>
<!--  ControllerAdvice    -->
<context:component-scan base-package="school.xauat.handler"></context:component-scan>
Spring MVCブロック
SpringMVCにおけるInterceptorブロックは、指定されたユーザ要求をブロックし、対応する前処理と後処理を行うために非常に重要であり、非常に有用である。そのブロックの時点は、「プロセッサマッパーは、ユーザからの要求に応じて実行されるプロセッサクラスをマッピングし、プロセッサ類を実行するプロセッサアダプタを見つけ、プロセッサアダプタがプロセッサを実行する前に」である。もちろん、プロセッサマッパーが実行するプロセッサクラスをマッピングした場合、ブロックとプロセッサは、1つのプロセッサのためにチェーンを実行し、中央スケジューラに戻った。
スクリーニングクラスを定義する

public class myInterceptor implements HandlerInterceptor {
    private Long beginTime;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle    ");
        beginTime = System.currentTimeMillis();
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle    ");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion    ");
        Long endTime = System.currentTimeMillis();
        System.out.println("      " + (endTime - beginTime) + "ms");
    }
}
スプリングMVCプロファイルにスクリーンショットを登録する

<mvc:interceptors>
     <mvc:interceptor>
          <mvc:mapping path="/**"/>
          <bean class="school.xauat.handler.MyInterceptor"></bean>
     </mvc:interceptor>
</mvc:interceptors>
ユーザー定義のインターフェースは、Handler Interceptorインターフェースを実現する必要があります。このインターフェースには三つの方法が含まれています。
preHandle(request、reponse、Object hander):
この方法は、プロセッサ方法が実行される前に実行される。その戻り値はbootleanであり、trueであれば、すぐにプロセッサ方法が実行され、afterCompration()方法を専用の方法スタックに入れて実行待ちます。
postHandle(request、reponse、Object hander、modelAndView):
この方法は、プロセッサ方法の実行後に実行される。プロセッサ方法は最終的に実行されないと、この方法は実行されない。この方法はプロセッサ方法の実行後に実行され、この方法パラメータにはModelAndViewが含まれているので、この方法はプロセッサ方法の処理結果データを修正して、ジャンプ方向を変更することができる。
after Complection(request、reponse、Object handler、Exception ex):
preHandle()方法がtrueに戻ると、この方法は、要求に応答するすべての作業が完了するまで、専用の方法スタックに入れられます。すなわち、この方法は、中央スケジューラが応答ページをレンダリングした後に実行するもので、ModelAndViewを再操作しても応答に役立たない。
afterComplectionが最後に実行する方法は、リソースをクリアします。例えば、Controller方法にデータを追加します。
ブロックの中の方法とプロセッサの方法の実行順序は次の図の通りです。

ブロックが複数ある場合

ブロックフィルタの違い
スクリーンとフィルタの違い
1、フィルタはServletのオブジェクトです。スクリーンショットはフレーム内のオブジェクトです。
2、フィルタはFilterインターフェースを実現する対象です。スクリーンセーバーはハンディインテグレートを実現するインターフェースです。
3、フィルタはrequestとレスポンスのパラメータ、属性を設定するために使用されます。
4、フィルタはブロックの前に実行されます。
5、フィルタはTomcatサーバで作成されたオブジェクトで、スクリーンセーバはスプリングmvc容器で作成されたオブジェクトです。
6、フィルタは実行時点で、ブロックは3つの実行時点があります。
7、フィルタはjsp、js、htmlなどを処理してもいいです。スクリーンはコントロールに対する対象です。もしあなたの要求が中央スケジューラに受け入れられないなら、この要求はブロック内容を実行しません。
SpringMVC実行プロセスの理解

SpringMVC実行フロー分析
(1)ブラウザ提出要求は中央スケジューラに
(2)中央スケジューラは、要求を直接プロセッサマッパーに転送する。
(3)プロセッサマッパーは、要求に応じて、この要求を処理するプロセッサを見つけ、プロセッサにカプセル化して、チェーンを実行した後、中央スケジューラに戻る。
(4)中央スケジューラは、プロセッサがチェーン内のプロセッサを実行することにより、このプロセッサを実行することができるプロセッサアダプタを見つける。
(5)プロセッサアダプタが実行プロセッサを起動する。
(6)プロセッサは、処理結果およびジャンプするビューをオブジェクトModelAndViewにカプセル化し、プロセッサアダプタに戻す。
(7)プロセッサアダプタは、結果を中央スケジューラに直接返します。
(8)中央スケジューラがビュー解像器を呼び出し、ModelAndViewのビュー名をビューオブジェクトとしてカプセル化する。
(9)ビュー解像器は、パッケージされたビューオブジェクトを中央スケジューラに返す
(10)中央スケジューラは、表示オブジェクトを呼び出して、自分でレンダリングさせる。すなわちデータを塗りつぶして、応答オブジェクトを形成する。
(11)中央スケジューラ応答ブラウザ。
締め括りをつける
この文章はここまでです。あなたに助けを与えたいです。私たちのもっと多い内容に注目してください。