【问题标题】:How to process form by <jsp:setBean> and send it to servlet?如何通过 <jsp:setBean> 处理表单并将其发送到 servlet?
【发布时间】:2014-09-17 13:54:14
【问题描述】:

你能帮我想出解决办法吗? 有将表单参数发送到 servlet 的 JSP 页面。 通常我通过 HttpServletRequest.getParameter() 解析参数,它适用于参数数量很小的表单。 现在我正在开发的应用程序有很多带有大量参数的 JSP,并且表单处理的标准方式很不方便。 我认为可能的解决方案可能是使用-action。 我不明白它是否适合我。 我浏览了很多资料,但一无所获。 我的意思是有任何关于在 jsp 中获取表单参数的可能性的信息, 自动创建实体类的实例, 将所有参数映射到实体属性并将实体实例发送到 servlet。 请看代码:

index.jsp

<html>
    <head>
        <title></title>
    </head>
    <body>
        <form method="post" action="NewFormServlet" enctype="application/x-www-form-urlencoded">
            <jsp:useBean id="client-bean" class="model.entity.Client" scope="request"/>
            <h3>Please enter client information</h3><br>
            Client first name<input type="text" name="first-name"/><br>
                <jsp:setProperty name="client-bean" property="firstName" value="${requestScope.first-name}"/>
            Client last name<input type="text" name="last-name"/><br>
                <jsp:setProperty name="client-bean" property="lastName" value="${requestScope.last-name}"/>
            Client address<input type="text" name="address" size="100"/><br>
                <jsp:setProperty name="client-bean" property="address" value="${requestScope.address}"/>
            Client city<input type="text" name="city"/><br>
                <jsp:setProperty name="client-bean" property="city" param="${requestScope.city}"/>
            Client postal code<input type="text" name="postal-code"><br>
                <jsp:setProperty name="client-bean" property="postalCode" value="${requestScope.postal-code}"/>
            <input type="hidden" name="jsp-identifier" value="client-form">
            <input type="submit" value="Submit">
        </form>
    </body>
</html>

这段代码有什么不正确的地方?提前谢谢你。

【问题讨论】:

  • 在线教程:jsptut.com/Forms.jsp
  • 关键点:输入元素的名称必须与属性名称完全匹配,否则必须在jsp:setProperty标签中用param属性标识字段。

标签: java jsp servlets


【解决方案1】:

您应该首先考虑在服务器上发生了什么,在浏览器中发生了什么,以及通过 HTTP 传输的内容。表单提交使用多个阶段:

  1. 在服务器上:JSP 使用 servlet 上下文、会话和请求属性执行,在 上一个 请求(参数,...)=> 处仍具有完全访问权限,所有这些都会生成 HTML 页面(最终链接或包含 css 或 javascript)
  2. 在浏览器上:浏览器获取并解析 HTML 页面,可选地获取链接资源(图像等),并将表单显示给用户
  3. 在浏览器上:用户填写表单的输入字段并单击输入按钮
  4. 在浏览器上:浏览器整理数据表单输入字段,生成 HTTP 请求(通常是 POST 请求)并将其发送到服务器
  5. 在服务器上:servlet 容器预处理请求(直到它只是符合 HTTP 协议的字节流)并使用 new HttpServletRequest 反映当前的调用适当的 servlet 方法HTTP 请求,以及 HttpServletResponse 以准备处理后将发送回浏览器的内容

所有这意味着您可以在 JSP 部分中请求属性的任何操作都将在 servlet 处理提交的表单时丢失。您只能依赖会话属性以及可作为请求参数访问的输入表单字段。

因此,对于您当前的 JSP,Servlet 将在请求属性中找不到任何内容(它是不同的 HttpServletRequest),并且只能使用名称为 firstNamelastName、@ 的 参数 987654325@、city

我可以理解这不是预期的答案,但HTTP协议就是这样......

编辑每条评论:

你可以把属性放在session中,然后servlet会使用和JSP一样的session。但是再读一遍我上面写的,想想什么时候 事情发生了:

  • 在服务器上,当执行 JSP 时,您创建一个空的 Client bean,并将其放入会话范围,并使用它的值来初始化表单字段。停止服务器部分
  • 在客户端,用户填写输入字段 - 服务器对此一无所知 - 并通过新请求提交表单
  • 在服务器上,servlet 具有请求参数中的值,但会话仍包含以前的值,因此 Client bean 具有空值

很抱歉,服务器没有足够的魔力自动在其属性(请求或会话)中找到来自表单提交的内容:它只存在于请求参数中,它是处理它们的 servlet 作业和最终将它们放入属性中。

【讨论】:

  • 感谢您全面详细的回复。正如我上面写的,如果我使用会话范围,它就可以工作。但是还有另一个问题 - 从会话范围中检索为属性的客户端实体对象具有空属性。也许您知道为什么会发生这种情况?
  • 谢谢!我现在明白了)
【解决方案2】:

编辑: 看来 jsp:useBean 是一种收集一组参数值以便更容易在页面上显示的老式方法。 发布请求时不添加属性。

基于此, 我在 jsp:useBean 标记中看不到什么价值, 因为您可以使用 el 表达式来访问您在 servlet 中设置的属性。

这并不能帮助您将发布的参数值放入 servlet 中的 bean 中。

您可以在 bean 上编写一个方法来从请求中提取参数值(访问者模式)。 例如:

class bean
{
    private String value;

    public void loadFromHttpServletRequest(final HttpServletRequest request)
    {
        value = request.getParameter("value");
    }
}

考虑使用 spring-mvc 之类的包。

【讨论】:

  • 我试过但有同样的异常:无法为 JSP 编译类:在 jsp 文件中的第 3 行发生错误:/index.jsp 标记“-”上的语法错误,;预计
    第 3 行是
  • 从字段名称中删除短划线字符。 (破折号是“-”)。
  • 谢谢,它成功了,但是现在即使我将 / 放在
    -tag 中,属性“clientbean”也不会发送到 servlet。我解析了servlet中所有的receiver参数,只有form参数名。
  • 你的意思是 request.getAttribute("clientBean") 返回 null 吗?
  • 尝试将 clientbean 置于会话范围内,看看是否可行。
猜你喜欢
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多