gpt4 book ai didi

java - Servlet/JSP 流控制 : Enums, 异常,还是其他?

转载 作者:行者123 更新时间:2023-12-04 06:56:08 25 4
gpt4 key购买 nike

我最近继承了一个使用裸 servlet 和 JSP 开发的应用程序(即:没有框架)。我的任务是清理错误处理工作流程。目前,每个 <form>在工作流中提交给 servlet,并根据表单提交的结果,servlet 执行以下两项操作之一:

  • 如果一切正常,servlet 将转发或重定向到工作流中的下一页。
  • 如果出现问题,例如无效的用户名或密码,servlet 将转发到特定于问题条件的页面。比如有AccountDisabled.jsp、AccountExpired.jsp、AuthenticationFailed.jsp、SecurityQuestionIncorrect.jsp等页面

  • 我需要重新设计这个系统来集中处理问题条件的方式。到目前为止,我已经考虑了两种可能的解决方案:
  • Exception s
  • 根据我的需要创建一个异常类,例如 AuthException .必要时从此类继承以更具体(例如: InvalidUsernameExceptionInvalidPasswordExceptionAccountDisabledException 等)。每当出现问题条件时,就抛出特定于该条件的异常。通过 web.xml 捕获所有异常并使用 <error-page> 将它们路由到适当的页面标签。
  • enum s
  • 采用错误代码方法,带有 enum跟踪错误代码和描述。可以从成品中的资源包中读取描述。

  • 我更倾向于 enum方法,因为身份验证失败并不是真正的“异常情况”,而且我认为将困惑添加到服务器日志中没有任何好处。另外,我只是用另一种替换一个维护头痛。我没有单独的 JSP 来维护,而是单独的 Exception类。

    我计划在专门为此目的编写的 servlet 中实现“错误”处理。我还将消除所有单独的错误页面,而不是设置 error带有错误消息的请求属性以显示给用户并转发回引荐来源网址。每个目标 servlet(Logon、ChangePassword、AnswerProfileQuestions 等)都会在请求中添加一个错误代码,并在出现问题时重定向到我的新 servlet。我的新 servlet 看起来像这样:
    public enum Error {
    INVALID_PASSWORD(5000, "You have entered an invalid password."),
    ACCOUNT_DISABLED(5002, "Your account has been disabled."),
    SESSION_EXPIRED(5003, "Your session has expired. Please log in again."),
    INVALID_SECURITY_QUESTION(5004, "You have answered a security question incorrectly.");

    private final int code;
    private final String description;

    Error(int code, String description) {
    this.code = code;
    this.description = description;
    }

    public int getCode() {
    return code;
    }

    public String getDescription() {
    return description;
    }
    };

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    String sendTo = "UnknownError.jsp";
    String message = "An unknown error has occurred.";

    int errorCode = Integer.parseInt((String)request.getAttribute("errorCode"), 10);

    Error errors[] = Error.values();
    Error error = null;

    for (int i = 0; error == null && i < errors.length; i++) {
    if (errors[i].getCode() == errorCode) {
    error = errors[i];
    }
    }

    if (error != null) {
    sendTo = request.getHeader("referer");
    message = error.getDescription();
    }

    request.setAttribute("error", message);

    request.getRequestDispatcher(sendTo).forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    doGet(request, response);
    }

    由于对 Java EE 相当缺乏经验(这是我第一次真正接触 JSP 和 servlet),我确信我缺少一些东西,或者我的方法不是最理想的。我是在正确的轨道上,还是我需要重新考虑我的策略?

    最佳答案

    (Web)应用程序中的异常/错误处理是一个敏感主题。有些人可能会选择抛出硬异常并将它们捕获在一个地方,而另一些人可能会选择传递一组错误消息。

    我自己更喜欢抛出异常。这样更清晰简洁,更好的重用、可维护和可测试。设计一个Validatorvalidate() 的接口(interface)抛出 ValidatorException 的方法.相应地实现所需的 validator 。收集 validator 并在 try/catch block 中一一运行它们并在那里收集异常。例如。

    Map<String, String> messages = new HashMap<String, String>();
    for (Validator validator : validators) {
    try {
    validator.validate(value);
    } catch (ValidatorException e) {
    messages.add(fieldname, e.getMessage());
    }
    }

    然后通常将请求转发回 相同页面(您输入表单的位置)并在输入字段旁边的某处或表单的顶部或底部显示错误消息。这比不同的错误页面更加用户友好,后者需要用户再单击一个按钮/链接来取回表单,并且用户必须记住/弄清楚错误实际上是什么。

    当然,所有标准错误消息都可以存储在 enum 中。 ,或更优选地在外部资源文件中,例如一个属性文件。这样更容易维护,也更容易将多种语言添加到您的 web 应用程序中。

    对于不可恢复的错误,例如死数据库或代码中的错误(运行时错误、内部服务器错误等),我只会让异常通过所有层,以便您可以通过通用和自定义错误页面,您可以定义为 <error-page>web.xml .您可以为每种类型的 Exception 定义一个单独的错误页面。和/或 HTTP 状态码。

    顺便说一下,这也是普通 MVC 框架的工作方式。

    关于java - Servlet/JSP 流控制 : Enums, 异常,还是其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2547486/

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