지구정복

[JSP-JSTL] 1/8 | 표준태그라이브러리 JSTL(태그종류, 코어사용(변수, 제어문, 반복문, 구구단만들기, forToken), 데이터베이스사용(update, select, 커넥션풀, 우편번호 검색기)), 필터(개념, web.xml, 어노테.. 본문

데이터 엔지니어링 정복/JAVA & JSP

[JSP-JSTL] 1/8 | 표준태그라이브러리 JSTL(태그종류, 코어사용(변수, 제어문, 반복문, 구구단만들기, forToken), 데이터베이스사용(update, select, 커넥션풀, 우편번호 검색기)), 필터(개념, web.xml, 어노테..

eeaarrtthh 2021. 1. 8. 18:04
728x90
반응형
SMALL

복습

MVC Model2
	parameter
		controller?action=list

	url
		list.do => 실제 많이 사용

view 표현법
	EL
		${ 데이터 또는 변수, 객체의내용 } 이것은 <%= %>이거와 같다.

	JSTL <= custom action tag이다. (p292)
	action tag란 <jsp:명령어>를 말한다. 즉, HTML을 작성하고 자바의 효과를 내는 것
	하지만 action tag가 사용자마다 다르게 사용하므로 이를 표준화한 것이
	JSTL(Java Standard Template Library)이고 action tag와 기능은 같다.
	
	JSTL과 EL을 이용해서 view.jsp페이지에서 java코드를 없앤다.

 

12. 표준 태그 라이브러리(JSTL)

더보기

p292

 

간단히 정리하면 JSP 페이지에서 HTML코드와 JSP 코드가 너무 섞여있으면 가독성이 좋지 않다. 따라서 JSP페이지에서 많이 사용하는 논리적인 판단, 반복 처리, 포맷 처리를 위한 커스텀 태그를 표준으로 만들어서 정의한 것이 있는데 이를 JSTL이다.

 

이를 위해서는 라이브러리가 필요하다.

jstl.jar
0.02MB

 

standard.jar
0.38MB

 

 그리고 위 라이브러리를 새로운 다이나믹 웹 프로젝트/WebContent/WEB-INF/lib 폴더안에 넣어둔다.

 

 

12.1.1 JSTL이 제공하는 태그의 종류

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

코어를 쓸 때는 이제 <c: 기능>로 사용한다.

prefix를 접두어라고 한다. 이 접두어는 사용자가 정할 수 있다. 또한 uri속성값은 고정되어있다.

 

  • 코어
    • 변수
    • 흐름
    • url
    • 기타
  • XML
  • 국제화
  • 데이터베이스
  • 함수

코어

코어를 실제 사용해보자.

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

<%
	pageContext.setAttribute( "data1", "value1" );
%>

JSP표현식으로 출력: <%= pageContext.getAttribute( "data1" ) %><br>
EL표현방식으로 출력: ${ data1 }<br>
JSTL 코어로 출력(out사용): <c:out value="${data1}"/><br>
JSTL 코어로 출력(out의 디폴트값 사용1): <c:out value="${data2}" default="value2"/><br>
JSTL 코어로 출력(out의 디폴트값 사용2): <c:out value="${data2}"/>value3<br>
JSTL 코어로 출력(out의 선언과 동시에 출력): <c:out value="${data3 = 'value4' }" /><br>

</body>
</html>

 

이번에는 jstl에 변수를 선언하고 사용해보자.

<%@ 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="data1" value="test1" />
<c:set var="data2" value="test2" scope="request"/>

<%
	
%>

출력 : ${data1 } =>EL로 출력<br>
출력 : <c:out value="${ data1 }"/> =>JSTL 코어로 출력<br>
출력 : <%= pageContext.getAttribute( "data1" ) %> =>JSP 표현식으로 출력. 바로 data1은 출력이되지 않는다.<br>
---String data1 = "test1" 이면 바로 출력이된다. c:set의 변수선언 방법은 pageContext.setAttribute("data1", "test1")과 같다.<br>
출력 : <%= request.getAttribute("data2") %> => c:set변수선언시 scope="request"를 하면 jsp표현식에서 request를 이용해서 출력할 수 있다.<br>





</body>
</html>

 

이번에는 jsp의 각 영역별로 변수를 선언해보자.

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

<!-- jsp 스트립트릿으로 변수 선언하기 -->
<%
	pageContext.setAttribute( "data1", "test1" );
	request.setAttribute( "data2", "test2" );
	session.setAttribute( "data3", "test3" );
	application.setAttribute( "data4", "test4" );
%>

<!-- jstl c:set으로 변수 선언하기 -->
<c:set var="data1" value="test1" scope="page" />
<c:set var="data2" value="test2" scope="request" />
<c:set var="data3" value="test3" scope="session" />
<c:set var="data4" value="test4" scope="application" />

출력 : ${ pageScope.data1 }<br>
출력 : ${ requestScope.data2 }<br>
출력 : ${ sessionScope.data3 }<br>
출력 : ${ applicationScope.data4 }<br>


</body>
</html>

 

jstl로 변수선언하고 변수를 제거해보자.

<%@ 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="data1" value="test1"/>
출력 : <c:out value="${data1 }"/><br>
<c:remove var="data1"/>
출력 : <c:out value="${data1}" default="값없음"/><br>

</body>
</html>

 

이번에는 jstl을 이용해서 자바 클래스를 객체로 불어와서 사용해보자.

BoardTO.java

package model1;

public class BoardTO {
	private String subject;
	private String writer;
	
	public BoardTO() {
		System.out.println( "생성자 호출" );
	}
	
	public String getSubject() {
		return subject;
	}
	public String getWriter() {
		return writer;
	}
	
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	
	
}

 ex05.jsp

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

<!-- 아래코드는 다음과 같다. BoardTO to = new BoardTO();  -->
<!-- 즉 jstl을 이용해서 java의 객체를 생성할 수 있다. -->
<c:set var="to1" value="<%=new model1.BoardTO() %>" scope="page" />

<!-- to1의 필드값에 데이터선언  -->
<c:set target="${ to1 }" property="subject" value="제목1" />
<c:set target="${ to1 }" property="writer" value="작성자1" />

<c:set var="to2" value="<%=new model1.BoardTO() %>" scope="page" />
<c:set target="${ to2 }" property="subject" value="제목2" />
<c:set target="${ to2 }" property="writer" value="작성자2" />

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

제목 : ${ to1.subject }<br>
작성자 : ${ to1.writer }<br>
제목 : ${ to2.subject }<br>
작성자 : ${ to2.writer }<br>

</body>
</html>

 

 흐름제어을 해보자.

<c: if> 태그로 단순 if문을 만들자.

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

-조건문 사용<br>
<!-- test에는 조건식이 들어간다.  -->
<c:if test="true">
	무조건 실행<br>
</c:if>
<hr>
-값검사하기<br>
<c:set var="country" value="korea"/>
<c:if test="${ country == 'korea'}">
	한국입니다.<br>
</c:if>
<hr>
-값 존재여부 검사하기<br>
<c:if test="${country != null }">
	국가명은 <c:out value="${ country }"/> 입니다.<br>
</c:if>

</body>
</html>

 

이번에는 다중 if문을 만들어보자.

<c:chooser>, <c:when>, <c:otherwise> 태그를 사용해서 만들 수 있다.

<%@ 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="country" value="korea"/>

<c:choose>
	<c:when test="${country == 'korea' }">
		<c:out value="${ country }"/>는 춥다.<br>
	</c:when>
	<c:when test="${country == 'canada' }">
		<c:out value="${ country }"/>는 더춥다.<br>
	</c:when>
	<c:otherwise>
		겨울은 안춥다.<br>
	</c:otherwise>
</c:choose>

</body>
</html>

 

반복문사용하기

<c:forEach>태그를 사용한다.

<%@ 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>
-1씩증가시키기<br>
<c:forEach var="i" begin="1" end="5">
	Hello JSTL - ${ i }<br>
	<c:out value="${ i }"/><br>
</c:forEach>
<hr>
-2씩 증가시키기<br>
<c:forEach var="i" begin="1" end="5" step="2">
	Hello JSTL - ${ i }<br>
	<c:out value="${ i }"/><br>
</c:forEach>
	
</body>
</html>

 

실습) 구구단 만들기

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

<table  border="1">
<c:forEach var="row" begin="0" end="9" step="1">
	<tr>
	<c:forEach var="col" begin="0" end="9" step="1">
		<c:choose>
			<c:when test="${ row == 0 && col == 0 }">
				<td>구구단</td>
			</c:when>
			<c:when test="${ row == 0 }">
				<td align="center"> X ${ col }</td>
			</c:when>
			<c:when test="${ col == 0 }">
				<td align="center">${ row } 단</td>
			</c:when>
			<c:otherwise>
				<td align="center"> ${ row } X ${ col } = ${ row * col } </td>
			</c:otherwise>
		</c:choose>
	</c:forEach>
	</tr>
</c:forEach>
</table>

</body>
</html>

 

배열 데이터 선언 및 배열데이터 출력하기 & HashMap 사용 및 출력하기

<%@page import="java.util.Date"%>
<%@page import="java.util.HashMap"%>
<%@ 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="intArr" value="<%= new int[] {1, 2, 3, 4, 5} %>" />
<c:out value="${ intArr[0] }" /><br>
<c:out value="${ intArr[1] }" /><br>
<c:out value="${ intArr[2] }" /><br>

<hr>
<c:forEach var="data" items="${ intArr }">
	<c:out value="${ data }" /><br>
</c:forEach>

<hr>
<c:forEach var="data" items="${ intArr }" begin="2" end="4">
	<c:out value="${ data }" /><br>
</c:forEach>

<hr>
<c:set var="strArr" value='<%= new String[] {"AA", "BB", "CC", "DD", "EE" } %>' />
<c:forEach var="data" items="${ strArr }">
	<c:out value="${ data }" /><br>
</c:forEach>

<hr>
-HashMap사용하기<br>
<c:set var="hm1" value='<%= new java.util.HashMap() %>' />
<c:set target="${ hm1 }" property="name" value="홍길동" />
<c:set target="${ hm1 }" property="today" value="<%= new java.util.Date() %>" />

<%
	//jsp 표현식으로 쓰면 아래와 같다.
	HashMap<String, Object> hm2 = new HashMap<>();
	hm2.put( "name", "홍길동" );
	hm2.put( "today", new Date() );
%>

<c:forEach var="data" items="${ hm1 }">
	${ data.key } = ${ data.value }<br>
</c:forEach>


</body>
</html>

 

JSP문서의 헤더정보를 출력해보자.

headerValues가 HashMap형태로 되있기때문에 아래 코드와 같이 작성해서 출력할 수 있다.

<%@ 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:forEach var="h" items="${ headerValues }">
	<c:forEach var="val" items="${ h.value }">
		param : ${ h.key } / ${ val }<br>
	</c:forEach>
</c:forEach>

</body>
</html>

 

이번에는 페이지간에 데이터 전송을 해보자.

-form.jsp

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

<form action="form_ok.jsp" method="post">
이름 : <input type="text" name="irum" /><br>
성적1 : <input type="text" name="sung" /><br>
성적2 : <input type="text" name="sung" /><br>
<input type="submit" value="전송"/>
</form>

</body>
</html>

-form_ok.jsp

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

이름 : ${ param.irum }<br>
성적1 : ${ paramValues.sung[0] }<br>
성적2 : ${ paramValues.sung[1] }<br> 
<hr>

<c:forEach var="p" items="${ paramValues }">
	<c:forEach var="val" items="${ p.value }">
		param : ${ p.key } / ${ val }<br>
	</c:forEach>
</c:forEach>

</body>
</html>

 

BoardTO에서 데이터를 가져와서 출력해보자.

<%@page import="java.util.ArrayList"%>
<%@page import="model1.BoardTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	BoardTO to1 = new BoardTO();
	to1.setSubject( "제목1" );
	to1.setWriter( "작성자1" );
	
	BoardTO to2 = new BoardTO();
	to2.setSubject( "제목2" );
	to2.setWriter( "작성자2" );
	
	ArrayList<BoardTO> lists = new ArrayList();
	lists.add( to1 );
	lists.add( to2 );
	
	request.setAttribute( "lists", lists );
	
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:forEach var="i" begin="0" end="<%= lists.size() - 1 %>">
${ lists[i].subject }<br>
${ lists[i].writer }<br>
</c:forEach>
<hr>

<c:forEach var="data" items="${lists}">
${ data.subject }<br>
${ data.writer }<br>
</c:forEach>


</body>
</html>

 

토큰별로 나눌 수 있는 반복문 사용

<c:forTokens>

<%@ 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:forTokens var="c" items="1, 2, 3, 4, 5" delims=",">
	데이터 : ${ c }<br>
</c:forTokens>
<hr>

<c:set var="lists" value="홍길동, 김길동, 고길동"/>
<c:forTokens var="c" items="${ lists }" delims=",">
	데이터 : ${ c }<br>
</c:forTokens>
<hr>

<c:set var="lists" value="빨강색,주황색.노란색,파랑색,남색.보라색"/>
<c:forTokens var="c" items="${ lists }" delims=",.">
	데이터 : ${ c }<br>
</c:forTokens>
<hr>

</body>
</html>

 

특정url로 이동할 수 있는 태그

<c:redirect url="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:redirect url="https://www.daum.net" /> 

 

검색창까지 들어가보자.

<%@ 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="https://www.daum.net" /> 
https://search.daum.net/search?w=tot&&q=%EC%BD%94%EB%A1%9C%EB%82%98
--%>
<c:redirect url="https://search.daum.net/search">
	<c:param name="w" value="tot"/>
	<c:param name="1" value="코로나"/>
</c:redirect>

 

실습) 네이버검색창에 코로나 검색하기

<%@ 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="https://www.naver.com" /> 
https://search.naver.com/search.naver?&query=%EC%BD%94%EB%A1%9C%EB%82%98
 --%>

<c:redirect url="https://search.naver.com/search.naver?">
	<c:param name="query" value="코로나"/>
</c:redirect>

 

특정 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:url var="url1" value="./list.do" />
${ url1 }<br>

<c:url var="url2" value="https://search.daum.net/search" >
	<c:param name="w" value="tot"/>
	<c:param name="q" value="코로나"/>
</c:url>
${ url2 }<br>

 

특정url을 import해서 가져올 수 있다.

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

불러온 html과 직접작성한 html이 합쳐진다.<br>
또한 주소창에 url은 코딩한 jsp파일 url이다.
<hr>
<hr>
<c:import url="https://m.daum.net" />

 

아래와 같이 직접 작성한 jsp파일 안에 다음url의 html를 불러와서 출력해보자.

<%@ 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 var="htmlData" url="https://m.daum.net"/>

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

HTML 내용<br>
<textarea rows="50" cols="800">
${ htmlData }
</textarea>

</body>
</html>

 

데이터베이스

이제 JSTL을 이용해서 데이터베이스 연동하고 데이터를 사용해보자.

먼저 업데이트문을 실행해보자. select문을 제외한 모든 쿼리는 <s:update> 태그를 사용한다.

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

