Deployment Descriptor

- Deployment Descriptor(배치 기술서)는 보통 Web Document Root 디렉토리에 WEB-INF 폴더 아래 web.xml 파일로 존재한다.

- Servlet 설정, Error Page 설정, Listener 및 Filter 설정, 보안 설정 등을 위한 Web Application의 설정 파일이다.

- URL과 실제 서블릿의 매핑 정보를 설정한다.

- 서버 자원(DB 설정) 등도 설정할 수 있으며, 설정된 서버 자원은 소스 코드 변경 없이 수정이 가능하다.

- 하나의 웹 어플리케이션에 하나만 존재한다.

- Servlet 3.0(jsp 2.2, Tomcat 7.0)부터는 web.xml 파일은 선택 사항으로 변경 되었다.

 

web.xml 에서의 서블릿 설정

- url-pattern의 유형

(1) Exactly matching

- 해당 URL 요청만 지정한 서블릿으로 처리하며, 반드시 "/"로 시작해야 한다.

- 형식 : /[경로/]이름

- 사용 예 : /bbs/list

(2) Directory matching

- "/경로/*" 형식으로 설정하며, "*" 부분은 모든 경로가 가능한 패턴이다.

- 사용 예 : /board/* -> /board/list, /board/article 처럼 * 자리에는 모든 경로가 가능하다.

(3) Extension matching

- 해당 확장자 요청을 지정한 서블릿으로 처리하며, "/"로 시작할 수 없고 확장자로 끝나야 한다.

- 형식 : *.확장자

- 사용 예 : *.do

(4) /

DefaultServlet에 대한 URL 패턴으로 DefaultServlet은 정적 리소스를 처리하는 톰캣의 기본 서블릿이다.

 

서블릿 실행과정 및 서블릿 작성

실행과정

1. 사용자가 URL로 요청하면 HTTP Request를 Servlet Container에 보낸다.

2. Servlet Container는 HttpServletRequest, HtttpServletResponse 두 객체를 생성한다.

3. 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다. Deployment Descriptor파일인 web.xml을 분석하여 해당 서블릿을 찾는다.

4. 컨테이너는 해당 서블릿의 service() 메소드를 호출하며, HttpServlet클래스를 상속 받은 경우 POST, GET 여부에 따라 doGet() 또는 doPost()가 호출된다.

5. service()메소드는 클라이언트 요청을 처리 한 후 HttpServletResponse 객체에 응답을 보낸다. HttpServlet 클래스를 상속 받은 경우에는 doGet() 또는 doPost() 메소드가 클라이언트 요청을 처리한 후 HttpServletResponse 객체에 응답을 보낸다.

6. 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다. 

 

Servlet Architecture

개요

- 서블릿 아키텍처는 javax.servlet 과 javax.servlet.http의 패키지로 구성된다.

- javax.servlet 패키지는 모든 서블릿이 상속하거나 구현하는 일반적인 인터페이스와 클래스로 구성되어 있다.

- javax.servlet.http 패키지는 HTTP 프로토콜에 맞춘 클래스 및 인터페이스로 구성되어 있다.

 

Servlet 인터페이스

개요

- javax.servlet.Servlet 인터페이스는 서블릿이 구현해야 하는 메소드가 선언된 인터페이스이다.

- Servlet 인터페이스의 구현은 javax.servlet.GenericServlet 또는 GenericServlet 클래스를 상속 받은 javax.servlet.http.HttpServlet 클래스를 상속 받아 서블릿 클래스를 작성할 수 있다.

- Servlet 인터페이스는 서블릿을 초기화하고 클라이언트 요청을 처리하며 서블릿을 서버에서 제거하는 메소드를 가지고 있다. 이러한 메소드는 라이프 사이클 메소드라고 하며 다음 순서로 호출된다.

(1) 서블릿이 생성된 다음 init() 메소드로 초기화 한다.

(2) 클라이언트의 요청은 service() 메소드에서 처리한다.

(3) 서블릿을 제거해야 하는 경우에는 컨테이너는 destroy() 메소드를 호출한 다음 garvage collected 후 종료한다.

 

GenericServlet 추상 클래스

개요

- javax.servlet.GenericServlet 추상 클래스는 Servlet 과 ServletConfig 인터페이스를 구현한 클래스이다.

- 서블릿을 작성하기 위해서 GenericServlet 클래스를 상속 받아 쉽게 작성할 수 있지만, HttpServlet과 같은 프로토콜 별 하위 클래스를 작성하는 것이 더 일반적이다.

- 웹에서 사용하는 HTTP 서블릿은 일반적으로 GenericServlet 대신 HttpServlet을 상속 받아 작성한다.

- GenericServlet을 상속받아 서블릿 클래스를 작성하기 위해서는 추상 메소드인 service() 메소드만 재정의 하면 된다.

 

HttpServlet 추상 클래스

개요

- javax.servlet.http.HttpServlet 추상 클래스는 GenericServlet 클래스를 상속받은 하위클래스로 웹사이트에 적합한 HTTP 서블릿을 만들기 위해 상속 받는다.

- HttpServlet 의 하위 클래스는 최소한 하나의 메소드를 재정의하며, 재정의하는 메소드는 일반적으로 다음 중 하나의 메소드이다.

: 서블릿이 HTTP GET 요청을 처리하는 경우 doGet()

: 서블릿이 HTTP POST 요청을 처리하는 경우 doPost()

: 서블릿이 HTTP PUT 요청을 처리하는 경우 doPut()

: 서블릿이 HTTP DELETE 요청을 처리하는 경우 doDelete()

doOptions() 및 doTrace() 메소드도 있지만 재정의할 이유가 거의 없으며, 일반적으로 웹 서비스는 doGet()메소드와 doPost() 메소드를 재정의하여 개발한다.

- 서블릿은 일반적으로 멀티 스레드 서버에서 실행되므로 서블릿은 동시 요청을 처리하고 공유 리소스에 대한 액세스를 동기화하는 데 주의 해야한다. 공유 리소스에는 인스턴스 또는 클래스 변수와 같은 메모리 내 데이터와 파일, 데이터베이스 연결 및 네트워크 연결과 같은 외부 개체가 포함된다.

 

ex12 - POST 방식으로 파라미터를 서버에 넘길 때

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>폼 예제</h3>

<form method='post' action="ex12_ok.jsp">
	<p>이름 : <input type='text' name='name'></p>
	<p>학번 : <input type='text' name='studentId'></p>
	<p>성별 :
		남자 <input  type='radio' name='gender' value='M' checked="checked">
		여자 <input type='radio' name='gender' value='F'>
	</p>
	<p>좋아하는 과목 :
		<input type="text" name="subject">
		<input type="text" name="subject">
		<input type="text" name="subject">
	</p>
	<p>출신도 :
		<select name="city">
			<option value="">::선택::</option>
			<option value="서울">서울</option>
			<option value="경기">경기</option>
			<option value="인천">인천</option>
			<option value="기타">기타</option>
		</select>
	</p>
	<p>취미 :
		<select name="hobby" multiple="multiple" size="5">
			<option value="운동">운동하기</option>
			<option value="영화">영화보기</option>
			<option value="등산">등산가기</option>
			<option value="여행">여행하기</option>
			<option value="게임">게임하기</option>
		</select>
	</p>
	<p>
		<button type="submit">등록하기</button>
	</p>
</form>

</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");
	
	String name = request.getParameter("name");
	String studentId = request.getParameter("studentId");
	String gender = request.getParameter("gender");
	
	String[] sub = request.getParameterValues("subject");
	String subject = "";
	for(String s : sub) {
		if(s.length() != 0) {
			subject += s + "  ";
		}
	}

	String city = request.getParameter("city");
	
	String[] hob = request.getParameterValues("hobby");
	String hobby = "";
	if(hob != null) {
		for(String h : hob) {
			hobby += h + "  ";
		}
	}

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>서버에서 넘겨 받은 파라미터</h3>

<p>이름 : <%=name %></p>
<p>학번 : <%=studentId %></p>
<p>성별 : <%=gender %></p>
<p>좋아하는 과목 : <%=subject %></p>
<p>출신도 : <%=city %></p>
<p>취미 : <%=hobby %></p>

</body>
</html>

 

ex13 - hidden 객체 : 화면에 출력되지 않지만 서버에 전송해야 하는 경우 (하지만 많으면 프로그래밍이 어려워짐)

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
function send(operator) {
	var f = document.myForm;
	
	if(! /^\d+/.test(f.num1.value) ) {
		f.num1.focus();
		return;
	}
	
	if(! /^\d+/.test(f.num2.value) ) {
		f.num2.focus();
		return;
	}
	
	f.operator.value = operator;
	
	f.submit();
}
</script>

</head>
<body>

<h3>hidden 객체 : 화면에 출력되지 않지만 서버에 전송해야 하는 경우에 사용 </h3>

<form name="myForm" action="ex13_ok.jsp" method="post">
<p>
	<input type="text" name="num1" placeholder="첫번째 수">
	<input type="text" name="num2" placeholder="두번째 수">
	<input type="hidden" name="operator">
</p>
<p>
	<button type="button" onclick="send('+')">더하기</button>
	<button type="button" onclick="send('-')">빼기</button>
	<button type="button" onclick="send('*')">곱하기</button>
	<button type="button" onclick="send('/')">나누기</button>
</p>
</form>

</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");

	int num1 = Integer.parseInt( request.getParameter("num1") );
	int num2 = Integer.parseInt( request.getParameter("num2") );
	
	String op = request.getParameter("operator");
	String s = "";
	
	// if(op.equals("+")) String.format("%d + %d = %d", num1, num2, num1+num2);
	
	switch(op) {
	case "+" : s = String.format("%d + %d = %d", num1, num2, num1+num2); break;
	case "-" : s = String.format("%d - %d = %d", num1, num2, num1-num2); break;
	case "*" : s = String.format("%d * %d = %d", num1, num2, num1*num2); break;
	case "/" : s = String.format("%d / %d = %d", num1, num2, num1/num2); break;
	}
	
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>결과</h3>
<p> <%= s %> </p>

</body>
</html>

 

ex14 - 폼태그 안의 disabled 속성의 객체는 서버로 전송되지 않는다.

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>폼예제 : disabled 속성의 객체는 서버로 전송되지 않는다.</h3>

<form action="ex14_ok.jsp" method="post">
	<p>번호 : <input type="text" name="num" value="1111" readonly="readonly"></p>
	<p>이름 : <input type="text" name="name"></p>
	<p>나이 : <input type="text" name="age" value="20" disabled="disabled"></p>
	<p>
		<button type="submit">보내기</button>
	</p>
</form>

</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");

	String num = request.getParameter("num");
	String name = request.getParameter("name");
	String age = request.getParameter("age");
	
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<p>번호 : <%=num %></p>
<p>이름 : <%=name %></p>
<p>나이 : <%=age %></p>
</body>
</html>

나이는 null로 나옴.

 

 

ex17 - redirect : 웹 컨테이너는 웹 브라우저에게 주어진 페이지로 이동하라고 명령을 내림. request, response는 초기화된다.

★ 로그인 후, 로그아웃 후, DB의 INSERT, UPDATE, DELETE 작업 후에 실시

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3> response 객체 : 요청에 대한 응답 정보를 담고 있는 객체</h3>

<%
	response.sendRedirect("ex17_ok.jsp");
%>

<%--
	- redirect
	  : 웹 컨테이너는 웹 브라우저에게 주어진 페이지로 이동하라고 명령을 내림(302 응답 코드를 보냄)
	    -> 웹브라우저는 주어진 주소의 새로운페이지 접속
	  : request, response는 초기화 됨
	  : 로그인 후, 로그아웃 후, DB의 INSERT, UPDATE, DELETE 작업 후 
 --%>

</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>정보</h3>
<p>
  안녕하세요. redirect된 페이지입니다.
</p>

</body>
</html>

 

ch05

 

ex01 - 계산 : 자바클래스를 이용해서, 스크립릿을 이용해 자바 클래스 생성해서, 스크립릿만을 이용해서

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<form action="ex01_ok.jsp" method="post">
<p>
	<input type="text" name="num1" required="required" placeholder="수" pattern="\d+">
	<select name="operator">
		<option value="+">더하기</option>
		<option value="-">뻬기</option>
		<option value="*">곱하기</option>
		<option value="/">나누기</option>
	</select>
	<input type="text" name="num2" required="required" placeholder="수" pattern="\d+">
<button type="submit">확인</button>
</form>

</body>
</html>

 

JSP 액션 태그(자바 빈즈)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");
%>
<%-- JSP 액션 태그 --%>
<%--
	Calculator vo = new Calculator(); 와 유사
 --%>
<jsp:useBean id="vo" class="ch05.Calculator"/>

<%-- 
	클래스 안의 동일한 이름을 찾아감 
	vo.setNum1( Integer.parseInt( request.getParameter("num1")) );
	vo.setNum2( Integer.parseInt( request.getParameter("num2")) );
	vo.setOperator( request.getParameter("operator") );
	역할을 함
	
	form 태그 input 요소의 name 속성과 동일한 Calculator 클래스의 필드에 값을 전달
--%>
<jsp:setProperty name="vo" property="*"/>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>액션 태그(자바 빈즈)를 이용한 연산</h3>
<p> <%=vo.toString() %> </p>

</body>
</html>
package ch05;

public class Calculator {
	private int num1;
	private int num2;
	private String operator;

	public int getNum1() {
		return num1;
	}

	public void setNum1(int num1) {
		this.num1 = num1;
	}

	public int getNum2() {
		return num2;
	}

	public void setNum2(int num2) {
		this.num2 = num2;
	}

	public String getOperator() {
		return operator;
	}

	public void setOperator(String operator) {
		this.operator = operator;
	}

	@Override
	public String toString() {
		String s = null;
		
		if(operator == null) return s;
		
		switch(operator) {
		case "+" : s = String.format("%d + %d = %d", num1, num2, num1+num2); break;
		case "-" : s = String.format("%d - %d = %d", num1, num2, num1-num2); break;
		case "*" : s = String.format("%d * %d = %d", num1, num2, num1*num2); break;
		case "/" : s = String.format("%d / %d = %d", num1, num2, num1/num2); break;
		}
		
		return s;
	}
}

 

스크립릿을 이용해서 자바 객체 생성

<%@page import="ch05.Calculator"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");

	Calculator vo = new Calculator();
	vo.setNum1( Integer.parseInt( request.getParameter("num1")) );
	vo.setNum2( Integer.parseInt( request.getParameter("num2")) );
	vo.setOperator( request.getParameter("operator") );
	
	String s = vo.toString();
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>자바 객체를 이용한 연산</h3>
<p> <%= s %> </p>

</body>
</html>

 

스크립릿만을 이용해서

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");

	int num1 = Integer.parseInt( request.getParameter("num1") );
	int num2 = Integer.parseInt( request.getParameter("num2") );
	
	String op = request.getParameter("operator");
	String s = "";
	
	// if(op.equals("+")) String.format("%d + %d = %d", num1, num2, num1+num2);
	
	switch(op) {
	case "+" : s = String.format("%d + %d = %d", num1, num2, num1+num2); break;
	case "-" : s = String.format("%d - %d = %d", num1, num2, num1-num2); break;
	case "*" : s = String.format("%d * %d = %d", num1, num2, num1*num2); break;
	case "/" : s = String.format("%d / %d = %d", num1, num2, num1/num2); break;
	}
	
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>결과</h3>
<p> <%= s %> </p>

</body>
</html>

 

ex02 - 자바 필드의 이름이 다를 경우 자바빈즈를 이용해서 속성값 이름 변경

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<form action="ex02_ok.jsp" method="post">
 <p> 번호 : <input type="text" name="no"> </p>
 <p> 이름 : <input type="text" name="name"> </p>
 <p> 좋아하는 과목 : <input type="text" name="subject"> </p>
 <p>
 	<button type="submit">등록하기</button>
 </p>
</form>

</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");
%>

<%-- 빈 생성 --%>
<jsp:useBean id="vo" class="ch05.User"/>

<%-- 생성된 빈에 속성 값(파라미터) 값 설정 --%>
<%-- property="*" 는 form안의 input 요소의 name과 User클래스의 필드가 동일한 경우만 설정--%>
<jsp:setProperty property="*" name="vo"/>

<%-- form input요소의 name과 User 클래스의 필드가 다른 경우 --%>
<jsp:setProperty name="vo" property="num" param="no"/>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<p> 번호 : <%= vo.getNum() %></p>
<p> 이름 : <%= vo.getName() %></p>
<p> 좋아하는 과목 : <%= vo.getSubject() %></p>

</body>
</html>

 

forward

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>forward</h3>
<%--
  - 클라이언트로부터 요청 받은 서블릿(JSP)은 서버의 다른 자원(서블릿, JSP)으로 요청 정보를 전달하여 처리
  - 포워딩은 서블릿 컨테이너에서 이루어 지므로 클라이언트는 알 수 없다.(브라우저 주소줄이 변하지 않음)
  - 요청 받은 페이지는 포워딩 페이지에 request, response 객체를 그대로 전달한다.
  - 요청 받은 페이지가 포워딩 페이지에 새로운 정보를 전달하기 위해서는 request.setAttribute()를 이용한다.
 --%>

<form action="ex03_ok.jsp" method="post">
	<p>이름 : <input type="text" name="name" required="required"></p>
	<p>나이 : <input type="text" name="age" required="required" pattern="\d+"></p>
	<p> <button type="submit">등록하기</button> </p>
</form>
 

</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");

	int age = Integer.parseInt( request.getParameter("age") );
	String s = age >= 19? "성인" : "미성년자";

	
	// 포워딩하는 페이지에 state 전달
	request.setAttribute("state", s); // request.setAttribute(String, Object);
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>포워딩하면 이 페이지는 클라이언트 화면에 보이지 않는다.</h3>

<%-- JSP 액션 태그를 이용한 forward --%>
<jsp:forward page="ex03_result.jsp"/>

</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");

	// 포워딩된 페이지는 포워딩한 페이지에서 request, response 객체가 전달되므로 클라이언트가 보낸
	// 파라미터를 받을 수 있다.
	String name = request.getParameter("name");
	int age = Integer.parseInt(request.getParameter("age"));
	
	// 포워딩한 페이지에서 설정한 속성 값 받기
	// request.getAttribute()의 리턴 타입은 Object 이므로 반드시 다운 캐스팅이 필요
	String s = (String)request.getAttribute("state");
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<p> <%=name %>님의 나이는 <%=age %>이므로 <%=s %>입니다.</p>

</body>
</html>

 

ex04 - 자바 클래스를 활용한 forward

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	String cp = request.getContextPath(); // 프로젝트명
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>서블릿 forward</h3>

<form action="<%=cp%>/ch05/demo" method="post">
	<p>이름 : <input type="text" name="name" required="required"></p>
	<p>나이 : <input type="text" name="age" required="required" pattern="\d+"></p>
	<p> <button type="submit">등록하기</button> </p>
</form>

</body>
</html>
package ch05.demo;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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("/ch05/demo")
public class DemoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// GET 방식으로 요청한 경우
		
		// /study2/ch05/ex04.jsp 로 포워딩
		// forward 할 때 /는 Context Path를 나타낸다.
		forward(req, resp, "/ch05/ex04.jsp");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// POST 방식으로 요청한 경우
		req.setCharacterEncoding("utf-8"); // POST방식은 필수!
		
		String name = req.getParameter("name");
		int age = Integer.parseInt( req.getParameter("age") );
		
		String state = age >= 19 ? "성인" : "미성년자";
		String msg = name + "님의 나이는 " +age +"입니다. 따라서 " + state + "입니다.";
		
		req.setAttribute("message", msg);
		
		forward(req, resp, "/ch05/ex04_ok.jsp");
	}
	
	protected void forward(HttpServletRequest req, HttpServletResponse resp, String path) throws ServletException, IOException {
		// 서블릿 포워딩 방법
		RequestDispatcher rd = req.getRequestDispatcher(path);
		rd.forward(req, resp);
	}
	
}
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>결과</h3>

<p>
	<%=request.getAttribute("message") %>
</p>


</body>
</html>

+ Recent posts