본문 바로가기
Programming

스트럿츠2

by Mizix 2009. 9. 29.
반응형
1. 스트럿츠2 구성요소
  • 액션
  • 리절트
  • 액션 정의
  • 액션과 리절트의 관계
  • 밸류 스택
  • OGNL 기본개념
  • 스트럿츠2 태그의 기본적인 사용법
  • 스트럿츠2의 컨트롤러인 필터 디스 패처

2. 웹 애플리케이션을 사용한다는 것을 기본적인 개념으로 이해하면 다음과 같을 것이다.
  • 사용자는 동적인 자원을 요청하고 응답을 받는다.
  • 요청에 대한 내용을 재구성한다.
  • 웹 서버가 처리할 수 없는 요청은 외부 모듈을 사용하여 처리한다.
  • 사용자가 동적인 자원을 얻을 수 있도록 웹 애플리케이션은 비즈니스 로직을 수행한다.
  • 사용자에게 응답할 동적인 문서를 생성한다.
사용자의 요청을 처리할 때 핵심 열할을 하는 액션, 리절트를 보조하기 위해 스트럿츠2가 제공하는 것이 있다. 바로 인터셉터(Interceptor)이다.
3. 인터셉터 개요
인터셉터는 액션 실행의 전과 후에서 다른 작업을 추가로 실행할 수 있도록 분리된 요청 저리 단계를 제공한다.

인터셉터로 구현된 스트럿츠2의 대표적인 핵심기능
  • 이중 서브밋 방지
  • 타입 변환
  • 입력 파라미터의 값을 액션 클래스의 프로퍼티에 설정
  • 유효성 검사
  • 파일 업로드
  • 출력 페이지 준비
스트럿츠2가 제공하는 대표적인 인터셉터
  • 체인 인터셉터
  • 체크박스 인터셉터
  • 쿠키 인터셉터
  • 세션 생성 인터셉터
  • 디버깅 인터셉터
  • 익스큐드 앤 웨이트 인터셉터
  • 익셉션 인터셉터
  • 파일 업로드 인터셉터
  • 인터내셔널 인터셉터
  • 로거 인터셉터
  • 파라미터 인터셉터
  • 프리페어 인터셉터
  • 스코프 인터셉터
  • 서블릿 컨피그 인터셉터
  • 타이머 인터셉터
  • 벨리데이션 인터셉터
  • 워크플로으 인터셉터 등...
※ 인터셉터는 어떻게 사용되나?

<package name="default" extends="struts-default" namespace="">
        <action name="printString"
            class="example.chapter2.PrintStringAction">
            <result>/chapter2/printString.jsp</result>
        </action>
</package>

기본적으로 struts.xml에 위와 같이 선언 할 것이다. 위 요소에서 패키지를 정의할 때 extends 속성을 사용하여 상속 받을 부모 패키지를 설정하고 있다. 위의 내용은 현재 패키지의 이름이 default 이고, 부모패키지 struts-default를 상속받는 다는 의미이므로 default에서는 부모패키지에서 정의한 내용을 그대로 사용할 수 있게 된다.

3.1 인터셉터 스택이란?
스트럿츠2는 여러 가지 유용한 인터셉터를 제공한다. 이러한 인터셉터는 모든 액션에 사용되는 것이 아니다. 어떤 인터셉터를 사용할 것인지는 개발자의 선택에 달렸다. 필요한 인터셉터를 모아서 원하는 액션의 전과 후에 처리할 수 있는 기능을 제공하는데, 이렇게 모인 인터셉터를 인터셉터 스택이라 한다.

※ 액션 정의시 인터셉터 설정
<action name="printString"
            class="example.chapter2.PrintStringAction">
<intercepter-ref name="timer" />
<intercepter-ref name="logger" />
            <result>/chapter2/printString.jsp</result>
</action>

액션 요소 사이에 <intercepter-ref /> 요소를 이용하여 액션에 인터셉터를 설정할수 있다.
위와 같이 설정하면, 위 액션을 호출하여 printString 실행되기전에 설정된 timer 인터셉터가 먼저 실행되고, 그담에 설정된 logger 인터셉터가 실행된다음 printString 액션 클래스의 execute() 메소드가 실행이된다.
실행이 완료되면 다시 역순으로 logger 인터셉터의 나머지 부분에 실행할 내용이 있다면 이를 실행한 후 반환되고, 다음 timer 인터셉터의 실행될 나머지 부분이 인타면 이를 실행한 후 반환된다.

3.2 리절트의 종류
  • 서블릿 디스패치(servlet dispatch: JSP 렌더링을 위한 처리)
  • 서블릿 리다이렉트
  • 벨러시티
  • 프리마커
  • JasperReports(PDF, CVS, XML 등을 생성)
  • XSLT 렌더링
  • ActionChainResult(현재 액션이 실행된 후 이어서 다른 액션이 실행될 수 있음)