<!-- 데이터베이스 연결  -->
<s:setDataSource 
	var="ds"
	url="jdbc:mysql://localhost:3307/sample"
	driver="org.mariadb.jdbc.Driver"
	user="root"
	password="!123456"
	scope="page"
/>

<%-- <s:update dataSource="${ ds }" sql="insert into dept2 values(93, '생산', '부산')"/> --%>
<s:update dataSource="${ ds }" sql="insert into dept2 values(?, ?, ?)">
	<s:param value="97"/>
	<s:param value="조사"/>
	<s:param value="대구"/>
</s:update>

 

아래와 같이 사용할 수도 있다.

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

<!-- 데이터베이스 연결  -->
<s:setDataSource 
	var="ds"
	url="jdbc:mysql://localhost:3307/sample"
	driver="org.mariadb.jdbc.Driver"
	user="root"
	password="!123456"
	scope="page"
/>

<%-- <s:update dataSource="${ ds }" sql="insert into dept2 values(93, '생산', '부산')"/> 
<s:update dataSource="${ ds }" sql="insert into dept2 values(?, ?, ?)">
	<s:param value="97"/>
	<s:param value="조사"/>
	<s:param value="대구"/>
</s:update>
--%>

<s:update dataSource="${ ds }">
	insert into dept2 values(?, ?, ?)
	<s:param value="98"/>
	<s:param value="생산"/>
	<s:param value="부산"/>
</s:update>

 

이번에는 select문을 사용해보자.

<s:query>태그를 사용한다.

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

<!-- 데이터베이스 연결  -->
<s:setDataSource 
	var="ds"
	url="jdbc:mysql://localhost:3307/sample"
	driver="org.mariadb.jdbc.Driver"
	user="root"
	password="!123456"
	scope="page"
/>

<s:query var="rs" dataSource="${ ds }" sql="select * from dept2"></s:query>

-컬럼명 출력<br>
<c:forEach var="columnName" items="${ rs.columnNames }" >
	${ columnName }<br>
</c:forEach>
<hr>

-데이터 출력<br>
<c:forEach var="data" items="${ rs.rows }" >
	${ data["deptno"] } / ${ data["dname"] } / ${ data["loc"] } <br>
</c:forEach>

 

이번에는 별칭을 사용해보자.

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

<!-- 데이터베이스 연결  -->
<s:setDataSource 
	var="ds"
	url="jdbc:mysql://localhost:3307/sample"
	driver="org.mariadb.jdbc.Driver"
	user="root"
	password="!123456"
	scope="page"
/>

<%-- <s:query var="rs" dataSource="${ ds }" sql="select * from dept2"></s:query> --%>

<s:query var="rs" dataSource="${ ds }" 
	sql="select deptno as no, dname as name, loc as location from dept2">
</s:query>

-컬럼명 출력<br>
<c:forEach var="columnName" items="${ rs.columnNames }" >
	${ columnName }<br>
</c:forEach>
<hr>

-데이터 출력<br>
<c:forEach var="data" items="${ rs.rows }" >
	${ data["deptno"] } / ${ data["dname"] } / ${ data["loc"] } <br>
</c:forEach>

 

이번에는 커넥션풀을 이용해서 데이터베이스를 연동해보자.

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

<!--커넥션 풀 이용 데이터베이스 연결  -->
<s:setDataSource 
	var="ds"
	dataSource="jdbc/mariadb2"
	scope="page"
/>

<s:query var="rs" dataSource="${ ds }" >
	select deptno as no, dname as name, loc as location from dept2
</s:query>

-데이터 출력<br>
<c:forEach var="data" items="${ rs.rows }" >
	${ data["deptno"] } / ${ data["dname"] } / ${ data["loc"] } <br>
</c:forEach>

데이터베이스 연결을 쿼리에 직접 사용할 수 있다.

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

<s:query var="rs" dataSource="jdbc/mariadb2" >
	select deptno as no, dname as name, loc as location from dept2
</s:query>

-데이터 출력<br>
<c:forEach var="data" items="${ rs.rows }" >
	${ data["deptno"] } / ${ data["dname"] } / ${ data["loc"] } <br>
</c:forEach>

 

select문의 where절과 limit를 사용할 수 있다.

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

<!-- startRow와 maxRows는 limit 2, 4와 같은 의미이다.  -->
<s:query var="rs" dataSource="jdbc/mariadb2" startRow="2" maxRows="4">
	select deptno as no, dname as name, loc as location from dept2 where deptno=?
	<s:param value="50" />
</s:query>

-데이터 출력<br>
<c:forEach var="data" items="${ rs.rows }" >
	${ data["deptno"] } / ${ data["dname"] } / ${ data["loc"] } <br>
</c:forEach>

 

 

실습) 우편번호 검색기 만들기

 

결과화면

 

-zipcode.jsp

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

<script type="text/javascript">
const checkfrm = function() {
	if( document.frm.dong.value.trim() == '' ) {
		alert( '동이름을 입력해주세요' );
		return;
	}
	document.frm.submit();
}
</script>

</head>
<body>

<form action="./zipcode_ok.jsp" method="post" name="frm">
동이름 <input type="text" name="dong"/>
<input type="button" value="동이름 검색" onclick="checkfrm()"/>
</form>

</body>
</html>

-zipcode_ok.jsp

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

<%
	request.setCharacterEncoding( "utf-8" );
%>

<s:setDataSource
	var="ds"
	url="jdbc:mysql://localhost:3307/sample"
	driver="org.mariadb.jdbc.Driver"
	user="root"
	password="!123456"
	scope="page"
/>

<s:query var="rs" dataSource="${ ds }" sql="select * from zipcode where dong like ?">
<s:param value="${ param.dong }%"/>
</s:query>


<table border='1'>
<c:forEach var="row" items="${ rs.rows }">
	<tr>
		<td>${ row["zipcode"] }</td>
		<td>${ row["sido"] }</td>
		<td>${ row["gugun"] }</td>
		<td>${ row["dong"] }</td>
		<td>${ row["ri"] }</td>
		<td>${ row["bunji"] }</td>
		<td>${ row["seq"] }</td>
	</tr>
</c:forEach>
</table>

 

 

 

19. 필터

더보기

p544

응답과 요청사이에 거르는 역할은 한다.

대표적으로 한글처리나 로그인검사 등을 필터안에서 처리하도록 할 수 있다.

 

필터를 등록하는 방법은 다음과 같다.

 

1. web.xml 사용

2. 어노테이션 사용

 

 

1. web.xml 사용하기

새로운 다이나믹 웹 프로젝트를 만들고 자바리소스 src에 패키지를 filter를 만들고 그 안에

FirstFilter라는 클래스명으로 javax.servlet.Filter 인터페이스를 구현받아서 아래와 같이 만든다.

-FirstFilter.java

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstFilter implements Filter {
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println( "첫번째 init() 호출" );
	}
	
	@Override
	public void destroy() {
		System.out.println( "첫번째 destroy() 호출" );
	}
	
	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		
		//doFilter 윗부분이 전처리 구간 / servlet과 jsp 호출부분
		System.out.println( "첫번째 전처리" );
		
		arg2.doFilter(arg0, arg1); //필터에 사용자의 요청 처리
		
		//doFilter 아래부분이 후처리 구간
		System.out.println( "첫번째 후처리" );

	}

}

 그리고 위의 필터를 web.xml에 등록해줘야한다.

-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>FilterEx01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <filter>
  	<filter-name>firstfilter</filter-name>
  	<filter-class>filter.FirstFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>firstfilter</filter-name>
  	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>
</web-app>

2. 어노테이션 기법 사용

새로운 다이나믹 웹 프로젝트를 만들고 jsp파일을 작성한다.

-ex01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	System.out.println( "Hello Filter" );
	out.println( "Hello Filter" );
%>

 -FirstFilter.java

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("*.jsp")
public class FirstFilter implements Filter {

    public FirstFilter() {
        
    }

	public void destroy() {
	
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println( "첫번째 전처리" );
		
		chain.doFilter(request, response);
		
		System.out.println( "첫번째 후처리" );
	}

	public void init(FilterConfig fConfig) throws ServletException {
		
	}

}

 

필터를 두 개 사용해보자.

SecondFilter.java를 만들어준다. 

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("*.jsp")
public class SecondFilter implements Filter {

    public SecondFilter() {
        
    }

	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println( "두 번째 전처리" );
		chain.doFilter(request, response);
		System.out.println( "두 번째 후처리" );
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

이번에는 한글처리를 필터로 처리해보자. 

이제 새로운 다이나믹 웹 프로젝트를 만들고 자바리소스 폴더에 filter 패키지만들고 그 안에 필터를 만든다.

-EncodingFilter.java

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("*.jsp")
public class EncodingFilter implements Filter {

    public EncodingFilter() {
        
    }

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		//필터가기전 처리
		if ( request.getCharacterEncoding() == null ) {
			request.setCharacterEncoding( "utf-8" );
		}
		
		chain.doFilter(request, response);
		
		//필터이후의 처리
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 그리고 jsp파일을 만든다.

-form.jsp

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

<form action="form_ok.jsp" method="post">
데이터 <input type="text" name="data" />
<input type="submit" value="전송"/>
</form>

</body>
</html>

-form_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
데이터 : <%=request.getParameter( "data" ) %>
</body>
</html>

 

이번에는 form.jsp에서 데이터가 입력이 안되면 error.jsp로 이동시키고 입력이 되면 form_ok.jsp로 이동할 수 있도록 해보자.

form.jsp과 form_ok.jsp는 위와 같다.

-error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
data를 입력하지 않았습니다.
</body>
</html>

 -EncodingFilter.java

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter("*.jsp")
public class EncodingFilter implements Filter {

    public EncodingFilter() {
        
    }

	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		//필터가기전 처리
		if ( request.getCharacterEncoding() == null ) {
			request.setCharacterEncoding( "utf-8" );
		}
		
		String data = request.getParameter( "data" );
		if ( data == null ) {
			chain.doFilter(request, response);
		}
		if( !data.equals( "" ) ) {
			chain.doFilter(request, response);
		} else {
			RequestDispatcher dipaDispatcher = request.getRequestDispatcher( "error.jsp" );
			dipaDispatcher.forward(request, response);
		}
		
		
		
		//필터이후의 처리
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

 

 

 

20. ServletContextListener 구현

더보기

ServletContextListener 서버의 시작과 종료에 영향을 끼친다.
HttpSessionListener 세션의 시작과 종료(접속)에 영향
ServletRequestListener 요청의 시작과 종료에 영향
Attribute 속성값의 변화에 대해 감지할수 있다.
ServletRequestAttributeListener 로 사용한다.

사용방법은 다음과 같다.

1. Web.xml

새로운 다이나믹웹프로젝트를 만들고 이때 web.xml을 포함해서 만든다.

 자바리소스에 패키지를 만들고 아래와 같이 클래스를 만든다.

 -FirstListener.java

package listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class FirstListener implements ServletContextListener {
	
	//서버의 시작과 관련
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println( "contextInitialized() 호출" );
	}
	
	//서버의 종료와 관련
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println( "contextDestroyed() 호출" );
	}
}

 -ex01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello Listener
</body>
</html>

 -web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ListenerEx01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <listener>
  	<listener-class>listener.FirstListener</listener-class>
  </listener>
</web-app>

 

2. 어노테이션

 새로운 웹 프로젝트 - 자바리소스 패키지생성후 Listener 생성 - 아래와 같이 클릭후 생성

 -FirstListener.java

package listener;

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

@WebListener
public class FirstListener implements ServletContextListener {

    public FirstListener() {
        // TODO Auto-generated constructor stub
    }

    public void contextDestroyed(ServletContextEvent sce)  { 
        System.out.println( "contextDestroyed 호출" );
    }

    public void contextInitialized(ServletContextEvent sce)  { 
    	System.out.println( "contextInitialized 호출" );
    }
	
}

 -ex01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello Listener
</body>
</html>

첫번째 contextInitialized 호출은 위에서 했던것이다.

리스너는 jsp와 상관없이 톰캣이 실행되면 같이 실행된다.

 

 

 

이제 jsp에서 ServletContext를 선언하고 이 데이터값이 추가, 수정, 삭제되면 톰캣에서 감지하고 리스너가 실행되도록 해보자.

 

먼저 리스너클래스를 자바리소스 패키지안에 아래와 같이 만든다.

 -SecondListener.java

package listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class SecondListener implements ServletContextAttributeListener {

    public SecondListener() {
        System.out.println( "생성자 호출" );
    }

    public void attributeAdded(ServletContextAttributeEvent scae)  { 
        System.out.println( "attributeAdded() 호출");
    }

    public void attributeRemoved(ServletContextAttributeEvent scae)  { 
    	System.out.println( "attributeRemoved() 호출");
    }

    public void attributeReplaced(ServletContextAttributeEvent scae)  { 
    	System.out.println( "attributeReplaced() 호출");
    }
	
}

 -ex01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello Listener

<%
	ServletContext context = getServletContext();
	
	context.setAttribute( "name", "honggildong" );
	out.println( "context 추가 완료<br>" );
	
	context.setAttribute( "name", "parkmunsu" );
	out.println( "context 수정 완료<br>" );
	
	context.removeAttribute( "name" );
	out.println( "context 삭제 완료<br>" );
	
%>
</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

[출처]

kic캠퍼스

jsp웹프로그래밍 - 최범균

728x90
반응형
LIST
Comments