본문 바로가기

카테고리 없음

JSP_4. Action Tag

▶ JSP Action Tag

  1. 표준 액션 태그  
    1. include
    2. forward
  2. 커스텀 액션 태그 
    1. JSTL Core Library :  변수선언, 조건문, 반복문 등과 관련된 문법을 제공
    2. JSTL Formatting Library : 숫자, 날짜 및 시간데이터 출력형식을 지정할 때 사용하는 문법을 제공
      1. formatNumber
      2. formatDate
    3. JSTL Functions Library : EL구문에서 사용할 수 있는 메서드를 제공
    4. OTHERS
      1. c:import
      2. c:redirect
      3. c:catch

▶ JSP Action Tag

: XML기술을 이용해서 기존의 JSP문법을 확장시키는 기술을 제공하는 태그들
=> jstl.jar 파일을 다운로드 후 WebContent/WEB-INF/lib폴더에 추가해야 사용가능하다.

1. 표준 액션 태그
  : JSP페이지에서의 별도의 라이브러리 연동 없이 즉시 사용가능하다. 
  : 태그앞에 jsp: 접두어가 붙는다.
        
2. 커스텀 액션 태그

 

 

1. 표준 액션 태그

▶ include / forward◀

▶ include ◀

1. 기존의 include 지시어를 이용한 방식(정적 include방식 == 컴파일시 포함되는 형태)
<%@ include file="footer.jsp" %>

특징 : include하고 있는 페이지상에 선언되어 있는 변수를 현재 페이지에서도 사용 가능함. 
       include한 페이지의 year 변수값 : <%= year %> 
	
       단, 현재페이지에서 동일한 이름으로 변수를 선언할 수 없었음.
       //<% String year = "2022"; %> 


2.  JSP표준 액션태그를 이용한 include 방식(동적 include방식 == 실행시 포함되는 형태)
    <jsp:include page ="footer.jsp" />
	<!--  반드시 시작태그와 종료태그가 있어야 한다.
		단, 시작태그와 종료태그 사이에 넣을 값이 없는 경우 시작태그에 / 를 붙여서 표현함 -->
        
특징1 : include하고 있는 페이지에서 선언된 변수를 공유하지 않는다. 
	<% String year = "2022"; %> 
	
특징2 : 포함시 include하는 페이지로 내가 원하는 값을 전달할 수 있다. 
	<jsp:include page ="footer.jsp" >
		<jsp:param value="testValue" name="test"/>
	</jsp:include>
	
	
	<jsp:include page ="footer.jsp" >
		<jsp:param value="testValue2" name="test2"/>
	</jsp:include>
	
	
	전달받은 param : ${param.test }

 

 

▶ forward ◀

<h1>여기는 02_forward.jsp 입니다..</h1>

	<jsp:forward page="footer.jsp"/>
<!-- 	forward 특성상 url은 그대로고 화면만 바뀜. -->

 

 

2. 커스텀 액션 태그

▶ JSTL이란 ?

: JSP Standard Tag Library의 약자로 JSP에서 사용되는 커스텀 액션태그.
 공통적으로 사용되는 코드들의 집합을 보다 쉽게 사용할 수 있도록 태그화해서 표준으로 제공한다.
 
 
* 라이브러리 다운로드 후 추가하기
1) 인터넷을 통해 jstl.jar파일 추가 
2) dev폴더에 추가
3) WEB-INF/lib에 추가하기


* JSTL 선언방법
: JSTL을 사용하고자 하는 JSP페이지 상단에 taglib지시어를 사용해서 선언한다. 
  <%@ taglib prefix= "접두어" url="라이브러리 파일상의 url주소" %>

 

▶ JSTL 분류

1. JSTL Core Library

: 변수선언, 조건문, 반복문 등과 관련된 문법을 제공


* 변수선언 <c:set var="변수명" value="리터럴" scope="스코프영역을 지정(생략)" />
    - 변수를 선언하고 초기값을 대입해두는 기능을 제공
    - 해당 변수를 어떤 scope에 담아둘껀지 지정가능함(기본값은 pageScope)
    => 해당 scope영역에 setAttribute함수를 이용해서 key+value형태로 데이터를 담아놓는 형태다
    => c:set을 통해 선언된 변수는 EL로 접근해서 사용할 수 있다.


