너굴 개발 일지

TIL_210426_JSTL ,Servlet 기초 본문

JSP,Serlvet

TIL_210426_JSTL ,Servlet 기초

너굴냥 2021. 4. 26. 23:05

목차

- Core 반복 액션 태그

 1)  <c:forTokens>

 

- Core URL 액션 태그

 1) <c:import>
 2) <c:url>
 3) <c:redirect>

 4)<c:choose>

 5)<c:when>

 6)<c:otherwise>

 

- Core 기본 액션 태그
 1) <c:remove>
 2) <c:catch>

 

- Core 조건 액션 태그

 1) <c:if>

 

Formatting

- 숫자, 날짜 액션
1) <fmt:formatDate>
2) <fmt:formatNumber>

 

- i18n액션
1) <fmt:setLocale>

- 타임존 액션
1) <fmt:timeZone>

 

- Functions 태그 라이브러리 

- Servlet 
- 서블릿의 콜백 메소드
- 응답정보 처리 - HttpServletResponse

 

 

EL 내장 객체 - paramValues

같은 이름으로 전달되는 질의 문자열의 이름과 값들을 저장하고 있는 map 객체

원래는 checkbox 같이 여러 개의 파라미터값을 불러올 때 String[] a = request.getParameterValues("item")을 사용했지만

EL 구문을 활용하여 다음과 같이 사용할 수 있다 

${paramValues.파라미터명}

 

 

forEach 태그로 checkbox parameter 값들 꺼내서 출력 (EL 구문 사용)

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

<c:foreach items="${리스트가 받아올 배열이름}"
           var="for문 내부에서 사용할 변수"
           varStatus="상태용 변수">
 
	// 반복해서 표시할 내용 혹은 반복할 구문
 
</c:foreach>

이때, 상태용 변수를 status라고 지정했다면 다음과 같이 사용할 수 있다

 

${status.current} 현재 for문의 해당하는 번호

${status.index} 0부터의 순서

${status.count} 1부터의 순서

${status.first} 첫 번째인지 여부

${status.last} 마지막인지 여부

${status.begin} for문의 시작 번호

${status.end} for문의 끝 번호

${status.step} for문의 증가값

 

위를 사용한 예시 (checkbox.jsp -> paramValue.jsp)

chekcbox.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>checkbox 선택 값을 paramValue로 전달</title>
</head>

<body>
	<form action="paramValue.jsp">
		<input type="checkbox" name="item" value="신발" checked="checked"/>신발 <br />
		<input type="checkbox" name="item" value="가방" />가방 <br />
		<input type="checkbox" name="item" value="벨트" />벨트 <br />
		<input type="checkbox" name="item" value="모자" />모자<br />
		<input type="checkbox" name="item" value="시계" />시계 <br />
		<input type="submit" value="전송" />
	</form>
</body>
</html>
paramValue.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>paramValue.jsp : 선택된 값 출력</title>
</head>

<body>
	선택한 항목은 <hr />
	<c:forEach var="item" items="${paramValues.item }" varStatus="status" >
		${item } <c:if test="${not status.last }">,</c:if> <!-- status가 가지고 있는 값이 마지막이 아닐 경우 쉼표 출력 요청 -->
	</c:forEach>
</body>
</html>

 

checkbox.jsp 실행결과
paramValue.jsp 실행결과


Core 반복 액션 태그

 

 <c:forTokens>

문자열을 특정 문자로 구분하여 분리한 후 분리된 문자열만큼 명령문을 반복 수행하는 태그

 

문법

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

<c:forTokens items="stringOfTokens" delims="delimiters"
	[var="varName"] 
    [varStatus="varStatusName"]
    [begin="begin"][end="end"][step="step"]>
    body 내용
</c:forEach>

items : 분리하고자 하는 문자열을 지정

delims : 문자열을 분리할 때 구분자로 사용할 기호를 지정 

 

예시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>forTokens.jsp : 특정 문자를 기준으로 분리</title> <!-- java split 같은 개념 -->
</head>

<body>
	<c:forTokens var="city" items="서울.인천,대구.부산" delims=",">  <!-- 띄어쓰기 주의 !! delims="," 뒤에 붙여쓰기 -->
		${city } <br />
	</c:forTokens>
</body>
</html>


Core - URL 액션 태그

 

<c:import>

특정 페이지의 처리 결과를 현재 페이지에 삽입하거나 변수에 저장하는 태그

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

<c:import url="url" [context="context"]
	[var="varName"][scope="{page|request|session|application}"]
    [charEncodiing="charEncoding"]>
    tag를 하위 tag로 사용하는 body 내용
</c:import>

url : 현재 페이지에 결과를 삽입할 페이지의 URL 지정

var : url 속성에 지정한 페이지의 결과를 저장할 변수를 지정

body 내용은 생략해도 가능 

 

예시 1) 다른 페이지의 결과를 가져오는 경우

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jstlUrl1.jsp : 다른 jsp IMPORT(02_el.jsp)</title>
</head>

<body>

	<c:import url="http://localhost:9000/el_jstl/02_el.jsp"></c:import>
	
	<hr />
	
	<c:import url="http://localhost:9000/el_jstl/02_el.jsp" var="data"></c:import>
	${data }
</body>
</html>


 

<c:url>

url 정보를 생성해주는 태그

 

문법

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

<c:url value="value" [content="content"]
	[var="varName"][scope="{page|request|session|application}"]>
	body 내용
</c:url>

 

예시 (img파일을 c:url 태그 이용하여 호출)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>이미지 경로 및 이미지 출력</title>
</head>

<body>
	WebContent / images / pic.jsg
	<hr />
	<img src="./images/pic.jpg" width="200" height="200" />
	<hr />
	
	<c:url value="./images/pic.jpg" var="data"></c:url>
	<img src="${data }" width="200" height="200" />
	
	<!-- jstl 태그 이용하여 사진 경로를 변수에 저장 후 변수는 img 태그에 넘겨서 사진 출력 -->
	<!-- 사진 경로 저장했던 변수 선언하여 경로명 출력  -->
	<h2>${data }</h2>
</body>
</html>

 

 

<c:redirect>

현재 실행중 페이지에서 다른 페이지로 이동시 사용하는 태그

 

문법

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

<c:redirect url="value" [context="context"] />

 

예시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jstlUrl3.jsp : reponse.sendRedirect()와 동일 기능 : redirect</title>
</head>

<body>
<!--  예전에도 썼지만 redirect하면 다른 페이지로 이동하기에 메서드 위에 코드 써도 사용자 화면엔 보이지 않아 
      출력 O, 사용자 화면에서만 보이지 않는 것 뿐-->
	<h3>리다이렉트 전</h3>
	
	<c:redirect url="jstlUrl2.jsp"></c:redirect>
	
	<h3>리다이렉트 후</h3>
	<!-- 다른 페이지로 이동하기에 rediret 메서드 밑에 코드 작성해도 출력 X -->
	
</body>
</html>

 

 

해당 코드를 실행하면 위 결과인 jstlUrl2.jsp의 결과가 출력된다

참고로 <c:redirect> 태그 위의 코드인 <h3>리다이렉트 전</h3>는 화면에 출력되었지만 다른 페이지의 호출로 인해 사용자 화면에는 보이지 않는다


 

Core 기본 액션 태그

 

<c:set>

JSP 페이지에서 사용하는 변수를 설정하는 태그

 

문법 1

<c:set value="value" var="varName" [scope="{page|request|session|application}"] />

문법2

<c:set value="value" target="target" property="propertyName" />

var : 변수명 지정

value : 변수값 지정

scope : 정의하는 변수를 scope에 지정, scope 속성값으로 기본값은 page다

taget : setter 메서드를 호출할 자바 객체를 지정

property : 값을 변경할 자바 객체의 멤버변수 이름 지정

 

 

<c:out>

현재 JSP 페이지에 데이터 출력 위해 사용하는 태그

 

문법

<c:out value="value" [escapeXml="{true|false}"] [defalut="기본값"] />

value : 출력할 값을 지정, 값의 지정은 문자열, 표현식, EL 형식이 가능함

escapeXml : true 또는 false 값을 지정, 속성값이 true면 <,>,',"와 같은 문자를 특수 문자 코드로 변환
                         <는 &lt;, >는 &gt;, &는 &amp;, '는 &#039;, "는 &034;로 변환되며 기본값은 true

default : value 속성에 값이 지정되지 않는 경우 출력할 값을 지정

 

 

<c:remove>

<c:set> 태그로 정의한 변수삭제하는 태그

 

문법

<c:remove [scope="{page|request|session|application}"] [var="var"] />

var : 삭제하고자 하는 변수의 이름을 지정

scpoe : 지정된 scope 영역내에서만 변수를 삭제, 지정하지 않을 시 모든 scope에서 var에 지정한 이름의 변수를 삭제

 

 

<c:catch>

JSP페이지 내에서 발생한 오류를 처리하는 태그

 

문법

<c:catch var="e"
	실행문
</c:catch>

var : catch 태그 사이에 발생한 Exception 객체가 저장되는 변수, try-catch 문에서 catch 문 다음에 선언하는 변수와 같은 역할 

 

예시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>변수 설정 / 제거 / 예외처리</title>
</head>

<body>
 	<h4>변수 선언 및 값 설정</h4>
 	<c:set var="age" value="30" scope="page"></c:set>
 	
 	<h4>변수 값 출력</h4>
 	나이 : <c:out value="${age }">10</c:out>
 	
 	<h4>불필요한 변수 제거</h4>
 	<c:remove var="age" scope="page" />
 	
 	나이 : <c:out value="${age }">10</c:out>
 	
 	<h3>예외처리</h3>
 	<c:catch var="errMsg"> <!-- 예외 발생시 errMsg에게 에러 저장 -->
 		예외발생 전 <br />
 		
 		<%= 1/0 %><br />
 		
 		예외발생 후 <br />  <!-- 위에서 예외발생하였으므로 여긴 출력 X
 		                                             자바에서도 예외처리되면 밑에 애들은 출력 안되니까 -->
 	
 	</c:catch>
 	<c:out value="${errMsg }" ></c:out>
</body>
</html>

 


Core 조건 액션 태그

<c:if>

if문장을 처리하기 위한 태그

 

문법

<c:if test="testCondition"
	var="varName" [scope="{page|request|session|application}"] />
    결과값이 true일때 실행할 내용
</c:if>

test : 결괏값이 true 또는 false가 되는 조건식을 지정

var : test 속성의 결괏값을 저장하는 변수 이름 지정

 

<c:choose>

여러 개의 조건식을 사용하여 처리할 때 사용하는 태그로 몸체 내용에는 <c:when>, <c:otherwise>를 하위 태그로 구성

 

<c:when>

자바 문법에서 switch~case 또는 if~else와 같은 기능을 하는 태그

 

<c:otherwise>

자바 문법에서 default 또는 else와 같은 기능을 하는 태그

 

문법

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

Formatting

- 숫자, 날짜 액션

<fmt:formatDate>

날짜를 표시하는 다양한 형식을 정의

 

문법

<fmt:formatDate [value="date"]
	[type="{time|date|both}"]
	[dateStyle="{default|short|medium|long|full}"]
	[timeStyle="{default|short|medium|long|full}"]
	[pattern="customPattern"]
	[timeZone="timeZone"]
	[var="varName"]
	[scope="{page|request|session|application}"]/>

value : 원하는 형식으로 지정하려는 날짜 또는 시간값을 지정

type : 형식을 지정하려는 데이터 타입을 선택, time은 시간의 형식을 지정, date는 날짜 형식을 지정

dateStyle : 미리 정의된 날짜 형식을 적용, 기본값은 dafault

timeStyle : 미리 정의된 시간 형식을 적용,

pattern : 시간과 날짜 형식을 사용자 형식으로 지정

timeZone : 사용하는 시간대를 지정 

var : 값이 저장될 변수 이름 지정

scope : 변수가 저장될 영역 지정

 

예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>JSTL : 출력형식 </title>
</head>

