我有一个我不太了解的春天网络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的代码,因为项目的其余部分也在这个结构中,我希望它是统一的。
但这是我的问题,因为根据我的研究,我并不完全清楚:
HttpServlet
课程?这与@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? 感谢您的帮助:)
答案 0 :(得分:1)
顺便说一下,你的web.xml似乎在我看来这不是一个Spring MVC应用程序,因为它基于DispatcherServlet
,它没有包含在你的部署描述符中。尽管如此,我还是试着回答你的问题。
通过使用HttpServlet
扩展您的课程,您可以通过覆盖doPost
或doGet
等方法使该课程符合管理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/。
希望我能为你澄清一些事情。