티스토리 뷰
📍 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
- gitbash
- 숫자형
- 다형성
- DB
- 제어문
- JSTL
- 데이터타입
- 단일행함수
- mysql
- Git
- Object
- null
- 매개변수
- 원격저장소
- Java
- 업캐스팅
- Method
- 인자
- 출력문
- 논리형
- 오버라이딩
- 로컬저장소
- Dao
- 문자형
- model2
- 내장객체
- jsp
- 주석문
- github
- javascript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |