본문 바로가기

Dev/Framework

[Struts 2] Token Interceptor 안 쓰고 페이지 분기

728x90
#. Class file source

public class SendEmailAction extends ActionSupport {
  ........

private String statusFlag = null;   // 처리 결과
private String altMessage = null;             // 사용자에게 보여줄 결과 메시지
@Override
public String execute() throws Exception {
try{
                            ........
}catch (Exception e) {
e.printStackTrace();
setStatusFlag(ERROR);
        setAltMessage(getText("mail.message.error"));  // xx.properties  파일에 있는 값 가져와서 넣기
return  ERROR;
}
setStatusFlag(SUCCESS);
        //setAltMessage("메일이 성공적으로 전송되었습니다. 빠른 시일 내에 연락드리겠습니다.");
        setAltMessage(getText("mail.message.success"));
return  SUCCESS;
}
  ......
public String getStatusFlag() {
return statusFlag;
}
public void setStatusFlag(String statusFlag) {
this.statusFlag = statusFlag;
}
public String getAltMessage() {
return altMessage;
}
public void setAltMessage(String altMessage) {
this.altMessage = altMessage;
}
}


#. struts.xml
....
<action name="send.email" class="com.prompt.eclix.mail.SendEmailAction" method="execute">
<result>/WEB-INF/jsp/controller.jsp</result>
</action>
.....

원칙적으로 한다면 페이지 분기를 Struts.xml 에서 <result> 태그의 "name" 속성으로 구분하여야 할 것이다. 그런데 그렇게 했을 경우 문제가 발생 했다.

페이지 이동은 설정해 준대로 이동하지만, URL 창에는 submit() 넘어 갈 때의 주소그대로 남아 있기 때문에 이중 submit() 이 일어나는 것이다.

1. struts 2가 제공해 준다는 이중 submit() 을 방지 Token interceptor 적용을 생각해 볼 수 있다. 이건 아직 시도해 보지 않았다.

2. <result> 태그의 name 속성으로 구분해서 페이지 이동과 동시에 URL까지 이동하게 해주는 Type 속성 "redirectAction" 값을 이용할 수 있다. 
그런데 이 경우, 위 코드처럼, 호출된 .jsp 페이지에서 request.getAttribute("altMessage") 로 Action 클래스에서 설정한 메세지를 바로 가져 올 수 없었다.
여기에서 또 두 가지 가능성으로 나뉜다.
    1) jsp 페이지에서 바로 메시지를 하드코딩해서 박아준다.
      - 한글이 깨져서 출력된다.
    2) <s:text> 라이브러리 태그로 Resource 파일에 있는 메시지를 불러온다.
      - Resource 파일이 유니코드로 저장되지 않았을 경우, 역시 한글이 깨진다. 
        (추후, 이클립스에 .properties 파일 에디터 관련 글 게시 예정)

따라서, 내가 선택한 궁여 지책.
3. 다음과 같이 중간 호출 .jsp 페이지를 만들어서 Action 클래스에서 설정한 메세지 뿌려주고 페이지를 분기한다.

#. /WEB-INF/jsp/controll.jsp

<script language="javascript">
var v_flag
                 '<%=request.getAttribute("statusFlag")==null?"":(String)request.getAttribute("statusFlag")%>';
var v_altMessage=
                 '<%=request.getAttribute("altMessage")==null?"":(String)request.getAttribute("altMessage")%>';

if(v_flag == 'error'){
alert(v_altMessage);
location.href="/open.email.action";
}else if( v_flag == 'success'){
alert(v_altMessage);
location.href="/main.action";
}else{
}
</script>

이렇게 해서 결과 메세지를 뿌려주고, URL 주소를 변경시키면서 페이지를 이동시킬 수 있었다.
다음엔, Token Interceptor 를 활용해 보도록 해야할텐데... 큭.