<body>
	
	<c:set var="now" value="<%= new java.util.Date() %>"></c:set>
	${now }<br />
	<fmt:formatDate value="${now }" /> <br />
	<fmt:formatDate value="${now }" type="date" /><br />
	<fmt:formatDate value="${now }" type="time" /><br />
	<fmt:formatDate value="${now }" type="both" /><br />
	
	default : 
	<fmt:formatDate value="${now }" type="both" dateStyle="default" timeStyle="default" /> <br />
	short : 
	<fmt:formatDate value="${now }" type="both" dateStyle="short" timeStyle="short" /> <br />
	<!--  연월일 short -> 2020->21 , 11:37:46 -> 11:37  -->
	medium : 
	<fmt:formatDate value="${now }" type="both" dateStyle="medium" timeStyle="medium" /> <br />
	long : 
	<fmt:formatDate value="${now }" type="both" dateStyle="long" timeStyle="long" /> <br />
	full : 
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /> <br />
	
	<!-- default $ medium 같은 표기내용  -->
	
	pattern : <fmt:formatDate value="${now }" pattern="yyyy년 MM월 dd일 hh시 mm분 ss초" />
	<!-- 사용자 패턴 지정 -->
	
</body>
</html>

 

 

<fmt:formatNumber>

숫자, 퍼센트, 현재 통화를 표시하기 위해 사용하는 태그

 

문법

<fmt:formatNumber value="numbericValue"
    [type="{number|currency|percent}"]
    [pattern="customPattern"]
    [var="varName"]
    [scope="{page|request|session|application}"]/>

value : 원하는 형식으로 지정하려는 숫자값을 지정

type : 지정하려는 형식으로 number는 숫자, currency는 통화, percent는 %로 표현, 기본값은 number

 

 


 

i18n액션

(i18n이란 Internationalization의 i와 n 사이에 18개의 알파벳이 있다는 것을 나타내는 것으로 제품이나 서비스를 특정 지역의 언어나 문화에 맞추는 작업을 쉽게 할 수 있도록 계획하거나 이해하는 과정에 관해 기능을 가지고 있는 태그들)

 

<fmt:setLocale>

로케일을 지정하는 태그

특정 사용자의 로케일을 지정할 수도 있고, 전체 웹 어플리케이션의 로케일을 지정할 수 도 있음

 

문법

<fmt:serLocale value="locale"
	[scope="{page|request|session|application}"]/>

value : 로케일을 지정, 지정하는 형식은 '언어코드_국가코드'로 국가코드는 생략 가능하며 중간에 '_'는  '-' 로 바꿔도 무방하다

 

setLocale & formatNumber 예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jstlFormat3 : 지역에 따른 통화(화폐) / 날짜</title>
</head>

<body>
	<c:set var="now" value="<%= new java.util.Date() %>"></c:set>
	<!-- <jsp:useBean id="now" class="java.util.Date"></jsp:useBean> 이 코드 써도 무방 -->
	톰캣 서버의 기본 로케일 : <%= response.getLocale() %><br />
	
	<fmt:setLocale value="ko_kr" />
	통화(currency) : 
	<fmt:formatNumber value="10000" type="currency"></fmt:formatNumber>
	<fmt:formatDate value="${now }"/><br />
	<hr />
	
	<fmt:setLocale value="ja_jp"/>
	통화(currency) : 
	<fmt:formatNumber value="10000" type="currency"></fmt:formatNumber>
	<fmt:formatDate value="${now }"/><br />
	<hr />
	
	<fmt:setLocale value="en_us"/>
	통화(currency) : 
	<fmt:formatNumber value="10000" type="currency"></fmt:formatNumber>
	<fmt:formatDate value="${now }"/><br />
	
	<hr />
	원하는 소숫점 자리, 퍼센트 출력 :
	<fmt:formatNumber value="0.12" type="percent"></fmt:formatNumber>,
	<fmt:formatNumber value="94453.2323" pattern=".00"></fmt:formatNumber>
</body>
</html>

 

 

 


 

 

 

 

타임존 액션

<fmt:timeZone>

태그의 몸체에 있는 모든 태그의 타임존을 지정 ( 주로 다국어 시스템에서 사용 )

 

문법

<fmt:timeZone value="timeZone"
	[var="varName"]
