Dawnist Note

Struts2에서 응답을 어떻게 만들어 낼지 결정하는 클래스를 result라고 한다.

   

만약 struts.xml에 다음과 같이 매핑 되어 있다면…

(아래 3경우는 동일한 결과를 나타낸다)

<result name="success" type="dispatcher">

<param name="location">/success.jsp</param>

</result>

<result name="success" type="dispatcher">/success.jsp</result>

<result>/success.jsp</result>

   

Action에서 리턴한 문자열이 success면 dispatcher TYPE의 result가 실행되는데 dispatcher는 /success.jsp로 forward 한다.

   

물론 Interceptor에서 Action의 실행 결과(Action.SUCCESS 등등)를 리턴하지 않고 결과 문자열을 만들어 리턴 하는 것도 가능한데 논리적인 유효성 검사 또는 로그인을 먼저 해야 하는 Action을 로그인 하지 않고 들어오는 경우 등에 이용이 가능하다. 이 경우 return invocation.invoke()을 하지 않고 문자열을 직접 리턴 할 수 있다.

   

Action 인터페이스는 아래와 같이 몇 가지 result 문자열을 상수로 정의하고 있다.

  • SUCCESS("success") : Action이 설동적으로 실행
  • NONE("none") : Action은 성공이지만 화면을 보여줄 필요가 없는 경우
  • ERROR("error") : Action 실행 중 에러 발생
  • INPUT("input") : 입력값에 문제가 있어 입력화면으로 되돌림
  • LOGIN("login") : 로그인을 하지 않아 Action 실행 불가. 로그인 화면으로 돌아간다.

   

[result-type과 result]

result는 다음과 같이 result-type을 먼저 정의하고 action요소에서 결과 문자열과 타입을 매핑한다.

<struts>

<package name="struts2" extends="struts-default">

<result-types>

<result-type name="dispatcher" class="…"/>

<result-type name="redirect" class="…"/>

<result-type name="chain" class="…"/>

</result-types>

<action name="login" class="login.action.LoginAction">

<result>/login/login_ok.jsp</result>

<result name="login" type="dispatcher">/login/login.jsp</result>

</action>

</package>

</struts>

   

Struts2에서는 자주 사용되는 result type에 대해 이미 클래스로 구현해 놓고 struts-default.xml에 이미 정의했으므로 우리는 struts-defulat 패키지를 extends 라고 action 설정에서 그냥 사용만 하면 된다.

   

<package name="struts-default">

<result-types>

<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>

<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>

<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>

<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>

<result-type name="redirect-action" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>

<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>

<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>

<result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" />

</result-types>

……………..

……………..

……………..

위 result-type중 dispatcher에 default="true" 라고 되어 있는데 action의 result 설정에서 type 속성을 기술하지 않으면 기본 type은 dispatcher가 된다.

   

[global-result]

로그인 화면, 에러처리화면(404,500에러 처리화면) 처럼 모든 웹 애플리케이션에 사용되는 화면같은 경우 global-results로 정의 해 모든 action 요소에서 사용 가능하게 할 수 있다. 결과문자열에 대한 매핑은 action 설정내의 local result를 먼저 찾고 없으면 global-results에서 찾는다.

<package …>

<global-results>

<result name="error">/error.jsp</result>

<result name="login">/login.jsp</result>

</global-results>

<action ….>

</action>

</package>

   

[와일드카드 매핑]

result에도 와일드카드 매핑을 할 수 있는 데 다음 예를 보자.

<action name="*/*" class="oraclejava.action.{1}Action" method="{2}">

<result>{2}.jsp</result>

</action>

   

만약 다음과 같은 요청이 들어 온다면…

/Login/create.action è LoginAction에서 action method create()를 실행하고 create.jsp로 forward 시킨다.

   

Comment +0