참고: http://www.struts2.org/struts2-control-tags-using-iterator-tag/

<table>
    <s:iterator value="serviceTypeList" id="serviceTypeInfo" status="cust_stat">
    <tr bgcolor="<s:if test="#cust_stat.odd==true">grey</s:if><s:else>white</s:else>">
        <td>serviceType</td>
        <td><s:property value="serviceType"/></td>
    </tr>
    </s:iterator>
</table>

value -> list
id -> 루프 돌 때의 현재 object
status -> 상태값.(짝수/홀수 등등)

위의 결과는 다음.

serviceType s1
serviceType s2
serviceType s3


추가.


id false
false String Deprecated. Use 'var' instead
란다.

<s:iterator value="serviceTypeList" status="stat" var="serviceTypeInfo">
<s:if test="{#temp.isSelected.equals('Y')}" >
위는 위에서 말한 id 대신 var 사용한 것이고, var 사용하면 Stack Context에 들어가서 #key로 참조 가능하다. <s:debug/>로 확인가능.

그리고 iterator 안에서 if 태그 사용하기 예제. 찾기 힘들었다...

ps. if 태그에서 test="{}" 괄호 빼먹지 말 것!!!

추가2.

if tag 사용법이 좀 헷갈리네.
<s:if test="%{true}"> -> 항상 참
<s:if test='%{#serviceTypeInfo.isSelected == "Y"}' > -> 문자열 비교 시 사용. 'Y' 랑은 다르니 조심할 것
<s:if test='%{isSelected == "Y"}' > -> 위랑 같다. iterator 안에서는 #serviceTypeInfo 처럼 강제로 밸류스택을 안 찾아도 되는건가?

추가3.
<s:if test='%{status.equalsIgnoreCase("R")}'>준비중</s:if>
위의 것도 잘 된다. equals도 잘 될 듯. 비교 대상이 문자열("")인가 문자('')인가를 헷갈리지 말 것

'프로그래밍 > Framework' 카테고리의 다른 글

[iBatis] queryForMap() 사용법  (0) 2009.04.21
[iBatis] iterate 사용법  (1) 2009.04.13
[iBatis] 동적쿼리에서 ORDER BY 하기  (0) 2009.04.13
[iBatis] 동적쿼리문 생성  (0) 2009.04.13
[Struts2] <s:select> 사용법  (0) 2009.04.10
<statement id="SELECT_CONTENT_TYPE" resultMap="contenttype-resultMap">
        SELECT
            *
        FROM (
            SELECT
                ROWNUM ROWCNT,
                CONTENT_TYPE, CONTENT_TYPE_NAME, SUBSET_LIST_KEY, STATUS,
                DESCRIPTION_PAGE_NAME, INPUT_PAGE_NAME, DETAIL_VIEW_PAGE_NAME,
                CREATE_ID, CREATE_TIME, UPDATE_ID, UPDATE_TIME
            FROM
                CONTENT_TYPE
        )
        <dynamic prepend="WHERE">
            <isNotEmpty property="pageNavi.startRow">
                ROWCNT BETWEEN #pageNavi.startRow# AND #pageNavi.endRow#
            </isNotEmpty>
        </dynamic>
        <dynamic prepend="ORDER BY">
            <isNotEmpty property="orderColumn">
                $orderColumn$ $orderType$
            </isNotEmpty>
        </dynamic>
    </statement>

$orderColumn$ 인 것에 주목.
문자열 치환일 경우엔 $가 붙는다.
#은 preparedStatment에서 바인딩 하는 경우에 사용한다.(?에 값 넣는 경우처럼)

'프로그래밍 > Framework' 카테고리의 다른 글

[iBatis] iterate 사용법  (1) 2009.04.13
[Struts2] <s:iterator> <s:if> 사용법  (0) 2009.04.13
[iBatis] 동적쿼리문 생성  (0) 2009.04.13
[Struts2] <s:select> 사용법  (0) 2009.04.10
[Struts2] 태그에서 변수 사용법  (0) 2009.04.08

[iBatis] 동적쿼리문 생성

프로그래밍/Framework 2009. 4. 13. 16:08 Posted by galad
출처: http://narrowway.tistory.com/entry/iBatis%EB%8F%99%EC%A0%81-%EC%BF%BC%EB%A6%AC%EB%AC%B8-%EC%83%9D%EC%84%B1

<statement id="dynamicGetAccountList" resultMap="account-result">

  select * from account

  <dynamic prepend="WHERE">

    <isNotNull prepend="AND" property="firstName">

      (acc_first_name = #firstName#

    <isNotNull prepend="OR" property="lastName">

       acc_last_name = #lastName#

    </isNotNull>

    )

    </isNotNull>

    <isNotNull prepend="AND" property="emailAddress">

      acc_email like #emailAddress#

    </isNotNull>

    <isGreaterThan prepend="AND" property="id" campareValue="0">

      acc_id = #id#

    </isGreaterThan>

  </dynamic>

  order by acc_last_name

</statement>

 

상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다.

동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.

 

이러한 조건들에 대해 간단히 정리하면 아래와 같다.

 

바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.

 

바이너리 조건 속성

prepend

Statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

비교되는 property(필수)

compareProperty

