保留Struts 2中多个JSP和Actions之间的值

时间:2013-08-26 12:22:07

标签: java jsp struts2 ognl struts2-interceptors

我的struts项目结构如下: page1 - > action1 - > page2 - > action2 - > page3

我需要的是我在第1页的输入标签中输入的值,以便在action2中访问。

这是我的代码:

第1页:

<div class = "container">
    <s:form id = "idinput" method = "post" action = "idEntered">
        Enter id: <input id = "txtid" name = "txtid" type = "text" />
        <input id = "cmdsubmit" name = "cmdsubmit" type = "submit" value = "enter details" />
    </s:form> 
</div>

动作1:

public class AddId extends ActionSupport {

private int txtid;
    //getter and setter

@Override
public String execute() throws Exception {      
    return "success";
}   

}

第2页:

<div class = "container">
    <s:form id = "formvalues" method = "post" action = "formEntered">
        <p>Your id entered is: <s:property value = "txtid" /></p>
        First name: <input id = "txtfname" name = "txtfname" type = "text" />
        Last name: <input id = "txtlname" name = "txtlname" type = "text" />
        Age: <input id = "txtage" name = "txtage" type = "text" />
        <input id = "cmdform" name = "cmdform" type = "submit" value = "submit form" />     
    </s:form>
</div>

1动作:

public class AddForm extends ActionSupport {    
    private String txtfname;
private String txtlname;
private int txtage;
private int txtid;
      //getters and setters 

@Override
public String execute() throws Exception {

    return "success";
}

}

并在

中显示所有内容

PAGE3:

<div class = "container">
    ID: <s:property value = "txtid" /><br>
    first name: <s:property value = "txtfname" /><br>
    last name: <s:property value = "txtlname" /><br>
    age: <s:property value = "txtage" />
</div>

这是我遇到问题的地方txtid显示为null,我从中推断该值未从page2传递到action2

我提出的解决方案是使用

<s:hidden value = "%{txtid}" name = "txtid2 /> 

page2中的格式中,我可以在txtid中使用txtid2的值作为action2,但这似乎更像是一个黑客而不是实际的解决方案,欢迎任何其他建议。

1 个答案:

答案 0 :(得分:3)

在您希望将字段值从一个操作传递到另一个操作的情况下,您可以配置字段的范围。只需在每个操作中使用getter和setter放置相同的字段,在您的情况下,它将是action1action2。字段名称为txtid。除了scope拦截器不包含在defaultStack中之外,您还应该在操作配置中引用它。例如

<action name="action1" class="com.package.action.AddId">
    <result>/jsp/page2.jsp</result>
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="scope">
        <param name="key">mykey</param>
        <param name="session">txtid</param>
        <param name="autoCreateSession">true</param>
    </interceptor-ref>
</action>
<action name="action2" class="com.package.action.AddForm">
    <result>/jsp/page3.jsp</result>
    <interceptor-ref name="scope">
        <param name="key">mykey</param>
        <param name="session">txtid</param>
        <param name="autoCreateSession">true</param>
    </interceptor-ref>
    <interceptor-ref name="basicStack"/>
</action> 

现在,您可以在其下方使用密钥mykey和字段txtid。在每个操作中为字段提供访问器将使传输字段值从一个操作到另一个操作。在上面的示例中使用了basicStack,它是拦截器堆栈的骨架,它不包括一些拦截器,包括validation拦截器。如果您需要为操作提供其他功能,则应在操作配置中构建自定义堆栈或引用其他拦截器。