- 리절트 타입 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>

- 우선, STRUTS 에서 구성하는 방법 세가지

1. POJO(Plain Old Java Object)

2. implements Action

3. extends ActionSupport    (유효성 체크 가능 : validate() )

요건 알고 시작해야지!

- 2번째 implements Action 에서 도메인 오브젝트(모델영역 : ex - User.java)

모델영역의 도메인 오프젝트를 독립적으로 분리시킴으로써, 어떤 프레임워크 상에서 어떤 뷰를 사용해서 어떻게 구현하였는지

에 대한 영향을 받지 않도록 하기위함.


MVC 패턴지향의 예(교재 : 스트럿츠2 프로그래밍 입문)

1. Model

2. Action

3. Dao

- 모델(Model : Bean.java) 생성(Getter * Setter) 후 struts.xml 에  <action name="" class=""></action> 등록하고

  package model;

public class User {

    private String userId;
    private String userPw;
    private String userName;

    /* Getter & Setter */
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserPw() {
        return userPw;
    }
    public void setUserPw(String userPw) {
        this.userPw = userPw;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /* toString */
    @Override
    public String toString() {
        String result;
        result =  "User [userId=" + userId + ", userPw=" + userPw + ", userName="
                + userName + "]";
        return result;
    }// end - toString Method

}// end - UserClass


- <action></action> 밑에 <interceptor-ref name="params"/> 등록해서 입력 폼에서 요청 파리미터와 같은 이름을 가진

   액션 프로퍼티에 값을 저장, 액션 수행 execute() 후 실행할 result 페이지 등록

<struts.xml>

        <!-- 도메인 오브젝트 테스트 -->
        <action name="UserRegForm2">
            <result>/jsp/userRegForm2.jsp</result>
        </action>
        <action name="UserRegAction2" class="action.UserRegAction2">
            <interceptor-ref name="params"/>
            <result name="success">/jsp/userRegSuccess.jsp</result>
        </action>


- action 페이지에서 도메인 오프젝트(Model : Bean) 생성, get, set 생성 후

execute() 메서드에서 Dao 호출하여 DB 작업

<UserRegAction2.java>

  package action;

import model.User;

import com.opensymphony.xwork2.Action;

import dao.UserDao;

public class UserRegAction2 implements Action {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user){
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        /* Dao Instance Create */
        UserDao userDao = new UserDao();
        userDao.create(user);
        return SUCCESS;
    }// end - execute Method

}// end - UserRegAction2 class


- action 에서 Model 객체 Dao 넘김 -> Dao 에서 데이타베이트 처리(현 예제는 간단히 Model 객체 출력으로 대처)

<UserDao>

package dao;

import model.User;

public class UserDao {

    public void create(User user) {
        System.out.println("사용자를 추가하였습니다.");
        System.out.println("추가된 사용자의 정보");
        System.out.println(user);
    }// end - create Method

}// end - UserDao class


이런 방식인데. 현 주제의 implements Action 도메인 오브젝트 를 사용하면 입력 폼이 있는 JSP 페이지에서

<form action="action Name"> 으로 넘겨줄때 Parameter 이 액션객체로 넘어갈때. 액션에 생성된 Model 인스턴스명 + 변수명 을

같이 지정해 주어야 한다.

(※ 책에서 그냥 도메인오브젝트명이래서 긴가민가 하다 액션에서 Model 인스턴스명 변경하고 테스트하니 오류 발생)

<input type="text" name="액션에서생성한Model 인스턴스명.변수명"> -> <input type="text" name="user.userId">  이렇게!!!

또. action execute() SUCCESS 이후 struts.xml 에 등록한 <result name="success"></result> 에 등록한 페이지에서 보여줄때도

같은방식으로 보여줘야 한다. 예를 들면 아이디 : ${user.userId} 이렇게!!!!


와~ 신기하다!! 근데 조금만 쓰면 입력 폼이 존재하는 JSP 와 결과를 보여줄 JSP 모든 뷰에서 action 에서 생성한 인스턴스명을 꼭

붙여주여야 해서 어간 불편한게 아닐수 아닐수 아닐수 없을수 없다.

그래서. 사용하는것이 "ModelDriven" 와 "Preparable" 두개이다. 이건 다음장에서 설명









- 요소

필터 :URL의 확장자가 action 이면 FilterDispatcher 에 의해서 액션을 실행하기 위한 환경을 구축하도록 한다  (web.xml)

/* web.xml(struts2-core-2.3.4.1.jar) */

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>struts2_ActionSupport</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
  <!-- Struts2 FilterDispatcher -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
            <!-- Struts2 인코딩 설정(struts-default 참조) -->
            <init-param>
                <param-name>struts.i18n.encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <!-- Struts2 인코딩 설정(struts-default 참조) -->
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
</web-app>



액션 : 리절트가 필요로 하는 메시지를 제공한다 (action.java)

/* action.java */

package action;

import com.opensymphony.xwork2.ActionSupport;

/* Struts2 ActionSupport 상속 */
public class UserRegAction extends ActionSupport{

    private String userId;
    private String userPw;
    private String userName;

    /* Getter & Setter */
    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserPw() {
        return userPw;
    }

    public void setUserPw(String userPw) {
        this.userPw = userPw;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String execute()throws Exception{
        return SUCCESS;
    }//end - execute Method


    @Override
    public void validate() {
        if(userId == null || userId.equals("")) {
            addFieldError("userId", "회원아이디를 입력해 주십시오");
        }
        if(userPw == null || userPw.equals("")) {
            addFieldError("userPw", "비밀번호를 입력해 주십시오");
        }
        if(userName == null || userName.equals("")) {
            addFieldError("userName", "이름을 입력해 주십시오");
        }
    }// end - validate Method()

}// end - class



매핑액션 : 실행 후 결과를 처리할 리절트와의 매피을 설정  (struts.xml)

/* 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="actionSupport" namespace="" extends="struts-default">
        <action name="UserRegForm">
            <result>/userRegForm.jsp</result>
        </action>
        <action name="UserRegAction" class="action.UserRegAction">
            <interceptor-ref name="params"/>
            <interceptor-ref name="validation"/>
            <interceptor-ref name="workflow"/>
            <result name="input">/userRegForm.jsp</result>
            <result name="success">/userRegSuccess.jsp</result>
        </action>
    </package>
</struts>



리절트 : 메시지를 출력하기 위한 화면 처리를 담당  (view.jsp)

/* view.jsp */

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원가입 결과</title>
</head>
<body>
    <center>
    <b><font color="red">회원 가입이 완료되었습니다.</font></b><p>
    아 이 디 : ${userId}<p>
    비밀번호 : ${userPw}<p>
    이 름 : ${userName}<p>
    </center>
</body>
</html>

+ Recent posts