이 포스팅의 목차는 다음과 같다.
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로 사용할 라이브러리를 선언해야한다.
파일의 경로이다.
라이브러리 선언 코드이다.
<%@ 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 |