</fmt:timeZone>

value : 사용할 시간대를 지정

 

예시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>jstlFormat2.jsp : useBean 태그 혼용 지역 시간 표시</title>
</head>

<body>
	<jsp:useBean id="now" class="java.util.Date"></jsp:useBean>
	Korea KST : 
	<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /><br />

	<fmt:timeZone value="GMT">
		Swiss GMT :
		<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" /><br />
	</fmt:timeZone>

	<fmt:timeZone value="GMT-8">
		NewYork : 
		<fmt:formatDate value="${now }" type="both" dateStyle="full" timeStyle="full" />
	</fmt:timeZone>
</body>
</html>

<!--  fmt:timeZone은 다국어 시스템에서 주로 사용  -->

 


Functions 태그 라이브러리 예시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>JSTL : Functions</title>
</head>

<body>
	<c:set var="greeting" value="Test String Functions" />
	${greeting } <br />
	
	${fn:toUpperCase(greeting) } <br />
	
	${fn:toLowerCase(greeting) } <br />
	
	${fn:indexOf(greeting, "String") } <br />
	
	${fn:length(greeting) }
</body>
</html>

 


 

Servlet 

자바 언어로 구현되는 서버 프로그램으로 클라이언트가 웹 브라우저를 통해 요청하면 서버에서 실행한 후 결과값만 클라이언트로 전송

HTTP 프로토콜로 통신하는 웹의 특징과 속성들을 자유롭게 활용할 수 있는 API를 제공해 클라이언트의 요청과 서버의 응답에 관한 처리 작업이 쉽다

 

또한 서블릿 구현시 javax.servlet.http 패키지에 있는 'HttpServlet' 클래스를 상속 받아야 한다 ( 해당 클래스는 웹상에서 클라이언트 요청이 있을 때 해당 서블릿을 실행하는 모든 조건이 포함되어 있음 )

 

'HttpServlet' 클래스

HTTP 프로토콜에 알맞은 동작을 수행하도록 구현한 추상 클래스로 GenericServlet 클래스를 상속하는데 service() 메서드를 재정의 함

service() 메서드는 요청방식 (GET / POST)에 따라 doGet(), doPost() 등 메서드가 호출되도록 구현되어 있다

따라서, 서블릿 프로그램을 구현할 때 어떠한 요청방식을 지원하는지 확인 후 관련 메서드 (doGet, doPost) 재정의 하여야 한다

 

서블릿 생성 

Java Resources -> src -> Servlet 순서로 URL Mapping은 웹 주소에서 해당 서블릿 호출시 사용하는 이름으로 예를 들어

URL Mapping을 /hello로 지정했을 시 Servlet을 생성하면 @WebServlet("/hello") 로 표기된다

(한 파일의 서블릿파일들은 url 맵핑이 겹칠 경우 오류 발생한다)

참고로 Servlet Mapping 이란 특정 servlet을 요청시, 전체 경로를 url에 써주면 복잡하고 보안에도 취약하기에 간단히 경로를 표현하는 것이다

servlet 매핑 방법은 1. web.xml 사용  /  2. java Annotation 이용 이 있다 (ex : @WebServlet("/hello") )

 

예시

package unit01;

import java.io.IOException;					// 예외처리 위한
import javax.servlet.ServletException;		// 예외처리 위한
import javax.servlet.annotation.WebServlet; // anotation @
import javax.servlet.http.HttpServlet;		// HttpServlet implements Servlet
import javax.servlet.http.HttpServletRequest; // doGet() / doPost() 의 첫번째 매개변수 타입
import javax.servlet.http.HttpServletResponse; // doGet() / doPost() 의 두번째 매개변수 타입

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L; // 수정불가 ! 톰캣이 서블릿 구별하기 위해 자동 부여되는 시리얼 넘버

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
		// response.getWriter() -> 반환타입 PrintWriter 타입 객체 반환 
		// PrintWriter out -> response.getWriter();
		// response.getWriter().append("Served at: ") -> out.append("Served at: ")
	}

}

 

서블릿의 콜백 메소드

