본문 바로가기

Programming/Struts

Struts : Action, 그리고 Value Stack이란?

엄청 오랜만에 포스팅하네요 ㅎㅎ;;;
그만큼 나태해졌음에 반성 좀 해야겠어요 에잇! ㅎㅎ

ValueStack은 이름처럼 스택입니다. 
사용자는 URL을 통해 서버에 무엇을 요구합니다. 그럼 서버는 요구에 맞추어 반응을 합니다. 액션이 취해지죠.
스트러츠에서는 이러한 요청에 따라 반응해야하는 행위를 Action 이라고 합니다.

스트러츠 개발시 사용자요청에 어떤 Action이 이루어져야하는지를 xml에 기록해야합니다.
xml에는 본래 Action이 취해지기전과 취해진 후에 어떤 일을 해야할지에 대한 interceptor 개념을 기술할 수 있습니다.

여러 interceptor들이 존재하는데, 개발의 편의성을 주기 위해서
일일이 request의 parameter들을 셋팅하지 않아도 되도록 도와주는 interceptor도 있습니다.
ValueStack 에는 Action이 취해질 액션인스턴스(객체)가 저장됩니다.
parameter들은 이 ValueStack의 액션들의 프로퍼티(변수) 들을 찾아서 top-down 방식으로 셋팅이 되게 됩니다.

ValueStack을 테스트해보시면 아마 이해가 더 손쉬우실 것입니다.
아래는 샘플 예제입니다.


 
package com.munsuTest.test;

import com.opensymphony.xwork2.util.OgnlValueStack;
import com.opensymphony.xwork2.util.ValueStack;

class Person{
	String name;
	int salary;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", salary=" + salary + "]";
	}
}
class Dog{
	String name;
	String kind;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getKind() {
		return kind;
	}
	public void setKind(String kind) {
		this.kind = kind;
	}
	@Override
	public String toString() {
		return "Dog [name=" + name + ", kind=" + kind + "]";
	}
}

public class TempTest {
	public static void main(String[] args) {
		Person person = new Person();
		Dog dog = new Dog();
		
		ValueStack valueStack = new OgnlValueStack();
		valueStack.push(dog);
		valueStack.push(person);
		
		valueStack.setValue("name", "munsu");
		valueStack.setValue("kind", "jindo");
		valueStack.setValue("salary", 500000);
		valueStack.setValue("name", "superdog");
		System.out.println(person);
		System.out.println(dog);
		
		System.out.println(valueStack.findValue("name"));
		System.out.println(valueStack.findValue("kind"));
		System.out.println(valueStack.findString("name"));
		System.out.println(valueStack.findString("salary"));
	}
}