2013년 8월 12일 월요일

[오라클자바community, 스트럿츠스프링강좌]struts2 result 타입 – chain

struts2 result 타입 – chain

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

 
result type chain은 현재  Action과 동일한 ActionInvocation에서 동일한 ActionContext 정보로 다음 Action을 실행한다. 먼저 실행한 Action ValueStack에서 먼저 들어가고 나중에 실행한 Action은 다음으로 들어간다.
 
만약 chain으로 연결되는 Action에서 나중에 실행하는 Action이 먼저 실행한 Action Property 값을 알려면 chain으로 연결되는 Action chain 인터셉터를 걸어주면 된다.
 
Result type chain인 경우 다음과 같은 파라미터의 사용이 가능하다.
 
actionName(default) : 체인으로 연결할 Action name, default Property
namespace : Action namespace, 값을 입력하지 않으면 현재의 namespace로 인식
method : Action Method
를 지정, 값을 지정하지 않으면 execute
skipActions : chain으로 연결할 Action name을 콤바 리스트로 분리한다.
 
result typechain을 하는 경우의 대표적 예는 회원등록 완료 후 바로 로그인이 가능하도록 구현하는 경우일 것이다. 이러한 경우 회원등록 action chain result에 로그인 action을 지정하면 회원등록 후 로그인을 진행하게 된다. 이러한 경우 로그인 Action은 회원등록과 같은 ActionContext를 가지게 되므로 필요한 메모리 정보(세션맵,요청맵 등)는 공유하게 되는 것이다.
 
위의 경우 최초 실행되는 로그인 Action ValueStack의 하단에 들어가고 로그인 Action ValueStack의 상단에 위치하는데 ValueStack에 모든 Action이 있으므로 JSP View쪽에서 Property에 접근이 가능하고 이 경우 최상단의 Action부터 검색을 한다. (ValueStack의 구현원리에 대해서는 ValueStack 강좌를 참고 하세요.)
 
예제를 만들어 보자.
 
회원정보를 입력하고 submit을 하게되면 회원정보 저장 후 LoginAction을 불러 로그인이 된 이후의 JSP로 보내는 기능을 만들어 보자. 화원정보를 입력하는 Action MemberAction이며 로그인 체크를 하는 Action은 로그인 LoginAction 이다.
 
먼저 실행되는 MemberAction Property값을 나중에 실행되는 LoginAction에서 참조하고자 하는 경우 struts.xml의 로그인 action 요소에서 <interceptor-ref name=”chain”/> 이라고 해서 chain 인터셉터를 실행해야 한다.
 
[개요]
-       사용자 정보를 입력 후 SUBMIT
-       MemberAction에서 사용자 정보 저장 후( MebberDAO save Method) LoginAction을 호출
-       LoginAction에서는 먼저 실행된 MemberAction id, pwd 값을 참조하여 로그인을 시도하고 id‘test’안 경우 로그인 성공으로 SUCCESS를 리턴하여 login_ok.jsp를 리턴한다.
 
 
1.     LoginAction.java
 
package chain.action;
 
import login.dao.LoginDAO;
import com.opensymphony.xwork2.Action;
 
public class LoginAction implements Action {
           String id;
           String pwd;
          
           public String execute() throws Exception {
                     LoginDAO dao = new LoginDAO();                   
                    
                     if (dao.loginChk(id, pwd)) {
                                return SUCCESS;
                     }
                     else {
                                return LOGIN;
                     }
           }
 
           public String getId() {
                     return id;
           }
 
           public void setId(String id) {
                     this.id = id;
           }
 
           public String getPwd() {
                     return pwd;
           }
 
           public void setPwd(String pwd) {
                     this.pwd = pwd;
           }
          
}
 
 
2.     MemberAction.java
 
package chain.action;
 
import chain.dao.MemberDAO;
import chain.model.UserInfo;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
 
public class MemberAction implements Action, Preparable, ModelDriven {
    //도메인 오브젝트
           UserInfo userInfo;
          
           public String execute() throws Exception {
                     MemberDAO dao = new MemberDAO();            
                    
                     if (dao.save(userInfo)) {
                                return SUCCESS;                     
                     }
                     else {
                                return LOGIN;
                     }
           }
          
           //Preparable인터페이스의 prepare 구현
           public void prepare() throws Exception {
                     userInfo = new UserInfo();
           }
          
           //ModelDriven 인터페이스의 getModel 구현
           public Object getModel() {
                     return userInfo;
           }
}
 
3.     MemberDAO.java
 
package chain.dao;
 
import chain.model.UserInfo;
 
public class MemberDAO {
           public boolean save(UserInfo userInfo) {
                     return true;
           }
}
 
4.     UserInfo.java
 
package chain.model;
 
public class UserInfo {
           private String id;
           private String pwd;
           private String name;
           private String age;
           public String getId() {
                     return id;
           }
           public void setId(String id) {
                     this.id = id;
           }
           public String getPwd() {
                     return pwd;
           }
           public void setPwd(String pwd) {
                     this.pwd = pwd;
           }
           public String getName() {
                     return name;
           }
           public void setName(String name) {
                     this.name = name;
           }
           public String getAge() {
                     return age;
           }
           public void setAge(String age) {
                     this.age = age;
           }
          
          
}
 
5.     struts.xml
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
     
<struts>
    <package name="struts2" extends="struts-default">
      <action name="member" class="chain.action.MemberAction">
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="params"/>
        <result name="success" type="chain">
          <param name="actionName">login</param>
        </result>
        <result name="login">/login/login.jsp</result>
      </action>
      <action name="login" class="chain.action.LoginAction">
        <interceptor-ref name="chain"/>
        <interceptor-ref name="params"/>
        <result name="success">/login/login_ok.jsp</result>
        <result name="login">/login/login.jsp</result>
      </action>  
    </package>
</struts>
 
 
6.     /chain/member_input.jsp
 
<%@ page pageEncoding="euc-kr" %>
<html>
<body>
<form action="member.action" method="post">
    id : <input type="text" name="id"><br>
    pwd  : <input type="text" name="pwd"><br>
    name : <input type="text" name="name"><br>
    age  : <input type="text" name="age"><
    <input type="submit">
</form>
</body>
</html>
 

7.     [실행] http://localhost:8080/result/chain/member_input.jsp

댓글 없음:

댓글 쓰기