어떤 객체에서 어떤 상황 발생시 컨테이너가 자동으로 호출하여 실행되는 메소드로 이런 콜백 메소드들이 서블릿을 실행한다. 다음은 서블릿의 콜백 메소드다

메소드명 메소드가 실행되는 시점 실행 횟수 기능 구현
init() 클라이언트로부터 최초로 서블릿 요청이 있을 때 실행 1 초기화 작업
service()
(doGet/doPost)
클라이언트로부터 요청이 있을 때마다 실행
(새로고침하면 계속 실행..)
n 실제 서블릿이 처리해야 하는 작업
destroy() 서블릿 객체가 메모리에서 삭제될 때 실행
(서비스나 서버 중지 시 )
1 자원 해제 작업

예시

package unit01;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/life")
public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init()는 첫 요청 시에만 호출됨");
	}

	
	public void destroy() {
		System.out.println("destroy()는 톰캣이 종료될 때만 호출됨");
	}

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet()는 메소드가 요청될 때마다 호출됨");
	}

}

서버 첫 실행시 init()메서드 실행 후 새로고침하면 doGet() 계속 실행
서버창에서 종료 시 destroy() 메서드 실행 

 

응답정보 처리 - HttpServletResponse

해당 인터페이스는 우리가 웹 애플리케이션을 개발하면서 응답 관련 작업을 수행할 때 사용하는 ServletResponse 인터페이스를 상속한다. 따라서 일반적 네트워크 통신에서 응답 관련 메소드들을 포함하고 있으며, HTTP 프로토콜 통신 기반의 응답 관련 메소드들도 확장하여 포함하고 있다

 

- ServletResponse : 일반적 네트워크 통신에서 응답 관련 메서드 제공

- HttpServletResponse : HTTP 통신 기반의 응답 관련 메서드 제공

 

ServletResponse 인터페이스 주요 메서드 기능
PrintWriter getWriter() 서비스를 요청한 클라이언트와 서버 간에 연결된
PrintWriter 객체를 생성하여 반환
void setCharacterEncoding(String charset) 응답정보 인코딩에 사용할 문자를 설정
void setContentType(String type) 응답정보의 데이터 형식을 설정
(서블릿에서 HTML 형태로 내보낼 때 사용)
void setLocale(Locale loc) 클라이언트가 사용하는 언어, 국가코드 등 클라이언트의 환경 설정

 

예시 1 ( setContentType(String type), getWriter()사용)

package unit01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/add")
public class AdditionalServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// request : JSP의 내장객체 request와 동일
		// response : JSP의 내장객체 response와 동일
		int num1 = 10;
		int num2 = 20;
		int add = num1+ num2;
		
		// response.setCharacterEncoding("UTF-8"); 단순히 값만 내보낼떄
		response.setContentType("text/html;charset=UTF-8"); // HTML 형태로 내보낼때 
		
		PrintWriter out = response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html><head><title>덧셈</title></head>");
		out.print("<body>");
		out.print(num1 + "+" + num2 + "=" + add);
		out.print("</body>");
		out.print("</html>");
	}

}

 

 

예시 2 ( setCharacterEncoding(String charset) 사용 )

paramtest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>HTML 파라미터 Servlet에게 전송</title>
</head>

<body>
	<form action="param_servlet" method="post">
		아이디 : <input type="text" name="userid" required="required" /><br />
		이름 : <input type="text" name="username" required="required" /><br />
		<input type="submit" value="전송" />
	</form>
</body>
</html>
package unit02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/param_servlet")
public class ParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String userid=request.getParameter("userid");
		String username=request.getParameter("username");
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		out.print("아이디 : " + userid);
		out.print("<br />");		
		out.print("이름 : " + username);
		out.print("</body></html>");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}

}

paramtest.jsp
paramServlet.java (get 방식으로 실행하였을때)

 

 

 

여기서 jsp 파일을 post 방식으로 명시하고 서블릿쪽에서 doPost() 메서드 구현부에 setCharacterEncoding("UTF-8"); 를 작성하지 않는다면 

한글이 깨지게 되는 doPost() 코드 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

post방식으로 전송 시 한글이 깨지게 된다

 

