[Servlet 2-3] 이미지 파일을 전달하기 위한 서블릿

임승현·2022년 11월 29일
0

Servlet

목록 보기
5/14

🐧클라이언트 요청에 대해 이미지 파일을 전달하기 위한 서블릿

📌 클라이언트에게 이미지 파일이 응답되도록 설정 - 응답될 파일형식(MimeType) 변경
→ 이미지 파일(이진 파일 - Binary File)로 응답하므로 캐릭터셋 미설정

response.setContentType("image/jpeg");

📌 응답될 이미지 파일을 생성하기 위한 값(원시 테이터 - 1Byte)를 전달하는 출력스트림을 반환받아 저장
📌 (ServletOutputStream 객체)을 반환받아 저장

ServletOutputStream out=response.getOutputStream();

📌 서버에 저장된 이미지 파일의 파일 시스템 경로를 반환받아 저장
📌 HttpServletRequest.getServletContext() : ServletContext 객체를 반환하는 메소드
→ ServletContext 객체 : 웹자원(WenContext)을 관리하기 위한 객체 - WAS
📌 웹자원(WenContext) : 웹서버(WebServer)가 사용할 수 있는 자원 - 웹에서 사용 가능한 리소스 파일
📌 ServletContext.getRealPath(String contextPath) : 매개변수로 전달받아 웹자원 관련 파일의 시스템 경로를 반환하는 메소드

String filePath=request.getServletContext().getRealPath("/WEB-INF/Koala.jpg");
//System.out.println("filePath = "+filePath);

📌 이미지 파일을 읽기 위한 입력스트림 생성

FileInputStream in=new FileInputStream(filePath);

📌 입력스트림으로 원시데이터를 읽어서 출력스트림으로 전달 - 반복 처리
→ 서버에 저장된 이미지 파일을 읽어 클라이언트에게 응답되도록 전달

while(true) {
		int readByte=in.read();
		if(readByte==-1) break;
		out.write(readByte);
	}
	//파일 입력스트림 제거
	in.close();

📃SendImageServlet.java

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 {
		//클라이언트에게 이미지 파일이 응답되도록 설정 - 응답될 파일형식(MimeType) 변경
		//→ 이미지 파일(이진 파일 - Binary File)로 응답하므로 캐릭터셋 미설정
		response.setContentType("image/jpeg");
		//
		//응답될 이미지 파일을 생성하기 위한 값(원시 테이터 - 1Byte)를 전달하는 출력스트림을 반환받아 저장
		//(ServletOutputStream 객체)을 반환받아 저장
		ServletOutputStream out=response.getOutputStream();
		//
		//서버에 저장된 이미지 파일의 파일 시스템 경로를 반환받아 저장
		//HttpServletRequest.getServletContext() : ServletContext 객체를 반환하는 메소드
		//→ ServletContext 객체 : 웹자원(WenContext)을 관리하기 위한 객체 - WAS
		//웹자원(WenContext) : 웹서버(WebServer)가 사용할 수 있는 자원 - 웹에서 사용 가능한 리소스 파일
		//ServletContext.getRealPath(String contextPath) : 매개변수로 전달받아 웹자원 관련 파일의 시스템 경로를 반환하는 메소드
		String filePath=request.getServletContext().getRealPath("/WEB-INF/Koala.jpg");
		//System.out.println("filePath = "+filePath);
		//
		//이미지 파일을 읽기 위한 입력스트림 생성
		FileInputStream in=new FileInputStream(filePath);
		//
		//입력스트림으로 원시데이터를 읽어서 출력스트림으로 전달 - 반복 처리
		//→ 서버에 저장된 이미지 파일을 읽어 클라이언트에게 응답되도록 전달
		while(true) {
			int readByte=in.read();
			if(readByte==-1) break;
			out.write(readByte);
		}
		//파일 입력스트림 제거
		in.close();
	}
}

🐧서블릿을 요청하여 이미지 파일을 응답받아 출력

◈ jQuery 자동 완성 기능을 사용하려면

◈ browser, jquery 체크

📃notice.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet</title>
</head>
<body>
	<h1>공지사항</h1>
	<hr>
	<!-- 서블릿을 요청하여 이미지 파일응 응답받아 출력 -->
	<img alt="코알라" src="/servlet/image.itwill" width="300">
	<hr>
	<button type="button" id="btn">오늘의 공지사항 보기</button>
	<script type="text/javascript">
		document.getElementById("btn").onclick=function() {
			window.open("notice.itwill","notice","width=400,heught=400,top=200,left=800");
		}
	</script>
</body>
</html>

🎨공지사항 페이지 만들기

📌 오늘 날짜의 공지사항 파일을 읽어 파일내용을 클라이언트에게 전달하는 서블릿
→ 오늘 날짜의 공지사항 파일이 없는 경우 클라이언트에게는 공지사항이 없음을 알리는 웹문서 전달
→ 공지사항 파일은 /WEB-INF/notice 폴더에 년월일(yyyyMMdd.txt)을 이용하여 작성
※ notice 폴더 생성 >> yyyyMMdd.txt 생성후 공지사항 작성

