代码之家  ›  专栏  ›  技术社区  ›  alexis

来自表单的servlet、jsp和用户反馈

  •  1
  • alexis  · 技术社区  · 14 年前

    我一直在纠结如何实现下面的场景。任何指导都将不胜感激。

    我有一个用户填写的表单。在发送到服务器之前,使用jquery尽可能地验证它。当单击提交按钮时,表单将发送到servlet。

    然后servlet将检查数据库,如果一切正常,它将添加相关信息发送到JSP,JSP将显示一个新页面。 如果servlet发现了一个错误,我就可以确定这一点。在这种情况下,出现错误时,应向用户弹出一条消息,页面不应更改。我知道这是不可能的。

    如果不可能的话,在用户提交表单后,是否有任何好的Web设计指导,以及如何使用servlet和jsp实现表单。

    谢谢

    亚历克西斯

    2 回复  |  直到 12 年前
        1
  •  1
  •   BalusC    12 年前

    您基本上需要将请求返回(转发)到与表单相同的JSP页面。你可以使用 ${param} 重新显示原始输入。你可以使用 request.setAttribute() 在servlet中设置请求范围中的一些数据,然后您可以在JSP页面中显示这些数据。

    下面是这样一个JSP页面的启动示例,它表示一个登录表单:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    
    ...
    
        <label for="username">Username</label>
        <input type="text" id="username" name="username" value="${fn:escapeXml(param.username)}">
        <br>
        <label for="password">Password</label>
        <input type="password" id="password" name="password" value="${fn:escapeXml(param.password)}">
        <br>
        <span class="error">${error}</span>
    

    (the fn:escapeXml 必须防止 XSS attacks 当重新显示用户控制的输入时)

    在后处理请求的servlet中,您可以大致按照以下方式处理登录:

    String username = request.getParameter("username");
    String password = request.getParameter("password");
    User user = userDAO.find(username, password);
    if (user != null) {
        request.getSession().setAttribute("user", user); // User found, login it.
        response.sendRedirect("home"); // Redirect to home page.
    } else {
        request.setAttribute("error", "Unknown username/password, please try again"); // Set message which you display in ${error}
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Redisplay the same JSP page.
    }
    

    请注意,上面的示例显示嵌入在同一页上的错误,并且不显示警报,因为警报是糟糕的用户体验。如果您真的坚持显示警报,那么您可以获取JSTL c:if 标记以按条件打印警报:

    <c:if test="${not empty error}">
        <script>alert('${error}');</script>
    </c:if>
    

    同样,这不是正常的做法。

    参见: