열심히 끝까지
디바이스 융합 자바(Java) day46 - JSTL(Set,Remove,ForEach,CatchErrMsg,If,Choose,ForTokens,Import,Url,Redirect) 본문
디바이스 융합 자바(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>
>> 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><회원 리스트></h1>
<!-- <>꺾세를 그냥 넣고 싶은데 <table>의 꺾세로 인식 -->
<!-- < > 사용해서 꺾세 넣기 -->
<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><회원 리스트></h1>
<!-- <>꺾세를 그냥 넣고 싶은데 <table>의 꺾세로 인식 -->
<!-- <, > 사용해서 꺾세 넣기 -->
<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} </td> <!-- 이 때,  는 사이를 한칸 띄우기 위한 것 -->
<!-- <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>
>> 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>
>> 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>
>> 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>
>> 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>
'디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)' 카테고리의 다른 글
디바이스 융합 자바(Java) day48 - 리스너(Listener)(초기화 매개변수),필터(Filter) (0) | 2022.08.18 |
---|---|
디바이스 융합 자바(Java) day47 - 트랜잭션(rollback(),commit()) (0) | 2022.08.17 |
디바이스 융합 자바(Java) day45 - 표현언어(EL식),커스텀태그(태그파일 기반의 커스텀태그,태그핸들러클래스 기반의 커스텀태그) (0) | 2022.08.12 |
디바이스 융합 자바(Java) day43 - 관리자&작성자 변경/삭제 로직 (0) | 2022.08.10 |
디바이스 융합 자바(Java) day42 - jsp를 이용한 게시글 내용변경,게시글 삭제,로그인,회원가입,회원정보변경,회원탈퇴,게시글 검색 (0) | 2022.08.09 |