如何通过<jsp:setbean>处理表单并将其发送到servlet?</jsp:setbean>

时间:2014-09-17 13:54:14

标签: java jsp servlets

你能帮我提出解决方案吗? 有JSP页面将表单参数发送给servlet。 通常我通过HttpServletRequest.getParameter()解析参数,该参数适用于具有微小参数编号的表单。 现在我正在开发具有大量参数数量的JSP的应用程序,并且标准的表单处理方式不方便。 我认为可能的解决方案可能是使用-action。 我不明白它是否适合我。 我浏览了很多材料但却一无所获。 我的意思是有关于在jsp中获取表单参数的可能性的任何信息, 自动创建实体类的实例, 将所有参数映射到entity-properties并将实体实例发送到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>

此代码中有什么不正确?提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

    服务器上的
  1. :使用servlet上下文,会话和请求属性执行JSP,在上一个请求中仍然具有完全访问权限(参数,...)=&gt;所有这些都会生成一个HTML页面(最终链接或包含css或javascript)
  2. 浏览器上的
  3. :浏览器获取并解析HTML页面,可以获取链接的资源(图像等),并将表单显示给用户
  4. 浏览器上的
  5. :用户填写表单的输入字段并单击输入按钮
  6. 浏览器上的
  7. :浏览器整理数据表单输入字段,生成 HTTP请求(通常是POST请求)并将其发送到服务器
  8. 在服务器上:servlet容器预处理请求(直到那只是符合HTTP协议的字节流)并使用 new HttpServletRequest调用适当的servlet方法反映当前的HTTP请求,以及HttpServletResponse以准备处理后将发送回浏览器的内容
  9. 这意味着,在servlet处理提交的表单时,您在JSP部分中请求属性的任何操作都将丢失。您只能依赖会话属性,以及可作为请求参数访问的输入表单字段。

    因此,使用当前的JSP,Servlet将不会在请求属性中找到任何内容(它是一个不同的HttpServletRequest),并且只能使用名称为firstName的{​​em>参数,{{1 }},lastNameaddress

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

    每条评论编辑:

    您可以将该属性放在会话中,然后servlet将使用与JSP相同的会话。但请再读一遍我上面写的内容,并在事情发生时思考

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

    对不起,但是服务器没有足够的魔力来自动查找表单提交的属性(请求或会话):它只存在于请求参数中,它是servlet作业来处理它们并最终将它们放在属性中。

答案 1 :(得分:1)

编辑: 似乎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这样的软件包。