JSP

[JSP] JSTL Core Tag - part.1(set,remove)

MoZZANG 2022. 5. 10. 18:20

표현언어(Expression Language) 지원 기능
   <c:catch>, <c:out>, <c:remove>, <c:set>
-흐름제어 기능
   <c:choose>, <c:when>, <c:otherwise>, <c:forEach>, <c:forToken>, <c:if>
-URL 관리 기능
   <c:import>, <c:param>, <c:redirect>, <c:url>
- 사용법
   <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

 

 

 

 

set태그

 

- <c:set/>은 setAttribute("속성명","값") 와 같은 역할. 

<c:set var="EL변수명"  value="값" scope="영역"/>
  
- EL식에서 사용하는 EL 변수를 생성하는데 사용된다.

- 변수에 값을 할당한다.
  자바빈 이나 컬렉션과 같은 객체의 속성에 값을 할당하기 위해서는 target 과 property속성을 이용한다.
  target과 property속성은 자바빈이나 Map계열 개체에만 적용 할 수 있다.

 

 

- set태그의 속성 요약

--------------+----------------+------------------+-------------------------------------------
속성           |   표현식/EL     |       타입          |                설명
--------------+----------------+------------------+--------------------------------
var             |        X          |    String           |   EL변수의 이름
--------------+----------------+------------------+--------------------------------------------
scope          |       X           |       String       |       변수를 생성할 영역.기본 값은 page
--------------+----------------+------------------+----------------------------------------------
value           |       O          |         Object    |       변수에 할당할 값
--------------+----------------+------------------+------------------------------------------------
target         |        O           |       Object      |       자바빈 개체 혹은 Map계열 컬렉션
--------------+----------------+------------------+---------------------------------------------
property      |       O          |          String     |       속성명
--------------+----------------+------------------+-------------------------------------------------

 

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.Arrays"%>
<%@page import="java.util.Vector"%>
<%@page import="java.util.List"%>
<%@page import="model.MemberDTO"%>
<%@page import="java.sql.Date"%>
<%@ 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">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SetTagIndex.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
<div class="jumbotron jumbotron-fluid bg-warning">
    <div class="container-fluid">
      <h1>JSP Standard Tag Library</h1>      
    </div><!--container-fluid-->
</div><!--jumbotron-fluid--> 
<div class="container">    
    <fieldset class="form-group border p-3">
        <legend class="w-auto p-3">set태그</legend>
        <!--  -->
        <h3>set태그로 EL에서 사용할 변수 설정</h3>
        <ul class="list-unstyled">
            <li>value속성에 직접 값 설정 : <c:set var="directvar" value="100"/></li>
            <!-- 위 JSTL코드는 아래의 자바코다와 같다 -->
            <%pageContext.setAttribute("directvar", "100");%>
            <li>value속성에 EL로 값 설정 : <c:set var="elvar" value="${directvar}"/></li>
            <li>value속성에 표현식로 값 설정 : <c:set var="expvar" value="<%=new Date(new java.util.Date().getTime()) %>"/></li>
            <li>시작태그와 종료태그 사이에 값 설정 : <c:set var="betweenvar"><h4>시작태그와 종료태그</h4>사이에 값을 설정합니다</c:set></li>
        </ul>
        <h3>set태그로 설정한 값 출력하기</h3>
        <h5>자바코드(스크립팅요소)로 출력</h5>	
        <ul class="list-unstyled">
            <li>directvar : <%=pageContext.getAttribute("directvar") %></li>
            <li>elvar : <%=pageContext.getAttribute("elvar") %></li>
            <li>expvar : <%=pageContext.getAttribute("expvar") %></li>
            <li>betweenvar : <%=pageContext.getAttribute("betweenvar") %></li>
        </ul>    	
        <h5>EL로 출력</h5>	
        <ul class="list-unstyled">
            <li>directvar : ${pageScope.directvar} </li>
            <li>elvar : ${elvar}</li>
            <li>expvar : ${expvar}</li>
            <li>betweenvar : ${betweenvar}</li>
        </ul>    		
        <h3>set태그로 각 영역에 저장</h3>
        <c:set var="pagevar" value="페이지 영역" />
        <c:set var="requestvar" value="리퀘스트 영역" scope="request"/>
        <c:set var="sessionvar" value="세션 영역" scope="session"/>
        <c:set var="application" value="어플리케이션 영역" scope="application"/>
        <h5>자바코드(스크립팅요소)로 출력</h5>	
        <ul class="list-unstyled">
            <li>pagevar : <%=pageContext.getAttribute("pagevar") %></li>
            <li>requestvar : <%=request.getAttribute("requestvar") %></li>
            <li>sessionvar : <%=session.getAttribute("sessionvar") %></li>
            <li>application : <%=application.getAttribute("application") %></li>
        </ul>    	
        <h5>EL로 출력</h5>	
        <ul class="list-unstyled">
            <li>pagevar : ${pagevar} </li>
            <li>requestvar : ${requestvar}</li>
            <li>sessionvar : ${sessionvar}</li>
            <li>application : ${application}</li>
        </ul>   
        <h3>set태그로 자바빈 객체에 저장</h3>
        <c:set scope="request" var="defaultMember" value="<%=new MemberDTO() %>"/>
        <h5>자바코드(스크립팅요소)로 출력</h5>	
        <ul class="list-unstyled">
            <li>이름 : <%=((MemberDTO)request.getAttribute("defaultMember")).getName() %></li>
            <li>아이디 : <%=((MemberDTO)request.getAttribute("defaultMember")).getId() %></li>
            <li>비밀번호 : <%=((MemberDTO)request.getAttribute("defaultMember")).getPwd() %></li>
        </ul>   
        <h5>EL로 출력</h5>	
        <ul class="list-unstyled">
            <li>이름 : ${defaultMember.name}</li>
            <li>아이디 : ${defaultMember.id}</li>
            <li>비번 : ${defaultMember.pwd}</li>    			
        </ul>   
            <c:set scope="request" var="argsMember" value='<%=new MemberDTO("KIM","1234","김길동","20") %>'/>
            <h5>자바코드(스크립팅요소)로 출력</h5>	
        <ul class="list-unstyled">
            <li>이름 : <%=((MemberDTO)request.getAttribute("argsMember")).getName() %></li>
            <li>아이디 : <%=((MemberDTO)request.getAttribute("argsMember")).getId() %></li>
            <li>비밀번호 : <%=((MemberDTO)request.getAttribute("argsMember")).getPwd() %></li>
        </ul>   
        <h5>EL로 출력</h5>	
        <ul class="list-unstyled">
            <li>이름 : ${argsMember.name}</li>
            <li>아이디 : ${argsMember.id}</li>
            <li>비번 : ${argsMember.pwd}</li>    			
        </ul>  
        <!--
            set태그의 target속성과 property속성은
            자바빈 객체나 컬렉션계열 객체 설정할때 사용할 수 있는 속성.

            ※target속성:반드시 EL식이나 표현식만 가능
             property속성:값,표현식,EL식 모두 가능.
              자바빈 인 경우-속성명(멤버변수명)
             Map컬렉션 - 키값  	

            ※scope속성은 var속성을 지정한 태그에서만 설정 가능
        -->
        <!-- target과 property를 사용해서
             자바빈이나 컬렉션에 값을 설정할때는
             var속성을 지정하면 안된다.
        -->
        <!-- target속성과 property속성을 이용해서
                자바빈 객체의 속성값 설정
         -->
         <c:set target="${defaultMember}" property="id" value="PARK"/>
         <c:set target="${defaultMember}" property="pwd" value="1234"/>
         <c:set target="${defaultMember}" property="name" value="박길동"/>
         <h5>target 및 property 속성으로 값 설정 후 EL로 출력</h5>	
        <ul class="list-unstyled">
            <li>이름 : ${defaultMember.name}</li>
            <li>아이디 : ${defaultMember.id}</li>
            <li>비번 : ${defaultMember.pwd}</li>    			
        </ul>  
        <%
            //리스트계열 컬렉션
            List list = Arrays.asList(request.getAttribute("defaultMember"),request.getAttribute("argsMember"));
        %>
        <c:set scope="request" value="<%=list%>" var="list"/>
        <h5>속성값 변경 전 출력</h5>
        <ul class="list-unstyled">
            <li>이름 : ${list[0].name}</li>
            <li>아이디 : ${list[0].id}</li>
            <li>비번 : ${list[0].pwd}</li>    			
        </ul>  
         <h5>target 및 property 속성으로 값 설정 후 EL로 출력</h5>
         <c:set target="${list[0]}" property="name" value="한소인"/>	
         <c:set target="${list[0]}" property="id" value="KOSMO"/>	
         <c:set target="${list[0]}" property="pwd" value="1234"/>	
         <h5>속성값 변경 후 출력</h5>
         <ul class="list-unstyled">
            <li>이름 : ${list[0].name}</li>
            <li>아이디 : ${list[0].id}</li>
            <li>비번 : ${list[0].pwd}</li>    			
        </ul>  
        <%
            //맵 계열 컬렉션
            Map map = new HashMap();
            map.put("default", request.getAttribute("defaultMember"));
            map.put("args", request.getAttribute("argsMember"));

        %>
        <c:set var="map" value="<%=map %>" scope="request"/>
        <h5>속성값 변경 전 출력</h5>
        <ul class="list-unstyled">
            <li>이름 : ${map['default'].name}</li>
            <li>아이디 : ${map['default'].id}</li>
            <li>비번 : ${map['default'].pwd}</li>    			
        </ul>  
         <h5>target 및 property 속성으로 값 설정 후 EL로 출력</h5>
         <c:set target="${map['default']}" property="name" value="한소인2"/>	
         <c:set target="${map['default']}" property="id" value="KOSMO2"/>	
         <c:set target="${map['default']}" property="pwd" value="0000"/>	
         <h5>속성값 변경 후 출력</h5>
         <ul class="list-unstyled">
            <li>이름 : ${map['default'].name}</li>
            <li>아이디 : ${map['default'].id}</li>
            <li>비번 : ${map['default'].pwd}</li>    			
        </ul>  
    </fieldset>
