DisplayTag 데코레이터 사용하기
참조 : http://displaytag.sourceforge.net/11/tut_decorators.html
어떻게 만드는지에 대한 설명은 없고 사용법만 나와있습니다. 에잉~ 어쩔 수 없이 Javadoc을 살펴봤습니다. 뭔가 인터페이스를 만들어 놓고 그걸 구현하게 해 뒀겠지.. 싶어서 찾아봤습니다.
올커니.. 너였구나. ColumnDecorator. 에엥; 왠걸 Deprecated 됐습니다. DisplaytagColumnDecorator 1.1부터는 이 인터페이스를 사용하라네요. 자세한건 귀찮아서 패~스.
구현해야 할 메소드는 딱 하나.
public Object decorate(Object object, PageContext context, MediaTypeEnum typeEnum)
throws DecoratorException {
}
object로 넘어온 값을 원하는 형태로 저 안에서 변형시킨 다음에 넘겨주면 됩니다. 저는 인터페이스를 타입 구현체에서 구현하게 했습니다.
public static final int MALE = 10;
public static final int FEMALE = 20;
public SexType() {
super(Arrays.asList(
new Pair(MALE, "남성"),
new Pair(FEMALE, "여성")));
}
private static SexType sexType = new SexType();
public static SexType getInstance(){
return sexType;
}
@Override
public Object decorate(Object object, PageContext context, MediaTypeEnum typeEnum)
throws DecoratorException {
return this.decode((Integer)object);
}
}
이렇게 말이죠. 그럼 뷰에서는 저 데코레이터 인터페이스를 구현한 클래스 풀 패키지 경로를 포함한 이름으로 설정해주면.. 됩니다.
<d:column property="name" />
<d:column property="loginId" />
<d:column property="sex" decorator="org.opensprout.sample.model.enumeration.SexType" />
<d:column property="location" />
<d:column property="birthday" />
<d:column property="hobbies" />
</d:table>
흠.. 고민이 있는데, 저런 데코레이터를 지금처럼 특정 타입에 대한 데코레이터니까, 타입 클래스가 구현하는게 좋을지 아니면 별도의 클래스로 분리하는게 좋을지.. 잘 모르겠습니다. 또 고민이 있는데, 저 인터페이스가 jsp 인터페이스에 종속되어 있어서(PageContext), SexType이라는 클래스가 디스플레이 태그 API와 JSP API의 침략을 당한다는 것입니다. 이 부분이 상당히 껄끄러운데.. 어쩜 좋을지.. 고민이 됩니다.
어차피 decode()라는 메소드가 AbstractType에 존재한다는 건, 디코딩 역할을 하겠다는 것이고, 뷰에서도 디코딩 역할을 이 녀석이 책임지는 것이 그리 나쁘지 않을 것 같다는 판단하에 타입 클래스가 구현하게 했습니다. 훔~
아니면..
저렇게 데코레이터를 사용하지 않고 도메인 클래스에 getSexDecode()라는 메소드를 추가하고, 뷰에서는 sex가 아니라, property="sexDecode" 라고 참조하는 방법도 있습니다.
단, 이 방법은 도메인 클래스의 역할이 역시 좀 이상해 집니다. 뷰에서 어떤 값을 보여주기 위해 디코딩하는 일이 도메인 클래스에 들어있는게, 그리 아름다워 보이지가 않아서 말이죠. 하지만, 이 방법을 쓰면 디스플레이 태그 API가 침범하지도 않고, 따라서 JSP API의 침범도 없습니다.
갈등이네요. (-- ) ( --) 어찌하면 좋을꼬...