본문 바로가기
JSP

[View업그레이드] EL & JSTL

by amoomar 2022. 3. 3.
반응형

 

 

이 포스팅의 목차는 다음과 같다.

1. EL_표현언어
   1) 표현언어란?
   2) 사용방법
   3) 주의사항
2. JSTL
   1) JSTL이란?
   2) 핵심(C)의 사용

 

 


 

 

1. EL_표현언어

 

1) 표현언어란?

view의 파트인 jsp에서 java코드 중 표현식을 대체하여 사용할 수 있는 언어로, jsp에서 java코드를 없애는 것을 최종 목적으로 갖는다. EL혹은 표현언어라고 한다. 숫자, 문자열, boolean, null, 연산이 가능하며, 이전 페이지에서 특정 키워드로 저장된 값을 키워드 호출을 통해 값 출력이 가능하다.

숫자와 문자열이 출력 가능하며
${10} <br> 10
${"apple"} <br> apple

연산또한 가능하다.
이때 특수기호의 사용을 줄이기 위해
약속된 영문으로 작성하는 방식으로도 동일한 결과를 얻을 수 있다.
${10 / 2}는 ${10 div 2}와 같다 / 5.0

비교 연산에 대해서는 참, 거짓으로 반환된다.
${10 > 3}은 ${10 gt 3}와 같다. true
${10 < 3}은 ${10 lt 3}와 같다. false 
${10 == 10}은 ${10 eq 10}와 같다. true

 

 


 

2) 사용방법

<%= 내용 %>을 대체하여
${내용}로 쓰인다.

 

이전 페이지에서 내장 객체를 사용하여 .setAttribute를 했다면 그 다음페이지에서 유효범위에 맞는 한에서 표현언어를 사용할 수 있게 된다. 

 

예시는 다음과 같다.

이전 페이지 내용
request.setAttribute("num", 1);

다음 페이지 내용
<%= request.getAttribute("num"); %>혹은
${num}으로 1이라는 값을 출력할 수 있다.
해당 페이지 내용(page객체는 유효범위가 현재 페이지이기 때문에!)
pageContext.setAttribute("aa", "hello");

${aa}를 통해 hello를 출력할 수 있다.
이전페이지 내용
ArrayList<int> datas = new ArrayList<int>();
datas.add(3);
datas.add(6);
datas.add(9);

request.setAttribute("datas", datas);

다음 페이지 내용
<%= (ArrayList)request.getAttribute("datas").get(0); %>혹은
${datas[0]}를 통해 3을 출력할 수 있다.
이전 페이지 내용
StudentVO vo = new StudentVO();
의 멤버변수는 name, score가 있으며, 초기데이터는 하나 존재한다.
request.setAttribute("vo", vo);

다음 페이지 내용
<%= (StudentVO)request.getAttribute("vo.getName()"); %>혹은
${vo.name}으로 "홍길동"출력이 가능하다.
이전 페이지 내용
<jsp:useBean id="student" class="test.Student" scope="session" />
<form action="NewFile2.jsp" method="post">
	<select name="sname">
		<%
			for(String v:student.getStudentList()){
				out.println("<option>"+v+"</option>");
			}
		%>
	</select>
	<input type="submit" value="선택하기">
</form>

다음 페이지 내용
<%= request.getParameter("sname") %>혹은
&{param.sname}으로 sname을 불러올 수 있다.

 

 

 


 

 

3) 주의사항

내장객체마다 유효범위가 존재하는데, 이를 간과하고 같은 이름으로 setAttribute한 후 표현언어를 사용해 출력하려 한다면, 우선순위에 따라 값이 순차적으로 출력된다.

 

이때 서블릿 내장객체 표현언어 내장객체를 혼용하지 않아야하며, 범위가 좁은 순서대로 pageScope, requestScope, sessionScope, applicationScope가 있다. 

 

