服务器端会话在同一客户端会话的所有请求之间共享。只要用户首次访问该站点,会话就一直存在,直到该会话过期(超过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 >${messages.username}</span> <p><label for="password">Password</label> <input type="password" id="password" name="password"> <span >${messages.password}</span> <p><label for="/confirm/i">Confirm password <span >*</span></label> <input type="password" id="/confirm/i" name="/confirm/i"> <span >${messages./confirm/i}</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:
<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将其打开,然后继续。



