49. servlet(3)

sumin·2023년 9월 13일
0

아카데미

목록 보기
50/82
post-thumbnail

Binding

	   * binding
	   * 
	   * 1. 값을 저장할 수 있는 영역에 속성(Attribute)의 형태로 값을 저장하는 것을 의미한다. 
	   * 2. HTML의 태그의 속성(attribute)과는 상관없는 개념이다. 
	   * 3. 서버가 값을 저장할 영역을 제공한다. 
	   * 4. 저장 영역
	   *   1) ServletContext : 컨텍스트(프로젝트, 애플리케이션) 종료 전까지 값을 저장할 수 있다. 애플리케이션이 실행중이라면 어디서든 값에 접근할 수 있다. 
	   *   2) HttpSession    : 세션 종료 전까지 값을 저장할 수 있다. 웹 브라우저가 실행중이라면 어디서든 값에 접근할 수 있다. (시간지정가능)
	   *   3) HttpServletRequest : 요청 종료 전까지 값을 저장할 수 있다. 응답 전이라면 값에 접근 할 수 있다. (1회용)
	   * 5. 속성(Attribute) 처리 메소드
	   *   1) setAttribute("속성", 값) : object 타입으로 값을 저장한다. 
	   *   2) getAtttibute("속성")     : Object 타입의 값을 반환한다. 캐스팅이 필요할 수 있다.
	   *   3) removeAttribute("속성")  :  값을 제거한다.   

binding1

	  // ServletContext 영역에 값을 저장하기 
	  ServletContext application = request.getServletContext();
	  application.setAttribute("msg", "servletContext");
	  
	  // Httpsession 영역에 값을 저장하기 
	  HttpSession session = request.getSession();
	  session.setAttribute("msg", "httpSession");
	  
	  // HttpservletRequest 영역에 값을 저장하기 ( 이미 매개변수에 선언되어 있다. )
	  request.setAttribute("msg", "HttpServletRequest");
	  
	  // Binding2 서블릿으로 이동(HttpServletRequest의 전달이 가증한  forward를 이용)
	  request.getRequestDispatcher("/binding2").forward(request, response);  //forward로 가면 /servlet 안씀

binding2

     /**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// servletContext 영역의 msg확인하기 
	  String msg1 = (String)request.getServletContext().getAttribute("msg");
	  System.out.println(msg1);
	  
	  //HttpSession 영역의 msg 확인하기 
	  String msg2 = (String)request.getSession().getAttribute("msg");
	  System.out.println(msg2);
	  
	  // HttpServletRequest 영역의 msg확인하기 
	  String msg3 = (String)request.getAttribute("msg");
	  System.out.println(msg3);
	  
	  request.getRequestDispatcher("/binding3").forward(request, response);
	  
	  
	}

binding3

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	  String msg1 = (String)request.getServletContext().getAttribute("msg");
    System.out.println(msg1);
    
    //HttpSession 영역의 msg 확인하기 
    String msg2 = (String)request.getSession().getAttribute("msg");
    System.out.println(msg2);
    
    // HttpServletRequest 영역의 msg확인하기 
    String msg3 = (String)request.getAttribute("msg");
    System.out.println(msg3);
    
    //Binding4 로 redirect (응답처리)
    response.sendRedirect("/servlet/binding4");
    
	}

binding4

    /**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	  String msg1 = (String)request.getServletContext().getAttribute("msg");
    System.out.println(msg1);
    
    //HttpSession 영역의 msg 확인하기 
    String msg2 = (String)request.getSession().getAttribute("msg");
    System.out.println(msg2);
    
    // HttpServletRequest 영역의 msg확인하기 
    String msg3 = (String)request.getAttribute("msg");
    System.out.println(msg3);
    
    
	}

binding1 -> binding2 -> binding3 -> binding4 로 전달하는 내용을 보기 위한 것이다.

쿠키란 방문한 웹사이트에서 생성된 파일로 방문에 관한 전보를 저장하여 온라인 환경을 더 편리하게 이용하도록 해준다. 로그인 정보등을 일정 시간, 조건 동안 저장을 하여 로그인을 하지 않아도 사용이 가능하게 해준다.
퍼스트 파티 쿠키
방문하는 사이트에 의해 생성되며 사이트 주소줄에 표시된다.
서드 파티 쿠키
다른 사이트에 의해 생성되며 내가 방문한 사이트에서는 다른 사이트의 콘텐츠를 삽입할 수 있다.
웹브라우저에서 사용유무를 설정할 수 있으며 웹 사이트 당 하나의 쿠키가 생성된다. 4KB의 용량 제한이 있다.

cookie1

package ex08_Cookie;

import java.io.IOException;
import java.net.URLEncoder;

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

/**
 * Servlet implementation class Cookie1
 */
@WebServlet("/cookie1")
public class Cookie1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Cookie1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 * 쿠키 
		 * 1. 클라이언트 측에 저장되는 정보를 의미한다. 
		 * 2. 보안에는 취약하므로 개인정보 같은 민감 정보는 저장하지 않는다. 
		 * 
		 */
	  
	  // 쿠키만들기
	  Cookie cookie1 = new Cookie("name","홍길동");  //쿠키로 저장할 수 있는것은 String 만 가능하다. 
	  Cookie cookie2 = new Cookie("age", "20");
	  Cookie cookie3 = new Cookie("address", URLEncoder.encode("서울특별시 종로구", "UTF-8"));  // 공백은 유효하지 않은 문자이므로 인코딩이 필요하다 . 
	  
	  // 쿠키가 저장될 경로 설정하기 (생략하면 컨텍스트패스 경로에 저장된다. )
	  cookie1.setPath("/servlet");  //컨텍스트패스 request.getContextPath() 를 이용해서 알아낼 수 있다.
	  cookie2.setPath("/servlet/cookie1"); // 서블릿 경로   :  request.getRequestURI()  coookie1 에 저장되어 있어서 cookie2에서는 안보인다. 
	                                      // cookie3은 경로 설정을 생략했으므로 컨텍스트패스에 저장된다. 
	  
	  //  쿠키가 유지되는 시간 설정하기 (생략하면 세션쿠기가 된다. 브라우저를 닫으면 지워진다.
	  cookie1.setMaxAge(60 * 60);  // 1시간 60초 곱하기 60분 
	  cookie2.setMaxAge(7 * 24 * 60 * 60); //7일
	                                       // cookie3은 시간 설정을 생략했으므로 세션쿠기가 된다. 
	  // 쿠키를 브라우저에 저장하기 (응답으로 처리한다)
	  response.addCookie(cookie1);
	  response.addCookie(cookie2);
	  response.addCookie(cookie3);
	  
	  // Cookie2 서블릿으로 redirect 이동 
	  response.sendRedirect("/servlet/cookie2");   //forward가 아니라서 /cookies 가 아니다. 
	  
	  
	  // 쿠키는 삭제라는 것이 없고 시간설정을 0으로 해준다음에 저장하면 0이 된다. 
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

cookie2

package ex08_Cookie;

import java.io.IOException;
import java.net.URLDecoder;

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

/**
 * Servlet implementation class Cookie2
 */
@WebServlet("/cookie2")
public class Cookie2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Cookie2() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	  // 요청한 곳의 모든 쿠키 가벼오기 (골라서 가져올 수 없다. )
	  Cookie[] cookies = request.getCookies();
	  
	  // 쿠키 확인하기 
	  if(cookies != null) {
	    for(int i = 0; i < cookies.length; i++) {
	      // 쿠키 이름
	      String name = cookies[i].getName();
	      //쿠키 값
	      String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8");
	      // 쿠키 경로
	      String path = cookies[i].getPath();
	      // 쿠키 유지시간
	      int expire = cookies[i].getMaxAge();
	      System.out.println(name + "," + value + "," + path + "," + expire);
	    }
	  }
	  
	  // 쿠키 삭제하기 (같은 이름의 쿠키를 만든 뒤 쿠키 유지시간을 0으로 설정하고 저장한다. (덮어 쓰기한다.))
	  Cookie cookie = new Cookie("name", "값은아무의미없다."); // 공백은 못 만든다. 
	  cookie.setMaxAge(0);
	  response.addCookie(cookie);
	
	
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

File up&down load

Html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script
  src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
crossorigin="anonymous"></script>
</head>
<body>

<div>
  <h1>파일첨부양식</h1>
  <form action="/servlet/upload" method="post" enctype="multipart/form-data"> <!-- multipart 여러파일 가져다 쓰는것  -->
      <div>
        <label for="uploader">업로더 </label>
        <input type="text" id="uploader" name="uploader">    <!--name이 파라미터  -->
      </div>
      <div>
        <label for="attach">파일첨부</label>
        <input type="file" id="attach" name="attach">
      </div>
      <div>
        <button type="submit">첨부하기</button>
      </div>
      <div id="preview"></div>
    </form>
</div>

<script>

  // <input type="file" id="attach">인 요소에 어떤 파일을 첨부하는 경우 chage 이벤트가 발생한다. "
  $('#attach').change(function(){
  
    // 첨부된 파일의 크기가 50MB (1024 * 1024 * 50)초과이면 첨부를 못하게 막는다. 
    var size = this.files[0].size;   //첨부된 파일의 크기
    var limit = 1024 * 1024 * 50;  // 크기 제한
    if(size > limit){
      alert('첨부파일의 최대 크기는 50MB 입니다. ');
      this.value = '';  //첨부된 파일을 취소한다. 
      return;
    }
    
    //첨부된 파일의 형식이 이미지가 아니면 첨부를 못하게 막는다. 
    var type = this.files[0].type;
    if(!type.startsWith('image/')){
      alert('이미지만 첨부할 수 있습니다. ');
      this.value = '';
      return;
    }
   
    //첨부된 파일 미리보기
    
    var reader = new FileReader();
    reader.readAsDataURL(this.files[0]);
    
    reader.onload = function(event) {
      var img = new Image();
      $(img).attr('src', event.target.result);
      $(img).css('width','192px');
      $('#preview').append(img);

    }
  })

</script>

</body>
</html>

upload

package ex09_up_down;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.List;

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

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

/**
 * Servlet implementation class Upload
 */
