스트럿츠1과 웹워크2의 결합 버전이다.
MVC패턴을 구현한 내부 아키텍쳐가 완전 달라진다.
스트럿츠1의 서블릿과 요청 프로세서 기반으로 액션 요청을 처리하던 구조 대신 필터와 인터셉터 기반의 웹워크2 아키텍처 적용함으로 매우 유연한 아키텍처를 갖게된다.
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<package name="default" extends="struts-default" namespace="">
<action name="HelloWorld" class="example.oracleClub.HelloWorld">
<result>/oracleClub/HelloWorld.jsp</result>
</action>
</package>
스트럿츠2는 사용자요청을 받고 원활하게 작동할 수 있도록 환경을 꾸미고, 어떤 액션을 호출할지 결정 후 액션을 실행, 리절트를 실행시킨후 최종 응답데이터를 사용자에게 반환하는 역할을 하는 컨트롤러를 제공한다.
struts2/
|-- WEB-INF
| |-- applicationContext.xml
| |-- classes
| | |-- Copy of struts.xml
| | |-- example
| | | `-- oracleClub
| | | `-- HelloWorld.class
| | |-- log4j.properties
| | |-- org
| | |-- struts.properties
| | `-- struts.xml
| |-- decorators.xml
| |-- dwr.xml
| |-- lib
| | |-- antlr-2.7.2.jar
| | |-- commons-beanutils-1.6.jar
| | |-- commons-chain-1.1.jar
| | |-- commons-collections-2.1.jar
| | |-- commons-digester-1.7.jar
| | |-- commons-fileupload-1.2.jar
| | |-- commons-io-1.3.2.jar
| | |-- commons-javaflow-20060411.jar
| | |-- commons-logging-1.0.4.jar
| | |-- commons-logging-api-1.1.jar
| | |-- commons-validator-1.3.0.jar
| | |-- dwr.jar
| | |-- freemarker-2.3.8.jar
| | |-- itext-1.3.1.jar
| | |-- jasperreports-1.3.4.jar
| | |-- jcommon-1.0.10.jar
| | |-- jdt-compiler-3.1.1.jar
| | |-- jfreechart-1.0.6.jar
| | |-- log4j-1.2.15.jar
| | |-- ognl-2.6.11.jar
| | |-- oro-2.0.8.jar
| | |-- sitegraph.bat
| | |-- sitemesh-2.3.jar
| | |-- spring.jar
| | |-- struts-core-1.3.5.jar
| | |-- struts2-codebehind-plugin-2.0.9.jar
| | |-- struts2-config-browser-plugin-2.0.9.jar
| | |-- struts2-core-2.0.9.jar
| | |-- struts2-jasperreports-plugin-2.0.9.jar
| | |-- struts2-jfreechart-plugin-2.0.9.jar
| | |-- struts2-pell-multipart-plugin-2.0.9.jar
| | |-- struts2-plexus-plugin-2.0.9.jar
| | |-- struts2-sitegraph-plugin-2.0.9.jar
| | |-- struts2-sitemesh-plugin-2.0.9.jar
| | |-- struts2-spring-plugin-2.0.9.jar
| | |-- struts2-struts1-plugin-2.0.9.jar
| | |-- struts2-tiles-plugin-2.0.9.jar
| | |-- tiles-api-2.0.4.jar
| | |-- tiles-core-2.0.4.jar
| | |-- tiles-jsp-2.0.4.jar
| | `-- xwork-2.0.4.jar
| |-- sitemesh-decorator.tld
| |-- sitemesh-page.tld
| |-- sitemesh.xml
| |-- src
| | |-- Copy of struts.xml
| | |-- example
| | | |-- oracleClub
| | | `-- HelloWorld.java
| | |-- log4j.properties
| | |-- struts.properties
| | `-- struts.xml
| `-- web.xml
| 파일 | 필수 | 위치(상대경로) | 목적 |
|---|---|---|---|
| web.xml | 예 | \WEB-INF\ | 모든 필수 프레임워크 컴포넌트를 포함하기 위한 웹 배치 디스크립터 |
| struts.xml | 아니오 | \WEB-INF\classes\ | 리절트/뷰 타입, 액션 매핑, 인터셉터 등을 포함한 메인환경설정 |
| struts.properties | 아니오 | \WEB-INF\classes\ | 프레임워크 속성 |
| struts-default.xml | 아니오 | \WEB-INF\lib\strtus-core.jar | 스트럿츠2에 의해 제공되는 기본 환경설정 |
| struts-default.vm | 아니오 | \WEB-INF\classes\ | velocity.peoperties에 의해 참조되는 기본 매크로 |
| struts-plugin.xml | 아니오 | 플러그인 jar 파일의 루트경로 | struts.xml과 같은 형식으로 되어있는 플러그인을 위한 선택적 환경설정 파일 |
| velocity.properties | 아니오 | \WEB-INF\classes\ | 기본 벨로시티 환경설정 파일 오버라이드 |
package example.oracleClub;
public class HelloWorld {
public static final String MESSAGE = "Hello World~!";
public String execute() throws Exception {
setMessage(MESSAGE);
return "success";
}
private String message;
public void setMessage(String message){
this.message = message;
}
public String getMessage() {
return message;
}
}
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2><s:property value="message" /></h2>
</body>
</html>
참고. OGNL
OGNL(Object Graph Navigtion Language) 자바 객체의 프로퍼티값을 얻거나 저장하기 위해 자바 빈상의 프로퍼티를 추적하는 표현식이다.
밸류스택은 Xwork와 스트럿츠2의 동적 컨텍스트 기반의 핵심부분이다. 액션이 실행되는 동안 액션을 스택상에 저장하여 밸류스택을 구축한다.
JSP태그와 벨로시티 매크로는 밸류스택으로부터 객체를 읽어오거나 저장한다.
http://www.ognl.org/
<action name="HelloWorld" class="example.oracleClub.HelloWorld">
<result name="success">/oracleClub/HelloWorld.jsp</result>
</action>
<action name="HelloWorld" class="example.oracleClub.HelloWorld">
<result>/oracleClub/HelloWorld.jsp</result>
</action>
\WEB-INF\web.xml
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<action name="HelloWorld" class="example.oracleClub.HelloWorld">
<result name="success">/oracleClub/HelloWorld.jsp</result>
</action>