만일 4개의 저장소 모두에 setAttribute("cnt", 각각 다른 값)되어있다고 가정하고 표현 언어를 사용하여 ${cnt}했을때, page에 set되어있는 값을 출력할 것이다.

 

이 말은 즉 유효범위가 가장 좁은 객체에서 찾아보고, 존재한다면 찾기를 종료하며 존재하지 않을때 다음 객체를 탐색한다는 의미이다.

 

pageContext.setAttribute("cnt", 4);
request.setAttribute("cnt", 5);
session.setAttribute("cnt", 6);
application.setAttribute("cnt", 7);
라고 내장객체에 값들이 set되어있을때,

${cnt}를 하게 되면 page객체에 저장된 값, 즉 4가 출력된다.

 

이때 특정 내장객체에 저장된 cnt의 값을 출력하기 위해서는 ${선택할 내장객체Scope.cnt}로 가능하다.

위와 같은 코드 상황에서
${sessionScope.cnt}를 통해 6이라는 값을 불러올 수 있다.

 


 

 

2. JSTL

 

1) JSTL이란?

JSP Standard Tag Library의 약자로, jsp 표준 태그 라이브러리라고 직역할 수 있다.

jsp에서 스크립틀릿을 대체할 수 있다. EL과 마찬가지로 jsp에서 java코드의 활용을 대신하여 view를 더욱 view다울 수 있도록 할 목적으로 사용된다.

 

종류는 핵심(C), xml(X), 국제화(FMT), db(sql), 함수(FN) 등이 있다.

 


 

2) 핵심(C)의 사용

아래에 첨부된 두 라이브러리를 WEB-INF파일 내부의 lib파일에 drag&drop으로 추가한 후, 페이지 지시어인 taglib로 사용할 라이브러리를 선언해야한다.

jstl.jar
0.02MB
standard.jar
0.38MB

 

파일의 경로이다.

drag&amp;amp;amp;amp;amp;drop경로

라이브러리 선언 코드이다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

다음 단락부터 C로 사용할 수 있는 태그들에 대해 정리해보았다.

 

 


 

① forEach

시작과 끝을 지정하고 해당의 시작과 끝만큼을 반복할 수 있다. 사용도는 높지 않다.

<c:forEach begin="0" end="5" varStatus="st">
	${st.index} | ${st.count}
</c:forEach>

index는 0부터 출력
count는 개수로(1부터) 출력

 

 

자바에서의 for(each)와 같은 역할을 할 수 있다.

선택속성인 items로 선택할 대상을 정하고, var로 items로 선택된 대상들을 무어라 명명할건지 정할 수 있다.

 

아래의 코드는 datas라는 리스트 안에 5명의 학생정보가 있으며, 각 학생들은 name, phone의 멤버변수를 가지고 있다는 가정하에 작성되었다. 해당 코드로 datas에 존재하는 5명의 학생들 정보가 출력된다.

<c:foreach var="v" items="${datas}">
	${v.name} | ${v.phone}
</c:foreach>

 

 


 

② out

value에 해당하는 값이 없을때, 태그에 작성된 문자열을 출력할 수 있도록 할 수 있다. 위에서 작성된 예시에서 만일 phone이라는 멤버변수에 값을 가지지 않은 학생들이 있을때 "정보 없음"이라는 글귀를 대체하여 출력할 수 있다.

<c:forEach var="v" items="${datas}">
	${v.name} | <c:out value="${v.phone}">정보없음</c:out>
</c:forEach>

 

이때, 정보없음이라는 글귀에만 색상을 부여하고싶을때, <font color>태그만 사용했을때 명령이 적용되지 않으므로 out태그에서 escapeXml선택속성을 false로 지정해야한다.

${v.name} | <c:out value="${v.phone}" escapeXml="false"><font color="red">정보없음</font></c:out>

 


 

③ forTokens

delims를 제외한 items의 내용을 확인할 수 있다.

<c:forTokens items="010-1234-5678" delims="-" var="num">
	${num}<br>
