相当于扩展HttpServlet

时间:2016-12-20 09:06:43

标签: java spring error-handling

我有一个我不太了解的春天网络mvc架构pice。

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课程?这与@RequestMapping注释不一样吗?但是,当我删除extends HttpServlet并将@RequestMapping放入doGet方法时,我必须为该值设置什么?或者是否有映射?
    我该如何摆脱扩展?
  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,....)
  5. 感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

顺便说一下,你的web.xml似乎在我看来这不是一个Spring MVC应用程序,因为它基于DispatcherServlet,它没有包含在你的部署描述符中。尽管如此,我还是试着回答你的问题。

通过使用HttpServlet扩展您的课程,您可以通过覆盖doPostdoGet等方法使该课程符合管理http请求的条件。然后,您可以在web.xml中注册servlet并为其指定映射。它不等同于Spring特定的注释@RequestMapping。如果你想用Spring MVC处理异常(因此不要使用HttpServlet类),你需要配置web.xml以支持Spring MVC,创建@Controller类并在其中创建{ {1}}带注释的方法,只要在控制器的范围内抛出给定的异常,就会调用该方法。处理Spring MVC中的异常的另一种方法可能是使用@ExceptionHandler注释的类。如果Spring在引发异常的控制器范围内找不到抛出异常的异常处理程序,它将在使用@ControllerAdvice注释的类中查找它。

如果您尚未使用Spring MVC并且您不确定它是如何工作的,请查看本教程:https://www.tutorialspoint.com/spring/

希望我能为你澄清一些事情。