학습목표
JSTL의 목적 및 사용 방법에 대해 설명할 수 있다.
JSTL Core Tag에 대해 설명할 수 있다.
JSTL(Java Server Pages Standard Tag Library)
JSP에서 사용하는 Tag Library들을 공통적으로 사용하기 위해서 정해진 표준
JSTL이 필요한 이유는?
- JSP를 작성하다 보면 HTML은 어쩔 수 없이 자바 코드가 들어갈 수 밖에 없음
- EL의 주목적은 데이터에 접근하여 데이터를 추출하는 것
- JSTL은 Tag로 자바 코드를 대체함 (if문 등)
--> 언어적인 측면에서 if문은 어렵진 않지만 Tag로 대체하는 이유는 자바의 정석 코드인 if문 말고 Tag가 들어가는 부분은 Tag를 이용하는 것이 낫기 때문이다. 또 JSP를 Tag 나열로만 작성할 수 있는 장점이 있다.
JSTL 종류
- Core
- Formatting
- SQL
- XML
- Function
JSTL Action들의 명명 규칙
JSTL Action들과 attribute들은 자바(Java) 명명 규칙을 따름
- 소문자로 시작하며 단어가 추가될 경우 대문자로 시작함 (camel)
- <c:out value="${param.amonut.}"/>
- <c:forEach var="item" itmes="${names}" varStatus="status">
- attribute들 중에서 var나 scope와 같은 attribute의 동일 이름들은 많은 JSTL Action에서 사용되며, 어느 Tag에 들어가도 동일한 의미를 가짐
JSTL 설치
maven repository에서 다운받아 설치함
https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
WEB-INF/lib에 다운로드 받은 jar 파일 복사
JSTL Tag 사용법
JSTL Tag를 사용하기 위해서는 taglib 지시 Tag를 이용해 JSTL 사용 선언을 해줘야 함
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Library | URI | Prefix |
Core | http://java.sun.com/jsp/jstl/core | c |
Formatting | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Function | http://java.sun.com/jsp/jstl/functions | fn |
Prefix 이름은 권장사항일뿐, 정해져 있는 것은 아니다.
JSTL Core Tag
- Core Tag : 언어의 기초적인 부분을 지원하는 Tag
- JSTL에서 사용 비율이 높음
1. <c:out>
현재 page에 data를 출력하기 위해서 사용됨
<c:out value="value" [escapeXml="true|false}"] [default="기본값"]/>
[ ] 는 out Tag를 사용할 때 작성 또는 생략 가능
2. <c:set>
특정 expression을 특정 범위의 변수로 지정하는 역할
만약 해당 변수가 더 이상 필요하지 않을 경우, <c:remove> Tag를 사용하여 제거할 수 있음
- value attribute를 사용하여 지정하는 경우
- <c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
<c:set var="variableName" value="Setting value." scope="session"/><br>
- value attribute를 사용하여 대상 객체의 값을 지정하는 경우
- <c:set value="value" target="target" property="propertyName"/>
<c:set target="<%=user%>" property="name" value="gildong"/>
3. <c:remove>
특정 변수들을 삭제할 경우에 사용됨
- <c:remove [scope="{page|request|session|application}"] var="var"/>
<c:remove var="variableName"/>
4. <c:catch>
- JSTL에서는 <c:catch> Tag를 사용하여 exception을 처리함
- java.lang.Throwable의 모든 subclass의 exception 처리가 가능함
- <c:catch var="E"> </c:catch>
<c:catch var="catchtheException">
<%
String name=null;
name.indexOf(0);
%>
</c:catch>
<c:if test="${catchtheException != null}">
<p>
에러 발생 : ${catchtheException }
</p>
</c:if>
null 인 상태에서 인덱스로 접근하면 당연히 에러가 발생한다. Exception이 발생하면 에러 정보가 catchtheException에 담긴다. catchtheException != null 은 null이 아니기 때문에 exception이 발생했다는 뜻이다. 따라서 에러가 발생한 것이므로 처리할 값을 명시한다.
5. <c:if>
if 문장을 처리하기 위해서 사용됨
- body 없이 사용할 경우
- testCondition은 true, false 값이 나오는 구문
- <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
- body와 함께 사용될 경우 (훨씬 많이 씀)
- <c:if test="testCondition" [var="varName"]
- [scope="{page|request|session|application}"]
- body 내용 // testCondition=true면 body가 적용되고, false면 적용x
- </c:if>
6. <c:choose>
- if와 마찬가지로 조건문, switch-case문의 대체문
- 한꺼번에 여러 조건을 준다.
- 상호 제외 조건(Mutual Exclusion Condition)을 제공
- 하나의 조건이 만족하면 다른 하나는 만족하지 않는 상호 제외 형태
- 수행조건에 맞는 code block이 수행되면 다른 code block은 수행이 되지 않음
<c:choose>
body 내용(<when>과 <otherwise>의 하위 tag로 사용)
</c:choose>
7. <c:when>
- <c:choose> 내에서 조건 명시
- <c:choose> Tag는 switch 문장, <c:when> Tag는 case문장으로 볼 수 있음
<c:when test="testCondition">
body 내용
</c:when>
8. <c:otherwise>
- <c:choose> 내에서 조건에 만족하지 않는 경우 실행
<c:otherwise>
body 내용
</c:otherwise>
<c:choose>
<c:when test='%{variableName != "Setting value."}'>When Test Passed</c:when>
<c:otherwise>Otherwise Called</c:otherwise>
</c:choose>
9. <c:forEach>
- collection을 지정된 횟수만큼 반복 수행함(흔히 얘기하는 for문의 Tag 대체)
- 사용법 1. 객체들의 Collection을 수행할 경우
- <c:forEach [var="varName"} items="collection">
- body 내용
- </c:forEach>
<%
int[] values = {1, 12, 23 ,34 ,45, 56, 67, 78, 89, 90};
%>
<c:set var="intValues" value="<%=values%>" scope="page" />
<br>
<c:forEach items='${intValues}' var='val'>
<b> Value = <c:out value='${val}' /></b>
<br>
</c:forEach>
value=1
value=12
value=23
...
- 사용법 2. 지정된 횟수만큼 반복 수행할 경우 (단순히 1부터 10까지 반복하는 구문 등)
- <c:forEach [var="varName"} begin="begin" end="end" [step="step"]>
- body 내용
- </c:forEach>
<c:forEach var="i" begin="1" end="3">
<p>hello ${i}</p>
</c:forEach>
hello 1
hello 2
hello 3
10. <c:forTokens>
- forEach랑 비슷하지만 문자열을 자르는 역할
- 콤마(,) 등의 구분자로 나누어지는 String을 반복 수행하기 위해서 사용됨
- <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]
- [begin="begin"] [end="end"] [step="step"]>
- body 내용
- </c:forTokens>
<c:forTokens itmes='First | Second | Three | Four' delims='|' var='item'>
<c:out value='${item}'/>
<br>
</c:forTokens>
11. <c:import>
- 현재 page에 추가되는 웹 page를 지정 가능
- import 결과를 화면에 출력할 수도 있고, 변수에 저장할 수도 있음
- <c:import url="url" [var="varName"]
- [scope="{page|request|session|application}"]
- [charEncoding="charEncoding"]>
- <c:param>
- </c:import>
<c:import url="some.jsp">
<c:param name="name" value="gildong"/>
</c:import>
12. <c:url>
- URL을 만드는 기능을 수행함
- <c:url value="value" [var="varName"]
- [scope="{page|request|session|application}"]/>
<c:url value="/RegisterDao.jsp" var="link">
<c:param name="name" value="gildong"></c:param>
c:param name="address" value="seoul"></c:param>
</c:url>
13. <c:redirect>
- 사용자의 웹 page를 다른 page로 redirect 하기 위해서 사용
- <c:recirect url="value"/>
실습
실습을 위해 Bean 생성 후 JSP 페이지에서 JSTL을 이용하는 테스트
User.java
package ch13;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
main.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="ch13.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<c:out value="${param.name}" default="no more parameter"/><br/>
<c:set var="variableName" value="setting value" scope="session"/>
<c:out value="${variableName}" default="no variableName value.."/><br/>
<%
User user = new User();
%>
<c:set target="<%=user %>" property="name" value="gildong"/>
<%=user.getName() %>
<c:set var="user2" value="<%=user %>"/>
<c:set target="${user2 }" property="name" value="gildong2"/><br/>
<c:catch var="e">
<%
String name=null;
name.indexOf(0);
%>
</c:catch>
<c:if test="${e != null }">
error... ${e }
</c:if>
<br/>
<%
int[] values= {1, 2, 3, 34, 56, 79};
%>
<c:set var="intValues" value="<%=values %>" scope="page"/>
<c:forEach items="${intValues }" var="val">
value = <c:out value="${val }"/><br/>
</c:forEach>
</body>
</html>
out Tag 이용 --> 뭔가의 값을 출력하려고 하는데 없다면 default 값이 출력된다.
set Tag 이용해서 변수 선언 --> 변수명 var, 변수 값 value, 변수의 이용 범위를 scope로 명시함
set에 의해 선언되어 있는 변수를 out Tag로 출력함
우리가 만든 User 클래스 이용을 위해 User 클래스 객체 생성
user 객체의 name 변수에 'gildong' 값을 세팅한 것
Script에서 선언되어 있는 객체를 JSTL에서 이용할 수 있게 변수로 지정함 (user2)
JSTL 내에서 user 객체는 user2라는 변수로 사용 가능
user2 객체의 name 변수 값을 'gildong2' 로 지정
catch Tag로 묶인 부분에 Exception이 발생하면, var에 선언되어 있는 변수에 Exception 내용이 들어감
확인을 위해 NullPointerException오류가 발생하는 상황 설정
"no more parameter" 출력
user에게 입력됐던것도 출력
exception 발생한 내용을 if Tag를 이용해서 내용을 그대로 출력
forEach Tag로 배열의 데이터를 출력한 내용
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
15차시 Custom Tag (0) | 2023.07.03 |
---|---|
14차시 JSTL - Formatting (0) | 2023.07.03 |
12차시 Expression Language (1) | 2023.07.01 |
11차시 Action Tag와 JSP Beans (0) | 2023.07.01 |
10차시 JSP 내장 객체 (0) | 2023.06.30 |