190 likes | 479 Vues
# Struts2 Architecture. ■ Debug 방법. Decompiler 이용 Jar 파일 제외 , 원래 java 파일 활용 eUML 활용 log4j.properties 의 옵션변경 ERROR -> DEBUG 실제 동작하는 log 파악 ( 소 스 ). ■ 중요 소스 구조 (1).
E N D
■ Debug 방법 • Decompiler이용 • Jar파일 제외, 원래 java파일 활용 • eUML활용 • log4j.properties의 옵션변경ERROR -> DEBUG실제 동작하는 log파악 (소스)
■ 중요 소스 구조(1) • ActionFamily[ActionMapper, ActionProxy,ActionInvocation, ActionContext]Action*.java 형태ActionProxy.java, ActionInvocation.java .. 등 • DefaultAction*.java형태 (기본구현체)
■ 중요 소스 구조(2) struts2-core-2.0.12.jar xwork-2.0.6.jar
■ FilterDispatcher • web.xml에 정의됨 • ActionMapper : Action의 invoke가 필요한지 파악함 • ActionProxy : Action의 invoke가 필요한 경우,제어권 반환 • 소스 : FilterDispatcher.java (TW설명) public class FilterDispatcher implements StrutsStatics, Filter{}
■ ActionMapper (1) • P.182, getMapping() 메소드 호출방식(설명)액션 매핑 생성 • DefaultActionMapper.javapublic class DefaultActionMapper implements ActionMapper {} • P.184 메소드접두어, 액션 접두어리다이렉트접두어,리다이렉트-액션접두어 DefaultActionMapper.java 에서 선언됨(설명)
■ ActionMapper (2) • 실습(p.185~p.194) • (1.)메소드접두어[method:default] <s:submit name="method:cancel" value="Cancel"/> 예제클릭다른 방법 (struts.xml 수정)<action name=“test” class=“../../../” method=“cancel”> 예제클릭
■ ActionMapper (3) • (2.)액션 접두어[action:dashboard]<s:submit name="action:methodPrefix3" value=“gogoThing"/> 예제실행 • (3.) 리다이렉트접두어[redirect:cancel.jsp]<s:submit name="redirect:http://www.ahnlab.com" value="Ahnlab.com"/> 예제실행 • (4.) 리다이렉트-액션 접두어[redirect-action:cancel] <s:submit name="redirect-action:methodTest" value="Ahnlab.com"/>
■ ActionMapper (4) • 커스텀 액션 매퍼 • 레스트풀 액션 매퍼 RestfulActionMapper.java http://host/article/Id ->setArticleId()메소드 필요 • 레프스풀2 액션매퍼 RestfulActionMapper2.javaparam_name/param_value형식으로파라미터는 액션이름 추출 • 혼합 액션 매퍼
■ ActionProxy / ActionInvocation • 두 항목은 짝을 이루어 구성됨 • ActionInvocation.java UML로 구조파악 (ActionInvocation1.ucd) • ActionProxy : ActionInvocation을 가짐ActionInvocation : 액션인스턴스,인터셉트순서,리절트맵,액션Contex를 가짐 • P.172 serviceAction() 연관관계 (설명)ActionProxy가 생성되는 과정
■ ActionProxy • ActionProxy는 제어권을 받음 -> 대행자 • 버스기사는 승객의 안전의 책임을 받음 • 운전습관 (커맨드 패턴) • 커맨드 패턴이란?한차원 높은 단계의 캡슐화를 말함메소드 호출을 캡슐화하여, 결정화함
■ ActionInvocation • P.175 (그림참조)DefaultActionInvocation.javapublic class DefaultActionInvocation implements ActionInvocation {} invoke() 메소드(설명)
■ ActionContext(1) • 쓰레드 로컬 맵(정의된값,저장)세션맵,액션인보케이션,요청파라미더.등 • ActionInvocation실행되는 동안 쓰레드로 구성됨 • P.180 최초 Actionproxy에 설정DefaultActionProxyFactory.java{createActionProxy (){ ActionProxy proxy = new DefaultActionProxy( ) }}
■ ActionContext(2) • 쓰레드 로컬 스토리지(시연소스) • 정의스레드별 유일한 오브젝트를 만들때 사용TreadLocal class사용 • Action에 필요한 모든 정보 • WAS 사용시client 요청 -> Thread 할당한100개의 요청 -> 100개의 Thread 생성
■ 정리 (잠시 쉬어가기) • (1.)필터 • (2.) proxy : 액션 실행 위임 대리자 • (3.) invocation : 대리자의 명령을 실제인터셉터와 액션,result을 실행 • (4.) context : 실행에 필요한 모든 정보 * (2,3,4)는모두 한쌍이다.요청시 마다 새로 생성,응답 까지 함께함
■ Interceptors • 액션 전,후의 호출을 가로채는 객체(spring의 AOP와 비슷한 역할) • com.opensymphony.xwork2.interceptor.Interceptor.java위 Interface를 구현해서 만든다.void init();void destory();String intercept(ActionInvocation invocation) • AbstractInterceptor.java Interceptor.java를 구현한 추상클래스init(), destory(); -> 초기화가 많이 필요없음
■ Interceptors (사용자 구현) • 사용자가 구현한 Interceptor예제실행 • 중요 소스public class TimerInterceptor extends AbstractInterceptor {}String result = invocation.invoke();<interceptors><interceptor name="timerer" class="exam.chapter4.TimerInterceptor" /></interceptors> <action name="goMethodPrefixPage"> <interceptor-ref name="timerer" /> <interceptor-ref name="logger" /> <result>/WEB-INF/jsp/chapter4/methodPrefix.jsp</result> </action>
■ Interceptors(default) • struts-default.xml • 앨리어스 <param name="aliases"> #{'name':'pName','modelNo':'pNo'}</param> <interceptor-ref name="alias" /> com.opensymphony.xwork2.interceptor.AliasInterceptor.java • 체인valueStack을 복사하여, 다른 Action에서 사용함com.opensymphony.xwork2.interceptor.ChainingInterceptor.java • 프리페어Preparable인터페이스 구현 -> prepare()메소드 호출com.opensymphony.xwork2.interceptor.PrepareInterceptor.java예제클릭
■ Interceptors(default) • 기능별 분류유틸리티 (timer, logger)프로퍼티(params, chain 등등)위크플로우(workflow, validation 등등) • Filter 와의 차이점서블릿 컨테이너에 묶이는 여부 Interceptor : action 마다 생성됨