私は完全に理解していない春の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のみのコードを作成したいということです。
- はなぜ誰かがここに
HttpServlet
クラスを拡張しない:
しかし、ここでは私の問題があるため、私が調査したものから、それは私にはcompleatly明らかではないですか。これは@RequestMapping
注釈と同じではありませんか?しかし、extends HttpServlet
を削除し、@RequestMapping
をdoGet
メソッドに配置すると、値を設定する必要はありますか?それとも、マッピングがありますか?
拡張機能を削除するにはどうすればよいですか? <exception-type>java.lang.Throwable</exception-type>
は@ExceptionHandler(value={Throwable.class})
と同等で、@RestControllerAdvice
である必要があります。または私はここで間違っていますか?<error-code>404</error-code>
とは何ですか?これは@ExceptionHandler(value={ResourceNotFoundException.class})
に相当しますか?それとも、Trowable.classがキャッチされているのでしょうか?- 何か不足していますか?新しいコードは、古いコードと同じくらい強くなければなりません。そのため、少なくとも同じ機能が必要ですが、もっとうまくいくはずです(ModelAndViewをvoidとPrintWriterの代わりに返すようにし、web.xmlを変更せずにクラスを他のパッケージに移動させます)。
助けをありがとう:)
このプロジェクトのアーキテクチャは完全に混乱しています。 All in Allこのプロジェクトは、比較的普通のバネmvcアーキテクチャを採用しています。 RequestMappingsは、永続性のためにhibernateとJPAと一緒に使用されます。しかし、エラー処理は "特別な"ものです。そして、私が達成しようとしている唯一のことは、エラーページにJSPテンプレートを使用することです。 HttpServletのメソッドはすべて無効なので、ModelAndViewを返すことはできません。 '@ControllerAdvice'の中の' @ExceptionHandler'は内部の500のエラーをキャッチすることができます。しかし、404と403のエラーをどのように捕まえることができますか?あるいは、「すべてをキャッチする」ことさえありますか? – christopher2007
404エラーまたは403エラーの場合、 'ErrorHandler'は動作しませんか? web.xmlに基づいて、例外がスローされるたびに呼び出される必要があります。 'PrintWriter'を扱う代わりにjspファイルを使いたい場合、' request.getRequestDispatcher( "/ WEB-INF/examplePage.jsp").forward(request、response); 'doGet'メソッドです。追加の属性をいくつか渡して、要求に応じてjspファイルの中に表示することもできます: 'request.setAttribute(" data "、data);'。 –
これで、 'web.xml'のエラー処理に関連するすべてを削除しました。ディスパッチャーに 'throwExceptionIfNoHandlerFound' - > 'true'を追加し、スプリングメソッドで' @ExceptionHandler'を持っています。現在、内部500エラーと404もキャッチされています。 ''しかし、 ''頭に正しいステータスコードがありません。それは常に200です。手動で設定する必要はありますか?もしそうなら、どうですか?あるいは私は設定が欠けていますか? – christopher2007