- 하루 정리 -
- Servlet 복습 및 정리 (쿠키, 파일 업로드)
- 세미프로젝트 회의(디스코드)
- 질문 사항 -
> ServletContext : 클라이언트가 요청한 컨텍스트 정보를 저장한 인스턴스 / ServletConfig : 컨텍스트 관련 환경정보를 저장한 인스턴스의 차이?
=> 단어 뜻 그대로 이해하면 됨, WAS가 만들어주고 get메소드로 컨텍스트 인스턴스를 가져와서 사용함.
> 팀프로젝트에서 HTML파일이 깨지는 경우가 많은데 어떡할지?
=> 웹페이지 자체 크롤링 막아놓음. 웹 페이지에서 소스보기로 가져오는 방법.
> (SVN) 여러명이 같은 페이지를 코딩했는데 커밋하고 다른 사람 update로 이어 받아서 또
커밋했고 3번째인 나는 두번 이상 리버전 넘버가 거쳐진 상태에서 커밋했는데 에러 발생? (Override Commit도 안됨)
=> 백업 후 체크아웃이 속 편함. 두번 이상은 꼬인다! (Oh's official)
> 서버 웹 디렉토리에 저장된 컨텍스트는 사라지지 않는가?
=> 내가 수동으로 지우면 되지만 굳이? 웹 자원 자체가 차지하는 메모리는 생각보다 적다. 클라이언트가 서버 요청 시 자원을 제공하여 사용하기 때문에 그때부터 메모리가 사용됨. (대형 서버 접속 시 클라이언트 접속 분산 개념의 이유 설명) 서버는 자원 자체를 제공하기만 할뿐 클라이언트는 자원을 제공받아 사용. 메모리 사용량보다 접속량이 많아질 때가 근본적인 문제임.
- 오늘 공부 내용 -
Servlet
- 입력 스트림 중요
- HTML에서 서블릿 src로 요청 가능
- 서블릿은 WAS에 의해 프로젝트들을 웹 자원으로 만든다
- 검색량은 2kb 약 2천자로 제한
- 입력값에 대한 검증은 브라우저에서 하지만 서버에서도 해야된다는게 법 (보안상 권장)
- 비정상적인 접근은 에러페이지 출력이나 location 객체 이용
- 파일을 얻어오는것은 순수한 원시데이타로 얻어오기 때문에 문자열로 얻어오는건 불가능.
- 파일을 입력받아 서버에 저장 - upload
- 파일을 받아 클라이언트가 갖고 감 - download
- 입력페이지에서 전달된 멀티파트 폼데이타를 처리하기 위한 클래스를 사용하여 서블릿 작성 // => Apache 그룹에서 배포한 commons-fileupload 라이브러리의 클래스 사용 - 선택적 파일 업로드 (어렵다 고급자용) // => Oreilly 그룹에서 배포한 cos 라이브러리의 클래스 사용 - 무조건 파일 업로드 (검증 자체가 불가능함)
- 폴더 : 윈도우의 논리적인 공간
- 디렉토리 : 유닉스.맥의 물리적인 공간 (파일 개념)
- 인터페이스 객체 생성 불가 ⇒ 상속받는 클래스로 객체를 생성하는 방법
- 서버 리로드 후 웹 디렉토리 파일 삭제되는 걸 방지하려면 차라리 워크스페이스 파일을 저장해라
Cookie
- 클라이언트와 서버의 연결의 지속성을 유지하기 위해
> 전달 되는 값이 여러개인 경우?
//HttpServletRequest.getParameterValues(String name) : 같은 이름으로 전달되는 모든 값들을
//얻어와 문자열 배열로 반환하는 메소드
// => 다중 선택 기능의 입력태그(checkbox, select 등)로 전달된 값을 반환받을 때 사용
String[] hobby=request.getParameterValues("hobby");
> 파일 업로드 형식은 multipart/form-data 형식을 이용하라!
<!-- 사용자로부터 파일을 입력받아 웹프로그램을 요청하여 전달하기 위해서는 반드시 method
속성값을 [POST]로 설정하고 enctype 속성값을 [multipart/form-data]로 설정 -->
<!-- enctype 속성 : [application/x-www-form-urlencoded] 또는 [multipart/form-data] 중 하나를 속성값으로 설정 -->
<!-- => [application/x-www-form-urlencoded] : 입력값을 인코딩 처리된 문자값으로 전달(기본) - 파일 전달 불가능 -->
<!-- => [multipart/form-data] : 모든 입력값을 원시데이타(멀티파트 폼데이타)로 전달 - 파일 전달 가능 -->
<form action="view.itwill" method="post" enctype="multipart/form-data">
> 파일을 반환받아 전달하는 서블릿 출력시 전달된 값에 대하여 캐릭터 셋을 변경해줘야함!
//POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋 변경
request.setCharacterEncoding("utf-8");
> 멀티파트 폼데이타는 request 메시지의 입력스트림을 사용하여 반환받아 사용!
InputStreamReader in=new InputStreamReader(request.getInputStream(), "utf-8");
> 비정상적인 요청에 대한 처리
if(request.getMethod().equals("GET")) {
response.sendRedirect("file_upload.html");
return;
}
=> 겟 방식 요청 시 파일업로드 페이지로 되돌려 보냄
> 전달된 파일을 저장하기 위한 서버 디렉토리의 시스템 경로를 반환받아 저장
=> 작업 디렉토리(WorkSpace)가 아닌 웹디렉토리(WebApps)의 시스템 경로 반환
> 주의)WAS 프로그램 시작시 작업 디렉토리의 프로젝트가 웹디렉토리에 동기화 처리되어 컨텍스트로 변환
=> 작업 디렉토리에는 업로드 파일이 없으므로 동기화 처리될 때 웹디렉토리의 업로드 파일이 삭제
String saveDirectory=request.getServletContext().getRealPath("/upload");
MultipartRequest 클래스로 인스턴스 생성
=> MultipartRequest : 멀티파트 폼데이타를 처리하기 위한 기능을 제공하는 인스턴스
=> MultipartRequest 인스턴스를 생성하면 모든 입력파일을 전달받아 서버 디렉토리에 저장
MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize
, String encoding, FileRenamePolicy policy)
=> request : 요청정보를 저장한 HttpServletRequest 인스턴스 전달
=> saveDirectory : 전달 파일을 저장하기 위한 서버 디렉토리의 시스템 경로 전달
=> maxPostSize : 처리 가능한 멀티파트 폼데이타의 크기 단위 - 단위 : Byte
=> encoding : 멀티파트 폼데이타에 저장된 전달값의 캐릭터셋 전달
=> policy : FileRenamePolicy 인스턴스 전달
FileRenamePolicy : 파일 업로드 처리시 입력파일과 같은 이름이 파일이 업로드 되는
서버 디렉토리에 이미 존재할 경우 전달파일의 이름을 자동으로 변경하는 인스턴스
=> FileRenamePolicy 인스턴스를 매개변수에 전달하지 않으면 기존 파일을 전달파일로 덮어씌우기(OverWrite)
//서버 디렉토리에 저장된 파일명과 동일한 파일명의 입력파일을 전달할 경우 파일명을 변경하여
//저장하기 위해 FileRenamePolicy 인터페이스를 상속받은 자식클래스로 FileRenamePolicy
//인스턴스를 생성하여 MultipartRequest 생성자의 매개변수에 전달
//DefaultFileRenamePolicy : FileRenamePolicy 인터페이스를 상속받은 자식클래스
// => 입력파일명 뒤에 숫자를 붙여 자동으로 변경하는 기능을 제공
MultipartRequest mr=new MultipartRequest(request, saveDirectory
, 20*1024*1024, "utf-8", new DefaultFileRenamePolicy());
> 입력 파일명과 실제 서버 디렉토리에 저장된 파일명을 가져오는 메소드
//입력파일명을 반환받아 저장
//MultipartRequest.getOriginalFileName(String name) : 멀티파트 폼데이타에 저장된 전달파일명을 반환하는 메소드
//String fileone=mr.getOriginalFileName("fileone");
//String filetwo=mr.getOriginalFileName("filetwo");
//MultipartRequest.getFilesystemName(String name) : 서버 디렉토리에 저장된 업로드 파일명을 반환하는 메소드
String fileone=mr.getFilesystemName("fileone");
String filetwo=mr.getFilesystemName("filetwo");
> 쿠키(Cookie) : 서버(웹프로그램)와 클라이언트와의 연결 지속성을 제공하기 위한 클라이언트에
저장하는 값 - 쿠키는 접속 서버 정보를 이름(식별자)으로 클라이언트에 저장
//Cookie 클래스로 인스턴스 생성
// => Cookie : 쿠키 정보를 저장한 인스턴스
//Cookie(String name, String value) : 쿠키명과 쿠키값을 전달하여 인스턴스를 생성하는 생성자
// => 쿠키명 : 쿠키값을 제공받기 위한 식별자
// => 쿠키명과 쿠키값은 영문자, 숫자, 일부 특수문자만 사용하여 저장 가능
Cookie idCookie=new Cookie("id", "abc123");
Cookie countCookie=new Cookie("count", "0");
> 저장될 쿠키의 유지시간 변경 가능 기본값은 -1로 브라우저 종료시 자동 소멸!
countCookie.setMaxAge(24*60*60);//쿠키 유지시간을 1일로 변경
> 쿠키를 클라이언트에게 전달
//쿠키를 클라이언트에 전달 - 클라이언트은 전달받은 쿠키를 저장
// => 유지시간을 변경하지 않은 쿠키는 브라우저 메모리에 저장
// => 유지시간을 변경한 쿠키는 쿠키 파일에 저장
//HttpServletResponse.addCookie(Cookie cookie) : 클라이언트에게 쿠키를 전달하는 메소드
response.addCookie(idCookie);
response.addCookie(countCookie);
> 클라이언트에서 전달된 모든 쿠키를 반환받아 저장
// HttpServletRequest.getCookies() : 클라이언트에서 전달된 모든 쿠키를 Cookie 배열로 반환하는 메소드
Cookie[] cookies = request.getCookies();
- 세미 팀플 -
> 금요일까지 각 화면 정의서 완성!
> 페이지 선택 완료
> 각 파트별로 HTML 알아오기 - 깨진 파일은 웹 페이지 소스보기
- 스터디 내용 및 결과 -
> 파일 업로드의 개념 확실히.
> 쿠키의 개념과 읽는 방식 확실히.
'레거시' 카테고리의 다른 글
2022.1.10의 기록 (0) | 2022.01.11 |
---|---|
2022.1.7의 기록 (0) | 2022.01.07 |
2021.1.5 (0) | 2022.01.05 |
2021.1.4의 기록 (0) | 2022.01.04 |
2022.1.3의 기록 (0) | 2022.01.03 |