</div><!-- container -->
</body>
</html>

<jsp:forward page="SetTagResult.jsp">
	<jsp:param value="android" name="subject"/>

</jsp:forward>

▲마지막에 forward 액션태그로 Result페이지로 이동한다. 파라미터로 subject=android도 같이 넘긴다.

 

 

Result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SetTagResult.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
<div class="jumbotron jumbotron-fluid bg-warning">
    <div class="container-fluid">
      <h1>JSTL(JSP Standard Tag Library)</h1>      
    </div><!--container-fluid-->
</div><!--jumbotron-fluid--> 
<div class="container">    
    <fieldset class="form-group border p-3">
        <legend class="w-auto p-3">set태그로 설정한 객체를 EL로 출력</legend>
        <h3>xxxvar계열</h3>
        <ul class="list-unstyled">
            <li>pagevar : ${pagevar}</li>
            <li>requestvar : ${requestvar}</li>
            <li>sessionvar : ${sessionvar}</li>
            <li>applicationvar : ${applicationvar}</li>
        </ul>
        <h3>MemberDTO계열(argsMember)출력</h3>
        <ul class="list-unstyled">
            <li>이름:${argsMember.name}</li>
            <li>아이디:${argsMember.id}</li>
            <li>비번:${argsMember.pwd}</li>
        </ul>
        <h3>리스트 계열 컬렉션(인덱스 1인 객체) 출력</h3>
        <ul class="list-unstyled">
            <li>이름:${list[1].name}</li>
            <li>아이디:${list[1].id}</li>
            <li>비번:${list[1].pwd}</li>
        </ul>
        <h3>맵 계열 컬렉션(키값이 'args'인 객체) 출력</h3>
        <ul class="list-unstyled">
            <li>이름:${map.args.name}</li>
            <li>아이디:${map['args'].id}</li>
            <li>비번:${map['args']['pwd']}</li>
         </ul>
    </fieldset>
