JSP 놓친 정리를 해보자.
빠뜨린 것들 먼저 추가!
*servlet으로 특정 위치에 있는 이미지 파일의 이름들을 html의 select > option으로 출력하고 submit 버튼을 눌렀을 때 해당 이름의 이미지가 뜨도록 하기.*
1) 특정 위치(d:/contents/images/)에 있는 이미지 파일의 이름들을 html의 select > option으로 출력하는 servlet
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageList extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//list로 받을 파일들이 있는 경로 설정.
String dataDirectory = "d:/contents/images/";
//list로 file list를 받기 위해 File 객체 생성
File dir = new File(dataDirectory);
//해당 경로에 있는 파일들의 배열 생성
String[] filesInDir=dir.list();
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html>"
+ "<head>"
+ "<meta charset=\"UTF-8\">"
+ "<title>Insert title here</title>"
+ "</head>"
+ "<body>"
+ "<h1>🎇🎇🎇🎇파일 선택하기🎇🎇🎇🎇</h1>"
+ "<form action=\""+req.getContextPath()+"/ImageServlet\">"
+ "<select name=\"fileName\">");
for(String str:filesInDir) {
out.println("<option value=\""+str+"\">"+str+"</option>");
}
out.println("<input type=\"submit\" value=\"선택\">"
+ "</form>"
+ "</body>"
+ "</html>");
out.close();
}
}
2) 선택한 이미지 파일의 이름을 parameter로 받아 이미지를 출력하는 servlet
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 파라미터로 파일의 이름 받기.
String imageName = req.getParameter("fileName");
//해당 파일 이름의 mimetype을 알아내기
String mime= getServletContext().getMimeType(imageName);
//response의 contentType을 mime변수로 받아놓은 타입으로 설정.
resp.setContentType(mime);
//이미지 파일이 있는 경로
String imageFolder = "D:/contents/images";
//imageFolder 경로의 imageName라는 이름을 가진 file 객체 생성.
File imageFile = new File(imageFolder, imageName);
//이미지를 출력하기 위한 buffer 배열 생성
byte[] buffer = new byte[1024];
//buffer로 읽어온 데이터를 담을 변수 length
int length = -1;
//이미지를 읽기 위한 스트림 생성
FileInputStream fis = new FileInputStream(imageFile);
//이미지를 출력하기위한 스트림 생성
OutputStream os = resp.getOutputStream();
//length에 담긴 값이 -1이 아닐 동안 (=buffer 단위로 fis를 이용해 읽어온 값이 있을 때)
while((length=fis.read(buffer))!=-1){
//시작점을 0부터 length만큼 buffer의 내용을 출력한다.
os.write(buffer,0,length);
}
fis.close();
os.close();
}
}
*Stream을 이용한 IO*
- Stream?
연속성을 지닌 일련의 데이터 집합이면서 동시에 데이터를 읽거나 쓰기 위한 단방향(***) 통로(읽기만 혹은 쓰기만 가능) - Stream을 사용한 IO 단계
- media(매체)를 어플리케이션에서 제어할 수 있는 객체의 형태로 생성
ex) new File(filesystem Path), k socket,memory - 1차 스트림을 매체에 연결
ex) new FileInputSrtream(file) - 2차 스트림을 1차 스트림에 연결(필요에 따라)
ex) new BufferedInputStream(inputStream) - EOF(EOS,-1,null)까지 반복적인 read / out
- close (?자원 반환)
- media(매체)를 어플리케이션에서 제어할 수 있는 객체의 형태로 생성
- Stream의 종류
- 전송 데이터 크기
- 1byte의 byte Stream (~~Stream)
- FileInputStream / FileOutputStream
- SocketInputStream / SocketOutputStream
- ByteArrayInputStream / ByteArrayOutputStream
- 2byte의 Character Stream (~~Reader/Writer)
- FileReader / FileWriter
- 1byte의 byte Stream (~~Stream)
- stream 생성 방법에 따라
- 1차 Stream
- 2차 Stream(연결형 스트림)
- BufferedReader(readLine() 한 줄을 모두 읽음)
- FilteredStream: DataInputStream
- ObjectInput[output]Stream: serializable 객체 직렬화/ 역직렬화 스트림
- 전송 데이터 크기
JSP: 웹상에서 랜더링할 웹 페이지를 생성하기 위한 스펙, script, 토큰의 종류가 여러 가지.
*표준 JSP 구성 요소*
- 정적 텍스트
- HTML, CSS, JS, text
- Scriptlet (JSP페이지에서 자바 코드를 실행할 때 사용되는 코드의 블록)
- directive(지시자): JSP 페이지에 대한 기본 설정 정보(page - required) <%@ %>
- include: 정적 내포
- taglib: 커스텀 태그 로딩 - scriptlet: <% %>
- expression(표현식) <%=출력할 값이나 연산식 %>
- declasration(선언부) <%! %>
- comment(주석 )<%-- --%>
- client side comment: HTML, CSS, JS => <!-- HTML comment -->
- server side comment: Java, JSP => <%-- JSO comment 브라우저에서 소스 보기로는 보이지 않음 --%>
- directive(지시자): JSP 페이지에 대한 기본 설정 정보(page - required) <%@ %>
서블릿 : 웹 상의 요청을 받고 그에 대한 응답을 생성할 수 있는 객체가 가져야하는 조건들에 대한 명세서(Spec)
->HttpServlet Spec 명세는 일종의 구현 규칙, 조건 정도가 될 듯.
개발 단계
1. HttpServlet 스펙 상속
2. Compile->classpath에 위치
3. 서블릿 컨테이너에 등록
1)servlet 2.x: web.xml에 servlet 엘리먼트로 등록
2) servlet 3.x: @WebServlet으로 등록
4. 서블릿 매핑 등록
1) servlet 2.x: web.xml에 servlet-mapping으로 등록
2) servlet 3.x: @WebServlet(urlPatterns) 등록
5. Container 재구동.
Servlet Container?
= 서블릿의 생명주기 관리자. 서블릿이라는 객체들을 담고있는 저장소?라고 보면 될 듯.
= 생명주기 내에서 호출되는 callback을 정의함
=>callback: 어떤 특정한 이벤트가 발생했을 때 시스템 내부적으로 자동 호출되는 구조.
직접적으로 부르지 않았으나 doGet, doPost, service 등의 메소드가 실행되는 것.
= 생성: init, 특별한 설정이 없는 한 해당 서블릿을 대상으로 최초의 요청이 발생하면 객체가 생성됨.
생성 시점에 parameter(String) 넘길 수 있는 구조를 가짐.
서블릿을 싱글톤(singleton)의 형태로 관리한다.
= 요청:
- service: 현재 요청의 http method를 판단하고, 해당 method callback을 호출함.
- doXXX: service에 의해 호출되는 hook 메소드로, 특정 http method 하나를 처리하는 메소드.
= 소멸: destroy 서블릿 스펙에서 제공되는 객체
1. HttpServlet: 서블릿 스펙의 코드화
2. HttpServlet Request: 하나의 요청에 대한 정보를 캡슐화한 객체. Stateless 방식으로 동작.
- 요청이 발생할 때 생성, 1:1...?
3. HttpServlet Response: 응답으로 전송될 정보를 캡슐화한 객체
4. HttpSession: 한 클라이언트의 하나의 브라우저를 이용한 경우 생성되는 세션에 대한 정보를 캡슐화한 객체.
- 사람을 대상으로 하는 것이 아닌 브라우저를 대상으로 생성됨.
5. ServletContext: 서버(WAS, Servlet Container)와 특정 context의 정보를 캡슐화한 객체.
하나의 context(application)당 싱글턴 객체의 형태로 관리
6. ServletConfig: 하나의 서블릿 객체당 하나씩 운영되는 객체로 해당 서블릿이 등록될 때 설정정보를 가진 객체
Model1 vs Model2
Model1 : 서블릿이나 JSP 객체 하나로 요청과 응답이 모두 처리되는 구조.
Model2 : 요청을 전담하는 Controller(Servlet)와
응답을 전담하는 View (JSP) 레이어가
하나의 명령을 처리하는 과정에서 사용되는 구조.
Controller 의 역할
1. 요청을 받아야 한다.
2. 해당 요청을 분석한다.
3. 그에 맞는 데이터를 생성한다. (응답데이터에 포함시켜야 하는 데이터) -> setAttribute
4. 뷰 레이어를 선택한다.
5. 해당 뷰 레이어로 데이터를 이동시킨다.
View 역할 (TMPL)
1. 데이터를 확보한다. -> getAttribute()
2. UI를 구성한다. (HTML Source 형태)
정리 못한 것들이 너모 많고,,, 정보처리기사 실기 준비도 해야하는데,,, 그냥 빠르게 포기하는 게 나으려나,,, ;ㅅ; 치킨값 버릴 것 같은데.....ㅜㅜ