Struts 2는, 이름으로, Struts 1과 구별된다.
Struts 2는 WebWork 2.2.4의 아키텍처를 전격 수용한 웹 프레임워크로 기존 Struts 프레임워크와는 내부 구조부터 다르다. 달리 말하면, WebWork 프레임워크가 Struts의 명성이라는 옷을 입은 셈이다. Struts 2.0.6 버전에서 상당히 안정되고 새로운 웹 프레임워크로 변신 가능성을 열고 있지만, Struts 2.0.1 BETA 버전에서는 둘의 생경한 만남 그 자체였다.
Struts 2 버전에서 Action 정의 방식이 Struts 1.x 버전과 다르다. 아래에 간략히 정리한다.
1. Struts 2에서 Struts 1.x 코드를 재사용하려면 플러그인(plugin)을 사용하여야 한다.
2. WebWork 프레임워크의 action 정의 방식
이 방식은 Struts 2에서 동적 메소드 호출(dynamic method invocation)이라고 이름이 붙여졌고, 이를 사용하기 위해서는 struts.properties 파일에서 다음과 같은 구성을 지정하여야 한다. 사전에 false로 지정되어 있기 때문이다.
3. Wildcard Mapping 지원
웹 애플리케이션의 규모가 커지면 action 수가 많아질 것이고, 기존 방식대로 action을 일일이 정의하는 것이 꽤 번거로울 수 밖에 없다. 이런 경우에 Wildcard Mapping 방식은 상당히 편리하다.
Struts 2 Wildcard Mappings 문서에 있는 예는 이렇다:
<action name="/edit*" class="org.apache.struts.webapp.example.Edit{1}Action">
<result name="failure" path="/mainMenu.jsp"/>
<result path="/\{1\}.jsp"/></action>
/edit으로 시작하는 모든 페이지와 일치하는 Wildcard Mapping에 의해 action을 정의한다.
다른 예로, 3개의 action을 Wildcard Mapping으로 한 번에 정의하는 예를 아래에 보인다.
<result name="input">/WEB-INF/jsp/userForm.jsp</result>
<result name="list">/WEB-INF/jsp/userList.jsp</result>
<result name="saved" type="redirect-action">user!list.action</result>
</action>
여기서, list(), input() 메소드를 가지는 단일의 Action 클래스에 대해 Wildcard Mapping을 적용하여 user!input.action, user!list.action, user!saved.action 과 같은 action 호출이 가능하도록 한 번에 action을 정의할 수 있다.
4. 무구성(Zero configuration)
우리 식으로 번역하면 무구성(Zero configuration)이 적절한 것 같다. 말 그대로 구성이 없다는 것으로, 복잡한 구성 파일을 만들지 않아도 된다. 하지만, action 정의가 구성 파일에서 하지 않는 것뿐 action 클래스에서는 꼭 있어야 한다.
4.1. actionPackages 필터 지정
web.aml 파일에서 actionPackages 필터의 init param에 action 클래스를 포함하는 패키지를 쉼표로 구분하여 지정한다.
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.foo.bar,com.baz.quux</param-value>
</init-param>
</filter>
4.2. 패키지와 action 명칭
하위 패키지 명칭을 네임스페이스(namespace)로, action 클래스 명칭을 action 이름으로 만든다. 클래스 명칭 뒷부분에 붙여진 "Action"은 action 이름에서 빠지게 된다. 따라서 구성된 패키지 명칭이 com.myapp.actions, action 클래스가 com.myapp.actions.member.EditAction 이면, http://server/myapp/member/edit.action을 통해 이에 접근할 수 있다.
4.3. Result 및 Results Annotation
클래스 수준에서 Result 및 Results Annotation 사용하여 결과를 정의한다.
단일한 결과에 대해 Result Annotation 사용한다.
Struts 2 Result Annotation 문서의 코드 예:
public class HomeAction extends ActionSupport {
// ...
}
여러 개의 결과는 Result 및 Results Annotation 사용한다.
@Result(name="input", value="/WEB-INF/jsp/userForm.jsp"),
@Result(name="list", value="/WEB-INF/jsp/userList.jsp")
})
public class UserAction extends ActionSupport {
:
Struts 2 무구성(Zero configuration)은 구성 파일을 더 이상 만들지 않아도 된다는 점에서는 편리해졌다고 할 수 있지만, Struts 2의 action 호출 방식 때문에 (이제까지 구성 파일에서 정의했던) 결과 정의를 클래스에서 Result 및 Results Annotation을 새로 추가하여야 한다.