※ 리절트 정의
<result type="타입정의">/chapter2/printString.jsp</result>
타입에 따라서 리절트가 정의된다.
strim, tiles, chart, ...

3.3 환경설정의 개요
스트럿츠2 개발자의 입장에서 보면 프레임워크가 요구하는 단하나의 호나경설정 파일은 'web.xml'이다. 그러나 여기서 스트럿츠2가 자신과 애플리케이션 양쪽을 모두 컨트롤할 수 있게 해야한다. 기본적으로 스트럿츠는 자신을 설정하는 내부 환경설정 파일을 로드 한다. 그 다음 애플리케이션에 관련된 부분을 설정한다.
다음 표는 프레임 워크와 애플리케이션을 설정할 때 필요한 파일 목록을 나열하고 있다.
 파일 필수여부
위치
목적
 wel.xml
 /WEB-INF/
모든 필수 프레임워크 컴포넌트를 포함하기 위한 웹 배치 디스크립터
 struts.xml 아니오
 /WEB-INF/classes/  리절트/리절트 타입, 액션 매핑, 인셉터 등을 포함한 애플리케이션 설정 파일
 struts.properties 아니오  /WEB-INF/classes/  프레임워크 속성 설정 파일
 struts-default.xml 아니오 /WEB-INF/lib/struts-core.jar  스트럿츠2에 의해 제공되는 기본 환경설정
 struts-default.vm
아니오 /WEB-INF/classes/  velocity.property에 의해 참조되는 기본 매크로
  struts-plugin.xml 아니오  플러그인 jap 파일의 루트 경로
 struts.xml
 velocity.properties 아니오  /WEB-INF/classes/  


※ struts.xml
스트럿츠2 웹 애플리케이션 환경설정 파일은 기본적으로 struts.xml 이다.
  • 이 파일은 필요하다면 다른 설정파일을 포함할 수 있다.
  • 전체 모듈이 플러그인 자신을 포함하고, 자동으로 환경설정되기 위해서 애플리케이션 내에 플러그인 되는 jar 파일에 struts-plugin.xml 파일을 포함하고 있다. 프리마커, 벨로시티의 경우에는 템플릿이 전체 모듈을 단일 jap 파일로 플러그인 될 수 있도록 클래스 경로로부터 로드한다.


※ 네임스페이스
namespace 속성은 액션 설정을 고유의 접두어를 가지고 논리적인 모듈로 분리 하기 위해 사용된다. 네임스페이스는 액션 사이에서 충돌을 피할 수 있게 한다.
서로 다른 패키지에 같은 이름을 가진 액션이 정의되어 있더라도 패키지에 정의한 네임스페이스가 다르면 네임스페이스를 접두어로 서로 구분할 수 있다.

※ 액션 메소드
스트럿츠2의 액션 클래스에서 기본 액션 메소드는 execute() 를 사용한다. 그러나 execute()메소드만을 액션 메소드로 사용할 수밖에 없다면 하나의 액션에 하나의 액션 클래스만을 사용할 것이다. 이러한 경우에는 프로젝트 규모가 커져서 많은 액션을 만들어야 할 때 지나치게 많은 액션 클래스를 만들어야 하기 때문에 액션 클래스를 관리하기 힘들어질 것이다.
또 그 외에도 다른 이유가 잇다
하나의 액션 파일에 관련된 업무의 액션 메소드를 모아둘 수 있다면 동일한 업무이기 때문에 공통된 프로퍼티를 액션 클래스를 만들 때마다 재정의 할 필요 없이 동일한 업무의 여러작업에서 사용할 수 있다.
스트럿츠2는 액션 클래스에서  액션 메소드의 이름에 대한 제한을 두고 있지 않다. 원하는 이름을 사용할 수 있으며, 개수의 제한도 없다. 그러나 다음 두 가지 규칙을 참고해야한다.
  1. 액션 메소드는 public 이어야 하고, 반환 타입은 String 이어야 하며, throws Exception을 정의 하고 잇어야 한다.(경우에 따라서 void 반환타입 사용할수도 있으며, 예외처리를 정의하지 않을 수 있다.)
  2. struts.xml 에서 액션을 정의할 때 <action />요소의 mothod 속성에 액션 메소드 이름을 정의한다.
액션클래스에서 메소드 정의
package example;
...
pulbic class SecurityAction {
...
public String login() throws Exception {
...
return "success";
}
public String logoff() throws Exception {
...
return "success";
}

struts.xml

<action name="login" class="example.SecurityAction" method="login">
...
</action>


반응형