【问题标题】:JSP form with validation in servlet在 servlet 中进行验证的 JSP 表单
【发布时间】:2015-01-22 18:44:19
【问题描述】:

我正在尝试使用JSP和servlet按照逻辑与表示分离的原则进行表单处理,但目前看来相当违反直觉。

到目前为止,我有一个简单的 JSP 页面,其中包含一个表单和一个 jsp:usebean,用于将请求参数获取到一个 java 对象中。 我使用 JST 'if' 来检查调用方法。如果是 GET,我会显示页面,如果是 POST,我会转发到验证 servlet。

这个想法是 servlet 执行处理,然后在数据不正确时重定向到表单。

问题是,如果servlet进程发布,然后重定向到表单,该表单将在无限循环中再次调用servlet,所以我需要在转发之前将请求方法更改为“GET”。

另一个可能是首先调用一个servlet,然后调用JSP 文件作为视图。但这是一个简洁的功能,并且在 servlet 中执行此操作需要通过调用 request.getParameter() 手动实例化对象,这也意味着很多重复。到参数名称,因此有必要首先使用 JSP。我可以使用 JSP,然后转发到 servlet,然后转发到“视图”JSP,但这对于 JSP 的单个“功能”来说似乎有点乏味。因此,尽管付出了很多努力,我仍在寻找一个简洁的解决方案。

人们如何在实践中应用“JSP 中无代码”的原则,同时保持“无代码重复”的原则?转发时是否可以更改请求方法?是否可以在 Java 代码中进行模拟?按照现代标准,完成这个简单用例的 JSP“方式”是否丑陋?我可能会使用很多变通方法,但我会尽可能地遵守标准。

【问题讨论】:

    标签: jsp servlets


    【解决方案1】:

    将 servlet 用作控制器。这意味着,用户永远不会看到 .jsp 扩展名或 JSP 的任何其他映射 url。用户总是被发送到 servlet 的 URL。然后 servlet 根据需要转发到 JSP。实际上,您可能希望将您的 jsp 放在 WEB-INF 中,以使用户无法通过控制器(即 servlet)以外的任何其他方式到达那里。

    这里的转发是在其正确的技术意义上使用的,这意味着它将执行传递给 JSP在后台,但 servlet 的 URL 保留在地址栏中(这与重定向非常不同)。这确保了如果用户点击刷新,servlet 仍然控制着执行流程。

    好的。现在你的逻辑:

    如果请求是 POST 并且验证成功,则 servlet 会处理它。

    如果验证失败或请求为 GET,则 servlet 转发到 JSP。

    您将不得不摆脱 jsp:useBean,因为它与 servlet 不兼容。见底部servlets info page

    至于代码重复,我猜你的意思是在servlet中调用request.getParameter(),然后将其移入request.setAttribute(),然后在转发之后读取JSP中的属性。好吧,如果您真的在使用 bean,您应该将所有参数放入 bean 并将 bean 设置为 request.setAttribute(),这样您就不会再从 JSP 中的同一个位置读取参数,因为您会寻找在bean不是请求参数....所以它不是代码重复。 (这也解释了您用什么替换过时的 jsp:useBean。)

    因此,让我们从 servlet 的信息页面中获取这个示例。在 servlet 中:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Preprocess request: load list of products for display in JSP.
        List<Product> products = productService.list();
        request.setAttribute("products", products);
        request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
    }
    

    在 JSP 中:

           <c:forEach items="${products}" var="product">
                <tr>
                    <td>${product.id}</td>
                    <td><c:out value="${product.name}" /></td>
                    <td><c:out value="${product.description}" /></td>
                    <td><fmt:formatNumber value="${product.price}" type="currency" /></td>
                </tr>
            </c:forEach>
    

    看看 servlet 如何创建一个名为 products 的对象并将其放置在请求属性中?你会做同样的事情,但这里不是一个列表,而是你的 bean 的任何类型。在 JSP 中的 EL 中访问它时也是如此:您将以这种方式访问​​您的 bean:s​​ervlet 中的 request.setAttribute("myBean", beanObj); 和 JSP 中的 ${myBean.memberName}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2023-03-17
      • 1970-01-01
      • 2011-11-20
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多