본문 바로가기

프레임워크/Struts2

struts.xml에서의 redirect-action, redirectAction

실제로 자료들을 찾아보면서 이거에 대한 얘기는 많이 있지만 쓸만한 자료는 별로 없었다.
특히..redirect-action과 redirectAction은 분명 버전차이인지 뭔지가 있는데 말이다.(내가 지식부족의 관계로 잘 모름....;;)

struts2를 하면서 이런건 누구나 다 경험이 있을것이다.
1. action을 실행하고 결과페이지를 리스트로 보여주고 싶을때
2. 특정 페이지에서 전에 쓰던 멤버들을 다시 쓰고 싶을때

그래서 쓰는것이 <result type="chain">액션명</result> 일것이다.
사용방법은 대충 이렇다..

<action name="boardList" class="board.BoardListAction">
    <interceptor-ref name="chain"/>
    <interceptor-ref name="basicStack"/>
    <result>/userList.jsp</result>
</action>

<action name="write" class="board.BoardWriteAction">
    <result type="chain">boardList</result>
</action>

글을쓰고 리스트로 갈때 다시 액션을 호출하고, BoardWriteAction에서 사용했던 멤버변수들을 다시 userList.jsp에서 쓰고 싶을때 이렇게 쓸것이다.
공부할때 이걸 발견하고 얼마나 기뻤는지 모른다..참고로 struts2는 독학했다...;;; 구글이 없었다면 하지 못했을 것이다..
하여튼 chain을 쓰면 간단하게 해결이 되었다..

하지만...중대한 오류 발견! ㅠㅠ
액션이 실행된 다음에 새로고침을 누르니...다시 액션이 실행되는 엄청난(?) 오류가 발생했다..ㅠㅠ 신이시여...
글을쓰고 새로고침을 수십번 누르니 새 글이 쭉쭉~ 올라온다...
삭제를 하고 다시 새로고침을 누르니 에러가 난다...해당 키 값을 찾을 수 없다는...

해결방법은 두가지로 생각했다.
1. 액션을 실행하고 성공메세지를 뿌려줄 새로운 페이지를 만든다음 거기서 다음 액션을 호출하는것.
2. 뭔가 struts2에서도 리다이렉트로 보내줄 수 있지 않을까..

첫번째 방법은 비효율적이었다. 그거 몇줄 쓸려고 파일 하나를 만들자니...;;
그래서 두번째 방법으로 열심히 구글링을 한 결과 redirect-action 이라는게 나왔다.

대충 사용법은 이랬다.

<action name="boardList" class="board.BoardListAction">
    <result>/boardList.jsp</result>
</action>

<action name="write" class="board.BoardWriteAction">
    <result type="redirect-action">
        <param name="actionName">goodsList</param>
    </result>
</action>

그러나..톰캣을 실행하자 당당히(?) 에러가 났다..
거기서 대단한 메세지를 발견!

Caused by: There is no result type defined for type 'redirect-action' mapped with name 'success'.  Did you mean 'redirectAction'? - result - file:/C:/DevWeb/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/board/WEB-INF/classes/struts.xml:306:41
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildResults(XmlConfigurationProvider.java:613)
 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:364)
 ... 26 more


영어는 잘 모르지만 대충 해석해보니...'success라는 이름에 매핑되는 redirect-action이라는건 result type에 없다' 라는건가....?   다음 문장이...'그 의미가 redirectAction냐?' 라는거????
아..그럼 redirect-action 게 아니고 redirectAction란 말인듯??
톰캣에서 이런 메세지가 나올줄은 생각도 못했다..정말 고마워라 ㅠㅠ
그래서 고치고 해보니 잘된다ㅠㅠ 고마워 고양아 ㅠㅠ

참고로<param></param>에는 중요하다고 할만한게 있었다.

<param name="id">id</param>                    :  잘됨. 파라메터값은 "id"로 넘어간다
<param name="id">${id}</param>                : 에러난다. ${id}를 찾을 수 없다는..그런게 값은 넘어간다;;

두번째에서 에러를 안나게 하려면 actionName도 필요없이 아래처럼 하면 된다.

<![CDATA[/userList?id=${id}....]]>

.jsp는 쓰지 않는다. 자동으로 나오더라.

이걸로 액션실행 후 새로고침에 대한 오류는 해결했다.
redirect-action과 redirectAction는 분명 버전차이 겠...지?