Struts의 Configuration File인 struts-config.xml에는
다음과 같은 내용이 기술되어 있다.
<struts-config>
1. Data Sources
데이터베이스를 위한 DataSource의 설정.
2. Form Beans
request에 의하여 전달되는 정보를 저장하는 FormBean의 설정.
3. Global Exceptions
Application에서 발생하는 Exception의 설정.
4. Global Forwards
Application에서 요청에 따른 작업을 끝낸후 Forward할 path에 대한 설정.
4. Action Mappings
Model과 통신하는 BusinessLogic을 담고 있는 Action클래스의 설정.
5. Controller
스트러츠 Controller의 설정.
6. Message Resources
Message Resource의 설정.
7. Plugins
다소 생소하겠지만 스트러츠에서는 플러그인이 가능하도록 구현되어 있다. 따라서 플러그인에 대한 설정이 가능하다
</struts-config>
struts-config.xml 설정에 관해
org.apache.struts.config package는 struts 1.1에서 추가 되었으며 자바 빈을 이용하여 실행 시 XML 설정 파일의 설정 내용을 자바 빈의 인스턴스를 이용하여 담아두는 역할을 합니다.
아래는 org.apache.struts.config에 대한 클래스 다이어그램 입니다.
설정 파일(struts-config.xml)의 검증과 파싱 작업이 마무리 되면 메모리에 올라와 있는 설정 정보를 빈즈 인스턴스를 이용하여 담아 둡니다.
위 클래스 다이어그램에서 ConfigResultSet 클래스는 다른 클래스와 다른 작업을 하는데 주로 struts 설정 파일을 해석 하는데 필요한 규칙을 포함하고 있는데 그 역할은 값을 설정하기 위해 필요한 빈의 인스턴스를 생성 하는 것 입니다.
-------------------------------
Struts-Config.xml 설정
-------------------------------
설정을 위한 DTD
<!ELEMENT struts-config (data-source?, form-beans?, global-exceptions?, global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)
Struts-config.xml 파일에 설정시 위에서 정의한 순서는 지켜져야 합니다.
1. data-source 요소
데이터 소스에 대한 설정을 하는 곳이며 대부분의 벤더들이 데이터 소스 객체의 구현을 제공 하는데 자바에서는 javax.sql.DataSource 인터페이스를 제공 하며 벤더들이 제공하는 구현 부에서 이 인터페이스를 구현해 주어야 합니다.
DTD정의
<!ELEMENT data-sources (data-source*)>
<!ELEMENT data-source (set-property*)>
예)
<data-sources>
<!-- configuration for commons BasicDataSource -->
<data-source key="mysql" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
<set-property property="url" value="jdbc:mysql://localhost/test" />
<set-property property="username" value="root" />
<set-property property="password" value="pw" />
<set-property property="maxActive" value="10" />
<set-property property="maxWait" value="5000" />
<set-property property="defaultAutoCommit" value="true" />
<set-property property="defaultReadOnly" value="false" />
<set-property property="maxIdle" value="10000" />
</data-source>
<data-source key="oracle" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<set-property property="username" value="scott" />
<set-property property="password" value="tiger" />
<set-property property="url" value="jdbc:oracle:thin:@localhost:1521:WINK" />
<set-property property="maxActive" value="50" />
<set-property property="maxIdle" value="10000" />
<set-property property="maxWait" value="100" />
<set-property property="defaultAutoCommit" value="true" />
</data-source>
</data-sources>
속성으로 다음과 같은 것들이 있습니다.
key : 데이터 소스가 저장 될 서블릿 컨텍스트 속성, 선택적 이며 기본값은 Action.DATA_SOURCE_KEY 입니다.
type : 데이터 소스 구현체 클래스의 전체 클래스 이름, 반드시 javax.sql.DataSource 클래스를 구현해야 합니다.
2. form-bean 요소
form-bean 요소는 여러 개의 ActionForm 클래스를 설정 할 수 있게 합니다. Form-beans 요소에서 form-bean 요소를 사용할 수도 있고 안 할 수도 있습니다. 각각의 form-bean 요소 역시 자식 요소를 포함 합니다.
DTD 정의
<!ELEMENT form-bean (icon?, display_name?, description?, set-property*, form-property*)>
가질 수 있는 속성은 다음과 같습니다…
className : 기본값은 FormBeanConfig이며 이 클래스를 사용하지 않는다면 지정한 클래스는 반드시 FormBeanConfig를 상속 해야 합니다.
dynamic : type속성 값이 org.apache.struts.DynaActionForm 클래스나 그 하위클래스라면 이 속성값을 true라고 설정하며 그렇지 않은 경우엔 false이다. 기본값은 false
name : 이 빈의 유일한 식별자
type : ActionForm 클래스를 상속하는 자바 클래스의 전체 이름, 실제 폼빈 역할을 하는 클래스의 이름을 패키지 명까지 포함해서 기술 합니다. 만약 이 값을 org.apache.struts.action.DynaActionForm으로 지정하면 스트럿츠가 DynaActionForm 클래스의 인스턴스를 동적으로 생성 합니다. 속성값은 반드시 지정해야 합니다.
<form-beans>
<form-bean name="loginForm" type="login2.LoginForm">
<form-property name="pwd" type="java.lang.String" />
<form-property name="id" type="java.lang.String" />
</form-bean>
</form-beans>
3. global-exceptions 요소
예외처리에 관한 설정을 하며 global-exceptions에는 exception 요소가 0개 이상 나타날 수 있습니다.
<!ELEMENT global-exceptions (exception*)>
exception 요소는 action 요소에도 정의가 가능한데 exception 요소가 global-exceptons와 action 요소에 동시에 정의되어 있다면 action에 선언된 것이 우선권을 가집니다.
exception 요소는 클라이언트의 요청을 처리하는 동안 발생하는 자바의 예외상황과 해당 예외를 처리하는 org.apache.struts.action.ExceptionHandler 클래스의 인스턴스를 매핑하는 역할을 합니다.
exception 요소의 DTD는 다음과 같습니다.
<!ELEMENT exception (icon?, display-name?, description?, set-property*)
Exception 요소의 속성은 다음과 같습니다.
className : 예외정보를 가지게 되는 설정 빈의 구현 클래스, 지정한 클래스는 ora.apache.struts.config.ExceptionConfig의 하위 클래스여야 하며 기본값은 ExceptionConfig 클래스 입니다.
handler : 예외 처리를 담당할 예외 처리 클래스의 전체 이름. 값을 지정하지 않으면 org.apache.struts.action.ExceptionHandler 클래스 입니다. 만약 다른 클래스를 지정한다면 ExceptionHandler의 하위클래스 이여야 합니다.
key : 하위 애플리케이션의 리소스 번들에 지정된 키 값이며 ActionError 클래스의 인스턴스에서 이 속성의 값을 사용 합니다.
path : 예외가 발생 시 전송해야 할 리소스의 상대 경로, 만약 값을 지정하지 않으면 action mapping에서 지정하는 input 속성의 값을 사용 합니다.
scope : ActionError 클래스의 인스턴스를 저장 할 스코프, “request” 또는 “session” 이여야 합니다. 기본값은 “request” 입니다.
type : 예외 처리 클래스의 전체 이름
<global-exceptions>
<exception
key = “global.error.invalidlogin”
path = “/login/login.jsp”
scope = “request”
type = “login2.exception.InvalidLoginException”
/>
</global-exceptions>
4. global-forward 요소
모든 Action은 View화면으로 포워드 되거나 리다이렉트 되는 방법으로 실행 됩니다. 뷰의 역할은 JSP가 할 수도 있고 HTML이 할 수도 있습니다. Struts 에서는 뷰 역할을 하는 자원을 직접 참조하는 대신 주로 어떤 이름을 사용 합니다.
global-forwards에서는 0개 이상의 forward요소를 가집니다.
<!ELEMENT global-forwards (forward*)>
forward 요소 역시 몇 개의 자식 요소를 가집니다. forward 요소는 논리적인 이름을 Web Application의 URI,의 상대 경로에 mapping 합니다. 이를 통해 애플리케이션은 논리적인 이름을 통해 포워드 또는 리다이렉트를 수행 합니다. 이러한 방법을 통해 뷰로부터 컨트롤러와 모델을 분리 할 수 있습니다.
<!ELEMENT forward(icon?, display-name?, description, set-property*)>
다음은 forward요소의 속성 입니다.
className : 포워드 설정 값을 포함하게 되는 자바 빈을 구현한 클래스, 기본값은 ForwardConfig 입니다. Optional 값
contextRelative : true로 지정 할 경우 path 속성에 지정된 리소스를 컨텍스트 상대 경로로 인식 합니다, 기본값은 false
name : 애플리케이션에서 이 포워드를 참조하기 위한 유일한 값, 반드시 값을 지정 해야 합니다.
path : 포워드 되거나 redirect 되어야 하는 애플리케이션의 상대 경로(contextRalative가 false인 경우) 또는 컨텍스트의 상대 경로의 URI를 지정, 반드시 “/”로 시작해야 합니다.
<global-forwards>
<forward name="success" path="/main.jsp" redirect=”true”/>
<forward name="logoff" path="/logoff.do" />
<forward name="login" path="/login.jsp" />
</global-forwards>
5. action-mapping 요소
action-mappings 요소는 action 요소를 0개 이상 포함할 수 있습니다.
<!ELEMENT action-mappings(action*)>
Action 요소는 사용자의 요청을 특정한 경로에 해당 하는 Action 클래스와 매핑을 하는 역할을 담당 합니다. Action 요소의 path 속성과 클라이언트로부터 들어온 요청 URI 경로를 매치시켜 특정 매핑을 선택 합니다.
Action 요소의 자식요소는 다음과 같습니다.
<!ELEMENT action (icon?, display-name?, description, set-property*, exception*, forward*)>
앞에서 설명한 exception 요소의 경우 global, action 양쪽에서 선언이 가능하다고 했습니다. 물론 action에서 정의한 exception이 global로 선언 한 것 보다는 우선권이 있습니다.
또한 forward인 경우에도 global, action 양쪽에서 선언이 가능하며 exception의 경우와 비슷합니다.
다음은 action 요소의 속성 입니다.
attribute : 이 action이 접근 가능한 요청 또는 세션 scope의 폼빈 이름, 이속성은 name 속성에 폼빈이 지정되어 있는 경우에만 사용 가능 합니다.
className : 액션과 관련된 정보를 포함하게 되는 빈을 구현한 클래스, 값을 지정하지 않으면 org.apache.struts.action.ActionMapping이 기본 클래스 입니다. 이속성은 선택적 입니다.
forward : 포워드될 서블릿이나 JSP의 상대경로, 이 속성은 선택적이며 org.apache.struts.action.ForwardAction 클래스가 동일한 역할을 하는데 서용 됩니다.
include : 클라이언트의 요청에 대해 포함되어야 할 서블릿이나 JSP의 상대경로
input : 폼빈에서 검증오류가 생기는 경우 돌아갈 곳
name : 폼빈의 이름
path : 액션의 이름, 요청을 처리할 액션의 상대 경로
parameter : action 인스턴스에 어떤 정보를 넘기기 위해 사용, 여기에 값을 지정하면 getParameter 메소드를 이용하여 값을 알아낼 수 있습니다.
prefix : 예를 들어 폼빈의 모든 속성이 “pre_”로 시작한다면 prefix 속성을 세팅해서 요청 인자가 ActionForm 속성과 일치 하도록 할 수 있습니다. Name 속성이 지정된 경우에만 사용 가능 합니다.
scope : 폼빈의 스코프, name 속성을 지정한 경우에만 사용 가능 하며 “request” or “session” 이 들어 올 수 있으며 기본값은 “session” 입니다.
suffix : 예를 들어 폼빈의 모든 속성이 “_foo” 로 끝난다면 suffix 속성을 지정하여 요청인자가 ActionForm 빈의 속성과 일치하게 합니다.
type : Action 클래스를 상속하는 즉 액션을 처리하는 클래스의 전체경로 및 이름
unknown : 이 액션을 애플리케이션에서 기본으로 설정 해야 하는지 여부를 표시 한다. true로 설정하면 이 액션은 처리할 액션이 지정되지 않은 모든 요청을 처리
validate : 폼빈의 validate() 메소드가 execute() 메소드 전에 실행 되어야 하는 지의 여부를 표시, 기본값은 true
<action-mappings>
<!-- loginAction에 대한 정의 -->
<action
path="/LoginSubmit"
type="login2.LoginAction"
scope=”rewuest”
name="loginForm"
validate="true"
input="/login.jsp"
>
<forward name=”SUCCESS” path=”/success.jsp” redirect=”true”/>
</action>
</action-mappings>
6. controller 요소
struts 1.1이상에서 새로 나온 기능으로 이전 버전에서는 ActionServlet 클래스가 컨트롤러 기능을 하며 이를 상속해서 컨트롤러의 기능을 구현 했습니다. 그러나 1.1이상에서는 대부분의 컨트롤러의 기능은 RequestProcessor 클래스로 이전 했습니다.
1.1이전의 예
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>myPackage.myActionServlet</servlet-class>
</servlet>
ActionServlet은 여전히 사용자의 요청을 받아 들이지만 그 요청에 대한 처리는 RequestProcessor 클래스의 인스턴스에 위임 합니다. 이렇게 함으로서 요청을 처리하는 클래스를 할당하고 기능을 수정 하는 것이 가능 해집니다.
Controller 요소는 자식요소 하나를 포함 합니다.
<!ELEMENT controller (set-property*)>
아래는 controller 요소의 속성 입니다.
bufferSize : 파일 업로드 시 사용하는 입력 버퍼의 크기, 기본값은 4096 입니다.
className : 컨트롤러 정보를 담아놓을 자바 빈을 구현한 클래스, org.apache.struts.config.ControllerConfig의 하위클래스여야 합니다. 기본값은 ControllerConfig 입니다.
contentType : 응답 경과를 보낼 때 사용하는 contentType, 이 속성은 선택적으로 사용 할 수 있으며 기본값은 “text/html” 입니다. 이 속성에 값이 있더라도 JSP 파일에 contentType을 기술 한다면 JSP 파일의 내용이 우선 합니다.
debug : 디버깅 레벨, 값이 클수록 많은 로깅 정보들이 기록되며, 기본값은 0으로 로깅 정보가 기록되지 않습니다.
locale : 사용자의 지역 정보를 세션에 저장 할지 여부, 기본값은 false
maxFileSize : 파일 업로드 시 허용되는 최대 용량
multipartClass : Multipart 요청에 대한 처리를 담당할 클래스, 기본값은 ora.apache.struts.upload 패키지의 DiskMultipartRequestHandler 입니다.
nocache : 응답에 있는 nocache 헤더에 대한 설정, true 또는 false, 기본값은 false, c가 소문자임을 주의
processClass : 사용자의 요청을 처리 할 클래스의 전체 이름
tempDir : 파일 업로드의 경우 사용할 임시 디렉토리
<controller
contentType="text/html;charset=euc-kr"
debug="3"
locale="true"
nocache="true"
processorClass="filter.MyFilter"/>
7. message-resources 요소
메시지 리소스 번들과 관련된 특징을 기술 합니다.
각각의 스트럿츠 설정 파일은 메시지 리소스 번들을 하나 이상 지정 할 수 있습니다.
<!ELEMENT message-resources (set-propert*)>
필요한 속성만 살펴 보도록 합니다.
className : message-resources의 정보를 담을 자바빈을 구현한 클래스
key : 메시지 리소스 번들이 저장될 서블릿 컨텍스트 속성, 기본값은 Action.MESSAGE_KEY에 의해 지정 됩니다.
null : 정의되지 않은 메시지 키가 사용된 경우 MessageResource의 하위 클래스에서 어떻게 처리 할지를 나타내는 Boolean 값. true로 설정하면 빈 문자열을 돌려줍니다. false로 설정하면 “???global.label.missing???”와 같은 문자를 돌려 줍니다.
parameter : 예를 들어 리소스 번들의 이름이 Application.properties 라면 이 속성의 값은 Application이 됩니다. 반드시 정의해야 하는 속성 입니다. 만약 리소스 번들이 패키지화 되어 있다면 전체 경로를 지정 해야 합니다.
<message-resources parameter="resources.application"/>
8. plug-in 요소
struts application이 구동 시에 동적인 자원을 처리 할 수 있게 해주는 기능
예를 들어 애플리케이션 구동 시 원격의 시스템에 연결 해야 된다면 직접 코딩하지 않고 플로그인 기능을 이용하여 이 기능을 구현할 수 있습니다. 플러그인을 사용하기 위해서는 org.apache.struts.PlugIn 인터페이스를 구현하는 자바 클래스를 생성 한 후 설정 파일의 plug-in 요소에 추가 하면 됩니다.
public interface PlugIn {
public void init(ActionServlet servlet, ApplicationConfig config)
throws ServletException;
public void destroy();
}
1.1이전 버전에서는 ActionServlet의 subClass를 통해 애플리케이션 구동 시 애플리케이션의 리소스를 초기화 했지만 1.1이후 버전에서는 Plug-In을 통해 이것이 가능 하게 됨
Plug-In의 경우 스트럿츠 애플리케이션이 초기화 되는 경우 ActionServlet이 Plug-In의 Init() method 를 호출 합니다.
Plug-In은 struts-config.xml 파일에 기술된 순서에 따라 호출됩니다.
<!ELEMENT plug-in (set-property*)>
<plug-in className="org.apache.struts.plugins.ModuleConfigVerifier"/>
<plug-in
className="org.apache.struts.webapp.example.memory.MemoryDatabasePlugIn">
<set-property property="pathname" value="/WEB-INF/database.xml"/>
</plug-in>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
예제
public final class MemoryDatabasePlugIn implements PlugIn {
...
public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
log.info("Initializing memory database plug in from '" + pathname + "'");
// Remember our associated configuration and servlet
this.config = config;
this.servlet = servlet;
// Construct a new database and make it available
database = new MemoryUserDatabase();
try {
String path = calculatePath();
if (log.isDebugEnabled()) {
log.debug(" Loading database from '" + path + "'");
}
database.setPathname(path);
database.open();
} catch (Exception e) {
log.error("Opening memory database", e);
throw new ServletException("Cannot load database from '" + pathname + "'", e);
}
// Make the initialized database available
servlet.getServletContext().setAttribute(Constants.DATABASE_KEY,database);
// Setup and cache other required data
setupCache(servlet, config);
}
}
public final class MemoryDatabasePlugIn implements PlugIn {
...
public void destroy() {
log.info("Finalizing memory database plug in");
if (database != null) {
try {
database.close();
} catch (Exception e) {
log.error("Closing memory database", e);
}
}
servlet.getServletContext().removeAttribute(Constants.DATABASE_KEY);
database = null;
servlet = null;
database = null;
config = null;
}
}
다음과 같은 내용이 기술되어 있다.
<struts-config>
1. Data Sources
데이터베이스를 위한 DataSource의 설정.
2. Form Beans
request에 의하여 전달되는 정보를 저장하는 FormBean의 설정.
3. Global Exceptions
Application에서 발생하는 Exception의 설정.
4. Global Forwards
Application에서 요청에 따른 작업을 끝낸후 Forward할 path에 대한 설정.
4. Action Mappings
Model과 통신하는 BusinessLogic을 담고 있는 Action클래스의 설정.
5. Controller
스트러츠 Controller의 설정.
6. Message Resources
Message Resource의 설정.
7. Plugins
다소 생소하겠지만 스트러츠에서는 플러그인이 가능하도록 구현되어 있다. 따라서 플러그인에 대한 설정이 가능하다
</struts-config>
struts-config.xml 설정에 관해
org.apache.struts.config package는 struts 1.1에서 추가 되었으며 자바 빈을 이용하여 실행 시 XML 설정 파일의 설정 내용을 자바 빈의 인스턴스를 이용하여 담아두는 역할을 합니다.
아래는 org.apache.struts.config에 대한 클래스 다이어그램 입니다.
설정 파일(struts-config.xml)의 검증과 파싱 작업이 마무리 되면 메모리에 올라와 있는 설정 정보를 빈즈 인스턴스를 이용하여 담아 둡니다.
위 클래스 다이어그램에서 ConfigResultSet 클래스는 다른 클래스와 다른 작업을 하는데 주로 struts 설정 파일을 해석 하는데 필요한 규칙을 포함하고 있는데 그 역할은 값을 설정하기 위해 필요한 빈의 인스턴스를 생성 하는 것 입니다.
-------------------------------
Struts-Config.xml 설정
-------------------------------
설정을 위한 DTD
<!ELEMENT struts-config (data-source?, form-beans?, global-exceptions?, global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)
Struts-config.xml 파일에 설정시 위에서 정의한 순서는 지켜져야 합니다.
1. data-source 요소
데이터 소스에 대한 설정을 하는 곳이며 대부분의 벤더들이 데이터 소스 객체의 구현을 제공 하는데 자바에서는 javax.sql.DataSource 인터페이스를 제공 하며 벤더들이 제공하는 구현 부에서 이 인터페이스를 구현해 주어야 합니다.
DTD정의
<!ELEMENT data-sources (data-source*)>
<!ELEMENT data-source (set-property*)>
예)
<data-sources>
<!-- configuration for commons BasicDataSource -->
<data-source key="mysql" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
<set-property property="url" value="jdbc:mysql://localhost/test" />
<set-property property="username" value="root" />
<set-property property="password" value="pw" />
<set-property property="maxActive" value="10" />
<set-property property="maxWait" value="5000" />
<set-property property="defaultAutoCommit" value="true" />
<set-property property="defaultReadOnly" value="false" />
<set-property property="maxIdle" value="10000" />
</data-source>
<data-source key="oracle" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<set-property property="username" value="scott" />
<set-property property="password" value="tiger" />
<set-property property="url" value="jdbc:oracle:thin:@localhost:1521:WINK" />
<set-property property="maxActive" value="50" />
<set-property property="maxIdle" value="10000" />
<set-property property="maxWait" value="100" />
<set-property property="defaultAutoCommit" value="true" />
</data-source>
</data-sources>
속성으로 다음과 같은 것들이 있습니다.
key : 데이터 소스가 저장 될 서블릿 컨텍스트 속성, 선택적 이며 기본값은 Action.DATA_SOURCE_KEY 입니다.
type : 데이터 소스 구현체 클래스의 전체 클래스 이름, 반드시 javax.sql.DataSource 클래스를 구현해야 합니다.
2. form-bean 요소
form-bean 요소는 여러 개의 ActionForm 클래스를 설정 할 수 있게 합니다. Form-beans 요소에서 form-bean 요소를 사용할 수도 있고 안 할 수도 있습니다. 각각의 form-bean 요소 역시 자식 요소를 포함 합니다.
DTD 정의
<!ELEMENT form-bean (icon?, display_name?, description?, set-property*, form-property*)>
가질 수 있는 속성은 다음과 같습니다…
className : 기본값은 FormBeanConfig이며 이 클래스를 사용하지 않는다면 지정한 클래스는 반드시 FormBeanConfig를 상속 해야 합니다.
dynamic : type속성 값이 org.apache.struts.DynaActionForm 클래스나 그 하위클래스라면 이 속성값을 true라고 설정하며 그렇지 않은 경우엔 false이다. 기본값은 false
name : 이 빈의 유일한 식별자
type : ActionForm 클래스를 상속하는 자바 클래스의 전체 이름, 실제 폼빈 역할을 하는 클래스의 이름을 패키지 명까지 포함해서 기술 합니다. 만약 이 값을 org.apache.struts.action.DynaActionForm으로 지정하면 스트럿츠가 DynaActionForm 클래스의 인스턴스를 동적으로 생성 합니다. 속성값은 반드시 지정해야 합니다.
<form-beans>
<form-bean name="loginForm" type="login2.LoginForm">
<form-property name="pwd" type="java.lang.String" />
<form-property name="id" type="java.lang.String" />
</form-bean>
</form-beans>
3. global-exceptions 요소
예외처리에 관한 설정을 하며 global-exceptions에는 exception 요소가 0개 이상 나타날 수 있습니다.
<!ELEMENT global-exceptions (exception*)>
exception 요소는 action 요소에도 정의가 가능한데 exception 요소가 global-exceptons와 action 요소에 동시에 정의되어 있다면 action에 선언된 것이 우선권을 가집니다.
exception 요소는 클라이언트의 요청을 처리하는 동안 발생하는 자바의 예외상황과 해당 예외를 처리하는 org.apache.struts.action.ExceptionHandler 클래스의 인스턴스를 매핑하는 역할을 합니다.
exception 요소의 DTD는 다음과 같습니다.
<!ELEMENT exception (icon?, display-name?, description?, set-property*)
Exception 요소의 속성은 다음과 같습니다.
className : 예외정보를 가지게 되는 설정 빈의 구현 클래스, 지정한 클래스는 ora.apache.struts.config.ExceptionConfig의 하위 클래스여야 하며 기본값은 ExceptionConfig 클래스 입니다.
handler : 예외 처리를 담당할 예외 처리 클래스의 전체 이름. 값을 지정하지 않으면 org.apache.struts.action.ExceptionHandler 클래스 입니다. 만약 다른 클래스를 지정한다면 ExceptionHandler의 하위클래스 이여야 합니다.
key : 하위 애플리케이션의 리소스 번들에 지정된 키 값이며 ActionError 클래스의 인스턴스에서 이 속성의 값을 사용 합니다.
path : 예외가 발생 시 전송해야 할 리소스의 상대 경로, 만약 값을 지정하지 않으면 action mapping에서 지정하는 input 속성의 값을 사용 합니다.
scope : ActionError 클래스의 인스턴스를 저장 할 스코프, “request” 또는 “session” 이여야 합니다. 기본값은 “request” 입니다.
type : 예외 처리 클래스의 전체 이름
<global-exceptions>
<exception
key = “global.error.invalidlogin”
path = “/login/login.jsp”
scope = “request”
type = “login2.exception.InvalidLoginException”
/>
</global-exceptions>
4. global-forward 요소
모든 Action은 View화면으로 포워드 되거나 리다이렉트 되는 방법으로 실행 됩니다. 뷰의 역할은 JSP가 할 수도 있고 HTML이 할 수도 있습니다. Struts 에서는 뷰 역할을 하는 자원을 직접 참조하는 대신 주로 어떤 이름을 사용 합니다.
global-forwards에서는 0개 이상의 forward요소를 가집니다.
<!ELEMENT global-forwards (forward*)>
forward 요소 역시 몇 개의 자식 요소를 가집니다. forward 요소는 논리적인 이름을 Web Application의 URI,의 상대 경로에 mapping 합니다. 이를 통해 애플리케이션은 논리적인 이름을 통해 포워드 또는 리다이렉트를 수행 합니다. 이러한 방법을 통해 뷰로부터 컨트롤러와 모델을 분리 할 수 있습니다.
<!ELEMENT forward(icon?, display-name?, description, set-property*)>
다음은 forward요소의 속성 입니다.
className : 포워드 설정 값을 포함하게 되는 자바 빈을 구현한 클래스, 기본값은 ForwardConfig 입니다. Optional 값
contextRelative : true로 지정 할 경우 path 속성에 지정된 리소스를 컨텍스트 상대 경로로 인식 합니다, 기본값은 false
name : 애플리케이션에서 이 포워드를 참조하기 위한 유일한 값, 반드시 값을 지정 해야 합니다.
path : 포워드 되거나 redirect 되어야 하는 애플리케이션의 상대 경로(contextRalative가 false인 경우) 또는 컨텍스트의 상대 경로의 URI를 지정, 반드시 “/”로 시작해야 합니다.
<global-forwards>
<forward name="success" path="/main.jsp" redirect=”true”/>
<forward name="logoff" path="/logoff.do" />
<forward name="login" path="/login.jsp" />
</global-forwards>
5. action-mapping 요소
action-mappings 요소는 action 요소를 0개 이상 포함할 수 있습니다.
<!ELEMENT action-mappings(action*)>
Action 요소는 사용자의 요청을 특정한 경로에 해당 하는 Action 클래스와 매핑을 하는 역할을 담당 합니다. Action 요소의 path 속성과 클라이언트로부터 들어온 요청 URI 경로를 매치시켜 특정 매핑을 선택 합니다.
Action 요소의 자식요소는 다음과 같습니다.
<!ELEMENT action (icon?, display-name?, description, set-property*, exception*, forward*)>
앞에서 설명한 exception 요소의 경우 global, action 양쪽에서 선언이 가능하다고 했습니다. 물론 action에서 정의한 exception이 global로 선언 한 것 보다는 우선권이 있습니다.
또한 forward인 경우에도 global, action 양쪽에서 선언이 가능하며 exception의 경우와 비슷합니다.
다음은 action 요소의 속성 입니다.
attribute : 이 action이 접근 가능한 요청 또는 세션 scope의 폼빈 이름, 이속성은 name 속성에 폼빈이 지정되어 있는 경우에만 사용 가능 합니다.
className : 액션과 관련된 정보를 포함하게 되는 빈을 구현한 클래스, 값을 지정하지 않으면 org.apache.struts.action.ActionMapping이 기본 클래스 입니다. 이속성은 선택적 입니다.
forward : 포워드될 서블릿이나 JSP의 상대경로, 이 속성은 선택적이며 org.apache.struts.action.ForwardAction 클래스가 동일한 역할을 하는데 서용 됩니다.
include : 클라이언트의 요청에 대해 포함되어야 할 서블릿이나 JSP의 상대경로
input : 폼빈에서 검증오류가 생기는 경우 돌아갈 곳
name : 폼빈의 이름
path : 액션의 이름, 요청을 처리할 액션의 상대 경로
parameter : action 인스턴스에 어떤 정보를 넘기기 위해 사용, 여기에 값을 지정하면 getParameter 메소드를 이용하여 값을 알아낼 수 있습니다.
prefix : 예를 들어 폼빈의 모든 속성이 “pre_”로 시작한다면 prefix 속성을 세팅해서 요청 인자가 ActionForm 속성과 일치 하도록 할 수 있습니다. Name 속성이 지정된 경우에만 사용 가능 합니다.
scope : 폼빈의 스코프, name 속성을 지정한 경우에만 사용 가능 하며 “request” or “session” 이 들어 올 수 있으며 기본값은 “session” 입니다.
suffix : 예를 들어 폼빈의 모든 속성이 “_foo” 로 끝난다면 suffix 속성을 지정하여 요청인자가 ActionForm 빈의 속성과 일치하게 합니다.
type : Action 클래스를 상속하는 즉 액션을 처리하는 클래스의 전체경로 및 이름
unknown : 이 액션을 애플리케이션에서 기본으로 설정 해야 하는지 여부를 표시 한다. true로 설정하면 이 액션은 처리할 액션이 지정되지 않은 모든 요청을 처리
validate : 폼빈의 validate() 메소드가 execute() 메소드 전에 실행 되어야 하는 지의 여부를 표시, 기본값은 true
<action-mappings>
<!-- loginAction에 대한 정의 -->
<action
path="/LoginSubmit"
type="login2.LoginAction"
scope=”rewuest”
name="loginForm"
validate="true"
input="/login.jsp"
>
<forward name=”SUCCESS” path=”/success.jsp” redirect=”true”/>
</action>
</action-mappings>
6. controller 요소
struts 1.1이상에서 새로 나온 기능으로 이전 버전에서는 ActionServlet 클래스가 컨트롤러 기능을 하며 이를 상속해서 컨트롤러의 기능을 구현 했습니다. 그러나 1.1이상에서는 대부분의 컨트롤러의 기능은 RequestProcessor 클래스로 이전 했습니다.
1.1이전의 예
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>myPackage.myActionServlet</servlet-class>
</servlet>
ActionServlet은 여전히 사용자의 요청을 받아 들이지만 그 요청에 대한 처리는 RequestProcessor 클래스의 인스턴스에 위임 합니다. 이렇게 함으로서 요청을 처리하는 클래스를 할당하고 기능을 수정 하는 것이 가능 해집니다.
Controller 요소는 자식요소 하나를 포함 합니다.
<!ELEMENT controller (set-property*)>
아래는 controller 요소의 속성 입니다.
bufferSize : 파일 업로드 시 사용하는 입력 버퍼의 크기, 기본값은 4096 입니다.
className : 컨트롤러 정보를 담아놓을 자바 빈을 구현한 클래스, org.apache.struts.config.ControllerConfig의 하위클래스여야 합니다. 기본값은 ControllerConfig 입니다.
contentType : 응답 경과를 보낼 때 사용하는 contentType, 이 속성은 선택적으로 사용 할 수 있으며 기본값은 “text/html” 입니다. 이 속성에 값이 있더라도 JSP 파일에 contentType을 기술 한다면 JSP 파일의 내용이 우선 합니다.
debug : 디버깅 레벨, 값이 클수록 많은 로깅 정보들이 기록되며, 기본값은 0으로 로깅 정보가 기록되지 않습니다.
locale : 사용자의 지역 정보를 세션에 저장 할지 여부, 기본값은 false
maxFileSize : 파일 업로드 시 허용되는 최대 용량
multipartClass : Multipart 요청에 대한 처리를 담당할 클래스, 기본값은 ora.apache.struts.upload 패키지의 DiskMultipartRequestHandler 입니다.
nocache : 응답에 있는 nocache 헤더에 대한 설정, true 또는 false, 기본값은 false, c가 소문자임을 주의
processClass : 사용자의 요청을 처리 할 클래스의 전체 이름
tempDir : 파일 업로드의 경우 사용할 임시 디렉토리
<controller
contentType="text/html;charset=euc-kr"
debug="3"
locale="true"
nocache="true"
processorClass="filter.MyFilter"/>
7. message-resources 요소
메시지 리소스 번들과 관련된 특징을 기술 합니다.
각각의 스트럿츠 설정 파일은 메시지 리소스 번들을 하나 이상 지정 할 수 있습니다.
<!ELEMENT message-resources (set-propert*)>
필요한 속성만 살펴 보도록 합니다.
className : message-resources의 정보를 담을 자바빈을 구현한 클래스
key : 메시지 리소스 번들이 저장될 서블릿 컨텍스트 속성, 기본값은 Action.MESSAGE_KEY에 의해 지정 됩니다.
null : 정의되지 않은 메시지 키가 사용된 경우 MessageResource의 하위 클래스에서 어떻게 처리 할지를 나타내는 Boolean 값. true로 설정하면 빈 문자열을 돌려줍니다. false로 설정하면 “???global.label.missing???”와 같은 문자를 돌려 줍니다.
parameter : 예를 들어 리소스 번들의 이름이 Application.properties 라면 이 속성의 값은 Application이 됩니다. 반드시 정의해야 하는 속성 입니다. 만약 리소스 번들이 패키지화 되어 있다면 전체 경로를 지정 해야 합니다.
<message-resources parameter="resources.application"/>
8. plug-in 요소
struts application이 구동 시에 동적인 자원을 처리 할 수 있게 해주는 기능
예를 들어 애플리케이션 구동 시 원격의 시스템에 연결 해야 된다면 직접 코딩하지 않고 플로그인 기능을 이용하여 이 기능을 구현할 수 있습니다. 플러그인을 사용하기 위해서는 org.apache.struts.PlugIn 인터페이스를 구현하는 자바 클래스를 생성 한 후 설정 파일의 plug-in 요소에 추가 하면 됩니다.
public interface PlugIn {
public void init(ActionServlet servlet, ApplicationConfig config)
throws ServletException;
public void destroy();
}
1.1이전 버전에서는 ActionServlet의 subClass를 통해 애플리케이션 구동 시 애플리케이션의 리소스를 초기화 했지만 1.1이후 버전에서는 Plug-In을 통해 이것이 가능 하게 됨
Plug-In의 경우 스트럿츠 애플리케이션이 초기화 되는 경우 ActionServlet이 Plug-In의 Init() method 를 호출 합니다.
Plug-In은 struts-config.xml 파일에 기술된 순서에 따라 호출됩니다.
<!ELEMENT plug-in (set-property*)>
<plug-in className="org.apache.struts.plugins.ModuleConfigVerifier"/>
<plug-in
className="org.apache.struts.webapp.example.memory.MemoryDatabasePlugIn">
<set-property property="pathname" value="/WEB-INF/database.xml"/>
</plug-in>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
예제
public final class MemoryDatabasePlugIn implements PlugIn {
...
public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
log.info("Initializing memory database plug in from '" + pathname + "'");
// Remember our associated configuration and servlet
this.config = config;
this.servlet = servlet;
// Construct a new database and make it available
database = new MemoryUserDatabase();
try {
String path = calculatePath();
if (log.isDebugEnabled()) {
log.debug(" Loading database from '" + path + "'");
}
database.setPathname(path);
database.open();
} catch (Exception e) {
log.error("Opening memory database", e);
throw new ServletException("Cannot load database from '" + pathname + "'", e);
}
// Make the initialized database available
servlet.getServletContext().setAttribute(Constants.DATABASE_KEY,database);
// Setup and cache other required data
setupCache(servlet, config);
}
}
public final class MemoryDatabasePlugIn implements PlugIn {
...
public void destroy() {
log.info("Finalizing memory database plug in");
if (database != null) {
try {
database.close();
} catch (Exception e) {
log.error("Closing memory database", e);
}
}
servlet.getServletContext().removeAttribute(Constants.DATABASE_KEY);
database = null;
servlet = null;
database = null;
config = null;
}
}
'Dev Story > dev' 카테고리의 다른 글
[iBATIS] 관련 모음 (0) | 2007.07.24 |
---|---|
Exception - The server encountered an internal error () that prevented it from fulfilling this request. (0) | 2007.07.22 |
사이냅소프트(Synapsoft) 개발체계 (0) | 2007.07.09 |
RIA (Rich Internet Application) (0) | 2007.07.09 |
Tomcat 디렉토리 보기 설정 (0) | 2007.07.04 |