JSTL의 코어라이브러리 - 1

<c:set>

- 변수를 선언하고 그 변수에 초기값을 대응하는 기능 

- 선언한 변수는 익스프레션 언어의 EL식 안에서 사용이 가능합니다.(스크립팅 요소안에서는 사용불가)

 올바른 예

 잘못된 예


 <c:set var="num" value = "100" />

 ..........

 ${num}


 <c:set var = "num" value ="100" /> 

 ...........

 <%= num %>

- <c:set> 액션을 이용해서 선언한 변수의 값을 또 다른 변수의 초기값으로 사용가능

<c:set var = "num1"  value = "${num1+num2} />

- <c:set> 태그에 scope라는 애트리뷰트에 저장할 영역을 지정하면 저장할 데이터영역 명시 가능

<c:set var ="PRICE" value ="15000" scope="request">


<c:remove>

- <c:set>액션을 이용한 변수는 데이터영역에 저장되기 때문에 인위적으로 삭제해야 합니다.

- <c:remove> 액션은 다음과 같이 사용이 가능합니다.

1. 데이터 영역에 저장되어 있는 해당 이름의 모든 변수를 삭제하는 경우

    <c:remove var ="code" />

2. 특정영역에 저장되어 있는 해당 이름의 변수를 삭제하는 경우(scope 테그에 명시)

    <c:remove var ="code"  scope="request" />


<c:if> 

- 자바의 if문과 비슷한 역할을 하는 커스텀 액션

- 조건식은 변수 이름의 애트리뷰트값으로 지정하해야 합니다.

  <c:if test="${num1 > num2}" >

num1 이 더 크다 

 </c:if>


<c:choose>

- 자바문법의 switch문과 동일한 기능을 하는 커스텀 액션

- <c:when> 과 <c:otherwise> 라는 커스텀액션을 함께 사용합니다.

 <c:choose>

     <c:when test ="${num == 0}">

num = 0; <BR>

    <c:when test ="${num == 1}">

num = 1; <BR>

    <c:otherwise>

</c:choose>


<c:forEach>

- for문에 해당하는 기능을 제공하는 커스텀액션

<c:forEach begin ="1" end ="10">

야호 <BR>

</c:forEach>

- 반복문에 카운트 변수를 사용해야 하는 경우 (var에 카운트 변수의 이름을 지정)

<c:forEach var ="cnt" begin = "1" end = "10">

${cnt} <BR>

</c:forEach>

- 반복문에 증가치를 변경 해야 경우 (step에 증가치를 지정)

<c:forEach var ="cnt" begin = "1" end = "10" step ="2">

${cnt} <BR>

</c:forEach>


- 배열의 항목을 순서대로 출력하는 경우 (item에 배열이름을 지정하고 var에 배열의 항목을 담는 변수이름 지정)

<c:forEach var="str"  items="${arr}">

${str} <BR>

</c:forEach>



- 참고 자료 : 뇌를 자극하는 JSP & Servlet

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

자바스크립트DOM - 노드 다루기  (0) 2014.01.22
자바스크립트 DOM  (0) 2014.01.22
JSTL의 코어라이브러리 - 2  (0) 2014.01.22

[ MyBatis3 ] 동적 SQL

- MyBatis 의 가장 강력한 기능 중 하나는 동적 SQL 기능이다.

- MyBatis 다른 요소의 사용을 최대한 제거하기 위해 OGNL기반의 표현식을 가져왔다.

    • if
    • choose (when, otherwise)
    • trim (where, set)
    • foreach

* if

<select id = "aaaa" parameterType = "Blog" resultType = "Blog">

SELECT * FROM BLOG

WHERE state = "bbbb"

<if test="title != null">

AND title like #{title}

</if>

</select>


- 이 구문은 선택적으로 문자열 검색 기능을 제공한다.

- title 값이 없다면 모든 active상태의 Blog가 리턴될 것이고 title 값이 있다면 그 값과 비슷한 데이터를 찾게 될 것이다.

* choose, when , otherwise

