Daejeon IT Developer Conference Struts2

4,263 views

Published on

Daejeon IT Developer Conference Struts2

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,263
On SlideShare
0
From Embeds
0
Number of Embeds
89
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Daejeon IT Developer Conference Struts2

  1. 1. 본 문서의 배포 및 변경 , 출력 및 활용에 관한 모든 권리는 작성자에 있습니다 . 본 서비스는 제 1 회 대전 IT 개발자 커뮤니티 참석자를 위해 제공됩니다 .
  2. 2. Struts2 현철주 아첸소프트웨어 September 28 th , 2008
  3. 3. 목차 <ul><li>프레임워크란 </li></ul><ul><li>Struts2 란 </li></ul>
  4. 4. <ul><li>영역 Area </li></ul><ul><li>협소한 영역 광범위한 영역 </li></ul><ul><li>시간 Time </li></ul><ul><li>한정된 시간 시간의 제한이 없도록 </li></ul><ul><li>고객 Customer </li></ul><ul><li>특정 고객 다양한 고객 ( 고객의 참여 유도 ) </li></ul><ul><li>마케팅 Marketing </li></ul><ul><li>고객 점유 마케팅 </li></ul><ul><li>얼마나 자주 방문하는가 ? 얼마나 오래 머물게 하는가 ? </li></ul><ul><li>충성 고객 확보 </li></ul><ul><li>감성 마케팅 </li></ul>시장의 변화 프레임워크란
  5. 5. <ul><li>독립형 애플리케이션 </li></ul><ul><li>네트워크형 애플리케이션 C/S </li></ul><ul><li>미들웨어 </li></ul><ul><li>웹 애플리케이션 </li></ul>특정 대상 불특정 다수 애플리케이션의 변화 프레임워크란
  6. 6. <ul><li>클라이언트 서버 </li></ul><ul><li>thin 클라이언트 중심 </li></ul><ul><li>서버에 부하 가중 </li></ul><ul><li>서버의 부하를 나눔 </li></ul><ul><li>분산처리 (com+, ejb, WebService) </li></ul><ul><li>farm 형성 </li></ul><ul><li>그리드 컴퓨팅 </li></ul><ul><li>thick 클라이언트 (?) </li></ul><ul><li>RIA Rich Internet Application ( 편리한 인터페이스 / 시선을 끔 : 감성 ) </li></ul><ul><li>Flex, Ajax, X-internet, ActiveX (?) </li></ul><ul><li>웹 표준 기반 ( 글로벌화 ) </li></ul>아키텍처의 변화 프레임워크란
  7. 7. <ul><li>구조화 프로그래밍 </li></ul><ul><li>Structured Programming </li></ul><ul><li>객체 지향 프로그래밍 OOP </li></ul><ul><li>Object Oriented Programming </li></ul><ul><li>컴포넌트 지향 개발 CBD </li></ul><ul><li>Component Based Development </li></ul><ul><li>프레임워크 지향 개발 FBD </li></ul><ul><li>Framework Based Development </li></ul>방법론의 변화 프레임워크란
  8. 8. <ul><li>패턴의 적용 </li></ul><ul><li>추상화 기법 </li></ul><ul><li>보다 쉬운 개발 기법 적용 </li></ul><ul><li>생산성 </li></ul><ul><li>직관성 </li></ul><ul><li>다양성 </li></ul><ul><li>프레임워크의 통합 및 연동 </li></ul>프레임워크 기반 개발 방법 프레임워크란
  9. 9. <ul><li>Pure Java </li></ul><ul><li>Servlet </li></ul><ul><li>JSP Java Server Pages </li></ul><ul><li>JavaScript </li></ul><ul><li>XML eXtensible Markup Language </li></ul><ul><li>HTML Hyper Text Markup Language </li></ul><ul><li>WebService </li></ul><ul><li>EJB Enterprise Java Beans </li></ul><ul><li>JDBC Java Database </li></ul><ul><li>Connectivity </li></ul><ul><li>Ajax Asynchronous Javascript And Xml </li></ul><ul><li>JMS Java Message Service </li></ul><ul><li>X-Internet </li></ul><ul><li>CSS Cascading Style Sheets </li></ul><ul><li>WAS Web Application Server </li></ul><ul><li>Database </li></ul><ul><li>O/S Operating System </li></ul><ul><li>PHP, Ruby, .NET, Perl,CGI, ... </li></ul>웹 애플리케이션을 위한 기술 프레임워크란
  10. 10. <ul><li>보다 단순하고 쉬운 개발 중심 </li></ul><ul><li>생산성 , 유지 보수 고려 </li></ul><ul><li>POJO Plain Old Java Object 기반의 개발 </li></ul><ul><li>다양한 오픈 소스 출현 </li></ul><ul><li>프레임워크의 연동 </li></ul>자바 기술의 최근 동향 프레임워크란
  11. 11. 웹 애플리케이션 개발 프레임워크 보안 프레임워크 SQL & OR Mapper 프레임워크 DI (Dependency Injection) & AOP (Aspected Oriented Programming) 프레임워크 디스플레이 레이아웃 프레임워크 SOA 프레임워크 리포팅 프레임워크 … 배포 및 형상 관리 프레임워크 자바 기반의 오픈 소스 프레임워크 개요 프레임워크란
  12. 12. <ul><li>Struts </li></ul><ul><li>Spring </li></ul><ul><li>iBATIS </li></ul><ul><li>Hibernate </li></ul><ul><li>Acegi </li></ul><ul><li>WebWork </li></ul><ul><li>Tiles </li></ul><ul><li>Sitemesh </li></ul><ul><li>JSF </li></ul><ul><li>Seam </li></ul><ul><li>jBPM </li></ul><ul><li>Drools </li></ul><ul><li>Tapestry </li></ul><ul><li>Ant </li></ul><ul><li>JSF </li></ul><ul><li>Shale </li></ul><ul><li>Struts2 </li></ul><ul><li>... </li></ul>자바 기반의 오픈 소스 프레임워크 프레임워크란
  13. 13. <ul><li>2000 년도에 ASF Apache Software Foundation 에 기증 </li></ul><ul><li>대표적인 웹 애플리케이션 개발 프레임워크 </li></ul><ul><li>MVC Model View Controller 패턴 적용 </li></ul><ul><li>웹 개발의 가이드 역할 </li></ul><ul><li>XML 기반의 환경 설정 </li></ul><ul><li>태그 라이브러리 지원 </li></ul><ul><li>국제화 지원 </li></ul><ul><li>기타 다양한 유틸리티 제공 </li></ul><ul><li>유효성 검사 , 레이아웃 , 프리젠테이션 객체 지원 (ActionForm), … </li></ul>Struts 프레임워크란
  14. 14. <ul><li>POJO 기반이 아님 </li></ul><ul><li>프레임워크에 종속된 프레임워크 객체들… </li></ul><ul><li>테스트가 용이하지 못하다 . </li></ul><ul><li>버전 업에 따른 환경설정의 모호함 발생 </li></ul><ul><li>struts-config.xml 에서 액션 정의 시 속성이 여러 용도로 사용하게 된다 . </li></ul><ul><li>ActionForm 의 불편함 </li></ul><ul><li>편리함을 위한 ActionForm 객체가 오히려 개발의 장애가 됨 . </li></ul><ul><li>ActionForm 객체는 비즈니스 객체가 아니므로 코드량 증가 </li></ul><ul><li>태그 라이브러리의 미숙한 지원 </li></ul><ul><li>별도의 태그 라이브러리 필요 </li></ul>Struts 단점 프레임워크란
  15. 15. <ul><li>Struts + WebWork2 </li></ul><ul><li>스트럿츠의 거대한 커뮤니티의 파워와 웹워크의 뛰어난 아키텍처의 결합 </li></ul>Struts 2 프레임워크란
  16. 16. <ul><li>자주 사용되는 클래스나 함수 , 소프트웨어 등을 모아서 재사용을 쉽게함 . </li></ul><ul><li>업무 로직의 흐름을 패턴화 </li></ul><ul><li>접근하기 쉽고 관리가 용이하도록 도와주는 소프트웨어 시스템 . </li></ul>프레임워크란 ? 프레임워크란
  17. 17. <ul><li>아파치 스트럿츠는 2000 년에 등장 . </li></ul><ul><li>자바 기반 웹 애플리케이션을 개발하는데 많은 도움을 주며 성장 . </li></ul><ul><li>더욱 다양하고 복잡한 기능 필요 . </li></ul><ul><li>더 쉽고 간결하게 웹 애플리케이션 개발 필요 . </li></ul><ul><li>더욱 풍부한 사용자 인터페이스를 구축하기 위한 웹 프레임워크들이 등장 . </li></ul>스트럿츠 프레임워크란
  18. 18. <ul><li>스트럿츠 Ti Titanium 제안 초안을 구성 </li></ul><ul><li>2005 년 자바원 JavaOne 에서 스트럿츠 프로젝트의 개발자와 비하이브의 개발자가 미팅을 통해 스트럿츠 Ti 제안 초안을 구성 . </li></ul><ul><li>웹워크의 단순함 , 세련미 , 개발 툴 친화성의 장점과 스트럿츠 1 을 결합 </li></ul>스트럿츠 2 Struts2 란
  19. 19. <ul><li>전혀 새로운 프레임워크 </li></ul><ul><li>스트럿츠 1 과는 전혀 다른 웹워크 2 의 MVC (Model View Controller) 아키텍처 채용 </li></ul><ul><li>서블릿 의존성에서 벗어난 POJO (Plain Old Java Object) 기반 액션 </li></ul><ul><li>테스트 용이 </li></ul><ul><li>입ㆍ출력 처리의 다양화 </li></ul><ul><li>비즈니스나 도메인 객체를 포함한 풍부한 객체 타입을 입ㆍ출력 객체로서 사용 </li></ul>스트럿츠 2 특징 Struts2 란
  20. 20. <ul><li>다양한 표현식 언어 EL Expression Language 지원 </li></ul><ul><li>스트럿츠 2 도 스트럿츠 1 때와 같이 JSTL 을 사용 </li></ul><ul><li>또한 , OGNL Object Graph Navigation Language 라고 불리는 강력하고 유연한 표현 언어를 지원 </li></ul><ul><li>뷰와 값의 연결 </li></ul><ul><li>밸류 스택 ValueStack 이라는 기술을 사용 </li></ul><ul><li>뷰 View 의 재사용 가능 </li></ul><ul><li>액션 실행 제어 </li></ul><ul><li>인터셉터 스택 Interceptor Stack </li></ul><ul><li>전 , 후 처리 가능 </li></ul>스트럿츠 2 특징 Struts2 란
  21. 21. <ul><li>제로 컨피규레이션 지향 및 신속한 리로딩 </li></ul><ul><li>환경 설정이 용이 ( 기본값 , 어노테이션 , 와일드카드 사용 ) </li></ul><ul><li>변경된 환경 적용 시 웹 컨테이너를 재 시작 하지 않아도 리로딩 가능 </li></ul><ul><li>강력한 유효성 검사 </li></ul><ul><li>XWork 의 유효성 검사 프레임워크에 기반 </li></ul><ul><li>강력한 태그 및 Ajax 지원 </li></ul><ul><li>재사용성이 높은 UI 태그를 제공 </li></ul><ul><li>특히 , Ajax 테마를 지원하는 Dojo 프레임워크를 포함 </li></ul>스트럿츠 2 특징 Struts2 란
  22. 22. <ul><li>다양한 플러그인 기능 </li></ul><ul><li>차트 지원의 JFreeChart </li></ul><ul><li>리포트 출력을 위한 JasperReport </li></ul><ul><li>레이아웃 적용을 위한 Sitemesh </li></ul><ul><li>DI, AOP 를 지원하는 Spring </li></ul><ul><li>다양한 리절트 타입의 지원 및 프로파일링 </li></ul><ul><li>JSP 외에 프리마커 Freemarker, 밸로시티 Velocity 등의 사용이 가능 </li></ul><ul><li>요청이 처리되는 모든 과정의 프로파일링이 가능 </li></ul><ul><li>강력한 태그 및 Ajax 지원 </li></ul><ul><li>재 사용성이 높은 UI 태그를 제공 </li></ul><ul><li>특히 , Ajax 테마를 지원하는 Dojo 프레임워크를 포함 </li></ul>스트럿츠 2 특징 Struts2 란
  23. 23. <ul><li>웹 개발 프레임워크와 개발자의 작업 내용 </li></ul><ul><li>스트럿츠 2 의 역할 </li></ul>개발자가 작성해야 하는 내용 비즈니스 로직 웹 개발 프레임워크 결과 페이지 환경 설정 개발자가 작성해야 하는 내용 비즈니스 로직 스트럿츠 2 결과 페이지 환경 설정 스트럿츠 2 역할 Struts2 란
  24. 24. <ul><li>액션 (Action) </li></ul><ul><li>리절트 (Result) </li></ul><ul><li>환경 설정 (Configuration) </li></ul>스트럿츠 2 핵심 개념 Struts2 란
  25. 25. <ul><li>액션이란 스트럿츠 2 에서 비즈니스 로직을 실행하기 위한 통로 역할을 하는 개념으로서 가장 중심적인 위치에 있다 . </li></ul>비즈니스 로직 스트럿츠 2 액션 사용자 요청 액션 선택 액션 Struts2 란
  26. 26. <ul><li>POJO 클래스이다 . </li></ul><ul><li>프로퍼티를 가질 수 잇다 . (Singleton 이 아님 ) </li></ul><ul><li>기본 엔트리 포인트로서 execute() 메소드 사용 </li></ul><ul><li>액션 메소드로 원하는 이름도 사용할 수 있다 . </li></ul><ul><li>struts.xml 파일에 액션을 정의할 때 <action/> 태그의 method 속성을 정의한다 . </li></ul><ul><li>비즈니스 로직의 중개 역할을 수행한다 . </li></ul><ul><li>액션 이름은 액션 호출을 위한 URL 로 사용한다 . </li></ul><ul><li>http://localhost:8080/someAction.action </li></ul><ul><li>액션 메소드는 문자열을 반환하다 . </li></ul>액션 Struts2 란
  27. 27. public class MyAction { ... public String execute() throws Exception { ... return &quot;success&quot;; } } 액션 클래스의 프로토타입 Struts2 란
  28. 28. <ul><li>최종 결과를 출력하기 위해 제공하는 것 </li></ul><ul><li>비지니스 로직을 수행한 후 , 최종 결과를 출력하기 위해 제공하는 것 </li></ul>비즈니스 로직 스트럿츠 2 액션 리절트 결과 페이지 리절트 Struts2 란
  29. 29. <ul><li>결과 페이지에서 태그 라이브러리를 통해 액션 클래스의 프로퍼티에 접근 </li></ul>스트럿츠 2 액션 리절트 결과 페이지 태그 라이브러리 태그 태그 라이브러리 Struts2 란
  30. 30. <ul><li>액션과 리절트의 관계를 정의 </li></ul><ul><li>사용자의 요청에 대해 어떤 액션을 수행한 후 , 어떤 리절트를 출력해야 하는지 스트럿츠 2 가 알 수 있도록 해야 한다 . </li></ul><ul><li>스트럿츠 2 자체의 기능 설정을 위해 환경 설정 모듈 제공 </li></ul>스트럿츠 2 액션 리절트 결과 페이지 환경설정 관리자 ConfigManager 환경설정 파일 환경설정 Struts2 란
  31. 31. <ul><li>액션과 리절트 페이지 정의 </li></ul><ul><li>기본 액션 메소드인 execute() 메소드는 String 타입을 반환한다 . </li></ul><ul><li>액션 메소드가 반환하는 문자열은 액션 실행이 끝난 후 어떤 리절트를 실행할지 결정하기 위해 사용된다 . </li></ul><ul><li>액션 메소드가 반환하는 이 문자열 값을 ‘리절트 코드 Result Code’ 라 부른다 . </li></ul><ul><li>액션을 호출하려면 사용자는 ' 액션이름 .action' 형식을 사용한다 . </li></ul><ul><li>액션 이름은 스트럿츠 2 애플리케이션 환경 설정 파일인 'struts.xml' 파일에서 아래와 같은 형식으로 정의한다 . </li></ul><ul><li><action /> 요소는 액션을 정의할 때 사용한다 . </li></ul><ul><li><action /> 요소는 name, class, method 속성을 갖는다 . </li></ul><ul><li><result /> 요소는 액션 수행이 완료된 후 실행될 리절트를 정의할 때 사용한다 . </li></ul><ul><li><result /> 요소는 <action /> 요소의 사이에 정의하고 , name, type 속성을 갖는다 . </li></ul><action name=&quot; myAction &quot; class=&quot; example.MyAction &quot;> <result>/ myPage.jsp </result> </action> struts.xml Struts2 란
  32. 32. <ul><li>필터 디스패처 </li></ul><ul><li>스트럿츠 2 웹 애플리케이션을 개발하기 위해 웹 애플리케이션 배치 디스크립터인 web.xml 에 필터디스패처를 등록해야 한다 . </li></ul><filter> <filter-name> struts </filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter>   <filter-mapping> <filter-name> struts </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 스트럿츠 2 컨트롤러 Struts2 란
  33. 33. 상세 목차 <ul><li>스트럿츠 2 란 </li></ul><ul><li>아키텍처 </li></ul><ul><li>▪ 필터 디스패처 </li></ul><ul><li>▪ 액션 매퍼 </li></ul><ul><li>▪ 액션 프록시 / 액션 인보케이션 </li></ul><ul><li>▪ 액션 컨텍스트 </li></ul><ul><li>▪ 인터셉터 </li></ul><ul><li>▪ 액션 </li></ul><ul><li>▪ 리절트 </li></ul>
  34. 34. 상세 목차 <ul><li>태그 라이브러리 </li></ul><ul><li>환경설정 </li></ul><ul><li>▪ web.xml </li></ul><ul><li>▪ 필터 디스패처 등록 </li></ul><ul><li>▪ struts.xml </li></ul><ul><li>▪ 상수 값 정의 </li></ul><ul><li>▪ 패키지 설정 </li></ul><ul><li>▪ 액션 설정 </li></ul><ul><li>▪ 와일드 카드 매핑 </li></ul><ul><li>▪ 기본 액션 매핑 </li></ul><ul><li>▪ 글로벌 리절트 </li></ul><ul><li>플러그인 </li></ul>
  35. 35. <ul><li>자바 기반 </li></ul><ul><li>웹 애플리케이션 개발 프레임워크 </li></ul><ul><li>단순함 </li></ul><ul><li>POJO 기반 </li></ul><ul><li>세련미 </li></ul><ul><li>단순하고 , 편리한 개발환경 제공에 대한 배려 </li></ul><ul><li>다양한 선택 가능 </li></ul><ul><li>디폴트 값 , 커스터마이징 ( 인터셉터 , 액션매퍼 ), 인터셉터 </li></ul><ul><li>스트럿츠 2 태그 , JSTL, 여러 가지 형태의 뷰 지원 </li></ul><ul><li>다른 기술과의 쉬운 결합 ( 플러그인 등 ) </li></ul><ul><li>발전된 다양한 기술 활용 및 기술 통합의 용이성 </li></ul><ul><li>커맨드 패턴 , 의존성 주입 , 인터셉터 , 액션 컨텍스트 </li></ul>스트럿츠 2 란 Struts2 란
  36. 36. <ul><li>서로 다른 시각을 가지고 있다 . </li></ul><ul><li>이를 모두 만족시켜야 한다 . </li></ul><ul><li>개발자가 원하는 것 </li></ul><ul><li>쉬운 학습과 적용 , 빠른 개발과 테스트 , 편리한 디버깅 </li></ul><ul><li>아키텍트가 원하는 것 </li></ul><ul><li>기술의 결합 용이 , 설계의 쉬운 적용 </li></ul><ul><li>사용자가 원하는 것 </li></ul><ul><li>뛰어난 기능 , 편리한 인터페이스 , 안정적인 시스템 , 유지보수 편리성 , 저렴한 비용 </li></ul>왜 스트럿츠 2 를 선택하는가 ? Struts2 란
  37. 37. FilterDispatcher struts.xml Interceptor Result ActionMapper ActionProxy/ActionInvocation ActionContext Tag Library Action 핵심 키워드 Struts2 란
  38. 38. 필터 디스패처 액션 인보케이션 액션 매퍼 태그 서브시스템 HTML, Dojo, Forms, etc 템플릿 JSP, FreeMarker, Velocity, etc HttpServletResponse 인터셉터 1 리절트 인터셉터 3 인터셉터 2 인터셉터 3 인터셉터 1 액션프록시 인터셉터 2 액션 환경설정관리자 struts.xml Other Filters (Sitemesh ...) ActionContextCleanUp Filter HttpServletRequest 스트럿츠 2 아키텍처 개념도 Struts2 아키텍쳐
  39. 39. <ul><li>요청 Request </li></ul><ul><li>필터 디스패처 FilterDispatcher </li></ul><ul><li>액션 매퍼 ActionMapper </li></ul><ul><li>액션 프록시 / 액션 인보케이션 ActionProxy/ActionInvocation </li></ul><ul><li>인터셉터 Interceptor ( 전처리 ) </li></ul><ul><li>액션 Action </li></ul><ul><li>리절트 Result </li></ul><ul><li>인터셉터 Interceptor ( 후처리 ) </li></ul><ul><li>응답 Response </li></ul><ul><li>필터 디스패처 FilterDispatcher </li></ul>요청은 스트럿츠 2 를 통해 어떻게 진행되는가 ? Struts2 아키텍쳐
  40. 40. 필터 디스패처 액션 인보케이션 액션 매퍼 태그 서브시스템 HTML, Dojo, Forms, etc 템플릿 JSP, FreeMarker, Velocity, etc HttpServletResponse 인터셉터 1 리절트 인터셉터 3 인터셉터 2 인터셉터 3 인터셉터 1 인터셉터 2 액션 액션프록시 환경설정관리자 struts.xml HttpServletRequest 필터 디스패처 Struts2 아키텍쳐
  41. 41. <ul><li>요청에 대한 엔트리 포인트 </li></ul><ul><li>‘ .action’ 과 매핑 </li></ul><ul><li>액션 컨텍스트 생성 </li></ul><ul><li>ActionContext = Map </li></ul><ul><li>application, session, request, parameters, attr, valueStack </li></ul><ul><li>액션 프록시 생성 및 실행 </li></ul><ul><li>요청을 래핑 </li></ul><ul><li>멀티파트 요청 처리 ( 파일 업로딩 ) </li></ul><ul><li>JSTL 사용을 위해… </li></ul>필터 디스패처 Struts2 아키텍쳐
  42. 42. <ul><li>web.xml 에 필터 디스패처 정의 </li></ul><filter> <filter-name> struts </filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter>   <filter-mapping> <filter-name> struts </filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 필터 디스패처 정의 Struts2 아키텍쳐
  43. 43. 필터 디스패처 액션 인보케이션 태그 서브시스템 HTML, Dojo, Forms, etc 템플릿 JSP, FreeMarker, Velocity, etc HttpServletResponse 인터셉터 1 리절트 인터셉터 3 인터셉터 2 인터셉터 3 인터셉터 1 인터셉터 2 액션 액션프록시 환경설정관리자 struts.xml HttpServletRequest 액션 매퍼 필터 디스패처 정의 Struts2 아키텍쳐
  44. 44. <ul><li>액션 매핑 ActionMapping 을 생성 </li></ul><ul><li>액션 매핑은 메소드 , 파라미터 , 리절트 정보를 갖지 않는다 . </li></ul><ul><li>요청과 액션 연결 </li></ul><ul><li>일치하는 액션이 없으면 : 널 값 반환 </li></ul><ul><li>일치하는 액션이 있으면 : 액션 호출 정보를 갖는 액션 매핑을 반환 </li></ul><ul><li>요청의 매핑을 결정하기 위해 스트럿츠 환경 설정을 참조하지 않는다 . </li></ul>액션 매퍼 Struts2 아키텍쳐
  45. 45. <ul><li>기본 액션 매퍼 </li></ul><ul><li>메소드 접두어 </li></ul><ul><li>액션 접두어 </li></ul><ul><li>리다이렉트 접두어 </li></ul><ul><li>리다이렉트 - 액션 접두어 </li></ul><ul><li>커스텀 액션 매퍼 </li></ul><ul><li>레스트풀 액션 매퍼 </li></ul><ul><li>레스트풀 2 액션 매퍼 </li></ul><ul><li>혼합 액션 매퍼 </li></ul>액션 매퍼의 종류 Struts2 아키텍쳐
  46. 46. 액션 인보케이션 액션 매퍼 액션프록시 필터 디스패처 태그 서브시스템 HTML, Dojo, Forms, etc 템플릿 JSP, FreeMarker, Velocity, etc HttpServletResponse 인터셉터 1 리절트 인터셉터 3 인터셉터 2 인터셉터 3 인터셉터 1 인터셉터 2 액션 환경설정관리자 struts.xml HttpServletRequest 액션 프록시 / 액션 인보케이션 Struts2 아키텍쳐
  47. 47. <ul><li>액션 프록시는 액션 수행을 위한 대행자이다 . </li></ul><ul><li>인터셉터 , 리절트 캡슐화 </li></ul><ul><li>액션 프록시는 액션의 상태 값을 가지는 액션 인보케이션을 가진다 . </li></ul><ul><li>액션 인보케이션은 액션 , 인터셉터 , 리절트 , 액션 컨텍스트를 가진다 . </li></ul>액션 프록시 / 액션 인보케이션 Struts2 아키텍쳐
  48. 48. 필터 디스패처 proxy = ActionProxyFactory.getFactory().createActionProxy() proxy.execute() 액션 프록시 invocation.invoke() 액션 인보케이션 interceptor() invokeActionOnly() executeResult() 인터셉터 인터셉터 인터셉터 리절트 액션 액션 프록시 / 액션 인보케이션 작업 흐름 Struts2 아키텍쳐
  49. 49. ActionProxy invocation.invoke() ActionInvocation invoke() { if (interceptors.hasNext()) { interceptor.interceptor(this); } else { invokeActionOnly(); } if (!executed) { executeResult(); } Interceptor interceptor(invocation) { … return invocation.invoke(); } 액션 프록시 / 액션 인보케이션 호출 구조 Struts2 아키텍쳐
  50. 50. <ul><li>애플리케이션 , 세션 , 요청 , 파라미터 정보를 저장하기 위한 쓰레드 로컬 맵 </li></ul><ul><li>액션 인보케이션이 실행되는 동안 쓰레드로 구성 </li></ul><ul><li>액션 프록시가 액션 인보케이션을 호출하기 전의 상태 값을 저장 </li></ul><ul><li>ActionContext.getContext() </li></ul><ul><li>인터셉터 , 액션 , 리절트에서 쓰레드 로컬로부터 액션 컨텍스트를 얻기 위해 사용 </li></ul><ul><li>액션 컨텍스트는 실행환경에 대한 다양한 정보 저장 </li></ul><ul><li>액션 프록시가 생성되기 전에 필터 디스패처에 의해 생성된 후 </li></ul><ul><li>ActionProxyFactory.createActionProxy() 메소드에 전달 </li></ul>액션 컨텍스트 Struts2 아키텍쳐
  51. 51. 액션 컨텍스트 시퀀스 다이어그램 Struts2 아키텍쳐 :ActionContext :ActionProxy :ActionInvocation 1. getContext() ActionProxy 가 실행될 때 ThreadLocal 로부터 ActionContext 를 얻고 이를 저장한다 . 2. return 4. return 3. getInvocationContext() ActionProxy 는 ActionInvocation 을 위해 ActionContext 를 얻고 ThreadLocal 상에 이를 설정한다 . 5. setContext(aContext) 6. invoke() 7. setContext(aContext) ActionInvocation 이 리턴된 후 , ThreadLocal 상의 예전 ActionContext 를 설정한다 .
  52. 52. <ul><li>actionInvocation </li></ul><ul><li>application </li></ul><ul><li>conversionErrors </li></ul><ul><li>locale </li></ul><ul><li>name </li></ul><ul><li>parameters </li></ul><ul><li>session </li></ul><ul><li>valueStack (root) </li></ul>액션 컨텍스트에서 관리하는 정보 Struts2 아키텍쳐
  53. 53. 필터 디스패처 액션 인보케이션 태그 서브시스템 HTML, Dojo, Forms, etc 템플릿 JSP, FreeMarker, Velocity, etc HttpServletResponse 리절트 액션 액션프록시 환경설정관리자 struts.xml HttpServletRequest 액션 매퍼 인터셉터 1 인터셉터 3 인터셉터 2 인터셉터 3 인터셉터 1 인터셉터 2 인터셉터 Struts2 아키텍쳐
  54. 54. <ul><li>액션 처리 전과 후에 추가적인 작업 지원 </li></ul><ul><li>여러 개의 인터셉터가 정의된 순서로 실행 </li></ul><ul><li>액션 인보케이션이 인터셉터의 실행을 담당 </li></ul><ul><li>액션 인보케이션은 정의된 인터셉터 맵을 갖는다 . </li></ul>액션 인보케이션 interceptor() invokeActionOnly () executeResult() 인터셉터 인터셉터 리절트 액션 인터셉터 Struts2 아키텍쳐
  55. 55. <ul><li>앨리어스 인터셉터 </li></ul><ul><li>액션이 실행될 때 요청에서 넘어온 파라미터의 이름을 다른 이름으로 사용할 수 있도록 한다 . </li></ul><ul><li>체인 인터셉터 </li></ul><ul><li>밸류 스택 안의 모든 객체의 프로퍼티를 복사하여 다음에 실행될 액션에서 사용할 수 있도록 한다 . </li></ul><ul><li>체크박스 인터셉터 </li></ul><ul><li>체크박스가 체크되지 않은 상태에서 서브밋했을 때 연결된 액션 클래스의 프로퍼티에 “ false” 값을 설정한다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  56. 56. <ul><li>익스큐트 앤 웨이트 인터셉터 </li></ul><ul><li>액션 실행을 일정 시간 동안 백그라운드에서 대기 시켰다가 실행할 수 있도록 한다 . </li></ul><ul><li>익셉션 인터셉터 </li></ul><ul><li>예외를 처리하기 위한 기능을 제공한다 . </li></ul><ul><li>인터내셔널 인터셉터 </li></ul><ul><li>현재 요청에 대한 로케일을 세션에 설정하는 기능을 제공한다 . </li></ul><ul><li>또한 특정 HTTP 요청 파라미터를 찾아서 로케일 정보를 설정한다 . </li></ul><ul><li>다국어를 지원하는 애플리케이션에 매우 유용하다 . </li></ul><ul><li>http://localhost:8080/struts2/someAction.action?request_locale=en_US </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  57. 57. <ul><li>로거 인터셉터 </li></ul><ul><li>액션의 시작과 끝을 로깅한다 . </li></ul><ul><li>이는 영어로만 지원하고 , 국제화를 지원하지 않는다 . </li></ul><ul><li>메시지 스토어 인터셉터 </li></ul><ul><li>ValidationAware 인터페이스를 구현한 액션의 메시지 , 오류 , 필드 오류를 HttpSession 에 저장하여 다른 단계에서 이들을 사용할 수 있도록 하는 기능을 제공한다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  58. 58. <ul><li>모델 드리븐 인터셉터 </li></ul><ul><li>ModelDriven 인터페이스를 구현한 액션 클래스를 지켜본 후 액션의 getModel() 메소드를 호출하여 getModel() 메소드가 반환하는 객체의 프로퍼티를 밸류 스택에 저장한다 . </li></ul><ul><li>스코프 모델 드리븐 인터셉터 </li></ul><ul><li>ScopedModelDriven 인터페이스를 구현한 액션을 감지하면 설정된 스코프로부터 모델 클래스를 가져와서 액션에 제공한다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  59. 59. <ul><li>파라미터 인터셉터 </li></ul><ul><li>모든 파라미터를 밸류 스택에 저장한다 . </li></ul><ul><li>이 인터셉터는 ActionContext 의 getParameters() 메소드로 모든 파라미터를 얻은 후 ValueStack 의 setValue(String, Object) 메소드를 호출하여 밸류 스택에 저장한다 . </li></ul><ul><li>프리페어 인터셉터 Prepare Interceptor </li></ul><ul><li>Preparable 인터페이스를 구현한 액션의 prepare() 메소드를 호출하는 기능을 제공한다 . </li></ul><ul><li>액션 메소드를 호출하기 전에 수행해야 할 비즈니스 로직을 수행할 필요가 있을 때 매우 유용하다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  60. 60. <ul><li>스코프 인터셉터 </li></ul><ul><li>스트럿츠 2 에서 마법사와 같은 기능과 관련된 몇 가지 단순한 이슈를 해결하기 위하여 디자인된 것이다 . </li></ul><ul><li>서블릿 컨피그 인터셉터 </li></ul><ul><li>액션이 구현하는 인터페이스에 기반한 액션의 프로퍼티를 설정한다 . </li></ul><ul><li>예를 들어 , 액션이 ParameterAware 인터페이스를 구현 하였다면 액션 컨텍스트의 파라미터 맵은 액션에 저장된다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  61. 61. <ul><li>스태틱 파라미터 인터셉터 </li></ul><ul><li>액션을 정의할 때 정의된 정적인 파라미터를 액션의 프로퍼티에 설정해주는 기능을 제공한다 . </li></ul><ul><li>롤 인터셉터 </li></ul><ul><li>사용자가 올바른 JAAS 권한을 가지고 있다면 액션을 수행하도록 한다 . </li></ul><ul><li>타이머 인터셉터 </li></ul><ul><li>1000 분의 1 초 단위로 액션의 실행 시간을 기록한다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  62. 62. <ul><li>토큰 인터셉터 </li></ul><ul><li>토큰 당 하나의 요청 만을 처리하게 한다 . </li></ul><ul><li>브라우저의 백워드 버튼과 더블 클릭에 대한 작동을 막는다 </li></ul><ul><li>토큰 세션 인터셉터 </li></ul><ul><li>유효하지 않은 토큰을 다루기 위해 보다 진보된 방식의 로직을 제공하여 토큰 인터셉터를 보강한 것이다 . </li></ul><ul><li>일반적인 토큰 인터셉터와는 달리 이 인터셉터는 동일한 세션을 사용하여 다중 요청의 이벤트에서 지능적인 실패 관리를 제공한다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  63. 63. <ul><li>밸리데이션 인터셉터 </li></ul><ul><li>표준 유효성 검사 프레임워크를 사용해서 액션을 실행한다 . </li></ul><ul><li>' 액션클래스 - validation.xml' 파일에 정의된 검사 규칙으로 액션을 검사하고 오류가 있는 경우 필드 레벨 , 액션 레벨 오류 메시지를 추가한다 . </li></ul><ul><li>워크플로우 인터셉터 </li></ul><ul><li>인터셉터 체인이 계속 진행되기 전에 기본 유효성 검사 작업 흐름을 수행한다 . </li></ul><ul><li>수행될 메소드의 이름이 excludeMethods 파라미터에 정의되어 있다면 아무일도 수행하지 않는다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  64. 64. <ul><li>파라미터 필터 인터셉터 </li></ul><ul><li>액션 또는 남은 다른 인터셉터 스택에 파라미터를 필터링하는 역할을 한다 . </li></ul><ul><li>프로파일링 인터셉터 </li></ul><ul><li>요청 파라미터를 통해 프로파일링 기능을 사용할 수 있게 한다 . </li></ul><ul><li>devMode 는 &quot; true &quot; 로 설정되어 있어야 한다 . </li></ul>인터셉터의 종류 Struts2 아키텍쳐
  65. 65. 필터 디스패처 액션 인보케이션 태그 서브시스템 HTML, Dojo, Forms, etc 템플릿 JSP, FreeMarker, Velocity, etc HttpServletResponse 인터셉터 1 리절트 인터셉터 3 인터셉터 2 인터셉터 3 인터셉터 1 인터셉터 2 액션프록시 환경설정관리자 struts.xml HttpServletRequest 액션 매퍼 액션 액션 Struts2 아키텍쳐
  66. 66. <ul><li>POJO 클래스이다 . </li></ul><ul><li>프로퍼티를 가질 수 있다 . </li></ul><ul><li>기본 엔트리 포인트로서 execute () 메소드 사용 </li></ul><ul><li>액션 메소드로 원하는 이름도 사용할 수 있다 . </li></ul><ul><li>단지 struts.xml 파일에 액션을 정의할 때 <action /> 태그의 method 속성을 정의한다 . </li></ul><ul><li>비즈니스 로직의 중개 역할을 수행한다 . </li></ul><ul><li>액션 이름은 액션 호출을 위한 URL 로 사용된다 . </li></ul><ul><li>http://localhost:8080/someAction.action </li></ul><ul><li>액션 메소드는 문자열을 반환한다 . </li></ul>액션 Struts2 아키텍쳐
  67. 67. <ul><li>com.opensymphony.xwork2.Action </li></ul><ul><ul><li>SUCCESS = &quot;success&quot;; </li></ul></ul><ul><ul><li>NONE = &quot;none&quot;; </li></ul></ul><ul><ul><li>ERROR = &quot;error&quot;; </li></ul></ul><ul><ul><li>INPUT = &quot;input&quot;; </li></ul></ul><ul><ul><li>LOGIN = &quot;login&quot;; </li></ul></ul><ul><ul><li>execute(); </li></ul></ul><ul><li>com.opensymphony.xwork2.ActionSupport </li></ul><ul><ul><li>setActionErrors() </li></ul></ul><ul><ul><li>getActionErrors() </li></ul></ul><ul><ul><li>setActionMessages() </li></ul></ul><ul><ul><li>getActionMessages() </li></ul></ul><ul><ul><li>getErrorMessages() </li></ul></ul><ul><ul><li>getErrors() </li></ul></ul><ul><ul><li>setFieldErrors() </li></ul></ul><ul><ul><li>getFieldErrors() </li></ul></ul><ul><ul><li>addActionError() </li></ul></ul><ul><ul><li>addActionMessage() </li></ul></ul><ul><ul><li>addFieldError() </li></ul></ul><ul><ul><li>hasActionErrors() </li></ul></ul><ul><ul><li>hasActionMessages() </li></ul></ul><ul><ul><li>hasErrors() </li></ul></ul><ul><ul><li>hasFieldErrors() </li></ul></ul><ul><ul><li>getLocale() </li></ul></ul><ul><ul><li>getText() </li></ul></ul><ul><ul><li>getTexts() </li></ul></ul><ul><ul><li>input() </li></ul></ul><ul><ul><li>doDefault() </li></ul></ul><ul><ul><li>execute() </li></ul></ul><ul><ul><li>clearErrorsAndMessages() </li></ul></ul><ul><ul><li>validate() </li></ul></ul><ul><ul><li>clone() </li></ul></ul><ul><ul><li>pause() </li></ul></ul><ul><li>com.opensymphony.xwork2.Validateable </li></ul><ul><ul><li>validate() </li></ul></ul><ul><li>com.opensymphony.xwork2.TextProvider </li></ul><ul><ul><li>getText() </li></ul></ul><ul><ul><li>getTexts() </li></ul></ul><ul><li>com.opensymphony.xwork2.LocaleProvider </li></ul><ul><ul><li>getLocale() </li></ul></ul><ul><li>com.opensymphony.xwork2.ValidationAware </li></ul><ul><ul><li>setActionErrors() </li></ul></ul><ul><ul><li>getActionErrors() </li></ul></ul><ul><ul><li>setActionMessages() </li></ul></ul><ul><ul><li>getActionMessages() </li></ul></ul><ul><ul><li>getErrorMessages() </li></ul></ul><ul><ul><li>getErrors() </li></ul></ul><ul><ul><li>setFieldErrors() </li></ul></ul><ul><ul><li>getFieldErrors() </li></ul></ul><ul><ul><li>addActionError() </li></ul></ul><ul><ul><li>addActionMessage() </li></ul></ul><ul><ul><li>addFieldError() </li></ul></ul>class MyAction extends ActionSupport { public String execute() throws Exception { } } ActionSupport <<interface>> Action <<interface>> Validatable <<interface>> TextProvider <<interface>> LocaleProvider <<interface>> ValidationAware class MyAction extends ActionSupport { 액션의 상관 관계 Struts2 아키텍쳐
  68. 68. <ul><li>com.opensymphony.xwork2.ActionSupport </li></ul><ul><li>Action 을 지원하기 위한 헬퍼 클래스이다 . </li></ul><ul><li>ActionSupport 클래스는 아래의 인터페이스를 구현한다 . </li></ul><ul><li>com.opensymphony.xwork2.Action </li></ul><ul><li>com.opensymphony.xwork2.Validateable </li></ul><ul><li>com.opensymphony.xwork2.ValidationAware </li></ul><ul><li>com.opensymphony.xwork2.TextProvider </li></ul><ul><li>com.opensymphony.xwork2.LocaleProvider </li></ul>ActionSupport 클래스 Struts2 아키텍쳐
  69. 69. <ul><li>execute() 메소드를 정의 </li></ul><ul><li>액션 메소드 실행 후 반환할 대표 문자열 상수 값 5 가지를 정의하고 있다 . </li></ul><ul><li>SUCCESS </li></ul><ul><li>NONE </li></ul><ul><li>ERROR </li></ul><ul><li>INPUT </li></ul><ul><li>LOGIN </li></ul>Action 인터페이스 Struts2 아키텍쳐
  70. 70. <ul><li>validate() 메소드를 정의하고 있다 . </li></ul>Validateable 인터페이스 Struts2 아키텍쳐
  71. 71. <ul><li>오류 관련 메소드 정의 </li></ul><ul><li>액션 오류 , 액션 오류 메시지 , 필드 오류 , 필드 오류 메시지 등을 추가하여 <s:actionError /> 또는 <s:fieldError /> 등의 태그와 연동하여 사용할 수 있는 메소드를 정의하고 있다 . </li></ul>ValidationAware 인터페이스 Struts2 아키텍쳐
  72. 72. ValidationAware 인터페이스의 메소드 Struts2 아키텍쳐 <ul><li>setActionErrors() </li></ul><ul><li>getActionErrors() </li></ul><ul><li>setActionMessages() </li></ul><ul><li>getActionMessages() </li></ul><ul><li>getErrorMessages() </li></ul><ul><li>getErrors() </li></ul><ul><li>setFieldErrors() </li></ul><ul><li>getFieldErrors() </li></ul><ul><li>addActionError() </li></ul><ul><li>addActionMessage() </li></ul><ul><li>addFieldError() </li></ul>
  73. 73. TextProvider 인터페이스 Struts2 아키텍쳐 <ul><li>여러 종류의 getText() , getTexts() 메소드 정의 </li></ul><ul><li>리소스 번들에 정의된 리소스를 액션에서 사용할 수 있도록 해준다 . </li></ul>
  74. 74. TextProvider 인터페이스의 메소드 Struts2 아키텍쳐 <ul><li>String getText(String key); </li></ul><ul><li>String getText(String key, String defaultValue); </li></ul><ul><li>String getText(String key, String defaultValue, String obj); </li></ul><ul><li>String getText(String key, List args); </li></ul><ul><li>String getText(String key, String[] args); </li></ul><ul><li>String getText(String key, String defaultValue, List args); </li></ul><ul><li>String getText(String key, String defaultValue, String[] args); </li></ul><ul><li>String getText(String key, String defaultValue, List args, ValueStack stack); </li></ul><ul><li>String getText(String key, String defaultValue, String[] args, ValueStack stack); </li></ul><ul><li>ResourceBundle getTexts(String bundleName); </li></ul><ul><li>ResourceBundle getTexts(); </li></ul>
  75. 75. LocaleProvider 인터페이스 Struts2 아키텍쳐 <ul><li>액션에서 로케일 정보를 얻을 수 있도록 getLocale() 메소드 정의 </li></ul>
  76. 76. <action name=&quot; someAction &quot; class=&quot;example.SomeAction&quot;> <result type =&quot; chain &quot;> anotherAction </result> </action>   <action name=&quot; anotherAction &quot; class=&quot;example.AnotherAction&quot;> <result>example/another.jsp</result> </action> <ul><li>액션은 다른 액션과 체인을 형성할 수 있다 . </li></ul><ul><li>액션 체인을 사용하면 이전 액션에서 사용했던 자원을 계속 사용할 수 있다 . </li></ul>액션 체인 Struts2 아키텍쳐
  77. 77. 필터 디스패처 액션 인보케이션 태그 서브시스템 HTML, Dojo, Forms, etc 템플릿 JSP, FreeMarker, Velocity, etc HttpServletResponse 인터셉터 1 인터셉터 3 인터셉터 2 인터셉터 3 인터셉터 1 인터셉터 2 액션프록시 환경설정관리자 struts.xml HttpServletRequest 액션 매퍼 액션 리절트 리절트 Struts2 아키텍쳐
  78. 78. 리절트 Struts2 아키텍쳐 <ul><li>액션 클래스는 애플리케이션의 상태를 관리하고 , 리절트 타입은 뷰를 관리한다 . </li></ul><ul><li>리절트는 액션 인보케이션에 의해 인터셉터 체인의 고리 제일 안쪽에서 액션이 실행된 후에 실행된다 . </li></ul>
  79. 79. 리절트 타입 Struts2 아키텍쳐 <ul><li>Chain </li></ul><ul><li>액션 체인을 위하여 사용된다 . </li></ul><ul><li>Dispatcher </li></ul><ul><li>JSP 를 포함한 웹 리소스 연동을 위하여 사용된다 . </li></ul><ul><li>FreeMarker </li></ul><ul><li>프리마커 연동을 위하여 사용된다 . </li></ul><ul><li>HttpHeader </li></ul><ul><li>특수한 HTTP 작동을 조절하기 위해서 사용된다 . </li></ul>
  80. 80. 리절트 타입 Struts2 아키텍쳐 <ul><li>Redirect </li></ul><ul><li>다른 URL( 웹 자원 ) 로 리다이렉트 하기 위하여 사용된다 . </li></ul><ul><li>Redirect Action </li></ul><ul><li>다른 액션 매핑으로 리다이렉트 하기 위하여 사용된다 . </li></ul><ul><li>Stream </li></ul><ul><li>브라우저에게 inputstream 을 스트리밍하기 위하여 사용된다 . ( 예 : 파일 다운로드 등 ) </li></ul>
  81. 81. 리절트 타입 Struts2 아키텍쳐 <ul><li>Velocity </li></ul><ul><li>벨로시티 연동을 위하여 사용된다 . </li></ul><ul><li>XSLT </li></ul><ul><li>XML/XSLT 연동을 위하여 사용된다 . </li></ul><ul><li>PlainText </li></ul><ul><li>특수한 페이지 ( 예 : jsp, html 등 ) 의 컨텐츠 원본을 디스플레이 하기 위하여 사용된다 . </li></ul><ul><li>Tiles </li></ul><ul><li>타일즈 구축을 위하여 사용된다 . </li></ul>
  82. 82. 스트럿츠 2 태그 일반 태그 Generic Tag 컨트롤 태그 Control Tag 데이터 태그 Data Tag 사용자 인터페이스 태그 UI Tag 폼 태그 Form Tag 넌폼태그 Non-Form Tag <ul><li>최소의 코딩으로 풍부한 기능의 태그 제공 . </li></ul><ul><li>OGNL 표현식을 지원 . </li></ul><ul><li>밸류 스택에 저장되어 있는 다중 객체의 프로퍼티를 손쉽게 엑세스 할 수 있다 . </li></ul>태그 라이브러리 태그라이브러리
  83. 83. 컨트롤 태그 태그라이브러리 <ul><li>컨트롤 태그는 조건 처리와 반복적인 데이터를 처리하기 위한 태그로 구성되어 있다 . </li></ul><ul><li>if, elseif, else </li></ul><ul><li>기본적인 조건 흐름을 수행한다 . 'if' 태그는 그 자체로 사용되거나 'elseif' 태그와 'else' 태그와 함께 사용할 수 있다 . </li></ul>
  84. 84. <ul><li>append </li></ul><ul><li>여러 리스트를 리스트에 하나의 iterator 로 묶어준다 . </li></ul><ul><li>이때 아이템의 순서는 먼저 저장되는 리스트의 아이템을 저장한 후 다음 리스트의 아이템이 저장되는 순서를 가진다 . </li></ul><ul><li>generator </li></ul><ul><li>generator 태그의 val 속성에 정의된 값으로 iterator 를 생성한다 . </li></ul><ul><li>iterator </li></ul><ul><li>Iterator 는 값을 반복 처리 한다 . 반복 처리할 수 있는 값은 java.util.Collection, java.util.Iterator 이다 . </li></ul>컨트롤 태그 태그라이브러리
  85. 85. <ul><li>merge </li></ul><ul><li>여러 리스트를 하나의 iterator 로 묶어준다 . </li></ul><ul><li>이 때 아이템의 순서는 append 태그를 사용했을 때와 다르다 . merge 태그는 첫 번째 리스트의 아이템 , 다음 리스트의 아이템 , 그 다음 다시 첫 번째 리스트의 두 번째 아이템 , 다음 리스트의 두 번째 아이템의 순서를 따른다 . </li></ul><ul><li>sort </li></ul><ul><li>태그 속성으로서 설정하는 Comparator 를 사용해 목록을 정렬하는 태그이다 . </li></ul><ul><li>subset </li></ul><ul><li>iterator 의 서브 셋을 취하는 태그이다 . </li></ul>컨트롤 태그 태그라이브러리
  86. 86. <ul><li>데이터 태그는 자바 빈의 값 출력 </li></ul><ul><li>리스트 등 다양한 형식의 데이터를 출력 </li></ul><ul><li>화면 단에서 데이터 처리를 위한 태그이다 . </li></ul><ul><li>리소스 링크 , </li></ul><ul><li>디버깅 화면 출력 , </li></ul><ul><li>빈의 생성 , </li></ul><ul><li>밸류 스택에 객체 저장 , </li></ul><ul><li>국제화 지원 , </li></ul><ul><li>날짜 데이터 형식 지정 , </li></ul><ul><li>다중 액션 호출 등의 기능으로 구성된다 . </li></ul>데이터 태그 태그라이브러리
  87. 87. <ul><li>a </li></ul><ul><li>a 태그는 클릭 시 Dojo 프레임워크를 이용해 원격 XMLHttpRequest 호출을 하는 HTML <a href=''/> 를 생성한다 . </li></ul><ul><li>action </li></ul><ul><li>개발자가 액션 이름과 네임스페이스 ( 옵션 ) 를 선언하여 JSP 로부터 직접 액션을 호출할 수 있게 한다 . </li></ul><ul><li>bean </li></ul><ul><li>자바 빈 규정에 따라 클래스를 인스턴스화 한다 . </li></ul>데이터 태그 태그라이브러리
  88. 88. <ul><li>date </li></ul><ul><li>신속하고 쉬운 방법으로 Date 의 형식을 줄 수 있다 . </li></ul><ul><li>debug </li></ul><ul><li>화면에 [ Debug ] 하이퍼링크를 출력한다 . 이 하이퍼링크를 클릭하면 밸류 스택의 내용과 Stack Context 내용을 출력한다 . </li></ul><ul><li>i18n </li></ul><ul><li>리소스 번들을 얻고 그 내용을 밸류 스택에 저장한다 . </li></ul>데이터 태그 태그라이브러리
  89. 89. <ul><li>include </li></ul><ul><li>서블릿의 출력 ( 서블릿의 결과 또는 JSP 페이지 ) 내용을 현재 출력할 페이지에 포함시킨다 . </li></ul><ul><li>param </li></ul><ul><li>파라미터로서 사용된다 . </li></ul><ul><li>push </li></ul><ul><li>밸류 스택 안에 값을 저장한다 . </li></ul><ul><li>set </li></ul><ul><li>특정 스코프의 변수에 값을 할당한다 . </li></ul>데이터 태그 태그라이브러리
  90. 90. <ul><li>text </li></ul><ul><li>I18n 텍스트 메시지를 렌더링 한다 . </li></ul><ul><li>url </li></ul><ul><li>이 태그는 url 을 생성할 때 사용한다 . </li></ul><ul><li>property </li></ul><ul><li>특정 값을 정의하지 않는다면 스택의 맨 위의 값을 프로퍼티로 취한다 . 액션의 프로퍼티의 값을 화면에 출력할 수 있다 . </li></ul>데이터 태그 태그라이브러리
  91. 91. <ul><li>일반적으로 입력 컨트롤을 다루는 태그 </li></ul><ul><li>체크박스 , 체크박스의 목록 , 콤보박스 등과 같은 컨트롤로 구성되어 있다 </li></ul><ul><li>checkbox </li></ul><ul><li>type 이 checkbox 인 HTML INPUT 요소로 렌더링된다 . 밸류 스택으로부터 특정 프로퍼티에 의해 내용을 설정할 수 있다 . </li></ul><ul><li>checkboxlist </li></ul><ul><li>list 로부터 체크박스 시리즈를 생성한다 . 사용방법은 <s:select/> 또는 <s:radio/> 와 비슷하지만 체크박스 태그를 생성한다 . </li></ul>폼 태그 태그라이브러리
  92. 92. <ul><li>combobox </li></ul><ul><li>콤보박스는 기본적으로 텍스트를 입력할 수 있는 HTML input 과 HTML select 를 그룹으로 함께 제공한다 . </li></ul><ul><li>datetimepicker </li></ul><ul><li>datetimepicker 요소를 렌더링한다 . DateTimePicker 위젯은 연도 , 월 , 주를 증가 시키면서 날짜를 쉽게 선택할 수 있게 해주는 기능을 갖는다 . </li></ul>폼 태그 태그라이브러리
  93. 93. <ul><li>doubleselect </li></ul><ul><li>첫 번째 리스트박스의 선택된 내용에 따라 두 번째의 내용이 변경되어 출력하는 HTML select 요소를 렌더링한다 . </li></ul><ul><li>head </li></ul><ul><li>HTML 파일에 대한 HEAD 섹션의 부분을 렌더링한다 . 테마 CSS 가 필요하고 자바스크립트를 포함할 때 유용하다 . </li></ul><ul><li>file </li></ul><ul><li>HTML file 요소를 렌더링한다 . </li></ul>폼 태그 태그라이브러리
  94. 94. <ul><li>form </li></ul><ul><li>HTML form 요소를 렌더링한다 . </li></ul><ul><li>hidden </li></ul><ul><li>type 이 hidden 인 HTML input 요소로 렌더링된다 . </li></ul><ul><li>label </li></ul><ul><li>HTML label 로 렌더링된다 . </li></ul><ul><li>optiontransferselect </li></ul><ul><li>기본적으로 2 개의 select 컴포넌트 사이에 option 을 이동할 수 있는 컴포넌트를 생성한다 . </li></ul>폼 태그 태그라이브러리
  95. 95. <ul><li>optgroup </li></ul><ul><li>select 태그 내에 삽입할 optgroup 컴포넌트를 생성한다 . </li></ul><ul><li>password </li></ul><ul><li>type 이 password 인 HTML input 요소로 렌더링된다 . </li></ul><ul><li>reset </li></ul><ul><li>리셋 버튼으로 렌더링된다 . 폼을 리셋 하기 위하여 form 태그와 함께 사용된다 . </li></ul><ul><li>select </li></ul><ul><li>type 이 select 인 HTML input 요소로 렌더링된다 . </li></ul>폼 태그 태그라이브러리
  96. 96. <ul><li>submit </li></ul><ul><li>서브밋 버튼으로 렌더링된다 . 비동기적인 폼 제출을 위해 form 태그와 함께 사용된다 . </li></ul><ul><li>textarea </li></ul><ul><li>HTML textarea 요소로 렌더링된다 . </li></ul><ul><li>textfield </li></ul><ul><li>type 이 text 인 HTML input 요소로 렌더링된다 . </li></ul><ul><li>token </li></ul><ul><li>폼의 이중 서브밋을 방지 한다 . </li></ul>폼 태그 태그라이브러리
  97. 97. <ul><li>updownselect </li></ul><ul><li>셀렉트박스의 요소를 위 , 아래로 이동 시킬 수 있는 버튼을 가진 select 컴포넌트를 생성한다 . </li></ul>폼 태그 태그라이브러리
  98. 98. <ul><li>폼에 종속되지 않고 단독으로 처리할 수 있는 태그로 구성 . </li></ul><ul><li>비동기적인 비즈니스 로직을 수행할 수 있는 Ajax 기능을 포함한 태그 제공 </li></ul><ul><li>actionerror </li></ul><ul><li>액션에 오류가 있다면 actionerror 를 렌더링한다 . </li></ul><ul><li>actionmessage </li></ul><ul><li>액션 메시지가 있다면 actionmessage 를 렌더링한다 . </li></ul>넌 폼 태그 태그라이브러리
  99. 99. <ul><li>component </li></ul><ul><li>특정 템플릿을 사용하는 커스텀 UI 위젯을 렌더링한다 . </li></ul><ul><li>div </li></ul><ul><li>ajax 테마를 사용할 때 div 태그는 전체 페이지를 갱신하지 않고 해당 내용을 갱신하기 위하여 현재 페이지로부터 원격 호출을 제공한다 . </li></ul><ul><li>fielderror </li></ul><ul><li>필드 오류가 있다면 fielderror 를 렌더링한다 . </li></ul>넌 폼 태그 태그라이브러리
  100. 100. <ul><li>table </li></ul><ul><li>모델링 테이블을 렌더링 하기 위한 태그 </li></ul><ul><li>tabbedPanel </li></ul><ul><li>tabbedpanel 위젯은 Ajax 컴포넌트이다 . 각 탭은 로컬 또는 리모트 컨텐츠가 될 수 있다 . ( 사용자가 탭을 선택할 때 갱신된다 .) </li></ul><ul><li>tree </li></ul><ul><li>Ajax 를 지원하는 트리 위젯을 렌더링한다 . </li></ul><ul><li>treenode </li></ul><ul><li>Ajax 를 지원하는 트리 위젯 안의 트리 노드를 렌더링한다 . </li></ul>넌 폼 태그 태그라이브러리
  101. 101. <ul><li>스트럿츠 2 를 사용하기 위해서 web.xml 에 등록할 수 있는 것들 . </li></ul><ul><li>FilterDispacther : 스트럿츠 2 컨트롤러 필터 ( 필수 ) </li></ul><ul><li>Sitemesh </li></ul><ul><li>PageFilter ( 사이트메쉬 JSP 페이지 필터 ) </li></ul><ul><li>FreeMarkerPageFilter ( 사이트메쉬 프리마커 페이지 필터 ) </li></ul><ul><li>VelocityPageFilter ( 사이트메쉬 벨로시티 페이지 필터 ) </li></ul><ul><li>ActionContextCleanUp : 액션 컨텍스트 클린업 필터 </li></ul><ul><li>DWRServlet : DWR 서블릿 </li></ul><ul><li>FacesServlet : JSF 서블릿 환경설정 </li></ul><ul><li>StrutsTilesContainerFactory : 타일즈 컨테이너 팩토리 </li></ul><ul><li>contextConfigLocation : 스프링 환경설정 파일 </li></ul><ul><li>TilesListener : 타일즈 리스너 </li></ul><ul><li>ContextLoaderListener : 스프링 컨텍스트 로더 리스너 </li></ul>web.xml 환경설정
  102. 102. <web-app … > <filter> <filter-name>struts</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> 스트럿츠 2 컨트롤러 필터 디스패처 등록 환경설정
  103. 103. <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?> <!DOCTYPE struts PUBLIC &quot;-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quot; &quot;http://struts.apache.org/dtds/struts-2.0.dtd&quot;> <struts> <package name=&quot;person&quot; extends=&quot;struts-default&quot; namespace=&quot;&quot;> <action name=&quot;myAction&quot; class=&quot;example.MyAction&quot;> <result>/myAction.jsp</result> </action> </package> </struts> 스트럿츠 2 환경설정 파일 : struts.xml 환경설정
  104. 104. <struts> < include file=&quot;struts-default.xml&quot;/> < include file=&quot;config-browser.xml&quot;/>   <package name=&quot;default&quot; extends=&quot;struts-default&quot;> ... </package>   <include file=&quot;other.xml&quot;/> </struts> struts.xml 에 다른 설정 파일 포함 환경설정 <ul><li>기본 파일인 struts.xml 은 <include/> 요소를 사용해서 다른 설정파일을 포함할 수 있다 . </li></ul>
  105. 105. <struts> <constant name=&quot;struts.devMode&quot; value=&quot;true&quot; /> </struts> struts.devMode = true <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <init-param> <param-name>struts.devMode</param-name> <param-value>true</param-value> </init-param> </filter> 상수 값 정의 환경설정 <ul><li>struts.xml </li></ul><ul><li>struts.properties </li></ul><ul><li>web.xml </li></ul>
  106. 106. struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml 상수 값 검색 환경설정
  107. 107. <ul><li>액션 , 리절트 , 리절트 타입 , 인터셉터 , 인터셉터 스택을 논리적인 설정 단위로 그룹화 한다 . </li></ul><ul><li>패키지는 상속될 수 있다 </li></ul><ul><li>하위 패키지에 의해서 오버라이드 될 수 있다 . </li></ul><ul><li>패키지는 후에 참조할 때 사용할 키 값으로 사용될 하나의 필수 name 속성을 갖는다 . </li></ul><ul><li>extends 속성은 선택사항이며 , 다른 패키지의 설정을 상속할 때 사용한다 . ( 모든 인터셉터 , 인터셉터 스택 , 액션 설정 포함 ) </li></ul><ul><li>extends 에 의해서 참조되는 패키지는 그것을 상속하는 패키지보다 위에 정의되어 있어야 한다 . </li></ul>패키지 설정 환경설정
  108. 108. <ul><li>name </li></ul><ul><li>패키지의 이름 ( 필수 ) </li></ul><ul><li>extends </li></ul><ul><li>상속받을 패키지 이름 </li></ul><ul><li>namespace </li></ul><ul><li>패키지 네임스페이스 이름 </li></ul><ul><li>abstract </li></ul><ul><li>추상 패키지 선언 여부 ( 패키지 안에서 액션 설정이 필요 없음 ) </li></ul>패키지 속성 환경설정
  109. 109. <struts> <package name=&quot;employee&quot; extends=&quot;default&quot; namespace=&quot;/employee&quot;> <default-interceptor-ref name=&quot;crudStack&quot;/> <action name=&quot;list&quot; method=&quot;list&quot; class=&quot;org.apache.struts2.showcase.action.EmployeeAction&quot;> <result>/empmanager/listEmployees.jsp</result> <interceptor-ref name=&quot;basicStack&quot;> </action> </package> </struts> 패키지 설정 예 환경설정
  110. 110. 네임스페이스 환경설정 <ul><li>namespace 속성은 액션 설정을 고유의 접두어를 가지고 논리적인 모듈로 분리한다 . </li></ul><ul><li>네임스페이스는 다른 네임스페이스를 가지고 동일한 액션 이름을 가진 액션이 서로 충돌하지 않도록 한다 . </li></ul><ul><li>루트 네임스페이스 </li></ul><ul><li>루트 네임스페이스 Root Namespace 는 &quot;/&quot; 이다 . </li></ul><ul><li>루트는 컨텍스트 경로 바로 밑의 요청을 받았을 때의 네임스페이스이다 . 만약 로컬 액션을 찾을 수 없다면 기본 네임스페이스에서 찾게 된다 . </li></ul><ul><li>기본 네임스페이스 </li></ul><ul><li>기본 네임스페이스 Default Namespace 는 &quot;&quot; 빈 문자열이다 . </li></ul><ul><li>기본 네임스페이스는 모든 것을 다 잡아낼 필요가 있을 때 사용 . </li></ul><ul><li>액션을 특정 네임스페이스에서 찾을 수 없다면 기본 네임스페이스를 찾는다 . </li></ul>
  111. 111. <package name=&quot;student&quot; namespace=&quot; /student &quot;> <action name=&quot; save &quot; class=&quot;example.StudentAction&quot;> <result>listStudent.jsp</result> </action> </package> <package name=&quot;professor&quot; namespace=&quot; /professor &quot;> <action name=&quot; save &quot; class=&quot;example.ProfessorAction&quot;> <result>listProfessor.jsp</result> </action> </package> 네임스페이스 예 환경설정
  112. 112. 액션 설정 환경설정 <ul><li>액션 이름 </li></ul><ul><li>액션 클래스 </li></ul><ul><li>액션 메소드 </li></ul><ul><li>리절트 타입 </li></ul><ul><li>리절트 페이지 </li></ul><ul><li>인터셉터 스택 </li></ul><ul><li>* 필수 요소는 name 속성 하나이다 . </li></ul>
  113. 113. <action name= &quot; logon&quot; class= &quot; example .SecurityAction &quot; method=&quot;logon> <result> logon.jsp </result> </action> 액션 이름 리절트 (type 생략 시 기본값은 dispatcher 타입 사용 name 생략 시 기본값은 success 리절트 코드 사용 ) 리절트 페이지 정의 액션 클래스 액션 메소드 (method 속성 생략 시 execute() 사용 ) 액션 설정 환경설정
  114. 114. <action name= &quot; logon&quot; class= &quot; example .SecurityAction &quot; method= &quot; logon &quot; > <interceptor-ref name=&quot;basicStack&quot;> <result type=&quot;redirect-action&quot;>menu</result> <result name=&quot;input&quot;>/example/logon.jsp</result> </action> 액션 이름 다른 액션을 리절트로 사용 JSP 를 리절트로 사용 액션에 인터셉터 스택 적용 액션 클래스 액션 메소드 다중 리절트 정의 액션 설정 예 환경설정
  115. 115. <action name=&quot;delete&quot; class=&quot;example.MyAction&quot; method =&quot; delete &quot;> public class MyAction { public String delete () throws Exception { ... return &quot;success&quot;; } } 액션 메소드 설정 환경설정 <ul><li>하나의 액션 클래스 안에 여러 개의 엔트리 포인트를 만들 수 있다 . </li></ul>
  116. 116. <action name=&quot; * Data &quot; class=&quot;example.MyAction&quot; method=&quot; {1} &quot;> add Data add () remove Data remove () edit Data edit () view Data view () find Data find () * 에 해당하는 액션의 접두어가 메소드 이름이 된다 . 와일드 카드 매핑 환경설정 <ul><li>액션 매핑은 패턴을 사용하여 여러 개의 액션을 하나의 액션 정의로 설정할 수 있다 . </li></ul>
  117. 117. <package name= &quot; default&quot; extends= &quot; struts-default&quot;> < default-action-ref name=&quot;underConstruction&quot;> <action name=&quot;underConstruction&quot;> <result>/underConstruction.jsp</result> </action> </package> 기본 액션 매핑 환경설정 <ul><li>액션 요청 시 요청과 일치하는 액션을 찾지 못할 경우에는 호출되는 기본 액션을 정의할 수 있다 . </li></ul>
  118. 118. <package ... > < global-results > <result name=&quot;error&quot;>/Error.jsp</result> <result name=&quot;invalid.token&quot;>/Error.jsp</result> <result name=&quot;login&quot; type=&quot;redirect-action&quot;> Logon!input </result> < /global-results > </package> 글로벌 리절트 환경설정 <ul><li>액션이 리절트를 공유할 필요가 있다면 글로벌 리절트의 집합을 각 패키지에 정의할 수 있다 . </li></ul><ul><li>먼저 액션의 로컬 리절트를 찾는다 . </li></ul><ul><li>적절한 로컬 리절트를 찾지 못하면 , 글로벌 리절트를 찾는다 . </li></ul>
  119. 119. 리소스 번들 환경설정 <ul><li>스트럿츠 2 의 리소스 번들 </li></ul><ul><li>액션 리소스 번들 </li></ul><ul><li>부모 클래스 리소스 번들 </li></ul><ul><li>인터페이스 리소스 번들 </li></ul><ul><li>패키지 리소스 번들 </li></ul><ul><li>글로벌 리소스 번들 </li></ul><ul><li>커스텀 리소스 번들 </li></ul>
  120. 120. 리소스 번들에 정의한 내용 적용 대상 환경설정 <ul><li>사용자 인터페이스 태그 </li></ul><ul><li>ValidationAware 인터페이스의 메시지와 오류 </li></ul><ul><li>ActionSupport 클래스를 상속받은 클래스 ( 액션 클래스 ) 에서 getText() 메소드를 통해 사용할 수 있다 </li></ul>
  121. 121. 리소스 번들 사용법 환경설정 <ul><li>ActionSupport 클래스를 상속받은 클래스에서 getText() 메소드를 이용하여 소스 내에서 사용 . </li></ul><ul><li>ActionSupport 클래스를 상속받은 액션 클래스를 호출한 후 실행되는 리절트 페이지에서 사용 . </li></ul><ul><li><s:text />, <s:i18n /> 태그 또는 UI 태그의 key 속성에서 사용할 수도 있다 . </li></ul><ul><li>기타 속성에서 사용 </li></ul><ul><li>예를 들면 , value 속성에 &quot;%{getText('some.key')}&quot; OGNL 표현식의 부분으로 getText() 메소드를 이용하여 리소스 번들의 내용을 사용할 수 있다 . </li></ul>
  122. 122. 액션 리소스 번들 환경설정 <ul><li>액션 클래스와 동일한 패키지 안에 액션 클래스와 동일한 이름과 '.properties' 확장명을 가진 파일 . </li></ul><ul><li>액션 클래스 : src/example/action/MyAction.java </li></ul><ul><li>기본 액션 리소스 번들 </li></ul><ul><li>src/example/action/MyAction.properties </li></ul><ul><li>지역화 액션 리소스 번들 ( 한국어 ) </li></ul><ul><li>src/example/action/MyAction_ko.properties </li></ul><ul><li>지역화 액션 리소스 번들 ( 영어 ) </li></ul><ul><li>src/example/action/MyAction_en.properties </li></ul>
  123. 123. # 리소스 번들 파일 label.sample = 이 것은 properties 파일 안의 메시지입니다 . // 액션 클래스 public class MyAction extends ActionSupport { private String message; public String execute() throws Exception { message = getText(&quot; label.sample &quot;)); return SUCCESS; } ... } #JSP <s:text name=&quot; label.sample &quot;/> <s:submit key=&quot; label.sample &quot;/> <s:property value=&quot; %{getText(‘label.sample’)} &quot;/> 리소스 번들 사용 예 환경설정
  124. 124. 액션 리소스 번들 부모 클래스 리소스 번들 인터페이스 리소스 번들 모델 드리븐의 모델 리소스 번들 패키지 리소스 번들 글로벌 리소스 번들 리소스 번들 검색 순서 환경설정
  125. 125. 플러그인 플러그인 <ul><li>Sitemesh : 페이지 레이아웃 </li></ul><ul><li>JFreeChart : 차트 출력 </li></ul><ul><li>JasperReport : 리포트 출력 </li></ul><ul><li>Spring : 의존성 주입 </li></ul><ul><li>CodeBehind : 기본 매핑 , 기본 리절트 제공 </li></ul><ul><li>ConfigBrowser : 환경 설정 상태 뷰 제공 </li></ul><ul><li>JSF : JSF 컴포넌트를 사용할 수 있게 함 </li></ul><ul><li>Plexus : 의존성 주입 ( 시험적인 버전 ) </li></ul>
  126. 126. 플러그인 플러그인 <ul><li>Struts1 : Struts1 의 Action, ActionForm 사용 </li></ul><ul><li>Tiles : 페이지 레이아웃 </li></ul>
  127. 127. Sitemesh 플러그인 <ul><li>대형 사이트를 구축할 때 웹 페이지 레이아웃을 쉽게 구성하기 위한 프레임워크이다 . </li></ul><ul><li>요청된 정적인 HTML 또는 동적으로 생성된 HTML 페이지에 대한 요청을 가로채어 , 페이지를 파싱하고 , 컨텐츠로부터 프로퍼티와 데이터를 얻어 원본 페이지를 수정하여 적절한 최종 페이지를 생성한다 </li></ul><ul><li>사이트메쉬는 Gang of Four Decorator 디자인 패턴을 기반으로 만들어진 프레임워크 . </li></ul>
  128. 128. welcome.jsp - Home Page example.com 광고 배너 1 검색 최신 뉴스 . . search.cgi - Search Results 검색 결과 . . . . . 광고 배너 2 메타 데이터 바디 내용 메타 데이터 example.com: {title} 메뉴 . 홈 . 뉴스 . 검색 . 공지 copyright 2007 example.com welcome.jsp - Home Page example.com: Home Page 메뉴 . 홈 . 뉴스 . 검색 . 공지 copyright 2007 example.com example.com 검색 최신 뉴스 . . 광고 배너 1 search.cgi - Search Results example.com: Search Results 메뉴 . 홈 . 뉴스 . 검색 . 공지 copyright 2007 example.com 검색 결과 . . . . . 광고 배너 2 decorator 에 의해서 레이아웃을 구성 . 최종 페이지를 생성한다 . decorator 에 의해서 레이아웃을 구성한다 . 최종 페이지를 생성한다 . decorator 에 정의된 레이아웃 . Sitemesh 작업 개념도 플러그인
  129. 129. JFreeChart 플러그인 플러그인 <ul><li>다양하고 유용한 차트를 출력 </li></ul><ul><li>100% 자바 차트 라이브러리이다 . </li></ul><ul><li>특징 </li></ul><ul><li>많은 유형의 차트 타입을 지원하며 , API 를 지원한다 . </li></ul><ul><li>확장하기 쉽도록 디자인되었고 , 서버 측과 클라이언트 측 모두 타겟 . </li></ul><ul><li>PNG, JPEG, 벡터 그래픽 파일 형식 (PDF, EPS, SVG) 와 같은 여러 가지의 출력 형태를 지원 . </li></ul><ul><li>액션 클래스가 생성한 차트를 손쉽게 반환 . </li></ul><ul><li>생성한 차트를 HTTP 응답에 직접 스트리밍하는 대신 플러그인이 'ChartResult' 를 제공하여 처리한다 . </li></ul>
  130. 130. JFreeChart 샘플 플러그인
  131. 131. JasperReport 플러그인 플러그인 <ul><li>다양한 데이터를 원하는 양식으로 리포팅 할 때 적용할 수 있는 오픈 소스 리포팅 툴이다 . </li></ul><ul><li>PDF, HTML, XLS, CSV, XML 파일 등 다양한 포맷의 리포트를 만들 수 있다 . </li></ul><ul><li>리포트 디자인 툴 : iReport </li></ul><ul><li>JasperReport 전용 디자인 툴 </li></ul><ul><li>iReport 를 사용하여 여러 가지 데이터 소스로부터 바인딩 데이터를 구성하고 이를 기반으로 화면을 구성할 수 있으며 , 컴파일 및 실행을 통해 디자인된 결과 화면을 미리 확인할 수 있어 편리하다 </li></ul>
  132. 132. JasperReport 샘플 플러그인
  133. 133. iReport 를 사용한 JasperReport 디자인 플러그인
  134. 134. Why not? 플러그인 <ul><li>오픈 소스 도입을 아직도 꺼리는가 ? </li></ul><ul><li>많은 상용 벤더들도 오픈 소스를 제품에 적용 </li></ul><ul><li>남들이 다 준비한 후에는 이미 늦다 . </li></ul><ul><li>리딩하려면 도전하라 . </li></ul><ul><li>기술 지원 때문에 고객이 꺼린다 ? </li></ul><ul><li>기술 지원을 할 수 있는 역량을 갖추고 적극적인 마케팅을 한다 . </li></ul><ul><li>새로운 시장을 개척할 수 있다 . </li></ul><ul><li>이것이 블루오션이다 . </li></ul><ul><li>남들이 어렵다고 생각하는 곳에 기회가 있다 . </li></ul>
  135. 135. 감사합니다 .

×