2016-12-20 8 views
0

私は完全に理解していない春のWeb mvcアーキテクチャのpiceがあります。HttpServletを拡張するのと同じです

Javaコード:

public class ErrorHandler extends HttpServlet { 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 
     out.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">"); 
     out.println("<html><head><title>ERROR</title></head><body>"); 
     out.println("<h1>An error occured</h1>"); 
     out.println("</body></html>"); 
    } 
} 

web.xmlの

<servlet> 
    <servlet-name>ErrorHandler</servlet-name> 
    <servlet-class>some.package.ErrorHandler</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ErrorHandler</servlet-name> 
    <url-pattern>/ErrorHandler</url-pattern> 
</servlet-mapping> 
<error-page> 
    <error-code>403</error-code> 
    <location>/ErrorHandler</location> 
</error-page> 
<error-page> 
    <error-code>404</error-code> 
    <location>/ErrorHandler</location> 
</error-page> 
<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/ErrorHandler</location> 
</error-page> 

は、このコードの意味が明確で、私は推測する:それは、一方でHTTPステータスエラーをキャッチするエラーハンドラです( 403、404)、内部例外をキャッチします(例えば、0で割ると内部500のエラーなど)。

今、私はそれをリファクタリングしたい。つまり、プロジェクトの残りの部分もこの構造に入っていて、それを一様にしたいので、ほとんどJavaのみのコードを作成したいということです。

  1. はなぜ誰かがここにHttpServletクラスを拡張しない:
    しかし、ここでは私の問題があるため、私が調査したものから、それは私にはcompleatly明らかではないですか。これは@RequestMapping注釈と同じではありませんか?しかし、extends HttpServletを削除し、@RequestMappingdoGetメソッドに配置すると、値を設定する必要はありますか?それとも、マッピングがありますか?
    拡張機能を削除するにはどうすればよいですか?
  2. <exception-type>java.lang.Throwable</exception-type>@ExceptionHandler(value={Throwable.class})と同等で、@RestControllerAdviceである必要があります。または私はここで間違っていますか?
  3. <error-code>404</error-code>とは何ですか?これは@ExceptionHandler(value={ResourceNotFoundException.class})に相当しますか?それとも、Trowable.classがキャッチされているのでしょうか?
  4. 何か不足していますか?新しいコードは、古いコードと同じくらい強くなければなりません。そのため、少なくとも同じ機能が必要ですが、もっとうまくいくはずです(ModelAndViewをvoidとPrintWriterの代わりに返すようにし、web.xmlを変更せずにクラスを他のパッケージに移動させます)。

助けをありがとう:)

答えて

1

あなたのweb.xmlは、デリバリディスクリプタに含まれていないDispatcherServletに基づいているため、Spring MVCアプリケーションであるとは思われません。それでも私はあなたの質問に答えようとしました。あなたがdoPostまたはdoGetのようなメソッドをオーバーライドすることにより、HTTPリクエストを管理するために、そのクラスを対象としますHttpServletであなたのクラスを拡張することにより

。次に、サーブレットをweb.xml内に登録し、そのサーブレットのマッピングを指定できます。 Spring特有の注釈@RequestMappingと同等ではありません。 Spring MVCで例外を処理する場合(つまり、HttpServletクラスを使用しない場合)、web.xmlでSpring MVCをサポートするように設定し、@Controllerクラスを作成し、内部に@ExceptionHandlerのメソッドを作成します。コントローラのスコープ内に例外がスローされました。 Spring MVCで例外を処理するもう1つの方法は、@ControllerAdviceと注釈を付けられたクラスです。例外がスローされたコントローラのスコープ内でスローされた例外の例外ハンドラを見つけられなかった場合、@ControllerAdviceと注釈されたクラスでそれを探します。

まだSpring MVCで作業しておらず、どのように動作するのかわからない場合は、チュートリアルhttps://www.tutorialspoint.com/spring/を確認してください。

私はあなたのためにいくつかの事を明確にすることができました。

+0

このプロジェクトのアーキテクチャは完全に混乱しています。 All in Allこのプロジェクトは、比較的普通のバネmvcアーキテクチャを採用しています。 RequestMappingsは、永続性のためにhibernateとJPAと一緒に使用されます。しかし、エラー処理は "特別な"ものです。そして、私が達成しようとしている唯一のことは、エラーページにJSPテンプレートを使用することです。 HttpServletのメソッドはすべて無効なので、ModelAndViewを返すことはできません。 '@ControllerAdvice'の中の' @ExceptionHandler'は内部の500のエラーをキャッチすることができます。しかし、404と403のエラーをどのように捕まえることができますか?あるいは、「すべてをキャッチする」ことさえありますか? – christopher2007

+1

404エラーまたは403エラーの場合、 'ErrorHandler'は動作しませんか? web.xmlに基づいて、例外がスローされるたびに呼び出される必要があります。 'PrintWriter'を扱う代わりにjspファイルを使いたい場合、' request.getRequestDispatcher( "/ WEB-INF/examplePage.jsp").forward(request、response); 'doGet'メソッドです。追加の属性をいくつか渡して、要求に応じてjspファイルの中に表示することもできます: 'request.setAttribute(" data "、data);'。 –

+0

これで、 'web.xml'のエラー処理に関連するすべてを削除しました。ディスパッチャーに '​​throwExceptionIfNoHandlerFound' - > 'true'を追加し、スプリングメソッドで' @ExceptionHandler'を持っています。現在、内部500エラーと404もキャッチされています。 ''しかし、 ''頭に正しいステータスコードがありません。それは常に200です。手動で設定する必要はありますか?もしそうなら、どうですか?あるいは私は設定が欠けていますか? – christopher2007

関連する問題