반응형
1) 웹자원(웹디렉토리)
2) 서버에서 가져올 정보
- 서블릿(웹프로그램)을 요청해 코알라 이미지 출력 - image.itwill
- 서블릿(웹프로그램)을 요청해 공지사항 페이지 출력 - notice.itwill
🍋 webapp>notice.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet</title>
</head>
<body>
<!-- CSL의 최상위 루트 디렉토리 = 서버 루트디렉토리 -->
<!-- => [/servlet/image.itwill]라고 표현함 -->
<!-- => 앞의 / : 서버 루트디렉토리 -->
<!-- => 뒤의 / : Context 루트디렉토리 -->
<h1>공지사항</h1>
<hr>
<!-- 서블릿(웹프로그램)을 요청하여 이미지 파일을 응답받아 출력 : "image.itwill" -->
<!-- 상대경로 -->
<!-- <img alt="코알라" src="image.itwill"> -->
<!-- 절대경로 -->
<img alt="코알라" src="/servlet/image.itwill" width="300">
<hr>
<button type="button" id="btn">오늘의 공지사항 보기</button>
<script type="text/javascript">
document.getElementById("btn").onclick = function() {
//서블릿(웹프로그램)을 요청하여 공지사항 문서를 응답받아 출력 : "notice.itwill"
window.open("notice.itwill", "notice",
"width=400,height=400,top=200,left=800");
};
</script>
</body>
</html>
3) 이미지 파일로 응답
🍏 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;
//💝6.
@WebServlet("/image.itwill")
//=> 결국 클라이언트가 웹프로그램(서블릿)을 요청할 URL 주소는 아래와 같음
//=> <http://localhost:8000> /(서버 루트디렉토리) servlet /(Context 루트디렉토리) image.itwill
//💝1.
public class SendImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//💝2.
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//💝3.
//클라이언트에게 이미지 파일이 응답되도록 설정 - 응답될 파일형식(Mimetype) 변경
// => 이미지 파일(이진 파일 - Binary File)로 응답하므로 캐릭터셋 미설정
response.setContentType("image/jpeg"); //클라야, 응답결과는 image/jpeg로 줄게
//💝4.
//응답될 이미지 파일을 생성하기 위한 값(원시데이타 - 1Byte)을 전달하기 위해 출력스트림
//(ServletOutputStream 객체)을 반환받아 저장
ServletOutputStream out = response.getOutputStream();
//🍏5.
//서버에 저장된 이미지 파일의 파일 시스템 경로를 반환받아 저장
//HttpServletRequest.getServletContext() : ServletContext 객체를 반환하는 메소드
// [ServletContext 객체] : 웹자원(WebContext)을 관리하기 위한 객체 - WAS
// [웹자원(WebContext)] : 웹서버(WebServer)가 사용할 수 있는 자원 - 웹에서 사용 가능한 리소스 파일
//서블릿(SSL)의 최상위 루트 디렉토리 = Context 루트 디렉토리
// => /WEB-INF/Koala.jpg]
// => / : Context 루트 디렉토리
//ServletContext.getRealPath(String contextPath) : 매개변수로 전달받은 웹자원 관련 파일의 시스템 경로를 반환하는 메소드
String filePath = request.getServletContext().getRealPath("/WEB-INF/Koala.jpg");
System.out.println("filePath = "+filePath); //아파치 톰캣이 가진 웹자원의 경로
//filePath = C:\\\\Users\\\\itwill\\\\Downloads\\\\apache-tomcat-9.0.68\\\\webapps\\\\servlet\\\\WEB-INF\\\\Koala.jpg
//🍏6.
//이미지 파일을 읽기 위한 입력스트림 생성
FileInputStream in = new FileInputStream(filePath);
//🍏7.
//입력스트림으로 원시데이타를 읽어서 출력스트림으로 전달 - 반복 처리
// => 서버에 저장된 이미지 파일을 읽어 클라이언트에게 응답되도록 생성
while(true) {
int readByte = in.read();
if(readByte==-1) break;
out.write(readByte);
}
//🍏8.
//파일 입력스트림 제거
in.close();
}
}
4) 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)을 이용하여 작성
//💝6.
@WebServlet("/notice.itwill")
//=> 결국 클라이언트가 웹프로그램(서블릿)을 요청할 URL 주소는 아래와 같음
//=> <http://localhost:8000> /(서버 루트디렉토리) servlet /(Context 루트디렉토리) notice.itwill
//💝1.
public class NoticeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//💝2.
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//💝3.
response.setContentType("text/html;charset=utf-8");
//💝4.
PrintWriter out = response.getWriter();
//🍏5.
//서버 시스템의 현재 날짜와 시간이 저장된 Date 객체 생성
//방법1. - 변수사용해 여러줄 작성
/*
Date now = new Date();
//[yyyyMMdd] 형식의 패턴이 저장된 SimpleDateFormat 객체 생성
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd")
//SimpleDateFormat 객체를 이용하여 Date 객체에 저장된 날짜와 시간을 특정 패턴의 문자열로 변환
String nowString = dateFormat.format(now);
//공지사항 파일의 이름 생성
String noticeFileName = nowString+".txt";
*/
//방법2. - 변수사용없이 한줄 작성
String noticeFileName = new SimpleDateFormat("yyyyMMdd").format(new Date())+".txt";
System.out.println("noticeFileName = "+noticeFileName);
//noticeFileName = 20221129.txt
//🍏6.
//공지사항 파일의 시스템 경로를 반환받아 저장
String noticeFilePath = request.getServletContext().getRealPath("/WEB-INF/notice/"+noticeFileName);
//아파치 톰캣이 가진 웹자원의 경로
System.out.println("noticeFilePath = "+noticeFilePath);
//noticeFilePath = C:\\\\Users\\\\itwill\\\\Downloads\\\\apache-tomcat-9.0.68\\\\webapps\\\\servlet\\\\WEB-INF\\\\notice\\\\20221129.txt
//🍏7.
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 {
//🍏8.
//공지사항 파일을 읽기 위한 입력스트림 생성
// => 공지사항 파일이 없는 경우 [FileNotFoundException] 발생
BufferedReader in = new BufferedReader(new FileReader(noticeFilePath));
//🍏9.
//공지사항 파일을 읽어 클라이언트에게 응답할 문서에 전달하여 저장
while(true) {
String text = in.readLine(); //공지사항 파일에 저장된 내용을 한 줄을 읽어 변수에 저장
if(text==null) break; //다 읽은 경우 나가기
if(text.equals("")) text=" "; //파일에 내용이 없다면 공백출력
out.println("<div>"+text+"</div>"); //응답파일에 저장
}
//🍏10.
in.close(); //파일 입력스트림 반드시 제거
}catch (FileNotFoundException e) {
out.println("<p>오늘은 공지사항이 없습니다.</p>");
}
//🍏7.
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>");
}
}
5) 오늘 날짜의 공지사항 파일
🍋webapp>WEB-INF > notice > 20221129.txt
오늘은 화요일입니다.
내일까지 화면정의서를 작성하여 제출해 주세요.
🍋webapp>WEB-INF > notice > 20221130.txt
오늘은 수요일입니다.
오늘까지 화면정의서 제출 바랍니다.
6) 코알라 사진
🍋webapp>WEB-INF > Koala.jpg
반응형
'servlet' 카테고리의 다른 글
[servlet] 6. 쿠키 생성, 전달, 제거 프로그램 (cookie) (0) | 2024.05.25 |
---|---|
[servlet] 5. 파일업로드 프로그램 (multipart/form-data) (0) | 2024.05.24 |
[servlet] 4. 회원가입 프로그램 (form) (0) | 2024.05.24 |
[servlet] 2. 서블릿 클래스 작성하는 법 (0) | 2024.05.23 |
[servlet] 1. 서블릿의 개념, 동작원리 및 생명주기(Lifecycle) 관리 (0) | 2024.05.22 |