* 주의사항
- 변수의 타입(자료형)을 별도로 지정하지 않음
- 반드시 해당 변수의 담아주고자하는 초기값 속성을 무조건 추가해줘야 함
  (선언과 동시에 초기화 해야함)

 

<c:set var="num1" value="10" />
<c:set var="num2" scope="request" >	20 </c:set>
num1 변수값 : ${pageScope.num1 } 
num2 변수값 : ${requestScope.num2 }

<c:set var="result" value="${num1+num2 }" scope="session" />
result 변수값 : ${result }

 

 

* 변수삭제 <c:remove var="제거하고자하는 변수명" scope="스코프영역지정(생략)">;
    - 해당 변수를 scope에서 찾아서 제거하는 태그
    - scope지정 생략시 모든 scope에서 변수명과 일치하는 값을 모두 제거함
    => 해당 scope에 removeAttribute메서드를 이용해서 제거하는 것과 같다.
삭제전 result : ${result } 
1) 특정 scope지정해서 삭제하기 
<c:remove var="result" scope="request"/>
request에서 result 삭제 후 : ${result } 
<!--  sessionScope에 result를 선언했기 때문에 삭제되지 않는다 -->

2) 모든 scope에서 삭제하기 
<c:remove var="result" />
삭제후 result : ${result }

 

* 변수출력<c:out value ="출력하고자 하는값" default="기본값(생략가능)" escapeXml="true/false"(기본값 true, 생략가능)) >;
    - 데이터를 출력하고자 할 때 사용하는 태그
    - 기본값 : value에 출력하고자 하는 값이 없을 경우 기본값으로 출력할 내용물을 기술(생략가능)
    - escapeXml : 태그로써 해석할지 여부(생략가능)
result : <c:out value="${result }" /> 
default 설정시 result : <c:out value="${result }" default ="값이 없다.." /> 

<!--  
    * escapeXml 
    생략시 기본값 true => 문자열로 취급
-->
<c:set var="outTest" value="<b>출력 테스트</b>" />
<c:out value="${outTest }" /> 
<c:out value="${outTest }" escapeXml="false" />

 

 

1) 조건문 - if (<c:if test="조건식" >;)

- JAVA의 단독 if문과 비슷한 역할을 하는 태그
- 조건식을 test라는 속성에 속성값으로 작성하는데, 무조건 EL구문으로 작성해야 한다.
<c:if test="${num1 gt num2 }" >
    <b>num1이 num2보다 큽니다.</b>
</c:if>
<!-- 조건식이 만족이 되지 않아 출력자체가 되지 않음 -->


<c:if test="${num1 lt num2 }" >
    <b>num1이 num2보다 작습니다.</b>
</c:if>

<c:set var="str" value="안녕" />

<c:if test="${str eq '안녕' }" >
    <mark>Hello</mark>
</c:if>

<c:if test="${str ne '안녕' }" >
    <mark>Good Bye</mark>
</c:if>

 

 

2) 조건문 - choose(<c:choose&gt;, &lt;c:when&gt;, &lt;c:otherwise>;)

- JAVA의 if-else, if-else if 또는 switch문과 비슷한 역할을 하는 태그
- 조건식들을 c:choose의 하위요소로 c:when에 작성한다.

<c:choose>
    <c:when test="${num1 eq 20 }">
        <b>num1은 20입니다</b>
    </c:when>
    <c:when test="${num1 eq 10 }">
        <b>num1은 10입니다.</b>
    </c:when>
    <c:otherwise>
        <b>num1은 10 혹은 20과 일치하지 않습니다.</b>
    </c:otherwise>
</c:choose>

 

3) 반복문 = forEach

for-loop문 -> <c:forEach var="변수명", begin="초기값" end="종료값" step="증감식" />;
향상된 for문 -> <c:forEach var="변수명", items="순차적으로 접근할 컬렉션" varStatus="현재 접근된 요소의 상태값을 보관할 변수명 />"
    => step : 미지정시 기본값은 1
    => varStatus : 생략가능

 

<!--  for loop문 -->
<% for(int i = 1; i <= 10; i++) { %>
<% } %>

<c:forEach var="i" begin="1" end="10">
    반복확인 : ${i } <br>
