SpringMVCのインターセプタ、例外について

A.ファイルのアップロード

1.ファイルのアップロード

  • SpringMVCは、ファイルアップロードのための直接的なサポートを提供し、このタイプはMultipartResolverプラグアンドプレイ技術です。CommonsMultipartResolver:MultipartResolver実装クラスを達成するためにJakarta CommonsののFileUpload技術と春。
  • デフォルトのファイルアップロード作業はケースに対処することはできませんので、あなたが春のファイルアップロード機能を使用したい場合はSpringMVCのデフォルトのコンテキストは、MultipartResolver装備されていない、必要性は今MultipartResolverコンテキストを設定されています。

    2. [設定MultipartResolver

  • defaultEncoding:JSPのユーザーがフォームの内容が正しい解決するために、同じ特性をpageEncoing必要があります。
  • 適切CommonsMulitpartResolverの作業を行うには、ファーストクラスとJakarta CommonsのするFileUploadパッケージJakarta Commonsのは、クラスパスに追加IO必要があります。

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <propert name="defaultEncoding" value="UTF-8"></property>
    <property name="maxUploadSize" value="524880"></property>
</bean>

II。インターセプタ

1.カスタムインターセプタ

SpringMVCインターセプタは、要求プロセスを傍受するために使用することができる、ユーザは、カスタムカスタムインターセプタはHandlerInterceptorインタフェースを実装する必要があり、特定の機能を実行するためにインターセプタができます。インターフェイスは三つの方法があります。

  • preHandleは():このメソッドは、前の要求を処理する方法において、ユーザ要求処理要求サービスに呼ばれます。あなたが取引をインターセプトするインターセプタを要求することを決定した場合も、それがtrueを返す処理を実行するために、他のインターセプタ、またはサービスプロセッサを呼び出し、プログラマは、要求を処理するために他のコンポーネントを呼び出す必要がないことを決定した場合、それが返されます偽。

  • postHandle():このメソッドは、サービス要求を処理したが、応答が呼び出されるまでのDispatcherServletは、このプロセスでは、クライアントにユーザ要求リクエスト()処理を戻されます。

  • afterCompletion():このメソッドは完全に完了のDispatcherServlet要求コールの後に処理され、あなたがプロセスにいくつかのクリーンアップ操作のリソースを行うことができます。

2.インターセプタ・メソッドの実行順序

3.カスタムインターセプタを設定

<mvc:interceptors>
      <!--  拦截所有资源 -->
      <bean class="com.desperado.interceptors.FirstInterceptor"></bean>
      <!--拦截指定资源-->
      <mvc:interceptor>
              <mvc:mapping path="/emps"/>
              <bean class="com.desperado.interceptors.SecondInterceptor"></bean>
      </mvc:interceptor>
      <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>

4.インターセプタ複数の実行順序

5. preHandleインターセプタ()メソッドがfalseを返す場合に実行順序

6.古典的な顔の質問

インターセプタとフィルタの違いは何ですか。

  1. インターセプターJavaリフレクション機構は基づいており、フィルタは、コールバック関数に基づいています。
  2. インターセプタは、サーブレットコンテナ、およびサーブレットコンテナに依存フィルタに依存しません。
  3. アクションのみ迎撃機能を要求することができ、およびフィルタは、ほぼすべての要求への影響かもしれません。
  4. インターセプタは、アクションのコンテキストにアクセスすることができ、物体内部のスタックの値、及びフィルタにアクセスすることはできません。
  5. 声明では、アクションのサイクルは、インターセプタは複数回呼び出すことができ、かつコンテナが再びここに呼んで(初期化されるとき、フィルタは一度だけ呼び出すことができ、コンストラクタのためのものであり、要求がのdoFilterが行う一致します継続的なプロセス。)
  6. インターセプターは、IOCコンテナ豆を取得し、フィルタすることはできません。

実行順序

III。例外処理

1.例外処理

  • マッピング・ハンドラを含む例外ハンドラによってスプリングMVC HandlerExceptionResolver、異常が発生したときに実行されるデータと標的結合方法。
  • SpringMVC提供的HandlerExceptionResolver的实现类
    - AbstractHandlerExceptionResolver
    - AbstractHandlerMethodExceptionResolver
    - ExceptionHandlerExceptionResolver
    - AnnotationMethodHandlerExceptionResolver
    - DefaultHandlerExceptionResolver
    - ResponseStatusExceptionResolver
    - SimpleMappingExceptionResolver
    - HandlerExceptionResolverComposite

2.HandlerExceptionResolver

  • DispatcherServlet默认装配的HandlerExceptionResolver:
    • 没有使用
      -AnnotationMethodHandlerExceptionResolver
      -DefaultHandlerExceptionResolver
      -ResponseStatusExceptionResolver

    • 使用了
      -ExceptionHandlerExceptionResolver
      -DefaultHandlerExceptionResolver
      -ResponseStatusExceptionResolver

3.ExceptionHandlerExceptionResolver

  • 主要处理Handler中用@ExceptionHandler注解定义的方法。
  • @ExceptionHandler注解定义的优先级问题:如果发生的是NullPointerException,但是声明的异常有RuntimeException和Exception,此时会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler注解方法,即标记了RuntimException的方法。
  • ExceptionHandlerMethodResolver内部若找不到@ExceptionHandler注解的话,会找@ControllerAdvice中的@ExceptionHandler注解方法

4.ResponseStatusExceptionResolver

  • 在异常及异常父类中找到@ResponseStatus注解,然后使用这个注解的属性进行处理。
  • 定义一个@ResponseStatus注解修饰的异常类。
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public class UnAuthorizedException extends RuntimeException{}
  • 若在处理器方法中抛出了上面定义的异常:
    由于触发的异常带有@ResponseStatus注解,因此会被ResponseStatusExceptionResolver解析到。最后响应HttpStatus.UNAUTHORIZED代码给客户端。

5.DefaultHandlerExceptionResolver

对一些特殊的异常进行处理,比如:
NoSuchRequestHandlingMethodException
HttpRequestMethodNotSupportedException
HttpMediaTypeNotSupportedException
HttpMediaTypeNotAcceptableException
等。

6.SimpleMappingExceptionResolver

如果希望对所有异常进行统一处理,可以使用该解析器,它将异常类名映射为视图名,即发生异常是使用对应的视图报告异常

四.Spring的运行流程

  1. 请求到达Spring DispatcherServlet的url-pattern。
  2. 判断SpringMVC中是否存在对应的映射
  3. 如果不存在判断是否配置了
  4. 如果配置了就去找目标资源,如果没有配置,返回404页面。
  5. 如果存在则从HandlerMapping获取handlerExecutionChain对象。
  6. 获取HandlerAdapter对象。
  7. 调用拦截器的preHandle方法。
  8. 调用目标Handler的目标方法得到ModelAndView对象。
  9. 调用拦截器的postHandle方法。
  10. 判断是否存在异常
  11. 存在异常,由HandlerExceptionResolver组件处理异常得到新的ModelAndView对象。
  12. 不存在异常,由ViewResolver组件根据ModelAndView对象得到实际的View
  13. 渲染视图
  14. 调用拦截器的afterCompletion方法。

五.在Spring的环境下使用SpringMVC

1.Bean被创建两次?

Spring的IOC容器不应该扫描SpringMVC中的Bean,对应的SpringMVC的IOC容器不应该扫描Spring中的Bean。

2.在SpringMVC配置文件中引用业务层的Bean

  • 多个SpringIOC容器之间可以设置为父子关系,以实现良好的解耦。
  • SpringMVC WEB层容器可作为"业务层"Spring容器的子容器,即WEB层容器可以引用业务层容器的Bean,而业务层容器却访问不到WEB层容器的Bean。

六、Spring和Struts2对比

  1. SpringMVC的入口是Servlet,而Struts2是Filter.
  2. SpringMVC会比Struts2快点,SpringMVC是基于方法设计的,而Struts2是基于类,每次发一个请求都会实实例一个Action
  3. SpringMVC使用更加简洁,开发效率高。
  4. Struts2的OGNL表达式使页面开发效率相比SpringMVC要高一点。

おすすめ

転載: www.cnblogs.com/jack1995/p/10958267.html