From JCFWiKi
|
|
- 산출물 : JCF3.0™ - Struts2 Configuration 가이드
- 작성자: 고경철
- 작성일 : 2007/12/03
- 버전 : 0.9
- 개정이력 :
Copyright © 2007 Daewoo Information Systems Co., Ltd.
|
[그림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의 분류
- 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"/>
|
|
- 주의사항
- include하는 순서는 중요하다.
- 순차적으로 include하기 때문에 참조하는 include tag가 참조되는 include tag보다 아래에 있어야 한다.
|
[편집] package tag
|
|
- 정의: package는 action,result,result type, interception(stack)등을 하나로 묶는 논리적단위.
- 보통 하나의 action파일에 하나의 package가 맵핑이된다
|
<package name="default" extends="struts-default">
...
</package>
| 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
| attribute | 설명
|
| name | *액션 매핑에 사용되는 이름이며, url에서 확장자(.action)를 뺀 주소가 된다.
|
| class | *해당 요청을 처리할 Action 클래스를 지정한다.
|
| Method | *해당 요청 시 호출 할 메소드 명을 지정한다.
|
| result | result
|
[편집] Result Type Tag
[그림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
|
| <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>
|
[편집] 참조