@WebServlet("/upload")
public class Upload extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Upload() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	  
	  /*
	   * 파일 첨부 선행 작업
	   * 1. http://servlets.com/ 접속
	   * 2. COS File Upload Library - cos-22.05.zip 다운로드 
	   * 3. zip압축 해제 후 /cos.jar 라이브러리 -> 프로젝트 webapp/WEB-INF/lib/cor.jar
	   */
	  /*
	   * cos.jar
	   * 1. 업로드 전용 라이브러리이다. 
	   * 2. 파일 첨부 폼 양식을 encytype = "multipart/form-data 로 설정하는데 이렇게 되면 HttpServletRequest
	   * 3. HttpServletRequest 대신 사용할  MultipartRequest 클래스를 지원하는 라이브러리이다. 
	   * 
	   */
	  
	  // 첨부파일의 경로
	  String path = "C:/storage";
	  
	  //첨부파일이 저장될 디렉터리가 없으면 새로 생성
	  File dir = new  File(path);
	  if(!dir.exists()) {
	    dir.mkdirs();
	  }
	  
	  // MultipartRequest 객체 생성 (실제 업로드가 진행되는 코드)
	  MultipartRequest mr = new MultipartRequest(
	                                    request                                      // 원래 사용하던 request
	                                  , path                                         // 파일 첨부 경로 
	                                  , 1024 * 1024 * 50                             // 1024kB = 1MB -> 50MB 첨부파일의 최대 크기     
	                                  , "UTF-8"                                      // 인코딩
	                                  , new DefaultFileRenamePolicy());              //  기본 파일 이름바꾸기 처리/파일 이름이 중복되는 경우 첨부파일의 이름을 바꾸는 정책(파일명 뒤에 번호를 붙인다. )
	  
	  // 요청 파라미터 (HttpServletRequwst 대신 MultipartRequest mr 을 이용한다. )
	  String uploader = mr.getParameter("uploader");
	  
	  // 첨부파일
	  String originName = mr.getOriginalFileName("attach");  //첨부파일명
	  String filesystemName = mr.getFilesystemName("attach");  // 저장된 첨부 파일명
	  
	  File attach = mr.getFile("attach");
	  String name = attach.getName(); //첨부 파일 명
	  String parent = attach.getParent(); //첨부파일 저장 디렉터리
	  // String path = attach.getPath(); // 첨부파일 저장 디렉터리  +  첨부 파일명
	  
	  String lastModified = new SimpleDateFormat("yyyy-MM-dd").format(attach.lastModified());
	  String size = new DecimalFormat("#,##0").format(attach.length() /1024 +(attach.length() % 1024 == 0 ? 0 : 1));
	    
	  // 응답
	  response.setContentType("text/html; charset=UTF-8");
	  PrintWriter out = response.getWriter();
	  
	  out.print("<ul>");
	  out.print("<li>업로더:" + uploader + "</li>");
	  out.print("<li>첨부파일명"+ originName + "</li>");
	  out.print("<li>저장된 첨부 파일명:" + name + "</li>");
	  out.print("<li>저장된 첨부 파일명:" + filesystemName + "</li>");
	  out.print("<li>저장된 디렉터리: " + parent + "</li>");
	  out.print("<li>최종수정일: " + lastModified + "</li>");
	  out.print("<li>파일 크기: " + size + "KB</li>");
	  out.print("</ul>");
	  out.print("<hr>");
	  //이곳에 첨부된 모든 파일의 목록을 보여주세요 
	  
	  File [] attaches = dir.listFiles();
    for(int i = 0; i < attaches.length; i++) {
      out.println("<div><a href=\"/servlet/download?path="+ URLEncoder.encode(attaches[i].getPath(),"UTF-8") +"\">" + attaches[i].getName() + "</a></div>");
    }
    
    out.flush();
    out.close();
	  
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

download

package ex09_up_down;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;

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

/**
 * Servlet implementation class Download
 */
@WebServlet("/download")
public class Download extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Download() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	  // 요청인코딩
	  request.setCharacterEncoding("UTF-8");
	  
	  //요청 파라미터(다운로드 할 파일명)
	  String path =URLDecoder.decode(request.getParameter("path"),"UTF-8");
	  
	  // 다운로드할 파일의 File 객체 생성
	  File file = new File(path); // new File("C:/storage/404.jpg")
	  
	  // 다운로드 할 파일을 읽어 들일 바이트 기반 입력 스트림 생성
	  BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
	  
	  // 다운로드용 응답을 만드려면 응답 헤더값 "Content-Disposition"에 "attachment" 값을 저장해야 한다. 
	  response.setHeader("Content-Disposition", "attachment"); //다운로드 할때 파일 저장 대화상자가 나타난다.
	  response.setHeader("Content-Disposition", "attachment; filename=" + path.substring(path.lastIndexOf("\\") + 1)); //파일 설정을 안해도 된다. 다운로드 할때 작어한 filename으로 바로 저장된다.
	  
	  // 바이크 기반 응답 출력 스트림 생성
	  BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
	 
	  // 첨부 파일 읽기 -> byte[] -> 응답 출력 스트림
	  //         in                          out
	  //        read()                      write()
	  byte[] b = new byte[1024];              // 1024 바이트 단위로 읽기 
	  int readByte = 0;                      //실제로 읽은 바이트 수
	  while((readByte = in.read(b)) != -1) { //모두 읽으면 더 이상 읽은 내용이 없으면 -1이 반환
	    out.write(b, 0, readByte);           // 읽은 바이트만큼만 내보내기 
	  }
	  
	  // 사용한 스트림 닫기
	  out.close();
	  in.close();	  	 	  	  
	}
    
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

profile
백엔드 준비생의 막 블로그

0개의 댓글