struts2 – ValueStack이란
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)
일반적인 스택(Stack)은 LIFO(Last In First Out)구조를 가진 자료구조로 나중 들어간 데이터가 먼저 나오는 구조를 가졌다. 이러한 일반적인 스택(Stack)의 기능에 더해서 top-down으로 스택에 저장된 자바 객체(빈)의 property를 저장하고 찾는 기능을 가진 Stack을 ValueStack 이라고 한다. Struts2는 ValueStack의 구현으로 OpenSymphony의 OgnlValueStack을 사용한다.
ValueStack 인터페이스의 모습은 다음과 같다.
package com.opensymphony.xwork2.util;
import java.util.Map;
public interface ValueStack
{
public abstract Map getContext();
public abstract void setDefaultType(Class class1);
public abstract void setExprOverrides(Map map);
public abstract Map getExprOverrides();
public abstract CompoundRoot getRoot();
//Stack내 오브젝트의 Property에 값을 세팅
public abstract void setValue(String s, Object obj);
public abstract void setValue(String s, Object obj, boolean flag);
public abstract String findString(String s);
//스택내 오브젝트의 Property값을 찾는다
public abstract Object findValue(String s);
public abstract Object findValue(String s, Class class1);
public abstract Object peek();
public abstract Object pop();
public abstract void push(Object obj);
public abstract void set(String s, Object obj);
public abstract int size();
public static final String VALUE_STACK = "com.opensymphony.xwork2.util.ValueStack.ValueStack";
public static final String REPORT_ERRORS_ON_NO_PROP = "com.opensymphony.xwork2.util.ValueStack.ReportErrorsOnNoProp";
}
ValueStack을 잘 이해하기 위해 간단한 예제를 하나 만들어 보자!
(Struts2에서는 ValueStack 인터페이스의 구현체로 OgnlValueStack을 사용하므로 이를 이용하자)
[ValueStackTest.java]
import com.opensymphony.xwork2.util.OgnlValueStack;
import com.opensymphony.xwork2.util.ValueStack;
//아래 CALSS Cat과 Dog는 모두 name, age를 속성으로 가진다.
//DOG는 weight라는 속성을 추가로 가진다.
class Cat {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String toString() {
return "CAT::::name = " + name + ", age = " + age;
}
}
class Dog {
private String name;
private String age;
private String weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public String toString() {
return "DOG::::name = " + name + ", age = " + age + ", weight= " + weight;
}
}
public class ValueStackTest {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
ValueStack stack = new OgnlValueStack();
stack.push(dog);
stack.push(cat);
//Stack에 나중에 들어간 cat의 객체 프로퍼티 세팅
//그러나 weight 속성은 dog에 있으므로 dog에 세팅
stack.setValue("name", "고양이2");
stack.setValue("age", "고양이는2살입니다.");
stack.setValue("weight", "개는2kg입니다.");
System.out.println(cat);
System.out.println(dog);
System.out.println(stack.findString("name")); //cat
System.out.println(stack.findString("weight")); //dog
}
}
[결과]
CAT::::name = 고양이2, age = 고양이는2살입니다.
DOG::::name = null, age = null, weight= 개는2kg입니다.
고양이2
개는2kg입니다.
댓글 없음:
댓글 쓰기