</c:forEach>


<c:forEach var="i" begin="1" end="10" step="2">
    반복확인 : ${i } <br>
</c:forEach>


<!--  태그내부에서 활용 -->
<c:forEach var="i" begin="1" end="6">
    <div id="div${i}">div태그</div>
</c:forEach>


<%
    ArrayList<Person> list = new ArrayList<>();
    list.add(new Person("홍길동", 20, "남자"));
    list.add(new Person("김길동", 30, "남자"));
    list.add(new Person("박길동", 15, "남자"));

    request.setAttribute("pList", list);
%>

<table border="1">
    <thead>
        <tr>
            <th>순번</th>
            <th>이름</th>
            <th>나이</th>
            <th>성별</th>
        </tr>
    </thead>
    <tbody>
<%-- 			<% if(!list.isEmpty()) { %> --%>
<%-- 				<% for(Person p : list ) { %> --%>
<!-- 					<tr> ... -->
<%-- 				<% } %> --%>
<%-- 			<% } %> --%>
        <c:choose>
            <c:when test="${empty pList }">
                <tr>
                    <td colspan="4">조회결과 없습니다.</td>
                </tr>
            </c:when>
            <c:otherwise>
                <c:forEach var="p" items="${pList }" varStatus="s">
                    <tr align="center">
                        <td>${s.count }</td>	<!--  index : 0부터시작, count : 1부터 시작 -->
                        <td>${p.name }</td>
                        <td>${p.age }</td>
                        <td>${p.gender }</td>
                    </tr>
                </c:forEach>
            </c:otherwise>
        </c:choose>
    </tbody>
</table>

 

4) 반복문 - forTokens

<c:forTokens var="각 값을보관할변수" items="분리식키고자하는 문자열" delims="구분자">;
- 구분자를 통해서 분리된 각각의 문자열에 순차적으로 접근하면서 반복수행
- java의 split("구분자") 또는 StrimgTokenizer와 비슷한 역할

 

<ul>
    <c:forTokens var="d" items="컴퓨터,핸드폰,tv,에어컨,냉장고.세탁기/비데" delims=",/">
        <li>${d}</li>
    </c:forTokens>
</ul>

<ul>
    <c:forTokens var="d" items="컴퓨터,핸드폰,tv,에어컨,냉장고.세탁기/비데" delims=",./">
        <li>${d}</li>
    </c:forTokens>
</ul>

 

5) 쿼리스트링 관련 태그 - url, param

- url 경로를 생성해주고 쿼리스트링을 정의할 수 있는 태그
- 넘겨야할 쿼리스트링이 길 경우 사용하면 편리함

<c:url var="변수" value="요청할url주소" >;
    <c:param name="키값" value="밸류값">;
    <c:param name="키값" value="밸류값">;
    ...
</c:url>;

 

<c:url var="query" value="list.do">
    <c:param name="currentPage" value="${emtpy currentPage ? 1 : currentPage }" />
    <c:if test="${!empty search }">
        <c:param name="search" value="${search }"/>
        <c:param name="keyword" value="${keyword }"/>
    </c:if>
</c:url>

 

 

2. JSTL Formatting Library

: 숫자, 날짜 및 시간데이터 출력형식을 지정할 때 사용하는 문법을 제공

 

2-1) formatNumber

- 숫자데이터의 포맷 지정
- 표현하고자 하는 숫자데이터의 형식을 통화기호, % 등 원하는 쓰임에 맞게 지정하는 태그 

<fmt:formatNumber value="출력할값" groupingUsed="true/false" 
    type="percent/currency" currencySymbol="$" >; 

type = "groupingUsed" 기본값 : true(,로 구분자가 찍힘)
type = "percent" : 소숫점을 백분율로 변경해서 출력(0.75 -> 75%) 
type = "currency" : 통화단위로 출력. 통화단위는 컴퓨터의 로컬정보 기준 
type = "currency" currencySymbol="$" : 통화단위를 $로 변경해서 출력

 

<c:set var="num1" value="123456789" />
<c:set var="num2" value="0.75" />
<c:set var="num3" value="50000" />

