我正在创建注册页面,并且已经完成了基本的客户端(JS)表单验证。 现在,我要编写服务器端验证。
我所做的是调用request.getParameter():
String username = request.getParameter("username");
然后,如果用户名输入无效,则将错误消息放入ArrayList:
ArrayList<String> errors = new ArrayList<String>(); errors.add("username is not valid");
然后,将ArrayList对象添加到会话变量,
session.setAttribute("inputErrors", errors);
通过这种方式,我可以使用逻辑来查看ArrayList是否不为空(即存在错误),重定向回注册页面并获取会话值以显示正确的错误消息。
但是我想知道以这种方式使用会话是否是处理错误消息的好方法。由于此操作仅涉及2个页面:注册UI(regis.jsp)和处理注册输入验证和处理的页面(process_regis.jsp)。我对会话的理解将主要在多个页面上用于登录的用户数据。
如果需要进一步说明,请告诉我。
服务器端会话在同一客户端会话的所有请求之间共享。只要用户首次访问该站点,会话就一直存在,直到该会话过期(超过30分钟不使用(可配置)),或者该会话被明确禁用。使用您的方法,在新的浏览器选项卡中打开同一页面。当根本不输入/提交新页面中的表单时,您仍然会看到错误消息。这不利于用户体验。
通常的做法是将错误消息存储在请求范围内,然后将请求 转发 到同一页面,而不是重定向到该页面。如果使用完全有价值的Servlet类而不是JSP文件进行处理和验证,则这很容易。例如
/WEB-INF/register.jsp
<form method="post" action="register"> <p><label for="username">Username</label> <input type="text" id="username" name="username" value="${fn:escapeXml(param.username)}"> <span class="error">${messages.username}</span> <p><label for="password">Password</label> <input type="password" id="password" name="password"> <span class="error">${messages.password}</span> <p><label for="confirm">Confirm password <span class="required">*</span></label> <input type="password" id="confirm" name="confirm"> <span class="error">${messages.confirm}</span> <p><input type="submit" value="Register"> <p>${messages.result}</p> </form>
com.example.RegisterServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String, String> messages = new HashMap<String, String>(); request.setAttribute("messages", messages); // Will be available by ${messages}. String username = request.getParameter("username"); if (username == null || username.trim().isEmpty()) { messages.put("username", "Please enter username"); } // ... request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); }
如下所示映射此servlet web.xml:
web.xml
<servlet> <servlet-name>registerServlet</servlet-name> <servlet-class>com.example.RegisterServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>registerServlet</servlet-name> <url-pattern>/register</url-pattern> </servlet-mapping>
通过http://example.com/context/register将其打开,然后继续。