이렇게 한글이 깨지게 된다. 따라서 doPost() 메서드 구현시  setCharacterEncoding()를 꼭 작성하여 인코딩에 사용할 문자를 필수로 설정해야 한다

올바른 doPost() 코드 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}

doPost() 메서드 올바르게 작성 후 실행한 결과 

 


서블릿 연습문제 1 (사진과 같은 결과가 나오도록 코드를 짜시오)

직접 짠 코드

더보기
checkbox.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>checkbox.jsp</title>
</head>
<body>
	<h3>악세사리</h3>
	<form action="checkbox_servlet" method="get">
		관심항목을 선택하세요. 
		<hr />
		<input type="checkbox" name="items" value="신발" />신발
		<input type="checkbox" name="items" value="가방" />가방
		<input type="checkbox" name="items" value="벨트" />벨트  <br />
		<input type="checkbox" name="items" value="모자" />모자
		<input type="checkbox" name="items" value="시계" />시계
		<input type="checkbox" name="items" value="쥬얼리" />쥬얼리<br />
		<input type="submit" value="전송" />
	</form>
</body>
</html>
checkBoxServlet.java

package unit02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/checkbox_servlet")
public class checkBoxServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String[] items = request.getParameterValues("items");
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		
		if (items == null) {
			out.print("선택한 항목이 없습니다.");
		} else {
			out.print("당신이 선택한 항목입니다. <hr />");
			for(String item : items) {
				out.print(item + " ");
			}
		}
			out.print("</body></html>");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

연습문제 2

직접 짠 코드

더보기
radio.jsp

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

<body>
	<form action="radio_servlet" method="get">
		성별 : <input type="radio" name="gender" value="남자" />남자
		 <input type="radio" name="gender" value="여자" checked="checked" />여자<br />
		 
		 메일 정보 수신 여부 : 
		  <input type="radio" name="mailYn" value="yes" checked="checked" />수신
		   <input type="radio" name="mailYn" value="no" />거부 <br />
		   
		간단한 가입 인사를 적어주세요^▽^ <textarea name="comment" cols="35" rows="3"></textarea>
		<input type="submit" value="전송" />
	</form>
</body>
</html>
RadioServlet.java

package unit02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/radio_servlet")
public class RadioServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String gender = request.getParameter("gender");
		String mailYn = request.getParameter("mailYn");
		String comment = request.getParameter("comment");
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		out.print("성별 : <b>" + gender + "</b>");
		out.print("<br />");		
		out.print("메일 정보 수신 여부 : <b>" + mailYn + "</b><br />");
		out.print("가입인사 : <b>" + comment + "</b>");
		out.print("</body></html>");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doGet(request, response);
	}

}

 

연습문제 3

 

직접 짠 코드

더보기
select.jsp

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

<body>
	<form action="select_servlet" method="get">
		직업
		<select name="job" >
			<option value="선택하세요" selected="selected">선택하세요</option>	
			<option value="학생">학생</option>	
			<option value="컴퓨터/인터넷">컴퓨터/인터넷</option>	
			<option value="언론">언론</option>	
			<option value="공무원">공무원</option>	
			<option value="군인">군인</option>	
			<option value="서비스업">서비스업</option>	
			<option value="교육">교육</option>	
		</select>
		관심분야
		<select name="coffee" multiple="multiple" size="5">
			<option value="에스프레소">에스프레소</option>
			<option value="로스팅">로스팅</option>
			<option value="생두">생두</option>
			<option value="원두">원두</option>
			<option value="핸드드립">핸드드립</option>
		</select>
		<input type="submit" value="전송" />
	</form>
</body>
</html>
SelectServlet.java

package unit02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/select_servlet")
public class SelectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String job = request.getParameter("job");
		String[] coffee = request.getParameterValues("coffee");
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.print("<!DOCTYPE html>");
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		out.print("당신이 선택한 직업 : <b>" + job + "</b>");
		out.print("<hr />");
		out.print("당신이 선택한 관심 분야 : ");
		
		for(String c : coffee) {
			out.print("<b>" + c + "</b> ");
		}
		out.print("</body>");
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}