Сохранение значений между несколькими JSP и действиями в Struts 2

Структура моего проекта Struts выглядит следующим образом:

page1->action1->page2->action2->page3

Мне нужно, чтобы значение, которое я ввел во входном теге в page1, было доступно в 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>

действие2:

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";
}
}

и отображать все в

страница 3:

<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, однако это больше похоже на взлом, чем на фактическое решение, поэтому любые другие предложения приветствуются.


person vikramjit_S    schedule 26.08.2013    source источник
comment
Почему вы используете page-›action вместо action-›page?   -  person Roman C    schedule 26.08.2013
comment
мне нужно сначала получить идентификатор от пользователя, поэтому страница 1 должна отображаться первой. при отправке страницы 1 вызывается действие struts — действие 1, которое затем отображает страницу 2.   -  person vikramjit_S    schedule 27.08.2013
comment
Но вы обрезаете action2, в котором хотите значение в txtid2, так что я не понимаю, что вы хотите.   -  person Roman C    schedule 27.08.2013
comment
@RomanC я отредактировал свой вопрос, на странице 3 отображаются только txtfname, txtlname и txtage, txtid, перенесенный со страницы 1, равен нулю   -  person vikramjit_S    schedule 27.08.2013


Ответы (1)


В ситуации, когда вы хотите сохранить значения поля, передаваемые от одного действия к другому, вы можете настроить область действия поля. Просто поместите одно и то же поле с геттерами и сеттерами в каждое действие, в вашем случае это будут action1 и action2. Имя поля txtid. А также scope interceptor не включает в 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 перехватчик.

Если вам нужны другие функции для ваших действий, вы должны либо создать собственный стек, либо ссылаться на другие перехватчики в конфигурации действия.

person Roman C    schedule 27.08.2013
comment
это сработало отлично, спасибо за ответ! похоже, мне придется вернуться и пересмотреть некоторые из моих основ. - person vikramjit_S; 28.08.2013