2013년 8월 12일 월요일

[오라클자바, 스트럿츠, struts2, struts2 action, struts2 actionform, struts2강좌, struts2교육,자바프레임워크, java framework, spring framework]Struts2 Action – ActionSupport 클래스 상속

Struts2의 기능을 최대한 활용하기 위해서는 com.opensymphony.xwork2.ActionSupport 클래스를 상속받아 Action을 만드는 것이 좋다. 이 클래스는 다음과 같은 인터페이스를 구현한 클래스 이기 때문이다. 


  오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

com.opensymphony.xwork2.Action

com.opensymphony.xwork2.Validateable

com.opensymphony.xwork2.ValidationAware

com.opensymphony.xwork2.TextProvider

com.opensymphony.xwork2.LocaleProvider

 

- Validateable 인터페이스

 

사용자기 요청 파라미터로 넘기는 값에 대해 validation check를 진행 할 validate() 메소드를 정의하고 있다.

 

package com.opensymphony.xwork2;





public interface Validateable

{



    public abstract void validate();

}

 

com.opensymphony.xwork2.ActionSupport 클래스의 validate() 메소드는 빈 메소드로 사용자 정의 Action에서 요청 파라미터에 대한 검증을 할려면 ActionSupport 클래스를 상속받아 validate() 메소드를 Override(재정의) 하면 된다.

 

validate 메소드는 struts-default.xml에 미리 선언된 workflow 인터셉터에 의해 호출된다. 즉 workflow 인터셉터에 의해 validate() 메소드가 호출되고 그 결과에 따라 Action의 실행여부가 결정된다.

 

 

- ValidationAware 인터페이스

 

Action Message, Action Error Message, Field Error Message 등을 저장, 조회할 수 있는 기능을 제공하며 Action Level의 메시지는 자바의 Collection에 저장되는데 Field Error 메시지는 필드명을 키로 Map에 저장된다.

 

package com.opensymphony.xwork2;



import java.util.Collection;

import java.util.Map;



public interface ValidationAware

{



    //액션 레벨 에러 메시지 Collection을 셋팅

    public abstract void setActionErrors(Collection collection);



    //액션 레벨 에러 메시지 Collection을 가져온다.

    public abstract Collection getActionErrors();



    // 액션 레벨 일반 메시지 Collection을 셋팅

    public abstract void setActionMessages(Collection collection);



    // 액션 레벨 일반 메시지 Collection을 가져온다.

    public abstract Collection getActionMessages();



    //필드에러 맵을 셋팅

    public abstract void setFieldErrors(Map map);



    //필드에러 맵을 가져온다.

    public abstract Map getFieldErrors();



    //현재 액션에 액션 레벨 에러 메시지를 추가

    public abstract void addActionError(String s);



    //현재 액션에 액션 레벨 일반 메시지를 추가

    public abstract void addActionMessage(String s);



//현재 액션에 지정한 필드에 대한 에러 메시지를 추가

    public abstract void addFieldError(String s, String s1);



    //현재 액션에 액션 에러 메시지가 있는지 검사

    public abstract boolean hasActionErrors();



    //현재 액션에 액션 일반 메시지가 있는지 검사

    public abstract boolean hasActionMessages();



    //액션에러 또는 필드에러가 있는지 검사

    public abstract boolean hasErrors();



    //필드에러가 있는지 검사

    public abstract boolean hasFieldErrors();

}

 

 

- TextProvider 인터페이스

 

지역화된 메시지 리소스에 접근하는 메소드를 제공

 

package com.opensymphony.xwork2;



import com.opensymphony.xwork2.util.ValueStack;

import java.util.List;

import java.util.ResourceBundle;



public interface TextProvider

{

    //메시지키로 메시지가져옴

    public abstract String getText(String s); 



    //메시지키로 메시지가져옴, 없으면 default 메시지인 s1을 던짐

    public abstract String getText(String s, String s1);



    //메시지키로 메시지가져옴(메시지 포맷 이용),

//없으면 default 메시지인 s1을 던짐

    public abstract String getText(String s, String s1, String s2);



    public abstract String getText(String s, List list);



    public abstract String getText(String s, String as[]);



    public abstract String getText(String s, String s1, List list);



    public abstract String getText(String s, String s1, String as[]);



    public abstract String getText(String s, String s1, List list, ValueStack valuestack);



    public abstract String getText(String s, String s1, String as[], ValueStack valuestack);



    //번들이름으로 리소스 번들을 가져온다.

    public abstract ResourceBundle getTexts(String s);



    //구현클래스와 조합된 리소스 번들을 가져온다.

    public abstract ResourceBundle getTexts();

}

 

 

- LocaleProvider 인터페이스

 

지역화된 메시지를 얻기 위한 Locale 객체를 제공하는 getLocale() 메소드를 제공한다.

 

package com.opensymphony.xwork2;



import java.util.Locale;



public interface LocaleProvider

{



    public abstract Locale getLocale();

}





[실습]

 

이번에는 이전 예제의 기능에 validation 로직을 분리하여 보자. ActionSupport 클래스를 상속받아 validate() 메소드를 재정의 한다.



- 다음과 같은 일반 Action 인터페이스를 상속받아 액션 클래스를 만들자. (hello3.action package에 만든다)

 

[HelloWorld.java]

 

package hello3.action;

 

import com.opensymphony.xwork2.ActionSupport;

 

public class HelloWorld extends ActionSupport {

          private String name;

          private String msg;

         

          public void validate() {

                   

                    if (name == null || "".equals(name)) {

                                addFieldError("name", "Enter Your Name!!");

                    }

          }

 

          public String getMsg() {

                    return msg;

          }

 

          public void setName(String name) {

                    this.name = name;

          }

         

          public String execute() throws Exception {                                 

                    msg = "Hello," + name;             

                    return SUCCESS;

          }

}

 

이번 Action은 ActionSupprt 클래스를 상속 받았다. 예제에서는 Validateable() 인터페이스의 validate() 메소드를 재정의 했으며 ValidationAware 인터페이스의 addFielsError() 메소드를 사용했다.

 

Workflow  인터셉터는 validate() 메소드를 호출 후 hasErrors() 메소드를 호출해서 오류가 있는지 확인하여 에러가 있으면 return INPUT을 수행하며 에러가 없으면 execute() 메소드를 실행한다.

 

addFieldError(name, “메시지”)로 저장한 필드 에러 메시지는 Map에 저장되어 getFieldErrors.get(name)으로 조회할 수 있다.

 

 

- Context 아래에 hello3 이라는 폴더 만들고 hello.jsp, result.jsp를 만들자.

 

[hello.jsp]

 

<h2>${fieldErrors.name}<h2>

<form action=/struts2_helloworld/hello3/hello.action>

Input Your Name : <input type=text name=name>

<input type=submit>

</form>

 

[result.jsp]

<h2>${msg}<h2>

 

 

- struts.xml

 

<?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>

    <package name="hello3" namespace="/hello3" extends="struts-default">

      <action name="hello" class="hello3.action.HelloWorld">

        <!-- params 인터셉터는 액션의 setter값을 요청 파라미터로 셋팅한다 -->

        <interceptor-ref name="params"/>

        <!-- workflow 인터셉터는 Action에서  validate()을 먼저 호출한다. -->

        <interceptor-ref name="workflow"/>

        <result name="input">/hello3/hello.jsp</result>

        <result name="success">/hello3/result.jsp</result>

      </action>

    </package>

</struts>

 

 

- 결과확인

 

http://localhost:8080/struts2_helloworld/hello3/hello.jsp 라고 입력한 후 확인하자.

댓글 없음:

댓글 쓰기