Struts2 Configuration

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물 : JCF3.0™ - Struts2 Configuration 가이드
  • 작성자: 고경철
  • 작성일 : 2007/12/03
  • 버전 : 0.9
  • 개정이력 :

Copyright © 2007 Daewoo Information Systems Co., Ltd.

[그림1]struts2에서의 view와 action 흐름도
[그림1]struts2에서의 view와 action 흐름도

목차

[편집] 서론

  • struts2를 configuration 하기 위해서는 struts.xml의 구조와 속성을 이해하는것이 가장 중요하다.
  • struts.xml은 struts 프레임워크의 대부분의 configuration을 기술하고 있다.
  • 개발자는 단지 struts.xml 파일만 수정하여 action의 namespace,result경로, 인터셉터등을 management할 수 있기 때문에 struts.xml의 태그속성을 이해하는 것이 필수적이다.
  • [그림1]은 struts2 프레임워크의 논리적인 플로우이다. 프리젠테이션 티어에서 struts.xml은 뷰와 action을 연결하는 다리역할을 하고 있음을 보여주고 있다.

[편집] Overview:struts.xml 전체 스트럭처

[그림2]appfuse에 적용된 struts.xml의 outline과 tag의 분류
[그림2]appfuse에 적용된 struts.xml의 outline과 tag의 분류
  • struts.xml의 구조
    • struts.xml는 [그림2]와 같이 참조 tag(constant,include), package 선언, action과 interception tag로 구성되어있다.하나의 action파일, 즉 interceptor stack이나 URL namespace 단위의 configuration들을 하나의 package로 묶는다. 이 안에 여러개의 action태그와 인터셉터들이 선언되어 있다.
    • [그림2]에 보여지는 구분대로 아랫 글에서는 각 tag에 대한 설명을 기술하였다.

[편집] strtus.xml detail

[편집] include tag

  • 역할
    • struts.xml에 include tag를 사용하면 각 기능 단위로 configuration을 모듈화 할 수 있다.
    • 만약 그룹단위로 모듈을 개발한다면 struts.xml 파일을 그룹별로 나눌 필요가 있다. 이럴때는 다음과 같이 include tag 를 사용한다.
    • 뿐만 아니라, 프로젝트의 모든 configuration 파일을 관리하기 쉽게 할 용도로 폴더에 관리하고 싶다면 고정적인 struts.xml의 경로로는 불가능하고 include tag를 이용해서 manage한다.
	<include file="config/struts-user.xml"/>
	<include file="config/struts-article.xml"/>

그림:forbidden.gif

  • 주의사항
    • include하는 순서는 중요하다.
    • 순차적으로 include하기 때문에 참조하는 include tag가 참조되는 include tag보다 아래에 있어야 한다.

[편집] package tag

그림:check.gif

  • 정의: package는 action,result,result type, interception(stack)등을 하나로 묶는 논리적단위.
  • 보통 하나의 action파일에 하나의 package가 맵핑이된다
  • example
 <package name="default" extends="struts-default">
 ...
 </package>
  • attribute
attribute설명
name
  • package의 ID
  • 고유한 이름이어야 한다.
  • view 파일에서는 폴더명에 해당한다.(아래 코드 참조)
<a href="user/editUser.action?user.id=${user.id}">EDIT</a>
<a href="user/listUser.action">LIST</a>
<a href="user/deleteUser.action?user.id=${user.id}">DELETE</a> 
//user는 package명에 맵핑이된다.
extends
  • package가 상속하는 파일을 명시, 대게 struts-default.xml을 사용한다.
namespace
  • application의 web 컨텍스트 아래의 URL prefix로 사용된다.
  • 생략시 컨텍스트 루트가 디폴트이며, /user로 지정하면, 해당 패키지 내의 모든 상대 URL 주소에 대해 prefix로 적용된다.
abstract
  • abstract 클래스와 비슷한 개념, no action에 사용한다.

