'Struts2'에 해당되는 글 2

  1. 2008.04.12 Struts2 - struts.xml 에서 설정해야 할 것 (2)
  2. 2008.04.11 Struts2

Struts2 - struts.xml 에서 설정해야 할 것

Struts2 에 대한 초 간단 예제를 보고 싶다면 여기로

struts.xml 에서는 요청에 대한 처리를 어디서 할지를 매핑해 준다. 기본적인 값은 struts-default.xml에 정의되어 있기 때문에 이 파일을 extends 해서 사용하면 된다. (당연히 자신이 개발한 서비스에서 떤 URL 요청이 오면 어떤 Action으로 연결한다...같은 건 꼭 해줘야 하는 거죠)

1. package
package 는 result-type, interceptors, action 등을 논리적인 단위로 그룹핑하는데 사용한다. 패키지는 다른 패키지를 상속할 수 있다.

package 안에 들어가는 element 들의 순서는 다음과 같다.
- result-type
- interceptors
- default-interceptor-ref
- default-action-ref
- global-result
- global-exception-mappings
- action

package 의 속성은 다음 4가지이다
- name (필수) : 패키지를 구분하는 키.
- extends (옵션) : 다른 패키지를 상속하고자 할 때 사용.
- namespace (옵션) : 패키지내의 액션들을 URL에 매핑할 때 URL의 중간 경로.
- abstract (옵션) : 추상패키지로 설정할때.(true). 다른 패키지 상속용도로 사용. (struts-default.xml 의 struts-default 패키지)

namespace
namespace는 요청 URL의 중간 경로이다.
http://localhost:8080/[contextpath][namespace]/[action name].action
아래는 struts.xml의 예이다. example는 namespace를 지정하지 않아서 default namepace가 되었고, nsexample은 namespace를 /ch4 로 설정했다. 이때, 다음과 같은 URL로 요청이 들어오면,
http://localhost:8080/struts2/ch4/helloWorld.action
마지막 /HelloWorld.action을 제외하고 바로 앞의 /ch4 라는 namespace를 가진 package를 찾고, helloWorld 액션을 찾아서 실행한다. 만약, package를 못찾았다면, 디폴트 액션을 실행한다. 그런데 디폴트 액션이 지정되어 있지 않다면 default namespace의 package(example)을 찾는다.
만약 /ch4 의 package를 못찾는다면 default namespace의 package를 찾는데, 이 package가 없다면
"helloWorld 라는 액션맵이 없다"면서 404 에러가 뜬다. 마찬가지로, default namespace에서 helloworld 액션을 찾지 못한다면 default action을 실행하고, default action 이 없다면 액션맵이 없다는 에러가 뜬다.
따라서, default namespace의 package와 그 안에 default action을 정의했다면 어떤 URL 요청도 매핑되게 된다.

struts.xml 예(namespace)


2. include
struts.xml 에 모든 것을 정의하면 복잡해지고 불편하므로 다음과 같이 파일을 나눈 후에 include 시킬 수 있다.
포함될 파일은 어디에 위치해도 상관없고 struts.xml과 같은 형식에 <!DOCTYPE...>도 포함되어야 한다. struts.xml에는 암묵적으로 <include file="struts-default.xml" />을 포함하고 있다.
<struts>
<include file="strtus-ch4.xml" />
<include file="struts-ch5.xml" />
</struts>

3. interceptors
인터셉터는 액션의 실행 전후에 실행되는 모듈이다. 서블릿의 필터와 비슷한 개념과 방식이다. struts-default.xml에 유용한 인터셉터와 인터셉터 스택들이 선언되어 있다.

4. action
액션 설정은 다음과 같은 일을 한다.
- URL과 actionc class를 매핑한다.
- action 에 붙일 인터셉터를 설정한다.
- action 실행 결과에 따른 result를 지정한다
- action 실행 시에 예외가 발생할 경우 예외에 따른 result를 지정한다.

action element 의 두 속성 name 과 class
- name : 요청 URL
- class : 실행할 action class
<package ...>
  <constant name="struts.enable.SlashsInActionNames" value="true" />
  <action name="helloWorld" class="example.control.actions.NSHelloWorld">
  ...........
  </action>
</package>
위의 예는 http://localhost:8080/contextpath/helloWorld.action 로 요청을 하면 된다.
action name에는 struts.enable.SlashsInActionNames 값을 true로 설정하여 / 를 사용할 수 있지만, package의 namespace 와의 혼란이 발생해 이상한 결과가 올 수 있다.

action 메서드(execute)
사용자가 URL로 접근하면 struts는 요청 URL에 해당하는 action을 찾아서 action 클래스의 execute() 를 호출하게 된다. 따라서 action 클래스는 com.opensymphony.xwork2.Action interface 를 implements 해서 execute() 를 구현해야 한다. 하지만 명시적으로 Action interface 를 implements 했다고 적지 않아도 execute() 만 구현되어 있다면 문제없다. 이때는 리플렉션으로 execute() 를 찾아간다. action 클래스는 execute() 외에 다른 메서드를 구현해서 그 메서드가 실행되도록 할 수 있는데, 예를 들면 create(), delete() 같은 메서드를 구현해 놓았다면, action element의 method 속성에 정의해야만 그 메서드가 호출된다.
<action name="delete" class="example.CrudAction" method="delete">

com.opensymphony.xwork2.Action interface

