티스토리 뷰
📍 JSTL — core
– JSTL에서 기본적인 기능 (컨트롤에 관계된 기능)들을 구현해놓은 라이브러리로서,
문자열 출력, 반복문, 조건문 등이 포함되어 있음.
– 커스텀 태그의 장점대로 자바 코드를 사용하지 않고도 쉽게 기본 기능을 구현할 수 있음.
– JSTL 라이브러리를 사용하기 위해서는 해당 페이지에 '태그 라이브러리' 를 등록해야 사용 가능.
▸ 태그 라이브러리 등록
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
– JSTL을 사용하려면 페이지 윗부분에 '태그 라이브러리' 를 추가해야 함.
– prefix의 c는 태그를 사용할 때 항상 붙는 접두어.
– uri는 태그 라이브러리가 존재하는 위치.
→ 위의 주소는 core 라이브러리가 존재하는 위치.
▸ core 라이브러리 태그
출력 태그 | <c:out> | |||
변수 설정 및 삭제 태그 | <c:set> | <c.remove> | ||
예외 처리 태그 | <c:catch> | |||
조건 처리 태그 | <c:if> | <c:choose> | <c:witch> | <c:otherwise> |
반복 처리 태그 | <c:forEach> | <c:forTokens> | ||
페이지 처리 태그 | <c:import> | <c:redurect> | <c:url> | <c:param> |
📃 core_out.jsp
• 여러가지 방법으로 화면에 출력하기
<h1>core_out.jsp</h1>
JSTL : <c:out value="ITWILL" /> <br>
HTML : ITWILL <br>
<%
out.println(" JSP : ITIWILL <br>");
%>
JSP (표현식) : <%="ITIWLL" %> <br>
EL 표현식 : ${"ITWILL" } <br>
<hr>
– JSTL이 표현식 필요없이 태그만 있어도 동작하므로 편리함.
✓ 실행 결과
• 연산 데이터 출력하기
JSTL : <c:out value="100+200" /> <br>
JSP : <%=100+200 %> <br>
EL : ${100+200 } <br>
JSTL : <c:out value="<%=100+200 %>" /> <br>
JSTL : <c:out value="${100+200 }" /> <br>
<hr>
– JSTL에서 연산하려면 value 값으로 연산이 가능한 '표현식' 또는 'el 표현식'을 사용하면 연산 가능.
이제부터 연산하기 위해 JSTL의 value값으로 el 표현식을 사용할 것.
– JSTL을 사용해서 화면에 출력하고, EL표현식 사용하여 연산 수행함.
✓ 실행 결과
• default 값 지정하기
el : ${itwill.id } <br>
JSTL + el : <c:out value="${itwill.id }" default="출력"/> <br>
<hr>
– itwill이라는 객체에 id라는 정보를 출력하는 코드.
하지만 해당 데이터가 없으므로 null값이 발생하는데, el 표현식은 null 값이 공백으로 출력됨.
→ nullpointexception 방지 가능.
– default 값을 지정하면 null값일 때 공백이 아닌 default 값을 출력함.
✓ 실행 결과
• <abc> 태그 출력하기
<abc>태그는 abc태그 입니다. <br>
<abc>태그는 abc태그 입니다. <br>
<c:out value="<abc>태그는 abc태그 입니다." /> <br>
– < 와 > 를 사용하여 각각 '<' 기호와 '>' 기호를 나타낼 수 있음.
– JSTL을 사용하여 value 값에 해당 문구를 작성하면 됨.
✓ 실행 결과
📃 core_set1.jsp
• 연산 결과 출력하기
1. 자바 (JSP) 코드 사용
<%
int num1 = 100;
int num2 = 200;
int sum = num1 + num2;
%>
결과 : <%=sum %> <br>
– 자바(JSP) 코드를 사용해서 변수 생성 → 연산결과 출력
– 내가 만든 JSP코드의 값을 화면에 출력할 때는 표현식 사용.
✓ 실행 결과
2. JSTL 사용
– JSTL 사용을 위해 taglib 추가하기.
<c:set var="num1" value="300" scope="page"/>
<c:set var="num2" value="400"/>
<c:set var="sum" value="${num1 + num2 }" />
결과 : <c:out value="${sum }" /> <br>
결과 : ${num1 } + ${num2 } = ${num1 + num2 } <br>
<!-- 영역객체 확인 -->
${pageScope } <br>
${requestScope } <br>
${sessionScope } <br>
${applicationScope } <br>
<hr>
코드 분석
1~3 | – <c:set var="변수명" value="변수값"/> 으로 영역에서 공유되는 데이터인 '속성'을 만드는 것. – JSTL에서 변수를 만든다는것은 영역객체에서의 속성을 생성하는 것. – 표현식은 내가 만든 JSP코드의 값을 화면에 출력할 때 사용하고, el표현식은 영역객체를 출력함. |
5, 6 | – el표현식은 영역객체를 출력함. 원래 el 표현식의 형태는 ${영역객체명.변수명 } 이지만 영역객체명 생략 가능함. → 그렇다보니 해당 데이터가 어느 영역객체에 저장이 되었는지 알기 힘듬. |
9~12 | – 모든 영역객체를 출력해본 결과, pageScope 객체에 해당 데이터들이 저장되어 있음. – 즉, 내가 따로 저장할 영역객체를 지정하지 않으면 기본값으로 'page' 영역객체에 저장됨을 알 수 있음. |
✓ 실행 결과
• 영역객체에 따른 데이터 사용 가능 범위
1 ) 데이터 생성
<c:set var="MODEL" value="S23" scope="request" />
<c:set var="NAME" value="삼성갤럭시" scope="session" />
<c:set var="PRICE" value="200" scope="session" />
– scope를 지정하지 않으면 기본적으로 pageScope 영역객체에 저장되므로 현재 페이지에서만 사용 가능.
다른 페이지에서도 사용 가능한 데이터를 생성할 것이므로 request 영역객체를 사용함.
→ request 영역객체 사용 시, 다음 페이지까지 데이터 사용 가능.
→ session 영역객체 사용 시, 브라우저 종료때까지 (= 서버) 데이터 사용 가능.
2 ) 페이지 이동
<jsp:forward page="core_set2.jsp"></jsp:forward>
– 액션태그를 사용하여 forward 방식으로 페이지 이동함.
→ request 객체 안의 정보도 전달하면서 페이지 이동하는 방법.
– forward 방식으로 페이지 이동 시, 파라미터, request, session, application의 데이터 모두 전달 가능.
3 ) 실행하기
– 현재 페이지인 core_set1.jsp 에서 실행하면, 위의 정보들을 모두 전달하면서 core_set2.jsp 페이지로 이동함.
📃 core_set2.jsp
• forward 방식으로 전달한 정보 출력하기
모델명 : ${requestScope.MODEL } <br>
이름 : ${NAME } <br>
가격 : ${PRICE } <br>
– 페이지 이동하면서 넘어온 정보들을 출력하기 위해 el 표현식 사용.
– 포워딩 방식은 request영역과 session영역 모두 데이터 전달 가능하므로 모든 데이터가 출력됨.
– 영역객체명이 생략된 이름과 가격 정보는 앞서 scope를 session으로 지정했으므로 session 객체에서 가져온 것.
– 사실상 session보다는 request를 많이 사용함.
→ 어차피 core_set1과 core_set2 페이지에서만 사용할거라 굳이 session을 쓸 필요 없음.
→ 항상 서버에서 유지되야하는 데이터들만 session에 저장함.
→ 용도에 맞게 데이터를 저장하여 사용하는 것이 불필요한 메모리낭비 없이 효율적인 코드.
✓ 실행 결과
• core_set2.jsp 페이지에서 실행하기
– 위의 결과는 실제로 데이터가 존재하는 core_set1.jsp 페이지에서 실행했기 때문에
해당 데이터들이 전달되며 페이지가 이동했고, 이에 core_set2.jsp 페이지에서 출력이 가능했던 것.
– 만약 처음부터 core_set2.jsp 페이지에서 실행했다면 전달된 데이터가 없으므로 아무것도 출력 안됨.
→ 그러나 앞서 우리는 NAME과 PRICE 정보를 session 영역에 저장했음.
→ session 영역에 저장된 정보들은 브라우저가 종료되지 않는 이상 계속 존재함.
→ 따라서 request 영역에 저장했던 MODEL 정보만 출력이 안됨.
✓ 실행 결과
• 영역객체 데이터 삭제
<c:remove var="NAME" scope="session" />
모델명 : ${requestScope.MODEL } <br>
이름 : ${NAME } <br>
가격 : ${PRICE } <br>
<hr>
– session 영역에 저장된 NAME 정보를 삭제함.
– scope 영역 지정을 하지 않으면 page부터 application까지 순차적으로 찾아서 삭제함.
– remove 속성으로 실제로 삭제되었는지 확인하기 위해 core_set1.jsp 페이지에서 실행함.
→ core_set1.jsp 페이지에서 실행했으므로 다시 데이터들이 전달되어 MODEL 정보가 출력됨.
✓ 실행 결과
📃 TestServlet4.java
• 서블릿 작성
– HttpServlet 상속, doGet() 메서드 오버라이딩, 어노테이션 사용하여 서블릿 매핑까지 함.
@WebServlet("/set2")
public class TestServlet4 extends HttpServlet{
// http://localhost:8088/JSP7/set2
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet4_doGet() 호출");
}
}
• 전달할 데이터 — 객체 정보 생성 및 저장
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet4_doGet() 호출");
// 객체 정보 생성
Person p = new Person();
p.setName("아이티윌");
Person p1 = new Person();
p1.setName("부산");
// 객체 정보 저장 (request)
request.setAttribute("person", p);
// ArrayList를 사용하여 회원정보 2개 생성
ArrayList memberList = new ArrayList();
memberList.add(p);
memberList.add(p1);
// 회원정보 저장
request.setAttribute("memberList", memberList);
코드 분석
9, 11 | – Person 객체의 변수 Name에 "아이티윌", "부산" 데이터를 각각 참조변수에 저장함. |
14 | – request 영역 안에 person이라는 정보가 있고 그 안에는 참조변수 p의 데이터가 담겨 있음. → 참조변수 p에는 변수 Name에 "아이티윌" 데이터가 저장되어 있음. |
17~19 | – 사실상 데이터가 2개밖에 없으면 setAttribute() 메서드로 정보 전달하는게 간단함. – 많은 양의 데이터를 전달해야 할 경우 ArrayList를 사용하게 되는데, 그때 사용할 수 있게 미리 연습함. – ArrayList의 add() 메서드로 ArrayList에 데이터 추가함. |
22 | – request 영역에 memberList라는 이름으로 위에서 생성한 ArrayList인 memberList 데이터 저장. |
• 페이지 이동
// 페이지 이동 (core_set2.jsp)
RequestDispatcher dis
= request.getRequestDispatcher("./jstl/core_set2.jsp");
dis.forward(request, response);
}
– doGet() 메서드의 제일 아래에 코드 작성.
– RequestDispatcher 인터페이스를 사용하여 forward 방식으로 core_set2.jsp 페이지로 이동함.
📃 core_set2.jsp
• TestServlet4에서 전달된 정보 저장 & 출력
1. Person 데이터
이름 : ${requestScope.person } <br>
이름 : ${person.name } <br>
<!-- JSTL 사용 -->
<c:set var="name" value="${requestScope.person.name }" />
이름 : ${name } <br>
<hr>
– TestServlet4.java 페이지에서 request 영역에 저장한 person 데이터를 출력함.
– Person 데이터 안에 있는 name 값도 출력함. (영역객체명 생략 가능)
– JSTL을 사용하면 el 표현식에 var의 값, 변수 이름만 적으면 출력되므로 코드가 간략해짐을 알 수 있음.
✓ 실행 결과
2. ArrayList 데이터
${requestScope.memberList } <br>
첫번째 사용자의 이름을 출력 : ${requestScope.memberList[0].name } <br>
두번째 사용자의 이름을 출력 : ${requestScope.memberList[1].name } <br>
<c:set var="p" value="${memberList[0] }" />
첫번째 사용자의 이름을 출력 : ${p.name } <br>
<c:set var="p" value="${memberList }" />
첫번째 사용자의 이름을 출력 : ${p[0].name } <br>
– 첫번째 사용자의 이름을 출력하기 위해 ${memberlist[0] } 입력함.
→ 여기서 배열의 0번째 요소는 'p' 객체! 아까 배열에 데이터 추가할 때 add(p) 했음.
→ ${memberlist[0].name } == ${person.name } 같은 의미.
– JSTL을 사용하여 변수 생성, 데이터를 입력하여 저장함.
→ 어떻게 뭘 저장하느냐에 따라 el 표현식의 코드가 간결해짐.
✓ 실행 결과
📃 core_if.jsp
• if문 — JSTL
< c:if test="${조건문}" >
조건문이 참일때 실행
</c:if>
• 변수 i의 값이 itwill일 때 "아이티윌" 출력
1. JSP 코드로 작성
<!-- 변수 i 생성 -->
<c:set var="i" value="itwill" />
<%
String i = (String) pageContext.getAttribute("i");
%>
i : <%=i %> <br>
<%
if(i.equals("itwill")){
out.println("아이티윌");
}
%>
코드 분석
2 | – JSTL에서 변수를 만든다는것은 영역객체에서의 속성 (= 데이터)을 생성하는 것. – scope를 따로 지정하지 않았으므로 변수 i의 데이터는 기본 값인 pageScope에 저장됨. → page에 있는 데이터를 가져올때는 pageContext로 가져옴. |
6 | – String타입으로 다운캐스팅 함. |
9 | – 표현식으로 정보를 출력해봄 → 확인 작업 |
11~15 | – 스크립틀릿으로 if문사용하여 .equals() 메서드로 문자열을 비교하여 결과 도출. |
✓ 실행 결과
2. JSTL을 사용하여 작성
<c:set var="i" value="itwill" />
i : ${pageScope.i } <br>
<!-- 방법1 -->
<c:if test="${i == 'itwill' }" >
<h2>아이티윌@@@</h2>
</c:if>
<!-- 방법2 -->
<c:if test="${i.equals('itwill') }" >
<h2>아이티윌@@@</h2>
</c:if>
코드 분석
2 | – 정보가 page에 저장되어 있으므로 pageScope 객체에서 정보를 불러와 el 표현식으로 출력. |
4~12 | – 동등비교연산자 또는 .equals() 둘 다 사용 가능. → 큰따옴표가 이미 사용중이므로 문자열일 경우 '작은따옴표' 사용. |
✓ 실행 결과
• 홀 & 짝 구분하기
– JSTL에서는 if문의 기능만 있으므로 여러 조건이 필요하다면 그냥 if문을 여러개 사용함.
<c:set var="number" value="1000" />
<!-- if문 1 -->
<c:if test="${number % 2 != 0 }" >
<h2>홀수</h2>
</c:if>
<!-- if문 2 -->
<c:if test="${number % 2 eq 0 }" >
<h2>짝수</h2>
</c:if>
✓ 실행 결과
• choose 태그 사용
– switch-case와 비슷함.
<!-- 방법1 -->
<c:choose>
<c:when test="${number%2 eq 0 }">
짝수 (choose) <br>
</c:when>
<c:when test="${number%2 ne 0 }">
홀수 (choose) <br>
</c:when>
</c:choose>
<!-- 방법2 -->
<c:choose>
<c:when test="${number%2 ne 0 }">
홀수 (choose) <br>
</c:when>
<c:otherwise>
짝수 (choose) <br>
</c:otherwise>
</c:choose>
– <c:otherwise>는 default랑 비슷한 기능이라 '그 외 나머지 전부'를 뜻함.
→ 정확하게 사용하자면 홀짝 구분할때는 <c:when>으로 구분하는게 맞음.
– 조건을 개별적으로 비교할때는 <c:if> 여러개를 비교할때는 <c:choose> 사용.
📃 core_forEach.jsp
• forEach문 — JSP코드
for (변수 : str ) { } 1 ) 뒤칸부터 채움
for (String s : str ) { } 2 ) str 데이터를 저장할 변수 생성
for (변수 : 배열 / 컬렉션 (ArrayList) ) { }
<%
String[] str = {"a", "b", "c", "d", "e", "g"};
for(String s : str){
System.out.println(s);
}
// page영역에 str 배열 저장
pageContext.setAttribute("str", str);
%>
– String타입의 배열을 생성하여 참조변수 str에 데이터를 저장함.
– 참조변수 str을 page 영역에 저장함.
→ 해당 페이지 내에서 str 배열 데이터 사용 가능.
• forEach문 — JSP코드 & JSTL & el 표현식
<%
for(int i=1; i<=5; i++){
%>
forEach<%=i %> <br>
<%
}
%>
<hr>
<c:forEach begin="1" end="5" step="1">
forEach <br>
</c:forEach>
<hr>
<c:forEach var="i" begin="1" end="5" step="1">
forEach${i } <br>
</c:forEach>
– 셋 다 같은 동작을 하는 코드.
– 가볍게 원리만 짚고 넘어가기 위해 간단하게 1부터 5까지 반복하는 코드를 작성함.
✓ 실행 결과
• str 배열 출력하기 — JSTL의 forEach문
<c : forEach var="변수명" items= " $ { 출력할데이터 (=배열명) } " >
반복 : $ { 변수명 } <br>
</c : forEach>
<c:forEach var="s" items="${str }">
반복 : ${s } <br>
</c:forEach>
– 위에서 page 영역에 str 배열을 저장 (pageContext 객체 사용)했으므로 el표현식도 사용 가능.
– 만약 저장안했다면 스크립틀릿에 자바 코드로도 저장했으니까 표현식으로 str 출력하기.
✓ 실행 결과
'JSP' 카테고리의 다른 글
코드의 기본 실행 순서 / Model1과 Model2의 개요 (0) | 2023.04.16 |
---|---|
JSTL 국제화 & 형식화 액션 — fmt (0) | 2023.04.14 |
서블릿과 JSP페이지 연결 / 정보 (데이터) 전달 (0) | 2023.04.13 |
JSTL (JSP Standard Tag Library)과 EL (Expression Language) (0) | 2023.04.13 |
서블릿 (Servlet) / 동작 원리 / 작성 규칙 / 전체적인 코드의 흐름 (0) | 2023.04.13 |
- Total
- Today
- Yesterday
- 단일행함수
- DB
- jsp
- 업캐스팅
- 주석문
- Object
- 매개변수
- github
- 내장객체
- gitbash
- 제어문
- Dao
- model2
- Git
- 로컬저장소
- 다형성
- null
- 출력문
- JSTL
- 원격저장소
- mysql
- 숫자형
- 논리형
- javascript
- Java
- 인자
- Method
- 문자형
- 오버라이딩
- 데이터타입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |