오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클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 라고 입력한 후 확인하자.
댓글 없음:
댓글 쓰기