java - 如何通过 <jsp :setBean> and send it to servlet? 处理表单

标签 java jsp servlets

你能帮我想出解决办法吗? 有 JSP 页面将表单参数发送到 servlet。 通常我通过 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>

这段代码有什么错误?预先感谢您。

最佳答案

你应该首先考虑服务器上发生了什么,浏览器上发生了什么,以及通过HTTP传输的是什么。表单提交需要多个阶段:

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

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

因此,对于您当前的 JSP,Servlet 将在请求属性中找不到任何内容(它是不同的 HttpServletRequest),并且只能使用名称为 firstName参数姓氏地址城市

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

编辑每条评论:

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

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

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

关于java - 如何通过 <jsp :setBean> and send it to servlet? 处理表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25892562/

相关文章:

java - 如何在java中获取一年中每个月的第一个工作日

java - Ant 文件复制不适用于 jdk 7

java - Selenium如何通过元素id查找

Java 正则表达式 : match whole word with word boundary

java - 获取应用服务器下的真实(虚拟)主机名

java - 在 spring mvc 中使用多个调度程序 servlet 的优点和缺点

java - 如何在服务器工作时保留java servlet中的对象?

apache - 正在将 tomcat 应用程序 url 设置为 http ://hostname/application/possible?

java - java加载Mysql类驱动的方法

java - Servlet - 将文件保存到磁盘,但不确定使用什么路径?