[편집] action tag

  • 정의
    • user가 보낸 HTTP request가 framework와 멥핑되는 역할을 수행한다.
  • Example
 
/showcase/user/editUser.jsp

//단순한 JSP의 호출일 경우 class와 method를 생략한다.


/user/listUser.action



/showcase/user/viewUser.jsp
  • attributes
attribute설명
name *액션 매핑에 사용되는 이름이며, url에서 확장자(.action)를 뺀 주소가 된다.
class *해당 요청을 처리할 Action 클래스를 지정한다.
Method *해당 요청 시 호출 할 메소드 명을 지정한다.
result result

[편집] Result Type Tag

[그림3]appfuse의 struts.xml에서 interceptor outline과 참조관계
[그림3]appfuse의 struts.xml에서 interceptor outline과 참조관계
  • action파일에서 return으로 던져진 값은 struts.xml의 <action>의 <result>태크에서 처리하게 된다.
    • result에는 default,dynamic,global result가 있다.
  • result의 예
            <result name="input">/WEB-INF/pages/uploadForm.jsp</result>
            <result name="success">/WEB-INF/pages/uploadDisplay.jsp</result>
            <result name="cancel" type="redirect">mainMenu.html</result>
<action name="Hello">
  <result>/hello/Result.jsp</result>
  <result name="error">/hello/Error.jsp</result>
  <result name="input">/hello/Input.jsp</result>
</action>
  • Class와 method 생략 시 항상 “success” result를 수행한다.

[편집] interception 속성

  • 정의
    • struts2에서는 interceptor가 동작한다. 예를 들면, 예외처리, 파일 업로딩, life cycle callback, validation 등의 기능이 interceptor에 구현되어있다.
    • 인터셉터는 특정 Action이 수행되는 것은 가로채서 Action이 수행되기 이전이나 이후에 특정 행동들을 추가할 수 있다.
    • 인터셉터를 통해서 개발자들은 하나나 그 이상의 Action에 적용되는 공통적인 기능들을 재사용 가능한 형태로 캡슐화 할 수 있다.
    • [그림3]과 같이
  • attributes
tag명 설명
<interceptors>
  • package를 시작할 때는 그 package에 소속된 action들이 사용할 interceptor를 먼저 정의하는데 이를 <interceptors>안에 기술한다.
  • <interceptors>안에는 Configuring Interceptor는 <interceptor>tag로, Stacking Interceptor는 <interceptor-stack>를 사용한다.
<interceptor>
  • 인터셉터 스택에서 참조할 인터셉터를 등록하는 태그이다
  • attribute
    • name: 인터셉터 ID
    • class: 인터셉터의 소스파일의 경로, 만약 struts-default.xml에 등록되어있는 interceptor라면 class를 굳이 쓸 필요가 없다.
<interceptor-stack>
  • 여러개의 인터셉터는 하나의 스택으로 만드는 태그이다.
  • <interceptor-ref>를 사용하여 등록된 인터셉터를 스택화 한다.
  • attribute
    • name: 인터셉터 스택 ID
<interceptor-ref>
  • <interceptor-stack>태그 안에서는 <interceptor-ref>를 사용하여 등록된 인터셉터를 스텍화 한다.
  • <action>태그에서 실제로 인터셉터가 사용될때는 <interceptor-ref>에 name에 위에서 등록한 인터셉터나 인터셉터-스택 이름을 등록한다.
  • 예)
//인터셉터 스택을 등록할때.
<interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servlet-config"/>
.......
//액션에서 인터셉터를 사용할때
 <action name="uploadFile" class="org.appfuse.webapp.action.FileUploadAction">
            <interceptor-ref name="fileUploadStack"/>
            <result name="input">/WEB-INF/pages/uploadForm.jsp</result>
            <result name="success">/WEB-INF/pages/uploadDisplay.jsp</result>
            <result name="cancel" type="redirect">mainMenu.html</result>
        </action>

[편집] 참조