그냥 출력 : ${num1 } 
formatNumber : <fmt:formatNumber value="${num1}" />  //세자리마다 구분되어 출력됨.
숫자 그대로 출력 : <fmt:formatNumber value="${num1}" groupingUsed="false" />
percent : <fmt:formatNumber value="${num2}" type="percent"/>
currency : <fmt:formatNumber value="${num3}" type="currency"/>
currencySymbol : <fmt:formatNumber value="${num3}" type="currency" currencySymbol="$"/>

 

2-2) formatDate

- 날짜 및 시간 데이터의 포맷 지정 
- 단, java.util.Date객체를 사용해야 한다.
<c:set var="sysdate" value="<%= new java.util.Date() %>" />

그냥 출력 : ${sysdate}
	
<ul>
    <li>
        현재 날짜 : <fmt:formatDate value="${sysdate}" type="date" />
        <!-- 	type속성 생략가능. 생략시 기본값 date --> <br>
    </li>
    <li>
        현재 시간 : <fmt:formatDate value="${sysdate}" type="time" />
    </li>
    <li>
        현재 날짜 및 시간 : <fmt:formatDate value="${sysdate}" type="both" />
    </li>
    <li>
        customizing : <fmt:formatDate value="${sysdate}" type="both" 
        pattern="yyyy-MM-dd(E) a HH:mm:ss"/>
    </li>
</ul>

 

 

3. JSTL Functions Library

: EL구문에서 사용할 수 있는 메서드를 제공

 

<c:set var="str" value=" How are you? " />

str : ${str} 
문자열의 길이1 ? : ${str.length()}글자 입니다.
<!--  문자열(String)의 length()를 사용해도 된다. -->
문자열의 길이2 ? : ${fn:length(str)}글자 입니다.
<!--  문자열의 길이뿐 아니라 List도 매개변수로 제시하면 사이즈값이 리턴된다 -->

모두 대문자로 출력 : ${fn:toUpperCase(str)}
are의 시작인덱스 : ${fn:indexOf(str, 'are')}
문자열 변환 : ${fn:replace(str, "are", "were")} 
<!-- 원본에 영향을 끼치지 않는다 -->

str에 "are" 이라는 문자열이 포함 ? : ${fn:contains(str, 'are')} 
str에 "are" 이라는 문자열이 포함 ? : ${fn:contains(str, 'are') ? '포함되어 있음' : "포함되지 않음"}
<!--  삼항연산자도 사용가능함 -->

문자열 앞,뒤 공백제거 : ${fn:trim(str)}
문자열 잘라주기1 : ${fn:substring(str,0,4)} 
문자열 잘라주기2 : ${fn:substringAfter(str,'are')} 
<%-- 	문자열 잘라주기3 : ${fn:substringAfter(str,'are')}  --%>

문자열 나누기 : 
<c:forEach var="s" items="${fn:split(str,' ')}" >
    ${s} <br>
</c:forEach>
배열 합치기 : ${fn:join(fn:split(str,' '), ',')}

<c:set var="htmlStr" value="<h1>a > b || a < b</h1>" />
태그를 문자열로 바꿔주는 함수 : ${fn:escapeXml(htmlStr)}
태그를 그대로 출력 : ${htmlStr}

 

 

 

4. OTHERS

c:import   : JSP 페이지에서 다른 페이지를 불러오는 기능
c:redirect : 페이지 재요청해주는 태그
c:catch    : 예외처리하기

 

4-1) c:import

<c:import var="header" url="http://www.google.com" />
<c:out value="${header}" escapeXml="false"/>

- JSP 페이지에서 다른 페이지를 불러오는 기능
- var : 페이지를 저장하는 변수명 
- url : 불러올 페이지의 위치(외부 브라우저도 가능)

 

4-2) c:redirect

<!--  권한이 없거나 혹은 admin이 아닌 경우 메인페이지로 이동 -->
<c:if test="${empty role or role ne 'admin'}">
// 		<c:redirect url="/" >

// 		</c:redirect>
</c:if>

 

4-3) c:catch

<% 
    String test = null;
    pageContext.setAttribute("test", test);
%>
<c:catch var="e" >
    <%= test %>	   // null 
    <%= test.charAt(0) %>  //java.lang.NullPointerException 
</c:catch>

${e}
<!--  페이지 그대로 유지됨 -->