본문 바로가기

5월 ~ 7월) 웹/servlet

51Day - FirstServlet/ web.xml& JoinServlet / LifeCycleServlet/ SendImageServlet/ $$ error/ form.html/ .tern-project

FirstServlet

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

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

//어노테이션(Annotation) : API 문서에 특별한 설명을 제공하기 위해 만들어진 기능
// => 프로그램 작성에 필요한 특별한 의미를 제공하거나 실행에 필요한 정보를 제공하는 기능

//@WebServlet : 서블릿 클래스를 서블릿으로 등록하고 URL 패턴을 매핑하기 위한 어노테이션
// => [web.xml] 파일의 servlet 엘리먼트와 servlet-mapping 엘리먼트로 제공하는 기능과 동일
//@WebServlet 어노테이션 속성을 이용하여 서블릿의 이름과 URL 패턴 매핑 설정
// => name 속성 : 서블릿의 이름을 속성값으로 설정 - 속성을 생략하면 자동으로 클래스 이름을 
//서블릿의 이름으로 설정
// => value 속성 : 서블릿을 요청하기 위한 URL 패턴을 속성값으로 설정 - value 속성외 다른 
//속성이 없는 경우 속성값만 설정 가능
//@WebServlet(name="first", value="/first.itwill")
@WebServlet("/first.itwill")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	//클라이언트 요청에 의해 자동 호출되는 메소드 - 요청 처리 메소드
	// => 클라이언트 요청에 대한 처리 명령과 응답될 실행결과를 저장한 파일을 생성하는 명령 작성
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//클라이언트 요청에 대한 실행결과를 저장하기 위한 파일형태 변경 및 응답파일을 생성하기
		//위한 출력스트림을 반환받아 저장
		// => 클라이언트에게 URL 주소로 응답할 경우 응답파일로 제공하지 않으므로 생략 가능 
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//요청에 대한 처리 명령 및 처리결과를 저장할 응답파일 생성
		// => 서블릿은 모든 클라이언트에게 일관성 있는 처리결과를 동적으로 생성하여 제공
		
		//서버 플렛폼의 현재 날짜와 시간이 저장된 Date 객체 생성
		Date now=new Date();
		
		//날짜와 시간에 대한 패턴정보를 저장한 SimpleDateFormat 객체 생성
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
		
		//SimpleDateFormat 객체의 format() 메소드를 호출하여 매개변수로 전달받은 Date 객체를
		//SimpleDateFormat 객체에 저장된 날짜와 시간 패턴의 문자열로 변환하여 반환
		String displayNow=dateFormat.format(now);
		
		//실행결과를 저장한 응답파일 생성
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("<style type='text/css'>");
		out.println("p {");
		out.println("width: 600px;");
		out.println("margin: 0 auto;");
		out.println("padding: 30px 0;");
		out.println("font-size: 2em;");
		out.println("font-weight: bold;");
		out.println("text-align: center;");
		out.println("border: 2px solid black;");
		out.println("}");
		out.println("</style>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿 시계</h1>");
		out.println("<hr>");
		out.println("<p>"+displayNow+"</p>");
		out.println("<script type='text/javascript'>");
		out.println("setInterval(function() {");
		out.println("location.reload();");
		out.println("}, 1000);");
		out.println("</script>");
		out.println("</body>");
		out.println("</html>");
	}
}

 


 

 

 



 

JoinServlet

package xyz.itwill.servlet;

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;