</c:forTokens>

 


 

④ set

<c:set var="addr" value="서울시 관악구"/>
${addr}

변수의 선언처럼 값을 저장할 수 있으며, 저장되었기에 EL식으로 출력이 가능하다

 


 

⑤ remove

세팅된 변수를 지울 수 있다.

<c:remove var="addr"/>

 


 

⑥ catch

태그 안에 변수형식으로 명명할 내용을 담고, 명명한 변수를 통해 내용을 출력할 수 있다.

<c:catch var="err">
	<%= 10/0 %>
</c:catch>
에러메세지: ${err}

 


 

⑦ if

test는 필수 속성으로, test내부의 내용이 참일때 수행될 내용을 태그 내부에 작성해주면 된다. 혹은 var를 활용하여 true로 반환 받을 수 있다. 단 분기처리는 불가능하므로 사용할 경우의 수를 파악하여 전부 작업해주어야한다.

<c:set var="str" value="apple"/>

<c:if test="${str=='apple'}">
	사과 맞음!
</c:if>

----------------------------------

<c:set var="str" value="apple"/>

<c:if test="${str=='apple'}" var="res">
	${res} //true로 반환
</c:if>

 


 

⑧ choose

choose태그 내부에 <c:when>태그를 활용하여 분기처리가 가능하다.

<form>
	<select name="al">
		<option>---</option>
        삼항연산자를 활용하여 내용 선택시 현재 option을 유지할 수 있다.
		<option ${param.al=='a'? 'seleted' : ''}>a</option>
		<option ${param.al=='b'? 'seleted' : ''}>b</option>
		<option ${param.al=='c'? 'seleted' : ''}>c</option>
	</select>
	<input type="submit" value="결과보기">
</form>

<hr>----------------------------------------------------------------

<c:choose>
	<c:when test="${param.al=='a'}">
		a를 선택했습니다
	</c:when>
	<c:when test="${param.al=='b'}">
		b를 선택했습니다
	</c:when>
	<c:when test="${param.al=='c'}">
		c를 선택했습니다
	</c:when>
	<c:otherwise>
		???
	</c:otherwise>
</c:choose>

 

 


 

⑨ import

url속성을 통해 var라는 이름으로 내용을 들여올 주소를 지정할 수 있다. <c:out>태그를 활용해 이때 저장된 url은 html파일의 모든 태그들까지 text형식으로 불러오므로, default true상태인 escapeXml을 false로 변경하여 파일의 태그들을 제외하고 내용만을 들여올 수 있게 된다.

<c:import url="NewFile.jsp" var="url1"/>
<c:out value="${url1}" escapeXml="false"/>

 

 


 

⑩ url

요청할 수 있는 url을 생성해낼때 사용된다. 요청을 전달하기 위해서는 단독으로 불가능하므로 다른 태그의 도움이 필요하다. 아래의 코드에서 res에 요청을 전달할 url과 전달할 내용을 저장하고, <a>태그를 통해 링크를 클릭하면 알맞은 요청이 지정된 url로 전달되게 된다.

<c:url value="NewFile4.jsp" var="res">
   <c:param name="al">c</c:param>
</c:url>

<a href="${res}">NewFile4.jsp에 c 값 보내기</a>

 


 

⑪ redirect

url과 다르게 다른 태그의 도움 없이 아래의 코드만으로 지정된 url로 <c:redirect>내부의 내용이 전달되게 된다.

<c:redirect url="NewFile4.jsp">
   <c:param name="al">b</c:param>
</c:redirect>

 


 

반응형

'JSP' 카테고리의 다른 글

[View업그레이드] 커스텀 태그  (0) 2022.03.07
[JDBC] MVC나누기_2 : 게시판+로그인  (0) 2022.03.06
[JDBC] MVC나누기_1 : 게시글  (0) 2022.03.02
[JDBC] Bean & JDBC연결  (0) 2022.03.01
[JSP] 내장객체  (0) 2022.02.25