Struts2

Hagi 2010. 2. 4. 11:23

1.  OGNL을 다루기 위한 최상위 객체로 맵을 사용(컨텍스트 맵 또는 컨텍스트라 부름)

 

2. OGNL은 컨텍스트 안에 루트 객체를 갖음

 

3. 컨텍스트의 다른 객체를 참조할 때 '#' 기호를 사용

 

4. 컨텍스트맵 ( application, seesion, value stack, request, parameters, attr)

    Struts2는 액션 컨텍스트를 OGNL 컨텍스트가 되도록 설정하고, value stack을 OGNL 루트 객체가 되도록 설정한다. 밸류 스택은 여러 객체의 집합이지만 OGNL 루트 객체는 단일 객체를 사용하는 차이점이 있다. OGNL 컨텍스트에는 밸류 스택 외에도 다른 객체를 저장한다.

* 액션은 항상 밸류 스택에 저장된다. 밸류 스택은 루트 객체이고, 액션은 밸류 스택 상에 있기 때문에 액션의 프로퍼티는 '#' 기호 없이 참조할 수 있다. 그러나 액션 컨텍스트 상의 다른 객체를 참조하려면 '#' 기호를 반드시 사용해야 한다.

예) <s:property value="#session.myKey" /> 또는 <s:property value="#session['myKey']" />

     => 액션에서 저장시 : ActionContext.getContext().getSession().put("myKey", myObject);

     <s:property value-="postalCode" />

 

5. Collections 객체를 사용할 때 OGNL의 표현식

 ㄱ. {e1,e2,e3} 형식 : <s:select name="name" list={'name1','name2','name3'}" value="%{'name2'}" />     리스트

 ㄴ. #{key1:value1, key2:value2} 형식 : <s:select name='name' list="#{'key1':'value1', 'key2':'value2'}" /> 맵

 ㄷ. 컬렉션에 하나의 요소의 존재 여부를 결정하는 법

     <s:if test="'name1' in {'name1','name2'}">

name1이 컬렉션 안에 존재합니다.

     </s:if>

     <s:else>

name1이 컬렉션 안에 존재하지 않습니다.

     </s:else>

        * not in 도 가능

  ㄹ.  컬렉션에 하나의 요소의 존재 여부를 결정하는 방법

     ? : 선택 조건과 일치하는 모든 요소

     ^ : 선택 조건과 일치하는 요소 중 첫 번째 요소

     $ : 선택 조건과 일치하는 요소 중 마지막 요소

      예) person.relatives.{? #this.gender == 'female'}  

 

 

 

 참고 : p101 ~p105, 스트러츠2 프로그래밍, 에이콘

 

 
 
 

Struts2

Hagi 2010. 2. 3. 17:53

핵심 기능

1. 이중 서브밋 방지

2. 타입 변환

3. 입력 파라미터의 값을 액션 클래스의 프로퍼티에 설정

4. 유효성 검사

5. 파일 업로드

6. 출력 페이지 준비

 

인터셉터는 struts2-core-2.x.x.jar 파일 안에 위치한 struts-default.xml 파일안에 내용을 정의하고 있다.

 

xml설정시 package에서 struts-default 패키지를 상속 받도록 설정하는데, 이것은 해당 package가 struts-default 패키지에서 정의한 내용을 그래로 사용할 수 있다는 것이다. 즉, 스트러츠2에서 인터셉터는 하나의 액션이 샐행되기 전과 후에 요청이 여러 인터셉터를 거치도록 설정할 수 있다. 인터셉터는 이처럼 체인 형식으로 구성할 수 있다. 인터셉터는 이처럼 체인 형식으로 구성할 수 있다. 이렇게 체인으로 형성된 여러 인터셉터의 무리를 '인터세터 스택(Interceptor Stack)'이라 부른다.

 

인터셉터 설정의 예

<action name="myAction" class="example.MyAction">

<interceptor-ref name="timer" />

<interceptor-ref name="logger" />

<result>/myPage.jsp</result>

</action>

 

(참고 : 스트러츠2 프로그래밍 / 에이콘)

 
 
 

Struts2

Hagi 2010. 2. 3. 15:24

* tablib의 선언 => <%@ taglib prefix="s" uri="/struts-tags" %>

 

1. <s:proerty />

 action 클래스에 선언되어 있는 getter에서 값을 가져온다. 이때 OGNL을 이용한다.

 <s:property value="message" /> 와 같은 식으로 action class에 있는 변수명과 value 내의 이름을 일치시키면 해당 값을 출력한다.

 

2. <s:iterator />와 <s:if />

 java.util.Collection과 java.util.Iterator 등을 출력할 때 쓰인다. 이것 역시 OGNL을 이용해 getter를 받는다.

action 클래스에서 List가 printList로 저장되어 있다면...(각 값은 디폴트인 String 형태)

<s:iterator value="printList">

<s:property />

</s:iterator>

로 출력한다.

<s:iterator status="stat" />

status는 말 그대로 상태를 나타낸다. 해본 예제에 의하면 html의 table에서 처음행(first),마지막행(last),행의 인덱스(idex), 짝수(odd) 등을 나타낼 수 있다.

<table border="1" width="400">
 <tr align="center" style="color:white; background-color:black">
  <td>제품 이름</td>
  <td>제품 모델번호</td>
 </tr>
 <s:iterator value="listProduct" status="status">
 <tr bgcolor='<s:if test="#status.odd">lightgrey</s:if>'>
  <td><s:property value="name" /></td>
  <td><s:property value="modelNo" /></td>
 </tr>
 </s:iterator>
</table>

=> if, elseif, else가 있다고 한다. 위 소스의 출력은 짝수행은 색깔이 회색으로 출력된다.

 

3. 객체 출력

 만약 action 클래스에 model을 선언하고 getter를 만들었다면, 예를 들어

package example.object.model;

public class Product{
 private String name;
 private String modelNO;
 
 public Product(){ }
 public Product(String name, String modelNo){
  this.name = name;
  this.modelNO = modelNo;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getModelNO() {
  return modelNO;
 }
 public void setModelNO(String modelNO) {
  this.modelNO = modelNO;
 }
}

action 클래스에서 Product product = new Product(); 라고 인스턴스를 생성하면,

view에서

<s:label>제품 이름 : </s:label>
<s:property value="product.name"/>
<br/>
<s:label>제품 모델번호 : </s:label>
<s:property value="product.modelNO"/>

이렇게 출력할 수 있다.

 

4. <s:date />

 action 클래스에서 Date currDate로 생성하면 getter와 OGNL을 이용하여 <s:date name="currDate" />로 날짜,시간 등을 출력할 수 있다.

=> 2010. 2. 3 오후 3:28:27 

 format="yyyy-MM-dd hh:mm:ss" 또는 dd/MM/yyyy hh:mm등으로 형식도 지정할 수 있다.

 

위 예제 소스

struts2-blank-2.1.8.1.war=> 용량 초과로 lib내의 파일 전부 삭제했으니 알아서 추가하시기 바람

 

- 첨부파일

struts2-blank-2.1.8.1.war