</div><!-- container -->
</body>
</html>

▲page영역에 저장한 pagevar는 null이므로 출력이 안되고 나머지는 모두 request영역에 저장하였기 때문에 forward방식으로 넘어오면서 모두 공유하고 있으므로 출력이 잘 된다.

 

 

 

 

 

 

 

remove태그

 


- removeAttribute와 같은 역할
- 해당 scope 에 있는 변수를 제거하는 역할을 한다.
- 변수를 삭제하는 경우 scope이 맞지 않으면 삭제 되지 않는다.
- scope를 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수가 삭제 됨.

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="my" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>RemoveTag.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
<div class="jumbotron jumbotron-fluid bg-warning">
    <div class="container-fluid">
      <h1>JSTL(JSP Standard Tag Library)</h1>      
    </div><!--container-fluid-->
</div><!--jumbotron-fluid--> 
<div class="container">    
    <fieldset class="form-group border p-3">
        <legend class="w-auto p-3">remove태그</legend>
        <!-- 각 영역에 JSTL을 이용해서 속성 저장 -->
        <my:set var="pagevar" value="페이지 영역" />
        <my:set var="pagevar" value="리퀘스트 영역1" scope="request"/>
        <my:set var="requestvar" value="리퀘스트 영역2" scope="request" />
        <my:set var="sessionvar" value="세션 영역" scope="session" />
        <my:set var="applicationvar" value="어플리케이션 영역" scope="application" />
        <h3>삭제 전 출력</h3>
        <ul class="list-unstyled">
            <ul class="list-unstyled">
            <li>pagevar : ${pagevar}</li>
            <li>pagevar : ${requestScope.pagevar}</li>
            <li>requestvar : ${requestvar}</li>
            <li>sessionvar : ${sessionvar}</li>
            <li>applicationvar : ${applicationvar}</li>
        </ul>
        <!-- 삭제만 안됨(세션영역에 키가 없으니까) -->
        <my:remove var="requestvar" scope="session"/>
        <h3>영역이 다른 경우</h3>
        <ul class="list-unstyled">
            <ul class="list-unstyled">
            <li>pagevar : ${pagevar}</li>
            <li>pagevar : ${requestScope.pagevar}</li>
            <li>requestvar : ${requestvar}</li>
            <li>sessionvar : ${sessionvar}</li>
            <li>applicationvar : ${applicationvar}</li>
        </ul>
        <!-- 영역 미 지정시 모든 영역에서 동일한 이름의 속성들이 삭제된다 -->
        <my:remove var="pagevar"/>
        <h3>동일한 속성명 삭제(영역 미 지정) 경우</h3>
        <ul class="list-unstyled">
            <ul class="list-unstyled">
            <li>pagevar : ${pagevar}</li>
            <li>pagevar : ${requestScope.pagevar}</li>
            <li>requestvar : ${requestvar}</li>
            <li>sessionvar : ${sessionvar}</li>
            <li>applicationvar : ${applicationvar}</li>
        </ul>
    </fieldset>
</div><!-- container -->
</body>
</html>

▲ 영역만 다르고 키값이 다른경우 remove를 할 때 영역을 지정하지 않으면 어떻게 될까?

 

 

▲ 영역을 지정하지 않으면 해당 키값으로 존재하는 모든 value들을 다 삭제한다.

'JSP' 카테고리의 다른 글

[JSP] JSTL Core Tag - part.2(if,choose ~when ~otherwise,forEach)  (0) 2022.05.10
[JSP]EL : 내장객체  (0) 2022.05.09
[JSP]Expression Language(EL : 표현언어)  (0) 2022.05.06
[JSP]Action Tag  (0) 2022.05.03
[JSP]session  (0) 2022.05.03