🥎비효율적인 방법

📍 서버 시스템의 현재 날짜와 시간이 저장된 Date 객체 생성

Date now=new Date();

📍 [yyyyMMdd] 형식의 패턴이 저장된 SimpleDateFormat 객체 생성

SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMdd");

📍 SimpleDateFormat 객체를 이용하여 Date 객체에 저장된 날짜와 시간을 특정 패턴의 문자열로 변환

String nowString=dateFormat.format(now);

📍 공지사항 파일의 이름 생성

String noticeFileName=nowString+".txt";

🥎효율적인 방법

String noticeFileName=new SimpleDateFormat("yyyyMMdd").format(new Date())+".txt";

📌 공지사항 파일의 시스템 경로를 반환받아 저장

String noticeFilePath=request.getServletContext().getRealPath("/WEB-INF/notice/"+noticeFileName);
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 style='text-align: center;'>공지사항</h1>");
		out.println("<hr>");
		String displayNow=new SimpleDateFormat("yyyy년 MM월 dd일").format(new Date());
		out.println("<p style='text-align: center;'>"+displayNow+"의 공지사항</p>");
		try {
			//공지사항 파일을 읽기 위한 입력스트림 생성
			// => 공지사항 파일이 없는 경우 FileNotFoundException 발생
			BufferedReader in=new BufferedReader(new FileReader(noticeFilePath));
			//
			//공지사항 파일을 읽어 클라이언트에게 응답할 문서에 전달하여 저장
			while(true) {
				String text=in.readLine();//공지사항 파일에 저장된 내용을 한 줄 읽어 변수에 저장
				if(text==null) break;
				if(text.equals("")) text="&nbsp;";
				out.println("<div>"+text+"</div>");//응답파일에 전달
			}
			//
			in.close();//파일 입력스트림 제거
		} catch (FileNotFoundException e) {
			out.println("<p>오늘은 공지사항이 없습니다.");
		}
		out.println("<hr>");
		out.println("<div style='text-align: center;'>");
		out.println("<button type='button' onclick='window.close();'>닫기</button>");
		out.println("</div>");
		out.println("</body>");
		out.println("</html>");
	}
}

📃NoticeServlet.java

package xyz.itwill.servlet;
//
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
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;
//
//오늘 날짜의 공지사항 파일을 읽어 파일내용을 클라이언트에게 전달하는 서블릿
//→ 오늘 날짜의 공지사항 파일이 없는 경우 클라이언트에게는 공지사항이 없음을 알리는 웹문서 전달
//→ 공지사항 파일은 /WEB-INF/notice 폴더에 년월일(yyyyMMdd.txt)을 이용하여 작성(notice 폴더 생성 >> yyyyMMdd.txt 생성후 공지사항 작성)
@WebServlet("/notice.itwill")
public class NoticeServlet 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();
		//
		/*비효율적인 방법
		//서버 시스템의 현재 날짜와 시간이 저장된 Date 객체 생성
		Date now=new Date();
		//[yyyyMMdd] 형식의 패턴이 저장된 SimpleDateFormat 객체 생성
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMdd");
		//SimpleDateFormat 객체를 이용하여 Date 객체에 저장된 날짜와 시간을 특정 패턴의 문자열로 변환
		String nowString=dateFormat.format(now);
		//공지사항 파일의 이름 생성
		String noticeFileName=nowString+".txt";
		*/
		//효율적인 방법
		String noticeFileName=new SimpleDateFormat("yyyyMMdd").format(new Date())+".txt";
		//System.out.println("noticeFileName = "+noticeFileName);
		//
		//공지사항 파일의 시스템 경로를 반환받아 저장
		String noticeFilePath=request.getServletContext().getRealPath("/WEB-INF/notice/"+noticeFileName);
		//System.out.println("noticeFilePath = "+noticeFilePath);
		//
		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 style='text-align: center;'>공지사항</h1>");
		out.println("<hr>");
		String displayNow=new SimpleDateFormat("yyyy년 MM월 dd일").format(new Date());
		out.println("<p style='text-align: center;'>"+displayNow+"의 공지사항</p>");
		try {
			//공지사항 파일을 읽기 위한 입력스트림 생성
			// => 공지사항 파일이 없는 경우 FileNotFoundException 발생
			BufferedReader in=new BufferedReader(new FileReader(noticeFilePath));
			//
			//공지사항 파일을 읽어 클라이언트에게 응답할 문서에 전달하여 저장
			while(true) {
				String text=in.readLine();//공지사항 파일에 저장된 내용을 한 줄 읽어 변수에 저장
				if(text==null) break;
				if(text.equals("")) text="&nbsp;";
				out.println("<div>"+text+"</div>");//응답파일에 전달
			}
			//
			in.close();//파일 입력스트림 제거
		} catch (FileNotFoundException e) {
			out.println("<p>오늘은 공지사항이 없습니다.");
		}
		out.println("<hr>");
		out.println("<div style='text-align: center;'>");
		out.println("<button type='button' onclick='window.close();'>닫기</button>");
		out.println("</div>");
		out.println("</body>");
		out.println("</html>");
	}
}

0개의 댓글