如何在JSP中以相同的forms执行validation和显示错误消息?

当用户提交错误的input时,如何在同一个JSP中显示错误消息? 我不打算抛出一个exception,并显示一个错误页面。

最简单的方法是在JSP中为validation错误消息设置占位符。

JSP /WEB-INF/foo.jsp

 <form action="${pageContext.request.contextPath}/foo" method="post"> <label for="foo">Foo</label> <input id="foo" name="foo" value="${fn:escapeXml(param.foo)}"> <span class="error">${messages.foo}</span> <br /> <label for="bar">Bar</label> <input id="bar" name="bar" value="${fn:escapeXml(param.bar)}"> <span class="error">${messages.bar}</span> <br /> ... <input type="submit"> <span class="success">${messages.success}</span> </form> 

在提交表单的servlet中,可以使用Map<String, String>来获取要在JSP中显示的消息。

Servlet @WebServlet("foo")

 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String, String> messages = new HashMap<String, String>(); request.setAttribute("messages", messages); // Now it's available by ${messages} String foo = request.getParameter("foo"); if (foo == null || foo.trim().isEmpty()) { messages.put("foo", "Please enter foo"); } else if (!foo.matches("\\p{Alnum}+")) { messages.put("foo", "Please enter alphanumeric characters only"); } String bar = request.getParameter("bar"); if (bar == null || bar.trim().isEmpty()) { messages.put("bar", "Please enter bar"); } else if (!bar.matches("\\d+")) { messages.put("bar", "Please enter digits only"); } // ... if (messages.isEmpty()) { messages.put("success", "Form successfully submitted!"); } request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response); } 

如果你创build了更多的JSP页面,并且servlet做的更less或者更多,并且开始注意到这是毕竟大量重复的样板代码,那么就考虑使用MVC框架。

也可以看看:

  • 我们的Servlets wiki页面
  • 在JSP中validation参数的最佳做法是什么?

我看到标签“表单validation”,所以也许你应该只使用JavaScript和客户端表单validation? 如果您需要使用JSP进行validation,请处理表单数据,并重新显示带有错误消息的表单或接受表单数据(如果正确)。

我不太清楚“显示错误信息”是什么意思。 如果你有一个标准的error handling,那么你总是可以检查选项:

 <% if(wrong option selected) throw new Exception("Invalid option selected"); %> 

当然,这只是概念; 最好是你有自己的exception类。 但是再次,我不太清楚你在做什么。