Struts basic

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물 : 스트럿츠2로 웹 컨트롤 구성하기
  • 작성자 : 정광선
  • 최초작성일 : 2008/05/20
  • 최종작성일 : 2008/05/20

Copyright © 2008 Daewoo Information Systems Co., Ltd.

그림:information.gif

JCF의 웹 애플리케이션 구성 계층중 프리젠테이션 계층에 적용된 스트럿츠2에 대한 설명을 다룬다.

목차

[편집] 프리젠테이션 계층

[편집] 프리젠테이션 계층의 특징

  • 클라이언트의 요청(Request)를 최초로 받음
  • 처리결과에 대한 결과(Response)를 다시 클라이언트에게 보냄
  • 모델1과 모델2 방식
  • 프리젠테이션 티어를 위한 웹 프레임워크 및 기술들
    • Struts
    • WebWork
    • Tapestry
    • JSP/Servlet/JSF
모델2(MVC) 아키텍처

[편집] 모델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 아키텍쳐

  • 스트럿츠2는 필터 기반
    • 스트럿츠1은 서블릿 기반이었음.
  • POJO기반
    • Form 대신 POJO 사용(모델 클래스)
    • POJO Action 클래스 사용
  • 다양한 인터셉터 적용
    • RequestProcessor의 역할
    • 공통적인 요구 기능 제공
  • 편리한 기본 설정 정보
    • 편리해진 struts.xml 작성
    • 현명한 디폴트값 지원
  • Annotation 지원
    • struts.xml 설정 대체 가능

[편집] Struts2 Configuration

[편집] Action

[편집] 정의

  • 하나의 액션은 하나의 URL 요청이다.
  • 개개의 액션은 XML 파일에 정의된다.
  • 하나의 액션은 물리적인 액션 클래스의 메소드에 매핑 된다.
  • 액션에 매핑된 메소드는 스트링을 반환하며, 이 스트링은 Result를 결정한다.

그림:warning.gif

  • name : 액션의 이름(URL과 일치)
  • class : 액션 요청을 처리할 클래스
  • method : 액션 요청을 처리할 메소드
  • 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>

그림:warning.gif

[편집] 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-user.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

  1. jcf.web.struts2.action.BaseAction를 상속한다.
  2. 폼으로 받을 데이터와 JSP에 결과로 전달할 객체를 멤버 변수로 선언하고, get/set 메소드를 추가한다.
  3. 사용하는 서비스 모듈 타입으로 멤버 변수를 선언하고 get/set 메소드를 추가한다.
  4. 반드시 멤버 변수에 대한 get/set 메소드를 반드시 추가해야 한다.
//설명#1
public class UserAction extends BaseAction { /************* PROPERTIES **************/
//설명#2
private User user;

private List userList;

//설명#3
private UserService userService;

/*********** GETTER & SETTER ************/

//설명#4
public 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

//설명#2
public UserService getUserService() {

return userService; } public void setUserService(UserService userService) { this.userService = userService; }

}

[편집] SERVICE METHODS

  1. 사용하는 Service 모듈은 초기화 하지 않고,Action 클래스의 멤버 변수를 사용한다.
  2. 메소드에서 사용하는 데이터들은 멤버변수를 활용한다.
  3. 메소드명은 struts 파일에 명시된 메소드명과 일치시킨다.
  4. return은 void가 아니고 String 형으로 처리한다.
  5. 특별히 action정의에 여러 result를 사용하지 않는 경우 SUCCESS를 사용한다.
public class UserAction extends BaseAction {
/* **********SERVICE METHODS ************* */
public String saveUser(){
User tUser = userService.getUser(user.getId()); //설명#1
if( tUser == null ) userService.insertUser(user);

else userService.updateUser(user); return SUCCESS; }  

public String viewUser(){ //설명#3
user = userService.getUser(user.getId());//설명#2
return SUCCESS;

}  

public String listUser(){ //설명#4
userList = userService.getUserList();

return SUCCESS; }   public String deleteUser(){ userService.deleteUser(user.getId());

return SUCCESS; //설명#5
} }

그림:information.gif

참조문서: