- 리절트 타입 Dispatcher 와 Redirect 의 차이

   예) 기본 리절트 타입 설정(type="dispatcher") 기본타입이므로 생략 가능

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

                 <interceptor-ref name="params"/>

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

         </action>


   예) Redirect 리절트 타입 설정(type="redirect)

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

                 <interceptor-ref name="params"/>

     <result name="success" type="redirect">/jsp/loginSuccess.jsp</result>

         </action>



 - 두 리절트 타입의 차이점

    ①  redirect 리절트 타입

         - JSP 에서 response.sendRedirect(" "); 메서드를 호출한 것과 같은 효과를 낸다.

         - 같은 효과가 모냐고 물으신다면...

            redirect 리절트 타입은 리다이렉트할 URL 을 응답으로 웹 브라우저에 보낸다. 

            URL 로 새롭게 서버와 연결이 되므로 request 가 새롭게 생성되는 것을 의마한다.

            웹 브로우저에 나타나는 URL도 바뀐다.(마지막 redirect 로 설정한 URL 이 표시됨.)

     ② dispatcher 리절트 타입(기본타입 - 생략가능)

         - dispatcher 타입은 request 가 유지된다. 서버와 새롭게 연결이 되는것이 아니므로 처음 접속했던 request 정보를 가진다.

           그 뜻은, redirect 타입처럼 새로 request 를 생성하는 것이 아니라 요청처리를 다른 웹 리소스로 위임하는 것이다.

           따라서, 웹 브라우저 상의 요청 URL 이 바뀌지 않는다.

   


※ 이건 구지 테스트 할 필요가 없을 것 같다. 액션 처리 후 리절트 페이지에서 URL 이 바뀌냐 안바뀌냐의 차이일뿐이니깐

     dispatcher 이면 페이지에서 지정한 action 페이지 URL 이 보일것이고,(위의 예를 들자면 action.LoginAction)

     redirect 이면 actino 처리 후 result 에 지정한 경로가 보일 것이다.(/jsp/loginSuccess.jsp)

- 스트럿츠2 프레임워크의 아키텍쳐를 묘사한것 ( 참고서적 : 스트럿츠2 프로그래밍 입문 )


- 간단한 설명

  스트럿츠 2는 모든 요청을 필터인 FilterDispatcher 가 처리한다. ( 스트럿츠2 web.xml 설정을 보면 알수있다. )

  FilterDispatcher 은 요청이 들어오면 ActionProxy 인스턴스가 생성되고 액션 실행을 위임한다.

  ActionProxy 는 인터셉터와 리절트 등 액션 실행 구성을 읽어서 Action Invocation을 초기화 하고 실행한다.

  Action Invocation 은 실질적인 '인터셉터' 와 '액션 리절트' 의 실행을 담당한다.




- 각 항목(아키텍처) 별 기능 및 역할

  1. 스트럿츠 2 필터 디스패쳐(Filter Dispatcher) 의 역할

     - 웹 어플리케이션 단위로 설정되는 컨텍스트마다 애플리케이션 에 대한 모든 요청이 스츠럿츠2 서블릿 필터로 전달되며,

        필터에서 어떠한 처리가 될 것인지가 결정된다. (즉, 필터 디스패쳐는 요청에 대한 진입점)

        ※ 스트럿츠 2 프레임 워크는 어떠한 처리를 할 것인지가 웹 어플리케이션 Web.xml 에 의해 결정된다.

  

  2. 설정 관리자 / 액션 매퍼

     - 사용자 요청이 들어올 때, 어떠한 액션이 URL로 매핑될 것인지에 대한 결정을 하기 위해 설정 관리자(ConfigurationManager) 

        와 액션 매퍼(ActionMapper)를 사용한다.

        설정관리자(ConfigurationManager)는 struts.xml 파일을 사용하여 초기화 된다.

        필터 디스패쳐는 액션 요청 처리를 위해 액션 매펴의 도움을 받아서 보내진 요청이 스트럿츠2 액션을 위한 요청인지의 여부를

        판단한다. 액션 매퍼를 통해 액션 요청으로 판단되면 액션 프록시(ActionProxy)에게 제어를 위임한다. 

        만약, 요청된 이름과 일치되는 액션이 발견되지 않으면 오류를 반환한다.


  3. 액션 프록시 / 액션 인보케이션 / 액션 컨텍스트 

     - 액션 프록시는 액션 실행을 위해 제공되는 대행자이다.액션 프록시 팩토리 인스턴스를 사용하여 필터디스패쳐에 의해 생성되고

        struts.xml 파일을 사용하여 초기화되는 설정 관리자(ConfigurationManager) 를 참조한다.

        액션 프록시는 액션 인보케이션을 생성하고, 액션 인보케이션은 액션 실행에 앞서 인터셉터를 찾아서 호출한다.

        더 이상 호출할 인터셉터가 없다면 액션 인스턴스가 실행된다. 이에 대한 동작은 다시 설명하겠다.

        글로 길게 써봐야 나중에 보지도 않을 뿐더러, 손만 아프니 내가 보기 편하게 쉽게 설명할 것이야 !!!


        ① web.xml 에  스트럿츠 필터 클래스(org.apache.struts2.dispatcher.FilterDispatcher)등록 & 필터 맵핑 등록

        ② 등록 후 어플레케이션 내의 모든 요청은 FilterDispatcher 가 처리한다.

        ③ FilterDispatcher 는 요청이 들어오면 ActionProxy 인스턴스 생성하고 액션 실행을 위임한다.

        ④ ActionProxy 는 다시 ActionInvocation 생성하고, inoke() 메서드 호출한다.

        ⑤ ActionInvocatino 은 인터셉터 스택 중 실행할 다음 인터셉터 확인 후 존재시 인터셉터의 intercept() 메서드 호출(전처리)

        ⑥ 인터셉터의 intercept() 메서드는 파라미터로 넘어온 액션 인보케이션의 invoke() 메서드를 다시 호출하여 체인을 형성

        ⑦ 이와 같은 방법으로 순차적으로 마지막 인터셉터까지 반복한다. 끝나면 액션을 실행 후 Result 를 실행

        ⑧ Result 실행 후 인터셉터들이 역순으로 반환된다.(후처리)


        

  

- 보통 액션을 실행 한 후에는 리절트 페이지로 포워딩하도록 구성한다.

   예) struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

    

<struts>

    <package name="ch04" namespace="" extends="struts-default">

        <action name="HelloWorld02" class="action.HelloWorld02">

            <interceptor-ref name="params"/>

            <result name="success">/helloWorld.jsp</result>

        </action>

    </package>

</struts>



- 그러나 경우에 따라서는 액션을 수행한 후에 다른 액션에서 이전 요청의 정보와 액션의 상태 값을 유지하여 계속해서 사용해야 

   할 경우가 생긴다. 이러한 경우에는 액션체인을 사용하여 다른 액션에게 상태 값을 유지하면서 호출 할수 있다.

   <?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

    

<struts>

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

        <action name="UserRegForm">

            <result>/jsp/userRegForm.jsp</result>

        </action>

    

        <action name="UserRegLoginAction" class="action.UserRegAction">

            <interceptor-ref name="params"/>

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

                <param name="actionName">LoginAction</param>

                <param name="namespace">package_namespace</param>package 태그 속성 namaspace 했을시에만 참

            </result>

        </action>

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

            <interceptor-ref name="chain"/>

            <interceptor-ref name="params"/>

            <result name="success">/jsp/userRegSuccess.jsp</result>

        </action>

    </package>

</struts>

+ Recent posts