//입력페이지(form.html)로부터 전달받은 입력값(회원정보)을 반환받아 클라이언트에게 전달하여 
//응답하는 서블릿
// => 입력페이지의 form 태그를 이용하여 POST 방식으로 요청해야만 실행되는 서블릿
@WebServlet("/join.itwill")
public class JoinServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
	
		//서블릿을 GET 방식으로 요청한 경우 비정상적인 요청으로 클라이언트에게 에러코드를
		//전달하거나 에러페이지로 이동되도록 처리
		//HttpServletRequest.getMethod() : 서블릿을 요청한 요청방식(GET or POST)을 반환하는 메소드
		if(request.getMethod().equals("GET")) {//서블릿을 GET 방식으로 요청한 경우 - 비정상적인 요청
			/*
			//HttpServletResponse.sendError(int sc) : 클라이언트에게 에러코드(4XX or 5XX)를
			//전달하여 응답하는 메소드
			// => 상태코드(StatusCode)는 HttpServletResponse 인터페이스의 정의된 상수 사용 
			//response.sendError(400);
			//response.sendError(HttpServletResponse.SC_BAD_REQUEST);//400
			//response.sendError(405);
			response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);//405
			return;
			*/
			
			/*
			//HttpServletResponse.sendRedirect(String url) : 클라이언트에게 301 상태코드와
			//URL 주소를 전달하여 응답
			// => 클라이언트는 전달받은 URL 주소로 브라우저의 요청 URL를 변경하여 웹프로그램을
			//요청하고 실행결과를 응답받아 출력 - 페이지 이동(리다이렉트 이동) 
			response.sendRedirect("error.html");//에러페이지로 이동
			return;
			*/
			
			//클라이언트에서 자바스트립트 전달하여 응답
			// => 경고창을 이용하여 메세지 출력 후 입력페이지로 이동 처리 
			out.println("<script type='text/javascript'>");
			out.println("alert('비정상적으로 페이지를 요청 하였습니다.');");
			out.println("location.href='form.html';");
			out.println("</script>");
			return;
		}
		
		//서블릿을 POST 방식으로 요청한 경우 사용자 입력값을 리퀘스트 메세지 몸체부에 저장하여 전달
		// => 리퀘스트 메세지 몸체부에 저장되어 전달되는 값은 기본적인 문자형태가 서유럽어
		//(ISO-8859-1)로 설정되어 제공
		// => 리퀘스트 메세지 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경
		//HttpServletRequest.setCharacterEncoding(String encoding) : 리퀘스트 메세지 몸체부에
		//저장되어 전달되는 값에 대한 문자형태를 변경하는 메소드
		// => GET 방식으로 요청한 경우 리퀘스트 메세지 몸체부를 사용하지 않으므로 메소드 사용 불필요
		request.setCharacterEncoding("utf-8");
		
		//서블릿을 요청할 때 전달된 값을 반환받아 저장
		//HttpServletRequest.getParameter(String name) : 매개변수로 전달받은 이름의 전달값을 
		//문자열(String 객체)로 반환하는 메소드
		// => 매개변수의 이름으로 전달된 값이 없는 경우 [null] 반환
		String id=request.getParameter("id");
		String passwd=request.getParameter("passwd");
		String name=request.getParameter("name");
		String email=request.getParameter("email");
		String gender=request.getParameter("gender");
		//동일한 이름으로 전달되는 값이 여러개 있는 경우 getParameterValues() 메소드 호출 
		//String hobby=request.getParameter("hobby");//첫번째 전달값만 반환받아 저장
		//HttpServletRequest.getParameterValues(String name) : 매개변수로 전달받은 이름의 
		//모든 전달값을 문자열 배열(String[])로 반환하는 메소드
		String[] hobby=request.getParameterValues("hobby");
		String job=request.getParameter("job");
		String profile=request.getParameter("profile");
		
		/*
		if(id==null || id.equals("")) {//전달값이 없는 경우 - 비정상적인 요청
			response.sendError(HttpServletResponse.SC_BAD_REQUEST); 
			return;
		}
		
		if(!Pattern.matches("^[a-zA-Z]\\w{5,19}$", id)) {//전달값이 정규표현식 패턴과 맞지 않은 경우
			response.sendError(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		*/
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>회원가입확인</h1>");
		out.println("<hr>");
		out.println("<p>아이디 = "+id+"</p>");
		out.println("<p>비밀번호 = "+passwd+"</p>");
		out.println("<p>이름 = "+name+"</p>");
		out.println("<p>이메일 = "+email+"</p>");
		out.println("<p>성별 = "+gender+"</p>");
		out.println("<p>취미 = ");
		for(int i=0;i<hobby.length;i++) {
			out.println(hobby[i]);//배열의 요소값을 HTML 문서에 포함하여 응답
			if(i < hobby.length-1) {
				out.println(",");
			}
		}
		out.println("</p>");
		out.println("<p>직업 = "+job+"</p>");
		//전달값의 엔터(Enter)를 <br> 태그로 변환해야만 줄바꿈 처리 가능
		out.println("<p>자기소개 = <br>"+profile.replace("\n", "<br>")+"</p>");
		out.println("</body>");
		out.println("</html>");
	}
}

 


 

 

 


