ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • struts2 :: 사용자 인터셉터 예제
    IT/Java & JSP & FW 2012. 4. 30. 17:36

    사용자 인터셉터 만들기 기본형태

    public abstract class AbstractInterceptor implements Interceptor {
    	public void init(){}
    	public void destroy(){}
    	public abstract String intercept(ActionInvocation invocation) throws Exception;
    }
    


    간단한 사용자 인터셉터 만들어 보기.

    0. 예제 개요

    - add.jsp에서 두수를 입력하고 submit한다.

    - SumAction이 이를 받아 두수의 합을 리턴하면 result.jsp에서 두 수 및 그 합을 출력한다.


    SumAction이 실행되기 전에 Action의 수행시간을 계산하기 위한 mytimer, prepare(Model빈을 초기화, 인스턴스생성), odelDriven(초기화된 모델빈을 ValueStack의 상단에 로딩), params (ValueStack의 상단에 있는 빈에 사용자의 요청 파라미터를 세팅)와 같은 인터셉터를 붙였다.


    1. 먼저 액션단을 작성한다.

    package interceptor1.action;
    
    import interceptor1.*;
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ModelDriven;
    import com.opensymphony.xwork2.Preparable;
    
    
    
    public class SumAction implements Action, Preparable, ModelDriven{
    	
    	NumberForAdd num;
    	private int sum=0;
    	
    	@Override
    	public String execute() throws Exception {
    		// TODO Auto-generated method stub
    		SumDAO dao=new SumDAO();
    		sum=dao.add(num);
    		return SUCCESS;
    	}
    	
    	@Override
    	public void prepare() throws Exception {
    		// TODO Auto-generated method stub
    		num=new NumberForAdd();
    		
    	}
    	
    	@Override
    	public Object getModel() {
    		// TODO Auto-generated method stub
    		return num;
    	}
    	
    	public int getSum(){
    		return sum;
    	}
    }
    


    2. 간단한 빈객체 생성.

    package interceptor1.action;
    
    public class NumberForAdd {
    	
    	private int num1;
    	private int num2;
    	public int getNum1() {
    		return num1;
    	}
    	public void setNum1(int num1) {
    		this.num1 = num1;
    	}
    	public int getNum2() {
    		return num2;
    	}
    	public void setNum2(int num2) {
    		this.num2 = num2;
    	}
    	
    }
    


    3. 간단한 dao 클래스 생성 (여기선 간단한 합계산을 한다.)

    package interceptor1.action;
    
    import interceptor1.*;
    
    public class SumDAO {
    
    	public int add(NumberForAdd num){
    		return num.getNum1()+num.getNum2();
    	}
    }
    


    4. 본격적으로 사용자 인터셉터를 만들어 준다.

    주의 할 것은 상속을 AbstractInterceptor를 상속받는 다는 점이다.

    package interceptor;
    
    import java.awt.event.InvocationEvent;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
    public class Timer extends AbstractInterceptor{
    	
    	private static Log log=LogFactory.getLog(Timer.class);
    	
    	@Override
    	public String intercept(ActionInvocation invocation) throws Exception {
    		// TODO Auto-generated method stub
    		
    		long start=System.currentTimeMillis();
    		
    		String result=invocation.invoke();
    		
    		long execTime=System.currentTimeMillis()-start;
    		
    		log.info("Action 수행시간 >>>>>"+execTime+"ms");
    		
    		return result;
    	}
    
    }
    


    5. 마지막으로 struts.xml 을 수정해 준다.

    주의 할 것은 액션 안에 사용자 인터셉터를 지정해 주었다는 것이다.

    <interceptors> <interceptor name="mytimer" class="interceptor.Timer"> </interceptor></interceptors>


    <interceptor-ref name="mytimer">

    <package name="interceptor" extends="struts-default">
    	<interceptors>
    		<interceptor name="mytimer" class="interceptor.Timer" />
    	</interceptors>
    	<action name="add" class="interceptor1.action.SumAction">
    		<interceptor-ref name="mytimer" />
    		<interceptor-ref name="prepare" />
    		<interceptor-ref name="modelDriven" />
    		<interceptor-ref name="params" />
    		<result>/interceptor/result.jsp</result>
    	</action>
    </package>
    


    6. 결과 확인

    1. view 단

    2. 콘솔 (여기에서 사용자 인터넵터가 제대로 되었는지 확인 할 수 있다.)

Designed by Tistory.