Struts basic
From JCFWiKi
Copyright © 2008 Daewoo Information Systems Co., Ltd. |
|
JCF의 웹 애플리케이션 구성 계층중 프리젠테이션 계층에 적용된 스트럿츠2에 대한 설명을 다룬다. |
목차 |
[편집] 프리젠테이션 계층
[편집] 프리젠테이션 계층의 특징
- 클라이언트의 요청(Request)를 최초로 받음
- 처리결과에 대한 결과(Response)를 다시 클라이언트에게 보냄
- 모델1과 모델2 방식
- 프리젠테이션 티어를 위한 웹 프레임워크 및 기술들
- Struts
- WebWork
- Tapestry
- JSP/Servlet/JSF
[편집] 모델2(MVC) 아키텍처
- 어플리케이션을 논리적인 3개의 모듈로 분리
- Model – 지속성 및 비즈니스 로직 처리
- View – 사용자 인터페이스(UI) 처리
- Controller – 어플리케이션 흐름 및 이벤트 처리
- 다양한 요구 사항을 가지는 웹 어플리케이션에 적합
- 장점
- 분리하여 디자인
- 코드 중복을 줄임
- 중앙 집중적 컨트롤
- 어플리케이션 수정에 용이
[편집] 스트럿츠2 개요
[편집] 스트럿츠2 개요
- Apache Software Foundation (ASF) 프로젝트
- WebWork의 아키텍처 도입
- 스트럿츠1과 완전히 달라진 아키텍처
- XML 기반의 컨트롤러 필터
- 오픈 소스 웹 어플리케이션 프레임웍
- 프리젠테이션을 위한 웹 프레임워크
- Model-View-Controller (MVC) 패턴 기반
- 다른 프레임웍과 연동 가능
- Velocity, XSLT, Spring FW, Expresso, ADF, etc
- 웹 어플리케이션 개발 시, Common problems 해결
- common infrastructure service 제공
[편집] 스트럿츠2 특징
[편집] 핵심 기능
- 자바5 지원(Servlet API 2.4/JSP API 2.0/Java 5)
- 자바 1.4도 지원가능
- 유연한 요청 처리(인터셉터/액션맵퍼)
- 액션과 분리된 검증(Validation)
- 다양한 국제화 계층 제공(액션 단위, 패키지 단위, 전역 단위, ..)
- 의존성 주입(DI)
- 설정 파일의 분리
- Annotation 설정 지원
[편집] 화면
- 테마와 템플릿 기반의 강력한 태그라이브러리
- AJAX의 쉬운 적용(태그와 테마)
- 다양한 VIEW 제공(JSP, FreeMarker, Velocity, PDF, and JasperReports)
- 파라미터를 모델 객체로 자동 매핑(OGNL)
[편집] 스트럿츠2 아키텍쳐
- 스트럿츠2는 필터 기반
- 스트럿츠1은 서블릿 기반이었음.
- POJO기반
- Form 대신 POJO 사용(모델 클래스)
- POJO Action 클래스 사용
- 다양한 인터셉터 적용
- RequestProcessor의 역할
- 공통적인 요구 기능 제공
- 편리한 기본 설정 정보
- 편리해진 struts.xml 작성
- 현명한 디폴트값 지원
- Annotation 지원
- struts.xml 설정 대체 가능
[편집] Struts2 Configuration
[편집] Action
[편집] 정의
- 하나의 액션은 하나의 URL 요청이다.
- 개개의 액션은 XML 파일에 정의된다.
- 하나의 액션은 물리적인 액션 클래스의 메소드에 매핑 된다.
- 액션에 매핑된 메소드는 스트링을 반환하며, 이 스트링은 Result를 결정한다.
|
[편집] 액션 작성하기
- 액션 정의 - struts.xml
<action name=“action1” class=“com.PrintAction” method=“printLine”> <result name=“SUCCESS”>success.jsp</result> </action>
- 액션 클래스의 작성 - PrintAction.java
package com; public class PrintAction{ public String printLine(){ system.out.println(“SUCCESS”); return “SUCCESS”; } }
- 액션 결과 페이지 - success.jsp
<html> . . <body> <h1>Your Action is succeeded. </body> </html>
[편집] Result
- 정의
- Result는 액션의 결과이다.
- 액션의 수행 후 반환되는 스트링 값에 일치하는 Result를 수행하도록 해준다.
- Result는 jsp이거나, 다른 액션이거나, 또 다른 자원일 수 있다.
- 기본적으로 포워드이며, 리다이렉트의 경우 별도로 명시하여야 한다.
- Result의 구성
<action name=“action1”> <result>success.jsp</result> </action>
- 액션의 결과를 JSP로 연결시켜주는 방법
- 가장 일반적인 방법 중에 하나이다.
- 포워드 방법으로 연결시켜준다.
<action name=“action1”> <result type=“redirect”>success.jsp</result> </action>
- 리다이렉트 방법으로 연결시켜준다.
[편집] Interceptor
- 인터셉터
- 모든 액션 요청(Action Request)에 대해 공통적으로 적용되어야 하는 공통 기능들을 제공하는 모듈
- 액션 수행의 전과 후에 작동된다.
- 파라미터 매핑 모델 생성, 예외 처리, 국제화 , 타입 컨버전, 검증(Validation), …
- 사용자가 자신만의 인터셉터를 작성하여 적용할 수 있다.
- 스트럿츠2가 자체적으로 기본적인 인터셉터들은 제공하고 있으며, 디폴트 XML(struts-default.xml) 파일에 정의되어 있다.
- 인터셉터 스택
- 다수의 인터셉터들을 묶어 정의함으로서, 하나 이상의 인터셉터들이 일괄적으로 적용되도록 해준다.
- 인터셉터는 정의된 순서대로 적용 된다.
- 기본적인 인터셉터 스택은 디폴트 XML(struts-default.xml) 파일에 정의되어 있다.
- 사용자만의 인터셉터 스택을 정의하여 사용할 수 있다.
- 패키지별 액션별로 적용될 수 있다.
[편집] package
- 정의
- 모든 스트럿츠 설정 요소들을 가진다.
- 액션, 결과, 인터셉터 등 모든 요소들은 반드시 패키지에 포함되어 정의된다.
- 패키지들간에는 확장을 통한 상속이 가능하다.
- 상위 패키지에 정의된 모든 설정 내용은 확장된 하위 패키지에서 중복 정의 없이 사용이 가능하다.
- 패키지는 이름과 네임스페이스를 가지며, 각각의 패키지 이름은 모든 패키지들 중에서 유일해야 한다.
- 패키지의 구성
<package name=“p1” namespace=“/p1”> <action name=“action1”> <result>success.jsp</result> </action> <action name=“action2”> <result>success2.jsp</result> </action> </package> <package name=“p2” extends=“p1” namespace=“/p2”> <action name=“action1”> <result>success3.jsp</result> </action> </package>
- p1은 2개의 액션 정의를 가진다.
- p2는 하나의 액션 정의를 가지며, p1을 확장하고 있다.
- 패키지의 네임스페이스는 액션 url을 구분해 주는 역할을 한다.
- 따라서 p1에 정의된 action1의 실제 접근url은 /p1/action1.action 이다.
- 역시 p2 패키지의 action1의 실제 url은 /p2/action1.action 이다.
[편집] 간단한 스트럿츠2 애플리케이션 작성
[편집] 라이브러리 포함
- TO-DO
[편집] 필터 등록
- /WEB-INF/web.xml에 필터 등록
- 스트럿츠2는 필터 기반으로 작동되기 때문에, web.xml에 스트럿츠 필터를 등록하여야 하며, 이를 통해 웹 어플리케이션이 배포될 때 스트럿츠2가 자동으로 작동한다.
<web-app> <filter> <filter-name>struts-cleanup</filter-name> <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class> </filter> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts-cleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> … </web-app>
[편집] struts.xml, struts-user.xml(추가모듈)
- 클래스 패스 루트에 위치하며 공통적인 설정 정보를 명시한다
- 기본적인 설정 정보
- struts.devMode(개발 시에만 true로 설정)
- struts.objectFactory(Spring 연동을 위해서 항상 적용)
- 추가할 웹 모듈 xml을 include 한다.
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.objectFactory" value="spring" /> <include file="config/struts-user.xml"/> <include file="config/struts-article.xml"/> </struts>
[편집] Action
[편집] PROPERTIES & GETTER & SETTER
- jcf.web.struts2.action.BaseAction를 상속한다.
- 폼으로 받을 데이터와 JSP에 결과로 전달할 객체를 멤버 변수로 선언하고, get/set 메소드를 추가한다.
- 사용하는 서비스 모듈 타입으로 멤버 변수를 선언하고 get/set 메소드를 추가한다.
- 반드시 멤버 변수에 대한 get/set 메소드를 반드시 추가해야 한다.
//설명#1public class UserAction extends BaseAction { /************* PROPERTIES **************///설명#2private User user;private List userList;
//설명#3private UserService userService;/*********** GETTER & SETTER ************/
//설명#4public User getUser() {return user; } public void setUser(User user) { this.user = user; } public List getUserList() { return userList; } public void setUserList(List userList) { this.userList = u
//설명#2public UserService getUserService() {return userService; } public void setUserService(UserService userService) { this.userService = userService; }
}
[편집] SERVICE METHODS
- 사용하는 Service 모듈은 초기화 하지 않고,Action 클래스의 멤버 변수를 사용한다.
- 메소드에서 사용하는 데이터들은 멤버변수를 활용한다.
- 메소드명은 struts 파일에 명시된 메소드명과 일치시킨다.
- return은 void가 아니고 String 형으로 처리한다.
- 특별히 action정의에 여러 result를 사용하지 않는 경우 SUCCESS를 사용한다.
public class UserAction extends BaseAction { /* **********SERVICE METHODS ************* */ public String saveUser(){User tUser = userService.getUser(user.getId()); //설명#1if( tUser == null ) userService.insertUser(user);else userService.updateUser(user); return SUCCESS; }
user = userService.getUser(user.getId());//설명#2return SUCCESS;}
userList = userService.getUserList();return SUCCESS; } public String deleteUser(){ userService.deleteUser(user.getId());
return SUCCESS; //설명#5} }
|
참조문서: |