$$ error

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet</title>
</head>
<body>
	<h1>에러페이지</h1>
	<hr>
	<p>비정상적인 방법으로 웹자원을 요청 하였습니다. 정상적인 방법으로 사이트를 이용해 주세요.</p>
	<div><a href="form.html>페이지 이동</a></div>
</body>
</html>

 


 

 


form.html

<!DOCTYPE html>
<!-- 사용자에게 회원정보를 입력받아 처리페이지(join.itwill)를 POST 방식으로 요청하여
입력값을 전달하는 HTML 문서 - 입력페이지 -->
<!-- => form 태그를 이용하여 서블릿을 POST 방식으로 요청한 경우 사용자 입력값을 리퀘스트
메세지 몸체부(Body)에 저장하여 전달 -->
<html>
<head>
<meta charset="UTF-8">
<title>Servlet</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<style type="text/css">
h1 {
	text-align: center;
}

fieldset {
	width: 800px;
	margin: 10px auto;
}

legend {
	font-size: 1.2em;
}

#joinForm ul li {
	list-style-type: none;
	margin: 15px 0;
}

#joinForm label {
	width: 150px;
	text-align: right;
	float: left;
	margin-right: 10px;
}

#btnFs {
	text-align: center;
}

.error {
	color: red;
	margin-left: 10px;
}
</style>
</head>
<body>
	<h1>회원가입</h1>
	<hr>
	<!-- form 태그 : 웹프로그램을 요청할 때 사용자로부터 입력받은 값을 전달하기 위한 태그 -->
	<!-- action 속성 : form 태그를 사용하여 요청할 웹프로그램의 URL 주소를 속성값으로 설정 -->
	<!-- => action 속성을 생략한 경우 현재 브라우저의 URL 주소의 웹프로그램 요청 -->
	<!-- method 속성 : 웹프로그램 요청방식(GET or POST)을 속성값으로 설정 -->
	<!-- => method 속성을 생략한 경우 웹프로그램은 GET 방식으로 요청 -->
	<!-- GET : 입력값을 URL 주소의 질의문자열(QueryString)로 변환하여 전달 -->
	<!-- => 소용량의 보안이 필요없는 값을 전달하기 위해 사용하는 요청방식  -->
	<!-- POST : 입력값을 리퀘스트 메세지의 몸체부에 저장하여 전달 -->
	<!-- => 대용량의 값 또는 보안을 필요로 하는 값을 전달하기 위해 사용하는 요청방식  -->
	<!-- 웹프로그램 요청시 전달되는 값은 이름과 값을 하나로 묶어서 전달 - 이름=값&이름=값&... -->
	<form action="join.itwill" method="post" id="joinForm">
	<fieldset>
		<legend>회원가입정보</legend>
		<ul>
			<li>
				<label>아이디</label>
				<input type="text" name="id" id="id"><br>
				<label>&nbsp;</label>
				<span id="idMsg" class="error"></span>
			</li>
			<li>
				<label>비밀번호</label>
				<input type="password" name="passwd" id="passwd"><br>
				<label>&nbsp;</label>
				<span id="passwdMsg" class="error"></span>
			</li>
			<li>
				<label>비밀번호 확인</label>
				<input type="password" name="repasswd" id="repasswd"><br>
				<label>&nbsp;</label>
				<span id="repasswdMsg" class="error"></span>
			</li>						
			<li>
				<label>이름</label>
				<input type="text" name="name" id="name"><br>
				<label>&nbsp;</label>
				<span id="nameMsg" class="error"></span>
			</li>
			<li>
				<label>이메일</label>
				<input type="text" name="email" id="email"><br>
				<label>&nbsp;</label>
				<span id="emailMsg" class="error"></span>
			</li>
			<li>
				<label>성별</label>
				<input type="radio" name="gender" class="gender" value="남자">남자&nbsp;&nbsp;
				<input type="radio" name="gender" class="gender" value="여자">여자<br>
				<label>&nbsp;</label>
				<span id="genderMsg" class="error"></span>
			</li>
			<li>
				<label>취미</label>
				<input type="checkbox" name="hobby" class="hobby" value="등산">등산&nbsp;&nbsp;
				<input type="checkbox" name="hobby" class="hobby" value="낚시">낚시&nbsp;&nbsp;
				<input type="checkbox" name="hobby" class="hobby" value="여행">여행&nbsp;&nbsp;
				<input type="checkbox" name="hobby" class="hobby" value="독서">독서<br>
				<label>&nbsp;</label>
				<span id="hobbyMsg" class="error"></span>
			</li>
			<li>
				<label>직업</label>
				<select name="job">
					<option value="회사원" selected="selected">&nbsp;회사원&nbsp;</option>
					<option value="주부">&nbsp;주부&nbsp;</option>
					<option value="학생">&nbsp;학생&nbsp;</option>
				</select>
			</li>
			<li>
				<label>자기소개</label>
				<textarea rows="4" cols="80" name="profile" id="profile"></textarea><br>
				<label>&nbsp;</label>
				<span id="profileMsg" class="error"></span>
			</li>
		</ul>
	</fieldset>
	<fieldset id="btnFs">
		<button type="button" id="submitBtn">회원가입</button>
		<button type="button" id="resetBtn">다시작성</button>
	</fieldset>
	</form>
	
	<script type="text/javascript">
	$("#id").focus();
	
	
	$("#submitBtn").click(function() {
		var result=true;
		
		$(".error").text("");
		
		var idReg=/^[a-zA-Z]\w{5,19}$/g;
		if($("#id").val()=="") {
			$("#idMsg").text("아이디를 반드시 입력해 주세요.");
			result=false;
		} else if(!idReg.test($("#id").val())) {
			$("#idMsg").text("아이디는 6~20자의 영문자,숫자,특수기호(_)로만 작성 가능합니다.");
			result=false;
		}
		
		var passwdReg=/^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[~!@#$%^&*_-]).{6,20}$/g;
		if($("#passwd").val()=="") {
			$("#passwdMsg").text("비밀번호를 반드시 입력해 주세요.");
			result=false;
		} else if(!passwdReg.test($("#passwd").val())) {
			$("#passwdMsg").text("비밀번호는 6~20자의 영문자,숫자,특수문자가 1번 이상 포함해야만 됩니다.");
			result=false;
		}
		
		if($("#passwd").val()=="") {
			$("#repasswdMsg").text("비밀번호 확인를 반드시 입력해 주세요.");
			result=false;
		} else if($("#passwd").val()!=$("#repasswd").val()) {
			$("#repasswdMsg").text("비밀번호가 맞지 않습니다.다시 입력해 주세요.");
			result=false;
		}
		
		if($("#name").val()=="") {
			$("#nameMsg").text("이름을 반드시 입력해 주세요.");
			result=false;
		}
		
		var emailReg=/^([a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+)*$/g;
		if($("#email").val()=="") {
			$("#emailMsg").text("이메일을 반드시 입력해 주세요.");
			result=false;
		} else if(!emailReg.test($("#email").val())) {
			$("#emailMsg").text("이메일을 형식에 맞게 입력해 주세요.");
			result=false;
		}
	
		if($(".gender").filter(":checked").length==0) {
			$("#genderMsg").text("성별을 반드시 선택해 주세요.");
			result=false;
		}	
		
		if($(".hobby").filter(":checked").length==0) {
			$("#hobbyMsg").text("취미를 반드시 선택해 주세요.");
			result=false;
		}
		
		if($("#profile").val()=="") {
			$("#profileMsg").text("자기소개를 반드시 입력해 주세요.");
			result=false;
		}
		
		if(!result) return;
		
		$("#joinForm").submit();
	});
	
	$("#resetBtn").click(function() {
		$("#joinForm")[0].reset();
		$("#id").focus();
		$(".error").text("");
	});
	</script>
</body>
</html>

 


 

 


 

.tern-project

{
  "ecmaVersion": 5,
  "plugins": {
    "guess-types": {
      
    },
    "outline": {
      
    },
    "browser-extension": {
      
    },
    "jquery-extension": {
      
    }
  },
  "libs": [
    "browser",
    "jquery"
  ]
}

 

 

 

 

 

 

 


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- web.xml : 웹프로젝트가 WAS 프로그램에 의해 웹자원(WebContext)으로 변환될 때 필요한 정보를 
제공하기 위한 환경설정파일 - XSD(XML Schema Description) 파일에 선언된 태그(엘리먼트)만 사용 가능 -->
<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 : 프로젝트 이름을 설정하기 위한 엘리먼트 -->
	<display-name>servlet</display-name>
	
	<!-- servlet : 서블릿 클래스를 서블릿으로 등록하기 위한 엘리먼트 -->
	<servlet>
		<!-- servlet-name : 서블릿을 구분하기 위한 이름(고유값)를 설정하기 위한 엘리먼트 -->
		<servlet-name>hello</servlet-name>
		<!-- servlet-class : 서블릿으로 등록될 서블릿 클래스를 설정하기 위한 엘리먼트 -->
		<servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>
	</servlet>
	
	<!-- servlet-mapping : 클라이언트가 요청하여 실행하기 위한 서블릿의 요청 URL 패턴을 
	매핑하기 위한 엘리먼트 -->
	<servlet-mapping>
		<!-- servlet-name : 요청 URL 패턴에 의해 실행될 서블릿의 이름을 설정하기 위한 엘리먼트 -->
		<servlet-name>hello</servlet-name>
		<!-- url-pattern : 서블릿을 요청하기 위한 요청 URL 패턴을 등록하기 위한 엘리먼트 -->
		<url-pattern>/hello.itwill</url-pattern>
	</servlet-mapping>
	
	<!-- welcome-file-list : welcome-file 엘리먼트 목록을 설정하기 위한 엘리먼트 -->
	<welcome-file-list>
		<!-- welcome-file : 클라이언트가 서버에 접속하여 웹프로그램을 요청하지 않은 경우 기본적으로  
		실행되어 응답될 웹문서의 이름을 설정하기 위한 엘리먼트 - 순차적으로 적용 -->
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.jsp</welcome-file>
		<welcome-file>default.htm</welcome-file>
	</welcome-file-list>
</web-app>

 

 

LifeCycleServlet

package xyz.itwill.servlet;

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

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;

//서블릿은 클라이언트 요청에 의해 WAS 프로그램에 등록된 서블릿 클래스를 읽어 메모리에 저장하고
//서블릿 클래스로 객체를 생성하여 요청 처리 메소드 호출
// => 클라이언트 요청에 의한 서블릿 객체가 이미 생성되어 있는 경우 새로운 서블릿 객체를 생성
//하지 않고 기존 서블릿 객체를 사용하여 요청 처리 메소드 호출
// => WAS 프로그램이 종료되면 WAS 프로그램에 의해 생성되어 관리된 모든 서블릿 객체 소멸
// => WAS 프로그램은 서블릿 객체를 관리하는 웹컨테이너(Web Container) 기능 제공
//컨테이너(Container) : 프로그램 실행에 필요한 객체의 생명주기(Life Cycle)를 관리하는 프로그램
// => 서블릿은 컨테이너에 의해 관리되는 컴퍼넌트(Component)
@WebServlet("/life.itwill")
public class LifeCycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private String name;
	
	//서블릿 클래스로 객체를 생성하기 위한 생성자 
	// => 객체를 생성하면서 실행될 초기화 명령 작성
	public LifeCycleServlet() {
		//name="홍길동";
		System.out.println("### LifeCycleServlet 클래스의 생성자 호출 - 객체 생성 ###");
	}
	 
	//서블릿 객체가 생성된 후 WAS 프로그램에 의해 자동으로 1번만 호출되는 메소드
	// => 객체를 생성한 후 실행될 초기화 명령 작성
	//생성자 대신 init 메소드를 이용하여 초기화 처리 명령을 작성하는 이유
	// => init() 메소드는 매개변수로 ServletConfig 객체를 제공받아 사용 가능
	//ServletConfig 객체 : 웹자원을 생성하기 위한 환경 설정 관련 정보를 저장한 객체
	// => [web.xml] 파일에서 제공되는 값을 얻어와 서블릿 클래스에서 사용 가능 - 유지보수의 효율성 증가
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("### LifeCycleServlet 클래스의 init() 메소드 호출 ###");
		
		//name="홍길동";
		
		//[web.xml] 파일의 context-param 엘리먼트로 제공되는 값 반환
		//ServletConfig.getServletContext() : ServletContext 객체를 반환하는 메소드
		//ServletContext.getInitParameter(String name) : [web.xml] 파일에서 제공되는 값을 얻어와 반환하는 메소드
		name=config.getServletContext().getInitParameter("name");

		//[web.xml] 파일의 init-param 엘리먼트로 제공되는 값은 ServletConfig 객체의
		//getInitParameter(String name) 메소드를 호출하여 값을 얻어와 반환
	}
	
	//서블릿 객체가 소멸되기 전에 WAS 프로그램에 의해 자동으로 1번만 호출되는 메소드
	// => 객체 소멸 전 실행될 마무리 명령 작성
	@Override
	public void destroy() {
		System.out.println("### LifeCycleServlet 클래스의 destroy() 메소드 호출 ###");
	}
	
	//클라이언트가 요청할 때마다 WAS 프로그램에 의해 반복 호출되는 메소드
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("### LifeCycleServlet 클래스의 service() 메소드 호출 ###");
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿의 생명주기(Left Cycle)</h1>");
		out.println("<hr>");
		out.println("<p>"+name+"님, 안녕하세요.</p>");
		out.println("</body>");
		out.println("</html>");
	}
}

 