비교되는 다른 property (필수 또는 compareValue)

compareValue

비교되는 값(필수 또는 compareProperty)

 

<isEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같은지 체크

<isNotEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같지 않은지 체크

<isGreaterThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 큰지 체크

<isGreaterEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 크거나 같은지 체크

<isLessThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 작은지 체크

<isLessEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 작거나 같은지 체크

 

사용법 예제)

<isLessEqual prepend="AND" property="age" compareValue="18">

  ADOLESCENT = 'TRUE'

</isLessEqual>

 

단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.

prepend

statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

체크하기 위한 프로퍼티(필수)

 

<isPropertyAvailable>

프로퍼티가 유효한지 체크

(이를 테면 파라미터의 프로퍼티이다.)

<isNotPropertyAvailable>

프로퍼티가 유효하지 않은지 체크

(이를 테면 파라미터의 프로퍼티가 아니다.)

<isNull>

프로퍼티가 null인지 체크

<isNotNull>

프로퍼티가 null이 아닌지 체크

<isEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null이거나 empty(“” or size() < 1)인지 체크

<isNotEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null 이아니거나 empty(“” or size() < 1)가 아닌지 체크

 

사용법 예제)

<isNotEmpty prepend="AND" property="firstName">

  FIRST_NAME = #firstName#

</isNotEmpty>


다른 요소들

Parameter Present : 파라미터 객체가 존재하는지 체크

Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분

<isParameterPresent>

파라미터 객체가 존재(not null)하는지 체크

<isNotParameterPresent>

파라미터 객체가 존재하지(null) 않는지 체크

 

사용법 예제)

<isNotParameterPresent prepend="AND">

EMPLOYEE_TYPE = 'DEFAULT'

</isNotParameterPresent>


Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.

Iterate Attributes :

  prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)

  property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수)

  open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)

<iterate>

java.util.List 타입의 프로퍼티 반복


사용법 예제)

<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR">

username = #userNameList[]#

</iterate>


주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.


[Struts2] <s:select> 사용법

프로그래밍/Framework 2009. 4. 10. 11:37 Posted by galad
<s:select name="subsetListKey" list="subsetList" headerKey="1" listKey="codId" listValue="codeName"/>

headerKey는 필수. 기본 선택 번호 headerKey는 첫번째 필드에 줄 값. headerValue랑 쌍으로 쓰인다. default로 선택해주는 것은 value속성
listKey는 값
listValue는 보여지는 것.

추가.

<s:select name="serviceSystem" list="systemInfoList" headerValue="Select Value" headerKey="-1" listKey="systemId" listValue="systemName" value="%{#serviceTypeInfo.systemId}">

headerValue는 첫줄에 보여줄 값. 예를 들어 "선택해주세요" 같은 것
headerKey는 headerValue에 설정할 값. 선택했을 때 주어지는 값.
value가 selected를 설정하는 값. value에 입력되는 값과 listKey의 값이 같으면 기본선택으로 된다. listValue와는 관계없는 듯.

추가2.

<s:select name="contentTypeInfo.status" list="#{'R':'준비중', 'U':'사용중'}" cssClass="form"></s:select>
<select name="contentTypeInfo.status" class="form">
        <option value="R">준비중</option>
        <option value="U">사용중</option>
</select>
위의 2개는 같다. list 속성에 직접 "키:값"의 쌍으로 목록을 넣을 수 있다.
출처: http://www.zulutown.com/blog/2009/01/21/accessing-current-item-properties-in-a-struts2-iterator/

<s:iterator value="myList" status="status" id="item" > 
<s:property value="%{attr.item.name}"/> Doesn't work
<s:property value="%{#attr.item.name}"/> Works
<s:property value="attr.item.name"/> Doesn't work
<s:property value="#attr.item.name"/> Works
<s:property value="item.name"/> Doesn't work
<s:property value="name"/> Works
<s:property value="#attr.item.name"/> Works
</s:iterator>

        <action name="addContentType" class="com.omp.bp.cms.content.action.ContentTypeAction" method="addContentType">
            <result>/cms/content/contenttype/m_register_content_type_main.jsp</result>
        </action>
        <action name="registerContentType" class="com.omp.bp.cms.content.action.ContentTypeAction" method="registerContentType">
            <result>/cms/content/contenttype/m_register_content_type_main.jsp</result>
            <result name="TEST" type="chain">addContentType</result>
        </action>

위처럼 chain으로 해서 다른 액션에 바로 연결할 수 있으나, 주소가 안 바뀐다.
사용할 경우를 골라야 할 듯.

redirect와 병행 사용?
Action에서 멤버변수로 jsp에 넘긴 값도 request.getAttribute()로 받을 수 있다.

제목그대로...

<%= request.getAttribute("command") %>
이걸 하든

<s:property value="%{command}"/>
이걸 하든

 값이 나오더라....

'프로그래밍 > Framework' 카테고리의 다른 글

[Struts2] 태그에서 변수 사용법  (0) 2009.04.08
[Struts2] result의 type 속성  (0) 2009.04.08
[Struts2] 링크들  (0) 2009.04.07
[iBatis] There is no DAO implementation found for...  (0) 2009.04.06
[Struts2] struts.properties  (0) 2009.03.13