열심히 끝까지

디바이스 융합 자바(Java) day46 - JSTL(Set,Remove,ForEach,CatchErrMsg,If,Choose,ForTokens,Import,Url,Redirect) 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day46 - JSTL(Set,Remove,ForEach,CatchErrMsg,If,Choose,ForTokens,Import,Url,Redirect)

노유림 2022. 8. 16. 14:34

[오늘 수업]

[리스너 클래스]
- 예습
   - .java로 끝남
   - (서블릿(Servlet)처럼)POJO가 아닌 클래스
   - 특수한 형태의 서블릿(=서블릿을 상속받은 상태)
     ex ) 사람 - 학생 - 고등학생
           POJO - 서블릿 - Listener
   - 어떤 행동을 모니터링(감지)할 지 선택할 수 있음!
   - 해당 동작을 감지하면, 본인을 자동호출할 수 있게 됨!!!
     >> Java Script의 onclick()콜백함수, 혹은 addEventListener 와 비슷
          : 인터페이스 동작이 감지되면, 내가 구현해 놓은 코드가 자동 호출
               => 톰캣의 시작

 

>> initialMember.java

package day46;

import java.util.ArrayList;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * Application Lifecycle Listener implementation class InitialMember
 *
 */
@WebListener
public class InitialMember implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public InitialMember() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent sce)  { 
         // 톰캣의 종료를 감지(모니터링)
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sce)  {  
    	// 톰캣(서버, 서블릿 컨테이너)의 시작을 감지(모니터링)
    	
    	// DB 대용
    	ArrayList<Member> datas=new ArrayList<Member>();
    	for(int i=0; i<10; i++) {
    		Member data = new Member("홍길동"+i,"010-1234-5678");
    		datas.add(data);
    	}
    	datas.add(new Member("임꺽정", null));
    	datas.add(new Member("아무무", null));
    	
        // context == application scope
    	ServletContext context=sce.getServletContext();
    	context.setAttribute("datas", datas); // control.jsp에서 하던 application.setAttribute와 동일
    	// 톰캣을 끄기 전까지 데이터 유지
    	context.setAttribute("data", new Member());
    }
	
}

 

>> day46.Member.java

package day46;

public class Member {
	private String name;
	private String phone;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	
	public Member() {
		name="김티모";
		phone="010-1234-1234";
	}
	public Member(String name, String phone) {
		this.name=name;
		this.phone=phone;
	}
}

 

[JSTL]
   V에서 사용 : EL식, 커스텀태그(파이리반, 핸들러클래스기반), 
                     JSTL(ㅁㅁㅁㅁ Library(라이브러리))


   ※ 좋은 자바 개발자란? 남들이 만들어놓은 것을 가져다가 쓸 때에는
                                   올바른 문법을 지켜서 구현이 가능한 수준으로 익히는 것!


   ※ 훌륭한 자바 개발자란? 남들이 아무걱정없이 막 쓸 수 있게 모듈을 개발<아직은 고민하지 말 것>
                                      -> 배포할 수 있는 사람!
                                      >> 신입한테 뭐 만들라고 하지 않음 
                                      >> 현재 분석을 잘 하는 것을 잘하는 것이 중요!


   >> WEB-INF > lib 하위에 jstl, standard.jar 넣을 것

 

>> JSTL도 태그 라이브러리 지시어 꼭 사용해야 함!!!!
뒤의 태그를 꼭 작성!!
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 

>> SetRemove JSTL

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SET,REMOVE JSTL</title>
</head>
<body>

<c:set var="msg" value="HELLO!" />
<!-- set으로 변수 설정 가능 -->
<!--<c:remove var="msg" />-->
<!-- remove로 변수 제거 가능! -->
${msg}

<hr>

<c:set target="${data}" property="phone" value="010-5092-9890" />
${data.name} | ${data.phone}

</body>
</html>

REMOVE하지 않았을 때의 실행결과
REMOVE 했을 때의 실행 결과

 

>> ForEach JSTL

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="day46.Member"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL 예제</title>
</head>
<body>

<h1>&lt;회원 리스트&gt;</h1> 
<!-- <>꺾세를 그냥 넣고 싶은데 <table>의 꺾세로 인식 -->
<!-- &lt; &gt; 사용해서 꺾세 넣기 -->

<table>
	<tr>
		<td>이름</td>
		<td>전화번호</td>
	</tr>
	<%
		for(Member v : (ArrayList<Member>)application.getAttribute("datas")){ // datas
	%>
	<tr>
		<td><%=v.getName() %></td>
		<td><%=v.getPhone() %></td>
	</tr>
	<%
		}
	%>
</table>

</body>
</html>

 

>> for문이 많이 쓰이기에 다음과 같이 사용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ForEach JSTL</title>
</head>
<body>

<h1>&lt;회원 리스트&gt;</h1> 
<!-- <>꺾세를 그냥 넣고 싶은데 <table>의 꺾세로 인식 -->
<!-- &lt;, &gt 사용해서 꺾세 넣기 -->

<table border="1">
	<tr>
		<td>이름</td>
		<td>전화번호</td>
	</tr>
	<c:forEach var="v" items="${datas}"> <!-- for문 많이 쓰이니 이런식으로 import -->
	<!-- 콜롬 기준 왼쪽-뭐라고 부를지 변수명 결정 = var |  오른쪽-집합 = items -->
	<!-- items= 어플리케이션 스코프 내장객체에 저장된 datas = EL식으로 내놔! 라고 요청 -->
	<tr>
		<td>${v.name}&nbsp;</td> <!-- 이 때, &nbsp는 사이를 한칸 띄우기 위한 것 -->
		<!-- <td>${v["phone"]}</td> <!-- ${v.phone} | ${v["phone"]}  도 가능!  -->
		<td><c:out value="${v.phone}" escapeXml="false"><font color="red">phone 정보없음</font></c:out></td> <!-- value="필수속성 -->
	</tr>
	</c:forEach>
</table>

</body>
</html>

 

>> TryCatch JSTL

 

>> trycatch 방법

  >> java문 사용 시..

<% 
	try{
%>
<%= 10/0 %>
<%
	}catch(Exception e){
		
	}
%>

 

>> Error JSTL 사용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- 에러 일부러 발생 -->
<c:catch var="errMsg"> <!-- errorMsg를 출력하고 싶으면 errMsg로 작성하면 됨 -->
<!-- 결과는 작성되지 않고 에러메세지만 띄움 -->
<%= 10/0 %>
</c:catch>
<hr>
${errMsg}

</body>
</html>

위 코드를 실행했을 때의 결과

 

>> JSTL을 이용해 if문 사용 방법

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:set var="member" value="ADMIN" />

<c:if test="${member=='ADMIN'}">
<!-- test="조건식을 쓰는 부분" -->
	관리자모드입니다.
</c:if>
<!-- else가 존재하지 않기 때문에 if문을 한 번 더 써주어야 함 -->
<c:if test="${member!='ADMIN'}">
<!-- test="조건식을 쓰는 부분" -->
	일반모드입니다.
</c:if>

</body>
</html>

ADMIN일 때 실행 결과
TIMO일 때 실행 결과


>> select를 사용한 JSTL 사용 방법

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CHOOSE JSTL</title>
</head>
<body>

<form> <!-- 다시 본 페이지로 돌아오고 싶어서 action 제거 -->
	<select name="sel">
		<option>-</option>
		<option>apple</option>
		<option>banana</option>
		<option>kiwi</option>
	</select>
	<input type="submit" value="선택">
</form>

<hr>

<c:choose>
	<c:when test="${param.sel=='apple'}"> <!-- sel => request, session 파라미터값 => param.sel -->
		apple을 선택하셨습니다.
	</c:when>
	<c:when test="${param.sel=='banana'}">
		banana를 선택하셨습니다.
	</c:when>
	<c:when test="${param.sel=='kiwi'}">
		kiwi를 선택하셨습니다.
	</c:when>
	<c:otherwise>
		-----
	</c:otherwise>
</c:choose>

</body>
</html>

-----------선택사항 유지법

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CHOOSE JSTL</title>
</head>
<body>

<!-- get요청이라 url에 다 나타남 -->
<form> <!-- 다시 본 페이지로 돌아오고 싶어서 action 제거 -->
	<select name="sel">
		<option ${param.sel=='-' ? 'selected' : '' }>-</option>
		<!-- 이전에 ''안에 사항을 선택했을 때, 그 선택한 사항에 대기하는 방법 -->
		<option ${param.sel=='apple' ? 'selected' : '' }>apple</option>
		<option ${param.sel=='banana' ? 'selected' : '' }>banana</option>
		<option ${param.sel=='kiwi' ? 'selected' : '' }>kiwi</option>
	</select>
	<input type="submit" value="선택">
</form>

<hr>

<c:choose>
	<c:when test="${param.sel=='apple'}"> <!-- sel => request, session 파라미터값 => param.sel -->
		apple을 선택하셨습니다.
	</c:when>
	<c:when test="${param.sel=='banana'}">
		banana를 선택하셨습니다.
	</c:when>
	<c:when test="${param.sel=='kiwi'}">
		kiwi를 선택하셨습니다.
	</c:when>
	<c:otherwise>
		-----
	</c:otherwise>
</c:choose>

</body>
</html>

