gpt4 book ai didi

java - 在 Java EE 应用程序中显示错误消息时出现意外结果(字段为空时没有错误)

转载 作者:行者123 更新时间:2023-12-04 05:13:17 25 4
gpt4 key购买 nike

我正在用 Java-EE 编写一个 Web 应用程序,当我尝试在用户输入上显示错误时,我发现自己得到了一个非常意外的结果。

该应用程序基于 JSP/Servlet/Form/Bean 模型构建。基本上,JSP 将数据存储在请求中,并将其传输到 servlet。然后 servlet 将请求原始传输到表单,然后读取数据,执行必要的检查并将 bean 返回给 servlet。

大多数字段必须具有特定值,其他一些字段必须简单地为非空。

我已经编写了错误检测代码来保护输入,但是我发现自己得到了一个非常奇怪的结果:

  • 当字段为非空但值不正确时(例如,位于 00:00-23:59 范围之外的一小时),它会返回正确的错误以及错误消息,存储在 HashMap 中,并且我可以在我的 JSP 中访问它。
  • 但是,当该字段为空时,它会返回消息,也可能将其存储在 HashMap 中(我知道这一点是因为 ${!empty errors.dataErrors} 测试返回 true 并且错误字段显示在我的 JSP 中)但是无法访问错误值

  • 我已经搜索了我的代码,但仍然找不到错误的来源。如果有人知道问题出在哪里,这里是它的片段

    servlet 中的 doPost 方法:
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    NewBookingForm form = new NewBookingForm();
    Booking booking = form.registerBooking(request);
    String VUE;

    request.setAttribute("booking", booking);
    request.setAttribute("errors", form);

    this.getServletContext().getRequestDispatcher(VIEW).forward(request, response);
    }

    map 是 NewBookingForm 类中的一个字段,在 registerBooking 之外声明和初始化像这样的方法 private Map<String,String> dataErrors = new HashMap<String,String>();它有一个私有(private) setter(用于在类中访问)和一个公共(public) getter(用于在 Servlet 和 JSP 中访问)

    在表单类中,我使用这个函数来获取字段值:
    private static String getFieldValue(HttpServletRequest request, String fieldName)
    {
    String value = request.getParameter(fieldName);
    if (value == null || value.trim().length() == 0){return null;}
    else{return value;}
    }

    通过一系列调用(如 String fieldDepartureStation = getFieldValue(request, FIELD_DEPARTURE_STATION);)获取值后在我的方法开始时,然后我使用这样的 try/catch block 检查它们
    try
    {validation.departureStation(fieldDepartureStation);}
    catch(Exception e)
    {setDataErrors(FIELD_DEPARTURE_STATION, e.getMessage());}

    如果数据必须具有特定的值范围或必须简单地为非空,则验证类中的验证方法会有所不同。

    在前一种情况下,它们是这样的:
    public void departureTime(String time) throws Exception
    {
    if (!validationRETime(time)) { throw new Exception("Please input a time with the hh:mm pattern"); }
    }
    ....
    private boolean validationRETime(String strTime)
    {
    String regExp = "^([01][0-9]|2[0-3])[:][0-5][0-9]$"; // hh:mm
    if (strTime.matches(regExp))
    {
    return true;
    }
    else
    {
    return false;
    }
    }

    而在后一种情况下,它们只是
    public void departureStation(String station) throws Exception
    {
    if (station.equals(null)) { throw new Exception("Please input a departure station"); }
    }

    最后,在我的 JSP 中,我使用以下代码来显示错误:
    <c:if test="${!empty errors.dataErrors}">
    <p>Errors</p>
    <c:forEach items="${errors.dataErrors}" var="message">
    <p><c:out value="${message.value}" /></p>
    </c:forEach>
    </c:if>

    当我故意输入不正确的值时,它确实会显示错误段落,但是 <c:forEach>仅当错误字段为非空但值不正确时才循环并显示错误消息。因此,对于一个只需要为非空的字段,我永远不会收到消息(但我确实收到了错误)

    这些都是我能想到的可能出错的事情,但我还没有发现他们在哪里做的,如果有人可以帮助我,我会很高兴。

    最佳答案

    问题出在您的 departureStation方法: -

    public void departureStation(String station) throws Exception
    {
    if (station.equals(null)) {
    throw new Exception("Please input a departure station");
    }
    }

    您对 null 的测试值本身会触发 NPE .所以,尽快 station.equals(null)station = null 执行, 一个 NPE抛出异常,然后将其传播给调用者。所以,你的 if block 甚至不会被执行。因此,您不会抛出 Exception正如你可能在想的那样。

    现在,还要注意, NPE抛出的不包含任何 message .所以, e.getMessage()将返回 null在上面。

    现在,让我们回到调用者:-
    try
    {validation.departureStation(fieldDepartureStation);}
    catch(Exception e)
    {setDataErrors(FIELD_DEPARTURE_STATION, e.getMessage());}

    在这里,你正在做世界上最大的犯罪 Exception Handling , 通过使用 Exception 的 catch block .由于 Exception是所有异常的父类(super class),它将以相同的方式处理所有异常。因此,它消耗了 NPE , 并将其传递给 setDataErrors() .

    所以,你当然会得到错误,但是,值 e.getMessage()将是 null .这就是为什么您没有看到任何消息的原因。您甚至可以通过 logging 进行测试 e.getMessage() 的值在 catch block多于。

    解决方案 ??

    只需更改您的 null检查这个: -
    if (station == null) { 
    throw new Exception("Please input a departure station");
    }

    一切都会好起来的。我认为,您必须在所有方法中进行此更改。始终执行 null check使用 ==运算符(operator)。

    关于java - 在 Java EE 应用程序中显示错误消息时出现意外结果(字段为空时没有错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14624455/

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