- 종종 모든 조건을 원하는 대신 한가지 경우만 만족하는 경우를 원할 수 있다, 자바에서 swith문과 유사하다.

<select id = "aaa" parameterType ="Blog" resultType = "Blog">

SELECT * FROM BLOG WHERE state = 'ACTIVE'

<choose >

<when test = "title != null">

AND title like #{title}

</when>

<when test ="author != null and author.name != null">

AND author_name like #{author.name}

</when>

<otherwise>

AND featured = 1

</otherwise>

</choose>

</select>


- title 만으로 검색하고 author 가 있으면 그값으로 검색하고 둘다 제공하기 않는다면 featured 상태의 blog가 리턴된다.


* trim, where, set


위 예제에서 어떤 조건에도 해당하지 않는다면

SELECT * FROM BLOG

WHERE

처럼 나온것이고 sql문이 꼬이게 될 것이다.

<select id=”findActiveBlogLike”parameterType=”Blog” resultType=”Blog”>

SELECT * FROM BLOG

<where>

<if test=”state != null”>

state = #{state}

</if>

<if test=”title != null”>

AND title like #{title}

</if>

<if test=”author != null and author.name != null”>

AND title like #{author.name}

</if>

</where>

</select>

>> where 요소는 태그에 의해 컨텐츠가 리턴되면 필요할 경우 "WHERE" 을 추가한다.

만약 컨텐츠가 "AND" 나 "OR"로 시작한다면 삭제해버린다.


만약 where 요소가 기대처럼 동작을 하지 않는다면, trim 요소를 사용자 정의할 수 있다.


<trim prefix ="WHERE" prefixOverrides = "AND | OR">

</trim>

>> override 속성은 오버라이드하는 텍스트의 목록을 제한한다.

결과는 override 속성에 명시된 것들을 지우고 with 속성에 명시된 것을 추가한다.


<update id ="updateAuthorIfNecessary" parameterType="domain.blog.Author">

update Author

<set>

<if test="username != null">username=#{username},</if>

<if test="password != null">password=#{password},</if>

<if test="bio != null">bio=#{bio}</if>

</set>

where id = #{id}

</update>


>> 여기서 set 요소는 동적으로 SET 키워드를 붙이고 필요없는 콤마를 제거한다.

<trim prefix="SET" suffixOverrides=",">

</trim>


* foreach


- 동적 SQL에서 공통적으로 필요한 것으 collection에 대한 반복처리를 하는 것이다. 종종 IN 조건을 사용하게 된다.

- foreach 요소는 매우 강력하고 collection을 명시하는 것을 허용한다.

- 요소내부에서 사용할 수 있는 item, index 두가지 변수를 선언한다.


- 열고 닫는 문자열로 명시할 수 있고 반복간에 둘 수 있는 구분자도 추가할 수 있다.

[ MyBatis3 ] SQL Map XML 파일(resultMap-3)

* collection

<collection property="posts" ofType="domain.blog.Post">

<id property = "id" column="post_id" />

<result property ="subject" column="post_subject" />

</collection>


- collection 요소는 관계를 파악하기 위해 작동한다.

- ofType : 자바빈 프로퍼티 타입과 collection 의 타입을 구분하기 위해 필요하다.

>> associations과 collections에서 내포의 단계혹은 조합에는 제한이 없다.


* discriminator


<discriminator javaType="int" column="draft">

<case vaule="1" resultType="DraftPost" />

</discriminator>


- 종종 하나의 데이터베이스 쿼리는 많고 다양한 데이터 타입의 결과를 리턴한다.

이 요소는 클래스상속관계를 포함하여 이러한 사항을 위해 고려됨

- discriminator 정의는 column 과 javaType 속성을 명시한다.

column은 MyBatis로 하여금 비교할 값을 찾을 것이다. javaType은 동일성 테스트와 같은 것을 실행하기 위해 필요

- 각각의 레코드를 가져와 draft값과 비교한다. 만약 비교값과 같은 경우가 생기면 명시된 resultMap을 사용 없다면 무시된다.