JSTL

OneTwoThree·2022년 10월 3일
0

jstl

java코드가 아닌 태그 형식으로 로직을 수행할 수 있다
(프론트 개발자가 사용하기 쉽도록 하기 위해)

JSP는 결과를 출력하는게 목적

JSTL 세팅

링크


파일 탐색기에서 복붙하지 말고 복사해서 이클립스로 와서 붙여넣어야 된다.

코어 태그

코어가 제일 중요하다. (조건문, 반복문)

논리적인 흐름을 태그로 처리할 수 있게 도와준다

set은 scope에 값을 저장하기 위해 사용
remove는 제거하기 위해 사용
varName이 변수명, value가 값, scope이 어떤 scope에 저장할 지

코어 태그 사용하기

먼저 jsp파일에서 위에 이런 코드를 넣어준다

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

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<!-- JSTL을 이용해서 request scope에 value1,kang 저장  -->
<c:set var="value1" scope="request" value="kang"></c:set>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
성 : ${value1 }<br>

<!-- JSTL의 remove태그를 이용해서 값 삭제 -->
<c:remove var="value1" scope="request"></c:remove>
성 : ${value1 }<br>

</body>
</html>

위와 같이 JSTL의 set 태그로 원하는 scope에 원하는 변수명에 값을 넣고 remove 태그로 삭제할 수 있다.
태그를 열고 닫는 태그로 구성했는데 태그 사이에 내용이 없다면 더 간편하게

<c:set var="value1" scope="request" value="kang"/>

이렇게 단일 태그로도 구성할 수 있다.

변수 지원 태그

setter와 getter를 호출해주기 위한 태그

some 객체의 propertyName 필드에 anyValue를 넣는다

흐름 제어 태그

자바의 if와는 다르게 else가 없음
test에 해당하는 내용이 true면 태그 내의 내용을 실행한다.

조건의 test="" 의 "" 안에는 주로 el 태그를 넣는다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<c:set var="n" scope="request" value="10"/>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:if test="${n==0 }">
n==0입니다 
</c:if>
<c:if test="${n==10 }">
n==10입니다. 
</c:if>


</body>
</html>

test부분을 el태그를 이용해서 구성했다.

if에 의해 n==10입니다만 화면에 출력된다.

choose - when - otherwise 태그가 if- else와 비슷하다고 볼 수 있다.
when이 여러개 나올 수 있고 when 조건 중 만족하는 것이 없다면 otherwise의 내용을 실행한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    
    <%
    request.setAttribute("score",83);
    %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:choose>
<c:when test="${score>=90 }">A학점 </c:when>
<c:when test="${score>=80 }">B학점 </c:when>
<c:when test="${score>=70 }">C학점 </c:when>
<c:otherwise>F학점</c:otherwise>
</c:choose>

</body>
</html>

forEach를 사용하면 배열, 리스트 같은 자료구조에서 데이터를 하나씩 뽑아낼 수 있음
for문처럼 특정 조건동안만 반복하게 할 수 도 있다

items에 리스트, 배열같은 자료구조를 넣는다
var은 변수명
begin~end 인덱스까지 반복한다

begin,end는 생략이 가능함 (없으면 처음부터 끝까지 반복)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>

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

<%
	
	
	List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("!!!!");

request.setAttribute("list",list);

%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:forEach items="${list }" var="item">
${item }<br>
</c:forEach>

</body>
</html>

begin, end 속성을 추가하면 원하는 부분만 출력할 수 있다.

자동 import

진행하면서 이클립스에서 자동 import를 사용하는데 나는 안되서 해결법을 찾아봤다.
이클립스 자동 import 안될 때

근데 이거 해도 안됨..

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>

그래서 상단에 이렇게 두줄을 추가해줬다.

import 태그를 이용하면 특정 url의 결과를 읽어들여서 그 내용을 변수에 저장할 수 있다.

charEncoding 속성은 필수가 아니다

param 태그는 url에 쿼리문자열이 있으면 그것까지 이용하기 위해서 사용한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    
    <c:import url="http://localhost:8080/testWeb/jstlValue.jsp" var="urlValue"
    scope ="request" ></c:import>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

${urlValue }<br>


</body>
</html>

jstValue.jsp에는 kang gyungmi만 출력되게 해놓고 그 반환값을 import로 받아서 변수에 저장하게 el코드를 이용해 출력한다.

google같은곳에서 검색결과를 얻어오고 싶다 하면 param 태그를 이용하면 된다

JSTL에서는 redirect 태그 안에 리다이렉트 하려는 url을 넣어주면 된다
param 태그 안에는 리다이렉트 하면서 페이지에 전달할 값이 있으면 변수명과 값을 넣어서 전달할 수 있다.

<%@ 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="http://localhost:8080/testWeb/jstl05.jsp"></c:redirect>
    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

이렇게 redirect 태그안에 원하는 url 을 넣어서 리다이렉트 할 수 있다.

기타태그

out 태그를 이용하면 특정한 문자열을 출력할 수 있다.

아래 예시를 통해 이해하는것이 좋다

<%@ 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>

<c:set var="t" value="<script type='text/javascript'>alert(1)</script>"></c:set>

<c:out value="${t }" escapeXml="false"/>

</body>
</html>

set 태그를 이용해 value t에 js코드를 넣었다.
그리고 out태그를 이용해 출력하는데 이 때 escapeXml값을 false로 줬다.

그리고 나서 실행하자 javascript 코드가 실행되어 alert 창이 뜬다.

<%@ 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>

<c:set var="t" value="<script type='text/javascript'>alert(1)</script>"></c:set>

<c:out value="${t }" escapeXml="true"/>

</body>
</html>

하지만 이렇게 escapeXml을 true로 놓고 실행하면 javascript 코드가 아닌 그냥 문자열로 인식하게 된다.

0개의 댓글