카테고리 없음

JSP 놓친 정리를 해보자.

Empty_Bottle 2022. 9. 8. 20:56

빠뜨린 것들 먼저 추가!

 

*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 단계
    1. media(매체)를 어플리케이션에서 제어할 수 있는 객체의 형태로 생성
      ex) new File(filesystem Path), k   socket,memory
    2. 1차 스트림을 매체에 연결
      ex) new FileInputSrtream(file)
    3. 2차 스트림을 1차 스트림에 연결(필요에 따라)
      ex) new BufferedInputStream(inputStream)
    4. EOF(EOS,-1,null)까지 반복적인 read / out
    5. close (?자원 반환)
  • Stream의 종류
    1. 전송 데이터 크기
      • 1byte의 byte Stream (~~Stream)
        • FileInputStream / FileOutputStream
        • SocketInputStream / SocketOutputStream
        • ByteArrayInputStream / ByteArrayOutputStream
      • 2byte의 Character Stream (~~Reader/Writer)
        • FileReader / FileWriter
    2. stream 생성 방법에 따라
      • 1차 Stream
      • 2차 Stream(연결형 스트림)
        • BufferedReader(readLine() 한 줄을 모두 읽음)
        • FilteredStream: DataInputStream
        • ObjectInput[output]Stream: serializable 객체 직렬화/ 역직렬화 스트림

JSP: 웹상에서 랜더링할 웹 페이지를 생성하기 위한 스펙, script, 토큰의 종류가 여러 가지.

*표준 JSP 구성 요소*

  • 정적 텍스트
    • HTML, CSS, JS, text
  • Scriptlet (JSP페이지에서 자바 코드를 실행할 때 사용되는 코드의 블록)
    1. directive(지시자): JSP 페이지에 대한 기본 설정 정보(page - required) <%@  %>
      - include: 정적 내포
      - taglib: 커스텀 태그 로딩
    2. scriptlet: <% %>
    3. expression(표현식) <%=출력할 값이나 연산식 %>
    4. declasration(선언부) <%! %>
    5. comment(주석 )<%-- --%>
      - client side comment: HTML, CSS, JS    =>  <!-- HTML comment -->
      - server side comment: Java, JSP  =>  <%-- JSO comment 브라우저에서 소스 보기로는 보이지 않음 --%>

서블릿 : 웹 상의 요청을 받고 그에 대한 응답을 생성할 수 있는 객체가 가져야하는 조건들에 대한 명세서(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 형태)

 


정리 못한 것들이 너모 많고,,, 정보처리기사 실기 준비도 해야하는데,,, 그냥 빠르게 포기하는 게 나으려나,,, ;ㅅ; 치킨값 버릴 것 같은데.....ㅜㅜ