WEB-INF > lib > web.xml 생성 


 

SendImageServlet

package xyz.itwill.servlet;

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

//클라이언트 요청에 의해 이미지 파일로 응답하기 위한 서블릿
@WebServlet("/image.itwill")
public class SendImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//클라이언트에게 이미지 파일이 응답되도록 응답파일의 타입 변경
		// => 응답파일이 문서파일이 아니므로 캐릭터셋 미설정 
		response.setContentType("image/jpeg");
		
		//응답파일을 생성하기 위한 출력스트림을 반환받아 저장
		// => 이미지 파일(이진 파일 : Binary File)를 생성하기 위해 원시데이타(1Byte)를 전달
		//하는 ServletOutputStream 객체 반환
		ServletOutputStream out=response.getOutputStream();
		
		//서버에 저장된 이미지 파일의 시스템 경로를 반환받아 저장	
		//HttpServletRequest.getServletContext() : ServletContext 객체를 반환하는 메소드
		// => ServletContext 객체 : 웹자원(WebContext)을 관리하기 위한 객체 - WAS
		//ServletContext.getRealPath(String contextParh) : 매개변수로 전달받은 웹자원의
		//파일 시스템 경로를 반환하는 메소드
		String imageFilePath=request.getServletContext().getRealPath("/WEB-INF/Koala.jpg");
		//System.out.println("imageFilePath = "+imageFilePath);
		
		//매개변수에 이미지 파일의 파일 시스템 경로를 제공하여 파일 입력스트림(FileInputStream 객체) 생성
		FileInputStream in=new FileInputStream(imageFilePath);
		
		//입력스트림으로 원시데이타를 읽어와 출력스트림으로 전달 - 반복 처리
		// => 서버에 저장된 이미지 파일을 클라이언트에게 전달하기 위한 응답파일로 생성
		while(true) {
			int readByte=in.read();
			if(readByte==-1) break;
			out.write(readByte);
		}
		
		in.close();//파일 입력스트림 제거
	}
}

 


 

WEB-INF > lib > Koala.jpg 생성