【问题标题】:Struts 1.3: request attributes lost after submitStruts 1.3:提交后请求属性丢失
【发布时间】:2013-05-29 03:31:23
【问题描述】:

我有两个jsp页面,比如form.jspmyForm.jsp

在第一页 form.jsp 中,有一个单选按钮组(表单名称为“form”)。

当用户提交此表单时,会从数据库中检索一些信息,并使用这些信息构建 myForm.jsp 中的表单(表单名称为“myForm”)。

问题在于,当提交第二个表单时,只显示错误,而不显示从 db 值创建的表单字段。 例如,我从数据库中检索两个单选按钮 (property="prop") 的标签和值。

struts-config.xml,我有:

<form-bean name="myForm" type="org.apache.struts.validator.MyValidatorActionForm">
<form-property name="prop" type="java.lang.Integer"></form-property>
</form-bean>

<action path="/form" input="/jsp/home.jsp" name="form" scope="request" type="myPackage.LoadInfo">

<forward name="Success" path="/jsp/myForm.jsp"/>  
<forward name="Failure" path="/jsp/home.jsp" />     
</action>

 <action path="/myForm" input="/jsp/myForm.jsp" name="myForm" validate="true" scope="request" type="myPackage.MyValidatorAction"> 
<forward name="Success" path="/jsp/success.jsp"/>  
<forward name="Failure" path="/jsp/failure.jsp"/>
</action>

myForm.jsp:

<html:form action="/myForm">
 <div><label>*&nbsp;<bean:message key="myForm.label"/></label>
<c:forEach var="propTypes" items="${props}">
<html:radio property="prop" value="${propTypes.value}">${propTypes.label}
     </html:radio>
     </c:forEach>
&nbsp;&nbsp;<html:errors property="prop" />
 </div>
<div><html:submit><bean:message key="myForm.label2"/></html:submit></div>
 </html:form>

validation.xml:

在不选择任何单选按钮的情况下提交表单后,会显示错误,但不会显示单选按钮。

如何维护所有请求属性? 我也尝试使用范围会话,但没有任何改变:

 <action path="/myForm" input="/jsp/myForm.jsp" name="myForm" validate="true" scope="session" type="myPackage.MyValidatorAction"> 
<forward name="Success" path="/jsp/success.jsp"/>  
<forward name="Failure" path="/jsp/failure.jsp"/>
</action>

我通过使用解决了:

request.getSession().setAttribute("props", props);

在显示表单之前调用的Action LoadInfo

myForm.jsp我使用:

 request.getSession().getAttribute("props");

而在 struts-config.xml 中,范围仍然是请求。

尽管如此,这不是一个好的解决方案,因为不同的浏览器标签共享同一个会话。

我该如何解决这个问题?

【问题讨论】:

    标签: forms validation httprequest struts-1


    【解决方案1】:

    您的 jsp 页面中的表单字段应该在您的 ActionForm 类中具有相应的属性。

    所以如果你的jsp有一个如下单选按钮

    <html:radio name="myForm" property="name">
    

    您需要在您的操作表单中有一个相应的属性,如下所示,并确保您有 getter 和 setter:

    public class MyClass{
    private String name; 
    public String getName()
    { 
       return name; 
    }
    public void setName(String name){
       this.name = name; 
    } 
    

    如果您以这种方式进行设置,当您的页面刷新时,用户输入的值应该仍然存在。

    【讨论】:

    • 我有它,带有私有 int 属性,以及 get 和 set 方法。问题是当出现错误时(在这种情况下,选择了任何单选按钮),会显示错误,但不会显示单选按钮。只有标签和味精错误。
    • 我不确定这是否是个好主意,或者它是否会起作用,但您是否尝试过将范围从请求更改为会话?
    • 我也是这么想的,已经试过改成session了,还是不行。
    • 试试这个:当错误发生时,在您的操作类中对单选按钮属性执行 SysOut 并查看打印出来的内容。这样,当错误发生时,您就可以知道该对象是否已存在。
    • 如果我不选择按钮然后提交表单,则通过 xml 进行验证(打印错误消息),但不会调用 Action 类 MyValidatorAction 的执行方法(我也不例外,什么都没有)。相反,如果我选择一个单选按钮,然后提交调用执行方法的表单,则单选属性的值会很好地打印在 System.out 上,但是“props”对象的打印会给出空指针异常(System.out .println(request.getAttribute("props").toString());)
    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多