만일 action 매핑에 class 속성을 정의하지 않았다면 기본적으로 ActionSupport 클래스를 사용한 것으로 간주한다. ActionSupport의 execute() 에서는 SUCCESS를 리턴한다. 다음 매핑은 action class 를 지정하지 않았기때문에 result 값이 SUCCESS(상수로 실제 값은 success)가 되고 따라서 hello.jsp로 포워딩시킨다.

action class 지정하지 않은 예..


default action
위의 namespace 설정에서 설명했듯이 요청한 액션이 없을 때 기본으로 실행할 action을 말한다. 이렇게 하면 액션이 없다는 에러를 발생하지 않고 default action에 정의된 page 로 포워딩 시킬수 있다.

5. result
result 에는 두가지 속성이 있다.
name : 액션 매서드 (execute) 가 리턴할 문자열.
type : result 의 type. dispatcher, redirect, chain 등. default 는 dispatcher.

type은 struts-default.xml에 잘 정의되어 있고, 거기에 보면 dispatcher가 default로 되어 있다. result는 여러개가 올수 있다.

global-results
여러 액션에서 공통으로 사용하는 result는 action의 하위 element 로 정의 하지않고 따로 정의한다. 에러나 로그인 같은 용도.
<package ....>
<global-results>
   <result name="login" type="redirect">/login.jsp</result>
   <result name="error">/error.jsp </result>
  </global-results>
</package>

PS. struts.properties
이 파일은 프레임워크 구동 방식에 대한 결정을 한다. 위치는 struts.xml과 마찬가지로 클래스패스의 루트에 두어야 하고, struts2-core-2.x.jar 의 org/apache/struts2/default.properties 에 있는 디폴트 값에 오버라이드 한다. 따라서 디폴트값과 다른 것만 설정하면 된다. 주요 값은 다음과 같다.

# default locale 과 인코딩 스키마
# struts.locale=en_US
struts.i18n.encoding=UTF-8

# 클래스 인스턴스를 cache 할 것인지.
struts.objectFactory.spring.useClassCache = true

# 디폴트로 임시디렉토리 지정. 최대 사이즈 지정.
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

신고

'개발' 카테고리의 다른 글

JSONP with dojo  (4) 2008.07.17
Top 10 Mistakes when building Flex Applications  (1) 2008.04.23
Struts2 - struts.xml 에서 설정해야 할 것  (2) 2008.04.12
Struts2  (0) 2008.04.11
JSP가 Servlet 으로 변환될 때  (0) 2008.04.01
HttpSession 관련 Listener  (2) 2008.03.31
TRACKBACK 0 Comment 2

Struts2

Struts 는 MVC2 모델을 구현하기위한 Framework이다. 이중에서 controller 를 쉽게 구현할 수 있도록 한다.

Struts1과 Struts2의 가장 큰 차이점은 Action 클래스이다.
1.x 버전에서의 action은 서블릿과 매우 유사하다. 여기에는 HttpServletRequest 와 HttpServletResponse객체를 필요로 했다. 2.x 버전의 Action은 빈 스타일의 POJO(Plain Old Java Object)이고, Servlet API가 없다.

초간단 Controller 만들기 (모델에서 데이터 가지고 오고, View에 넘겨주는 컨트롤러 겸 네비케이터)
1.Action 만들기
Action은 Bean으로 getter가 있으며, excute()를 구현해야 한다. 아래 예는 ActionSupport를 extends 했지만, 이를 extends 할 필요없이 그냥 POJO로 구현해도 된다.

action code...


2. view(jsp) 만들기

jsp code..


3. 맵핑
액션과 result로 view page(jsp)를 연결하는 설정은 struts.xml에서 한다. struts.xml 파일은 WEB-INF/classes 아래에 둔다. 아래 코드를 보면 action의 name 이 URL이 되고, 액션 클래스의 result 가 success이면 helloworld.jsp로 보내게 되는 것이다. 따라서 URL에 http://localhost:8080/contextPath/HelloWorld.action으로 요청을 보내면 example.control.actions.HelloWorld의 클래스에서 excute() 가 실행되고, result 값(success)에 따라 알맞은 jsp로 포워딩 시키는 것이다.

struts.xml..


4. web.xml 설정
 Struts2 는 필터에서 모든 것을 처리 한다. web.xml 에 요청URL이 *.action 일 경우 FilterDispatcher가 이를 감지하도록 Filter로 등록시킨다. 따라서 위의 예처럼 http://.../HelloAction.action 의 요청이 들어오면 FilterDispathcer가 struts.xml 에 있는 action mapping 에서 알맞은 action을 찾아 실행시키게 되는 것이다.
Struts1에서는 ActionServlet을 통해서 제어했으나 Struts2에서는 FilterDispatcher를 통해서 오는 요청만 제어하게 되는 것이다.

web.xml..


5. helloworld.jsp 에서 EL 표현식
message(getMessage)를 어떻게 호출할까. 뭐 bean 이니깐 되겠지. 알아서 잘 만들었을라구.
신고

'개발' 카테고리의 다른 글

Top 10 Mistakes when building Flex Applications  (1) 2008.04.23
Struts2 - struts.xml 에서 설정해야 할 것  (2) 2008.04.12
Struts2  (0) 2008.04.11
JSP가 Servlet 으로 변환될 때  (0) 2008.04.01
HttpSession 관련 Listener  (2) 2008.03.31
HttpSession  (0) 2008.03.30
TRACKBACK 0 COMMENT 0

티스토리 툴바