4. Implementing WebWork actions

4.1 The Action interface

  • WebWork의 action이 되기 위해서는 오직 com.opensymphony.xwork.Action interface만 구현하면 됩

    public String execute() throws Exception

4.1.1 Result codes

  • execute() 메소드에서는 String 값을 리턴해야 한다.
  • return 되는 String 값은 어떤 값이든 상관 없다.
  • INPUT, SUCCESS, ERROR, NONE, LOGIN은 Action interface에 static final String으로 정의되어 있다.

public String saveCategory() {
    if (category == null) {
        return INPUT;
    }
    categoryDAO.makePersistent(category);
    
    return SUCCESS;
}

  • xwork.xml 파일에 Action의 리턴값에 대해 각각의 행동을 맵핑해야 한다.

<action name="saveCategory" class="org.hibernate.auction.web.actions.categories.EditCategory" method="saveCategory">
    <interceptor-ref name="crudStack"/>
    <result name="input">createCategory.jsp</result>
    <result name="success" type="redirect">dashboard.action</result>
</action> 

4.1.2 Handling exceptions

  • Action interface의 execute() method에서는 java.lang.Exception를 throws 하도록 선언되어 있다.

4.2 Using the ActionSupport base class

  • ActionSupport 클래스는 action 클래스를 쉽게 개발 할 수 있도록 다양한 기능들을 기본적으로 구현해주고 있다.
  • action들은 ActionSupport를 상속할 필요도 없고 추가적인 인터페이스도 구현할 필요도 없이 com.opensymphony.xwork.Action만 구현하면 된다.
  • ActionSupport 클래스가 기본적으로 구현해주는 인터페이스들
    • com.opensymphony.xwork.Validateable : action에서 검증을 하기 위한 validate() 메소드 제공
    • com.opensymphony.xwork.ValidationAware : action과 field-level의 에러를 저장하기 위한 메소드 제공
    • com.opensymphony.xwork.TextProvider : localized message text를 얻기 위한 메소드 제공
    • com.opensymphony.xwork.LocaleProvider : locale 정보를 얻기위한 getLocale() 메소드를 제공

4.3 Understanding basic validation

  • 제목 링크 참고

4.4 Using localized message texts

4.4.1 Retrieving the user's locale: LocaleProvider

  • com.opensymphony.xwork.LocaleProvider : Locale정보를 제공하는 인터페이스 (java.util.Locale)
  • ActionSupport에 locale 정보를 제공하는 코드가 기본적으로 구현되어 있다.

ActionContext.getContext().getLocale()

4.4.2 Displaying the localized text: TextProvider

  • com.opensymphony.xwork.TextProvider : 지역화 된 텍스트 메세지 기능을 제공하는 인터페이스 (java.util.ResourceBundle)
    • text 정보를 담은 파일은 패키지 클래스가 있는 위치에 있어야하고, 파일명은 클래스명과 동일
    • 클래스명 : org.hibernate.auction.web.actions.users.CreateUser 클래스에서 사용되는 프러퍼티 파일
    • 경로: org/hibernate/auction/web/actions/users
    • 파일명 : CreateUser_ko.properties
    • 파일 내용 : user.exists=The user already exists

public void validate() {
    // see if the name already exists
    String username = this.user.getUsername();
    User existing = userDAO.findByUsername(username);
    if (existing != null) {
        addFieldError("user.username", getText("user.exists"));
    }
}

4.5 Advanced inputs

4.5.1 Intermediary objects

  • Intermediary objects는 입력값과 domain object 사이에 다리 역할을 함.
  • 임시적인 데이터 저장소로써 데이터검증 , 타입변환 , 필드조작등의 역할을 수행함

4.5.2 Using domain objects directly

  • domain object 프로퍼티에 바로 접근하게 구성

<ww:form action="createUser">
<ww:textfield label="%{getText('username')}" name="user.username"/>
<ww:password label="%{getText('password')}" name="user.password"/>
<ww:textfield label="%{getText('firstname')}" name="user.firstname"/>
<ww:textfield label="%{getText('lastname')}" name="user.lastname"/>
<ww:textfield label="%{getText('email')}" name="user.email"/>
<ww:submit value="Submit"/>
</ww:form>

  • getUser(), setUser()를 이용

public class CreateUser extends ActionSupport implements UserDAOAware {
  User user;
  ...
  public String execute() throws Exception {
   userDAO.makePersistent(user);
   return SUCCESS;
  }
  public User getUser() {
   return user;
  }
  public void setUser(User user) {
    this.user = user;
  }

  • 웹워크가 인스턴트를 생성한 후 자동으로 값을 설정 함
  • 어느 레벨이든 상관 없음 (user.address.street → getUser().getAddress().setStreet(...))

Advantages of using domain objects

  • value object를 만들 필요도 없고 domain object와 value object간의 mapping코드를 만들지 않아도 되어 시간 절약 됨
  • 복잡한 도메인 오브젝트들도 편리하게 사용 할 수 있음(chapter 12 에서 설명 예정)
  • Object Graph Navigation Language (OGNL) 을 지원 (chapter 8 에서 설명 예정)

4.6 Working with ModelDriven actions

  • 제목 링크 참고

4.7 Accessing data through the ActionContext

  • 제목 링크 참고

4.8 Handling file uploads

  • 제목 링크 참고

문서에 대하여

  • 이 문서의 내용은 Webwork In Action 교재를 스터디 하면서 정리한 내용 입니다.
  • 최초작성자 : 김정식
  • 최초작성일 : 2007년 9월 21일
  • 이 문서는 오라클클럽 자바 웹개발자 스터디 모임에서 작성하였습니다.
  • 이 문서를 다른 블로그나 홈페이지에 퍼가실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^\^