我正在用 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);
}
地图是 NewBookingForm 类中的一个字段,在这样的registerBooking
方法之外声明和初始化private Map<String,String> dataErrors = new HashMap<String,String>();
,它有一个私有 setter(用于在类内访问)和一个公共 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 块检查它们
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>
当错误字段为非空但值不正确时,它只会循环并显示错误消息。因此,对于一个只需要为非空的字段,我永远不会收到消息(但我确实收到了错误)
这些都是我能想到的可能出错的事情,但我还没有发现他们在哪里做的,如果有人可以帮助我,我会很高兴。