Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp 第二个表单提交为空_Jsp_Servlets - Fatal编程技术网

Jsp 第二个表单提交为空

Jsp 第二个表单提交为空,jsp,servlets,Jsp,Servlets,我有一个JSP,它包含一个表单,包含几个文本输入 我可以用一些数据填充文本输入。 单击submit按钮后,将按预期调用servlet的doPost方法。 遵循PRG设计模式,我在doPost方法的末尾使用“sendRedirect”调用,以避免在用户重新加载wep页面时再次提交表单 此时一切正常: 表格中输入的数据将显示在屏幕上 但是,如果我再次按下submit按钮,就会出现令人讨厌的NullPointerException,因为传递给servlet的doPost方法的HttpServletRe

我有一个JSP,它包含一个表单,包含几个文本输入

我可以用一些数据填充文本输入。 单击submit按钮后,将按预期调用servlet的doPost方法。 遵循PRG设计模式,我在doPost方法的末尾使用“sendRedirect”调用,以避免在用户重新加载wep页面时再次提交表单

此时一切正常: 表格中输入的数据将显示在屏幕上

但是,如果我再次按下submit按钮,就会出现令人讨厌的NullPointerException,因为传递给servlet的doPost方法的HttpServletRequest不再包含我在第一次提交时输入的数据

我不明白为什么我会有这种行为: 表单包含数据,但不会第二次发送

你能解释一下我的方法有什么问题吗

[编辑]我正在尝试另一种方法,使用会话属性 以下是我的一些代码:

在JSP上(myJsp.JSP)

我的理解是: -第一次加载页面时,将调用doGet方法。因此,myBean被设置为会话的一个属性 -当我点击submit时,doPost方法被调用。由于myBean已经被设置为会话的属性,我希望自动检索bean信息(因为${sessionScope.bean.field}在表单的值字段中)

=>使用第二种方法,即使第一次表单提交失败,也会出现空指针异常,但我不明白为什么

如果我恢复使用请求参数而不是会话对象

value="${bean.field}
我通过doPost方法中的request.getParameter访问参数。 它适用于表单的第一次提交,但在第二次提交时,即使表单填写了第一次提交的值,也没有名为“field”的请求参数

总结一下我的谈话: -当我使用请求参数时:为什么在第二次提交时没有名为“field”的请求参数?
-当我使用session属性时:为什么第一次提交表单时它为空?

我找到了解决问题的方法,但我不喜欢它

  • 在第一次提交时,请求参数映射包含表单输入内容。 所以我通过request.getParameter(..)方法获取它们,并使用request.getSession.setAttribute(..)将它们设置为会话属性

  • 在第二次提交时,请求参数映射不包含表单内容(即使它们显示在表单中,因为它们是从会话属性检索的) 我测试request.getParameter的空值,如果为空,则不更新会话属性

它是有效的,但我不觉得它干净,我肯定我错过了什么,所以我留下这个开放的任何其他想法。
谢谢。

使用#{…}EL表达式有效

您如何重新显示重定向GET请求上的数据?在重定向的GET请求上提交表单到底应该做什么?为什么它又会进入同一个servlet?BalusC,回答您的问题:我用EL表达式value=“${sessionScope.bean.field}”或value=“${bean.field}”重新显示表单中的数据。例如,在“部分提交”的情况下,数据将进入同一个servlet。假设用户在表单上填写了一些输入。它们由servlet处理,但相同的网页随后会用已经输入的数据重新显示,以便用户可以继续填充用户缺少的字段
private Bean myBean;

doPost(...){
doSthWithMyBean(myBean);
response.sendRedirect("myJsp.jsp");
}

doGet(...){
request.getSession().setAttribute("bean",myBean);
this.getServletContext()....("myJsp.jsp").forward(request, response);
//I forget the exact methods on the description above, but you see what I do : I forward the request and response to the same jsp
}
value="${bean.field}