📌 클라이언트에게 이미지 파일이 응답되도록 설정 - 응답될 파일형식(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=" "; 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=" "; 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>"); } }