gpt4 book ai didi

java - 相当于扩展HttpServlet

转载 作者:行者123 更新时间:2023-12-01 09:06:24 25 4
gpt4 key购买 nike

我得到了一个 spring web mvc 架构图片,但我不完全理解。

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类(class)?这不是和 @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,....)

感谢您的帮助:)

最佳答案

顺便说一句,您的 web.xml 看起来似乎不是一个 Spring MVC 应用程序,因为它基于 DispatcherServlet ,但尚未包含在您的部署描述符中。尽管如此,我还是尽力回答你的问题。

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

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

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

关于java - 相当于扩展HttpServlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41238430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com