문제

Struts2 value 스택에 관한 질문이 있습니다. 내가 행동 클래스가 호출되었다고 가정 해 봅시다 RegisterAction 다음과 같이 실행 방법이 있습니다.

public String execute() {
    ValueStack stack = ActionContext.getContext().getValueStack();
    stack.push(new String("test string"));
    return SUCCESS;
}

내 struts.xml은 다음과 같습니다.

<struts>
    <package name="default" extends="struts-default">
        <action name="*Register" method="{1}" class="vaannila.RegisterAction">
            <result name="populate">/register.jsp</result>
            <result name="input">/register.jsp</result>
            <result name="success">/success.jsp</result>
        </action>        
        <action name="*Test" method="{1}" class="vaannila.TestAction">
            <result name="test">/test.jsp</result>
            <result name="success">/success2.jsp</result>
        </action>        
    </package>
</struts>

따라서 컨트롤은 성공으로 흐릅니다 .JSP 실행 메소드가 해당 클래스에서 실행 된 후.

내 질문은 다음과 같습니다.

1) 스택에 푸시 한 값을 어떻게 얻을 수 있습니까? success.jsp?

2) 말합시다 success.jsp 나는있다 <s:submit method="testMethod" /> 그 항목은 호출 된 액션 클래스로 리디렉션됩니다 TestAction. 다시 말해, 레지스터 페이지에서 사용자는 제출을 클릭하고 실행 방법에서 RegisterAction 스택에서 "테스트 문자열"을 밀어 넣습니다. 그런 다음 우리는갑니다 success.jsp. 그만큼 success.jsp 우리를 지시하는 제출 버튼이 있습니다 TestAction#testMethod. ~ 안에 TestAction#testMethod, 내가 스택에 밀어 넣은 값은 RegisterAction#execute 아직도 거기? 어떻게 얻을 수 있습니까? 나는 Eclipse Debugger를 밟았지만 그 값은 보이지 않습니다.

감사.

도움이 되었습니까?

해결책

좋아, 나는 이것을 알아 냈다.

1) 값 스택에서 객체를 얻는 방법을 발견하여 JSP에서 액세스 할 수있는 방법은 다음과 같습니다.

Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().push(context);

다시 말해, 우리는 필요한 객체를 포함하는 값 스택에 해시 맵을 넣을 수 있습니다. 그런 다음 JSP에서는 다음과 같은 실제 값에 액세스 할 수 있습니다.

<s:property value="key" />
<s:property value="key2" />

그것은 값 스택을 통해보고 우리가 푸시 한 해시 맵에서 해당 값을 찾을 것입니다.

2) 조치 클래스의 인스턴스는 단 하나의 요청과 관련이 있습니다. 그래서 우리가 다른 행동으로 가서 다른 JSP로 끝날 때, 우리가 첫 번째 조치에서 값 스택에 밀어 넣은 것들은 다른 행동에 자체 값 스택을 가지고 있기 때문에 거기에 없을 것입니다. 참조: http://www.manning-sandbox.com/thread.jspa?messageid=93045

당신은 이것 중 하나라도 잘못되었거나 이런 일을하는 더 똑똑한 방법이 있다면 당신은 나를 자유롭게 바로 잡을 수 있습니다 :).

감사.

다른 팁

Struts 2는 실행될 때 값 스택의 상단에 동작을 추가합니다. 따라서 값 스택에 물건을 넣는 일반적인 방법은 값에 대한 Getters/Setter를 액션 클래스에 추가하는 것입니다. 여전히 s : 속성 태그를 사용하여 값에 액세스합니다.

CRUD 튜토리얼 : http://struts.apache.org/2.1.6/docs/crud-demo-i.html

같은 속성을 정의하십시오

String string1 = "test string";

당신의 행동에서.

JSP에서는 직접 액세스 할 수 있습니다.

예를 들어

 <s:property value="string1"/>

인쇄됩니다

"테스트 문자열"

일반적으로 Nate가 말했듯이 행동은 항상 Valuestack에 있기 때문에 행동에 필드를 사용할 것입니다. 그러나 템플릿 (JSP/Freemarker 등)이 호출 될 때까지 인터셉터가 사라지기 때문에 인터셉터 코드를 작성하는 경우에는 작동하지 않습니다. 위에서와 마찬가지로 Valuestack에 일종의 Java Bean과 같은 물체를 넣어야합니다.

안녕하세요 정보 만하면됩니다

이것들은 사용의 단점입니다 getValueStack().getContext() 때로는 데이터가 .ftl에서 사용할 수 없었습니다 (데이터는 Line2에서 표시되지 않았지만 Line1에 나오는 것이 었습니다) 나는 이것의 이유를 실제로 모릅니다. 그러나 사용 .getValueStack().set("resDTO",resDTO); 문제가 해결되었습니다 (데이터는 두 기능 모두에 인구가 발생했습니다).

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top