문제
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