JSTL
JSTL의 정식 명칭은 JavaServer Pages Standard Tag Library이고 줄여서 JSTL이라고 부른다.
JSTL은 코드의 복잡함을 해결하기 위한 일종의 사용자 정의 태그의 표준이다.
→자바코드를 HTML 태그형식으로 간편하게 사용하기 위해 나온 라이브러리
JSTL은 라이브러리이기 때문에 사용하기 전에 core를 header에 추가해주어야 한다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
사용방법은 다음과 같다.
<c:if test=""></c:if>
<c:forEach items=""></c:forEach>
JSP는 자신만의 태그를 추가할 수 있는 기능을 제공하고 있다. <jsp:useBean>과 같은 커스텀 태그처럼 연산이나 조건문이나 반복문인 if문, for문, DB를 편하게 처리할 수 있는것이 JSTL이다.
즉, JSTL은 표준 액션태그로 처리하기 힘든 부분을 담당한다.
JSP에서 Java코드가 들어갈 때마다 매번 <% ~~ %> 이 태그를 넣어 사용하면 가독성도 떨어지고 사용하기가 불편해진다. 그래서 나온것이 JSTL이다.
태그 종류
core (prefix:c)
일반 프로그래밍에서 제공하는 것과 유사한 변수 선언
실행 흐름의 제어 기능을 제공
페이지 이동 기술 제공
URI → http://java.sun.com/jsp/jstl/core
Formatting (prefix:fmt)
숫자, 날짜, 시간을 포맷팅하는 기능을 제공
국제화, 다국어 지원 기능 제공
URI → http://java.sun.com/jsp/jstl/fmt
DataBase (prifix:sql)
DB의 데이터를 입력 / 수정 / 삭제 / 조회 하는 기능을 제공
URI → http://java.sun.com/jsp/jstl/sql
XML (prefix:x)
XML 문서를 처리할 때 필요한 기능 제공
URI → http://java.sun.com/jsp/jstl/xml
Function (prefix:fn)
문자열을 제공하는 함수 제공
URI→ http://java.sun.com/jsp/jstl/functions
태그선언
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
JSTL은 Core를 선언할 시 taglib를 이용하여 다음과 같이 선언한다.
<% taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
필요한 JSTL 태그(Formatting, DataBase, XML, Function)는 prefix와 uri만 바꿔주면 된다.
JSTL의 Core Library
<c:set>
<c:set var="num" value="100">
<c:set var="num" value="100" scope="page">
num이라는 변수에 100이라는 값이 설정되고 scope도 설정을 할 수 있다.
여기서는 page로 설정하여 특정 서블릿이나 JSP가 실행되는 동안에만 정보(num이 100이라는 값)를 유지하고 있다.
즉, 자바의int num = 100;을 <c:set var="num" value="100">으로 바꿔 쓴 코드이다.
<c:out>
<c:out value="출력할 값" default="value가 null값일 경우 출력할 값">
자바로 system.out.println("안녕");을 간단하게 <c:out value="안녕">로 변경하여 출력할 수 있다.
<%-- escapeXml="false"
출력할 데이터에 포함된 기호가 태그의 일부로서 제기능을 하도록 한다.
--%>
<c:out value="<font size=7> 커다란 글씨</font>를 출력합니다." /><br/>
<c:out value="<font size=7> 커다란 글씨</font>를 출력합니다." escapeXml="false"/>
<c:out>태그는 특수문자를 그대로 출력한다. escapeXml="false"를 해주면 출력할 데이터에 포함된 기호가 태그의 일부로서 제기능을 할 수 있다.
<c:remove>
<c:remove var="변수명" scope="영역" />
한 영역의 변수명을 지우는 코드이다. 만약 영역을 생략할 경우 모든 영역의 변수가 삭제된다. 영역은 page → request → session → application 순서의 영역을 가진다.
<c:if>
<c:if test="조건식" var="조건을 검사하고 return되는 bool값을 저장할 변수" scope="bool 변수가 사용될 범위" />
자바의 if-else 문과 동일하지만 JSTL에서는 else문이 없다. 여기서 scope값을 생략하면 기본으로 "Page영역"이 지정된다.
<c:choose>
<c:choose test="조건식">
<c:otherwise>
자바의 switch구문과 if-else 구문을 혼합한 형태로 다수의 조건문을 걸고 싶을 때 사용한다.
<c:choose> 태그 안에 <c:when>이 중복되어 사용이 가능하며 boolean 값이 True일 경우(test="조건식"의 값이 True일 경우) 블록을 수행한다.
<c:otherwise>는 <c:when>의 결과 값이 모두 false일 경우 실행이 된다. (필요한 경우에만 사용된다.)
<c:foreach>
<c:forEach begin="시작값" end="끝값" step="증가값" var="count값이 저장될 변수"/>
<c:forEach var="변수" items="배열 or 컬렉션" />
자바의 for문이 JSTL에서는 forEach로 변경되었다. 배열이나 컬렉션, Map에 저장되어 있는 값들을 순서대로 처리 할 때 사용되며, <c:forEach var="i" begin="1" end="10" step="2">${i}</c:forEach>로 i가 1부터 10까지 2씩 증가한다는 구문을 쉽게 만들 수 있다.
<c:forEach var="count" begin="1" end="6" step="2">
<font size=${count}>야호~~~</font><br />
</c:forEach>
<c:forTokens>
<c:forTokens var="변수" items="배열 or 컬렉션" delims="구분자" begin="시작값" end="끝값" step="증가값" />
자바의 StringTokenizer를 JSTL을 사용하면 간편하게 사용할 수 있다.
<h1>호랑이님의 생일잔치에는 누가 왔나요?</h1>
<c:set var="guests" value="토끼^^거북이~강아지$$$여우*사슴" />
<c:forTokens var="animal" items="${guests}" delims="^~$*">
<h1>${animal}</h1>
</c:forTokens>
<c:catch>
try문에 해당하고 catch에 해당하는 코드는 따로 작성해야 된다.
try{
자바에서는 여기에 행동
} catch (Exception e) {
에러 내용 표시
}
<c:catch var="zzz">
JSTL에서는 여기에 행동
</c:catch>
태그 밖에 ${zzz}를 사용하여 에러내용
자바의 Try-Catch 구문과 같다. 단 <c:catch>태그는 에러내용을 EL을 이용하여 ${zzz}로 빼내서 처리해줘야 한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String str1 = request.getParameter("NUM1");
String str2 = request.getParameter("NUM2");
int num1 = Integer.parseInt(str1);
int num2 = Integer.parseInt(str2);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Divide.jsp</title>
</head>
<body>
<h1>나누기</h1>
<c:catch var="e">
<% int result = num1 / num2; %>
<h1>나눗셈 결과 : <%= result %></h1>
</c:catch>
<c:if test="${e != null}"><%-- e != null : 익셉션이 발생했는지 체크하는 조건식 --%>
<h1>에러 메시지 : ${e.message}</h1>
</c:if>
</body>
</html>
검색창에 ?NUM1=숫자&NUM2=숫자를 입력한다.
NUM2=0 → 0을 나누려고 하면 에러메시지가 출력된다.
<c:redirect>
<c:redirect>는 파라미터 값을 지정된 url로 보낸다.
<c:redirect url="zzz.jsp">
<c:param name="abc" value="안녕" />
</c:redirect>
Redirect.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:redirect url="Multiply2.jsp">
<c:param name="NUM1" value="3" />
<c:param name="NUM2" value="44" />
</c:redirect>
Multiply2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Multiply2.jsp</title>
</head>
<body>
<h1>두 수의 곱한 결과는?</h1>
<h1>${param.NUM1} x ${param.NUM2} = ${param.NUM1 * param.NUM2}</h1>
</body>
</html>
<c:import>
<c:import>는 <jsp:include>와 비슷하다.
<c:url>
<c:url>은 <c:set>과 비슷하며 GET방식으로 파라미터를 전달한다.
JSTL core의 태그 정리
태그명 | 설명 |
<c:set> | 변수명에 값을 할당 |
<c:out> | 값을 출력 |
<c:if> | 조건식에 해당하는 블럭과 사용될 scope 설정 |
<c:choose> | 다른 언어의 switch와 비슷 |
<c:when> | switch문의 case에 해당 |
<c:otherwise> | switch문의 default에 해당 |
<c:forEach> | 다른언어의 loop문 items 속성에 배열을 할당할 수 있음 |
<c:set var="num" value="2" />
<c:if test="${num % 2 == 0}">
짝수
</c:if>
<c:choose>
<c:when test="${num % 2 == 0"}">
짝수
</c:when>
<c:otherwise>
홀수
</c:otherwise>
</c:choose>
<c:set> 태그는 변수명을 정의하고 변수에 넣을 값을 정해주는것이다.
${num}은 <c:set>에서 선언한 변수를 이용할 때 사용하는 방법이다.
<c:choose></c:choose>는 Java에서의 if문을 JSTL로 사용할 때 사용하는것이고,
<c:when test="${num%2 == 0}"></c:when> 은 if else문을 사용하는 방법이다.
<c:otherwise></c:otherwise>는 else문을 사용하는 방법이다.
<c:forEach var="num" items="${nlist}">
${num}
</c:forEach>
<c:forEach>는 java에서 for문을 JSTL로 사용하는 방법이다.
items는 서블릿에서 리스트로 만든 인스턴스를 가져워서 이용할 때 사용한다.
JSTL 라이브러리 설치
https://mvnrepository.com/artifact/javax.servlet/jstl
위 링크를 들어간다.
Version에 1.2를 클릭한다.
Files의 jar(404 KB)를 클릭해서 다운 받는다.
다운 받은 후 jstl-1.2.jar 파일을 현재 사용하고 싶은 프로젝트 web-inf 안의 lib에 넣어준다.
JspProject(사용할 프로젝트)를 우클릭한 후 Properties를 클릭한다.
Java Build Path의 Libraries를 클릭한다.
Modulepath에 Add JARs... 클릭해서 jstl-1.2.jar를 추가해준후 사용하면 된다.
JSTL 태그 정리
태그 | 설명 |
Core 태그 | 변수선언, 삭제 등 변수와 관련된 작업 및 if 문, for 문과 같은 제어기능, URL 처리로 페이지 이동 기능을 제공 |
Formatting 태그 | 문자열이나 컬렉션을 처리하는 함수 태그로 숫자, 날짜, 시간 등을 형식화하는 기능. 국제화, 다국어 지원기능 제공 |
Sql 태그 | 데이터베이스와 상호작용하기 위해 사용하는 태그로 데이터베이스의 데이터 삽입, 수정, 삭제, 조회 기능 제공 |
Function 태그 | 문자열을 처리하는 함수를 제공 |
태그별 기능 정리
core 태그
태그 | 설명 |
<c:out> | 출력 |
<c:set> | 사용할 변수를 설정 |
<c:remove> | 설정한 변수 제거 |
<c:catch> | 예외 처리 |
<c:if> | 조건문 처리 |
<c:choose> | 다중 조건문 처리 |
<c:when> | <choose>의 서브태그로 조건문 참일 때 수행 |
<c:otherwise> | <choose>의 서브태그, 조건문 거짓일 때 수행 |
<c:import> | 다른 리소스의 결과 삽입 |
<c:forEach> | 반복문을 처리하는데 사용 |
<c:forTokens> | 구분자로 분리된 각각의 토큰 처리 |
<c:param> | url 관련 태그의 파라미터 설정 |
<c:redirect> | 설정한 경로로 이동하는데 사용 |
<c:url> | url 재작성 |
sql 태그
태그 | 설명 |
<sql:setDataSource> | DataSource를 설정하는데 사용 |
<sql:query> | 조회 커리문 실행 |
<sql:update> | 삽입,수정,삭제 쿼리문 실행 |
<sql:dateParam> | 쿼리문에 문자열 형식의 파라미터 설정 |
<sql:param> | 쿼리문에 날짜 형식의 파라미터 설정 |
<sql:transaction> | 트랜잭션 구현 사용 |
functions 태그
태그 | 설명 |
contains() | 검색 대상 문자열의 포함 여부를 확인 |
containsignoreCase() | 대,소문자와 상관없이 검색대상문자열 포함 여부 확인 |
startsWith() | 특정 문자열로 시작하는지 확인 |
endWith | 특정 문자열로 끝나는지 여부 확인 |
escapeXml() | 문자열에 포함된 특수문자를 특정 코드로 변환 |
indexOf() | 검색대상문자열의 첫위치값 반환 |
split() | 문자열을 설정한 구분자로 분리하여 배열 형태로 반환 |
join() | 배열 형태의 문자열을 설정한 구분자로 연결하여 반환 |
length() | 문자열의 길이 반환 |
substring() | 특정 위치의 문자열을 반환 |
substringAfter() | 설정한 문자열 이후의 부분에 있는 문자열 반환 |
substringBefore() | 설정한 문자열 이전의 부분에 문자열 반환 |
replace() | 검색 대상 문자열을 설정한 문자열로 변경하여 반환 |
toLowerCase() | 소문자로 변환 |
toUpperCase() | 대문자로 변환 |
trim() | 문자열 앞위의 공백 제거하여 반환 |
formatting 태그
태그 | 설명 |
setLocale | 로케일을 설정 |
requestEncoding | 요청 파라미터의 문자 인코딩 설정 |
bundle | 사용할 리소스번들 설정 |
message | 리소스번들에서 로케일에 맞는 메세지 불러와 출력 |
setBundle | 리소스번들을 특정 변수에 저장 |
formDate | 날짜 형식을 표현 |
parseDate | 문자열에서 원하는 패턴의 날짜 형식으로 변환 |
parseNumber | 문자열에서 원하는 패턴의 숫자형식으로 변환 |
formatNumber | 숫자형식 표현 |
setTimeZone | 특정 범위의 시간대 설정 |
timeZone | 시간대를 설정 |
EL
EL의 정식 명칭은 표현 언어(Expression Language)라고 하며 줄여서 EL이라고 부른다.
JSP 2.0 스펙에 새로 추가된 스크립트 언어로서 초기의 EL은 JSTL의 액션 태그에서만 작동하는 문제가 있었는데, JSP 2.0부터는 JSP 컨테이너가 EL표현식을 해석할 수 있게 되어 표준 액션 태그, 커스텀 태그, 템플릿 데이터와 같이 자바코드를 사용해야 했던 모든 곳에 EL을 사용할 수 있다.
EL은 자바스크립트에서 확장된 Xpath에서 힌트를 얻어 만들어진 언어로 값이 없는 변수(null)에 대해 좀 더 관대하고 데이터 형 변환을 자동으로 해주는 특징이 있다. EL을 사용하면 값이 없거나 형 변환 등에 전혀 신경 쓸 필요 없이 서버로 전송해서 형변환 없이 사용할 수 있다.
EL 사용법
<%= name %>
${name}
EL의 내장 객체
객체명 | 설명 |
${pageScope} | page Scope에 접근하기 위한 객체 |
${reqeustScope} | request Scope에 접근하기 위한 객체 |
${sessionScope} | session Scope에 접근하기 위한 객체 |
${applicationScope} | application Scope에 접근하기 위한 객체 |
${param} | 파라미터 값을 가져오기 위한 객체 |
${header} | 헤더 값을 가져오기 위한 객체 |
${cookie} | 쿠키 값을 가져오기 위한 객체 |
${initParam} | JSP 초기 파라미터를 가져오기 위한 객체 |
${pageContext} | pageContext 객체에 접근하기 위한 객체 |
EL의 연산자 종류 및 표현법
연산부호 | 연산자 |
+ | + |
* | * |
/ | div |
\&\& | and |
|| | or |
== | eq |
!= | ne |
< | ge |
> | lt |
<= | ge |
>= | le |
'Programming > Web' 카테고리의 다른 글
[Web] 용어 정리(utility), (Software), (Network), (localhost), (Built-in Object), (HTTP) (0) | 2022.11.06 |
---|---|
[Web] Spring Bean 선언, 오토와이어링(Autowired) (0) | 2022.11.03 |
[Web] WebMVC와 RestController 모듈 (0) | 2022.10.31 |
[Web] IoC(Inversion of Control), DI(Dependency Injection), AOP(Aspect-Oriented Programming) (1) | 2022.10.31 |
[Web] 스프링 프레임워크와 스프링 부트 (0) | 2022.10.27 |