초기에 선택하지 않았을 때 실행 결과
kiwi 선택 시 실행결과 및 선택고정

 

 

>> forEachForTokens

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ForEach/ForTokens JSTL2</title>
</head>
<body>

<c:forEach var="v" items="${datas}" begin="0" end="3" varStatus="status" >
	index : ${status.index} <br>
	count : ${status.count} <br>
	${v.name} | ${v.phone} <hr>
</c:forEach>

<hr>

<c:forTokens items="사과,바나나,키위" delims="," var="v">
	${v} <br>
</c:forTokens>

</body>
</html>

위의 코드 실행 시 결과


>> import JSTL

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Import JSTL</title>
</head>
<body>

<!-- import는 현재 존재하는 쪽으로 데이터를 불러와 저장하는 태그 -->
<c:import url="SetRemoveJSTL.jsp" var="url" />
<c:out value="${url}" escapeXml="false"/>
<!-- 태그 내용해석하려면 escapeXml="false"로 놓으면 됨 -->

<hr>

<c:import url="https://www.naver.com" var="url2" />
<c:out value="${url2}" escapeXml="false"/>

</body>
</html>

SetRemove내용 가져와서 출력(Set을 Remove 진행 시)


>> Url JSTL

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Url JSTL</title>
</head>
<body>

<c:url value="ChooseJSTL.jsp" var="target">
	<c:param name="sel">banana</c:param>
</c:url>

<hr>

${target} <br>
<a href="${target}">ChooseJSTL.jsp 페이지로 banana 값(파라미터명 : sel)을 보내는 링크</a>

</body>
</html>

위의 코드 실행 시 결과
아래의 링크로 이동 시 결과


>> Redirect JSTL

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Redirect JSTL</title>
</head>
<body>
<c:redirect url="ChooseJSTL.jsp">
	<c:param name="sel">kiwi</c:param>
</c:redirect>

</body>
</html>

kiwi주고 실행하면 출력하는 결과 + url에서는 ChooseJSTL.jsp로 이동한 상황

 

>> 45일차 EL1, EL2 를 JSTL 방식으로 체인지

>> 45일차 EL1, EL2

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean id="test" class="test.Test" scope="session"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL식 - 1</title>
</head>
<body>
<!-- 데이터를 정해주기 위한 작업 -->
<form action="El2.jsp" method="post">
	<select name="sel">
		<%
		// 테스트 클래스를 가져오려면 객채화 진행 위에 useBean을 통해 진행
			for(String v : test.getDatas() ){ // for(String v : Test클래스의 datas 멤버변수)
		%>
			<option><%=v %></option>			
		<% 	
			}
		%>
	</select>
	<input type="submit" value="선택">
</form>

</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL식 - 2</title>
</head>
<body>

sel이라는 파라미터에 저장된 값 : <%=request.getParameter("sel") %><br>
현재 session scope 내장객체에는 test라는 이름의 객체가 저장된 상태.<br>
test.getNum1() + test.getNum2() = ???
Test test=(Test)session.getAttribute("test"); << object로 돌려줌 >> 캐스팅 진행
=> <jsp:useBean scope="session" id="test" class="test.Test"/>
<% // => 뒤에 값이 나오는 곳
	int res=test.getNum1() + test.getNum2();
	out.println(res);
%>
<br>
<hr>
<!-- EL식 방법 : 위의 과정 동일 --> 
sel이라는 파라미터에 저장된 값 : ${param.sel} 
현재 session scope 내장객체에는 test라는 이름의 객체가 저장된 상태.<br>
${test.num1} + ${test.num2} = ${test.num1+test.num2}

</body>
</html>

 

>> JSTL로 체인지한 내용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<jsp:useBean id="test" class="test.Test" scope="session"/> <!-- C가 담당 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL식 - 1</title>
</head>
<body>
<!-- 데이터를 정해주기 위한 작업 -->
<form action="EL1.jsp" method="post">
	<select name="sel">
		<c:forEach var="v" items="${test.datas}">
				<option>${v}</option>
		</c:forEach>			
	</select>
	<input type="submit" value="선택">
</form>

</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 태그 라이브러리 지시어 꼭 사용해야 JSTL 사용 가능 -->
<!-- prefix는 c로 한다. 거의 고정이니 c로 할 것 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL식 - 2</title>
</head>
<body>

<hr>
<!-- EL식 방법 : 위의 과정 동일 --> 
sel이라는 파라미터에 저장된 값 : ${param.sel} 
현재 session scope 내장객체에는 test라는 이름의 객체가 저장된 상태.<br>
${test.num1} + ${test.num2} = ${test.num1+test.num2}

</body>
</html>

EL.jsp 결과
apple을 선택했을 시에 나오는 결과