你能帮我想出解决办法吗? 有 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传输的是什么。表单提交需要多个阶段:
- 在服务器上:JSP 使用 servlet 上下文、 session 和请求属性执行,并且仍然对前一个请求(参数、...)=> 生成 HTML 页面具有完全访问权限(最终链接或包含 css 或 javascript)
- 在浏览器上:浏览器获取并解析 HTML 页面,可以选择获取链接的资源(图像等),并向用户显示表单
- 在浏览器上:用户填写表单的输入字段并单击输入按钮
- 在浏览器上:浏览器整理数据表单输入字段,生成新 HTTP 请求(通常是 POST 请求)并将其发送到服务器
- 在服务器上: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/