package kr.or.ddit.servlet02;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* E://contents/cat1.jpg 파일을 중계하는 서블릿.
* 이미지 파일을 읽고(input),
* stream copy
* 스트리밍 컨텐츠로 출력(output)
* Content-Type(MIME) 설정 필요.
* 1. source 확보 (E://contents/cat1.jpg)
* 2. source대상 input 스트림 개방
* FileInputStream
* 3. destination 확보 (response)
* 4. dest 대상 output 스트림 개방
* response.getOutputStream
* 5. in/out stream copy
*
*
*/
/**
* 서버측에서 클라이언트의 요청을 처리할때 주의할 점.
* ** 클라이언트의 모든 요청 데이터에 대해 검증이 필요함.
* 1) 요청 파라미터
* 2) 요청 헤더
* 3) 요청 데이터에 의해 파생되는 데이터
*/
@WebServlet("/02/streaming.do") // URI
public class ImageStreamingServlet extends HttpServlet {
// ServletContext는 한 어플리케이션 내에서 싱글톤으로 관리됨
private ServletContext application; //ServletContext는 어플리케이션 전체에서 싱글톤 객체. 몇 번 꺼내든 모두 동일
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
application = getServletContext();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String folderPath = "D:\\contents";
File folder = new File(folderPath);
String imageName = req.getParameter("image");
if(imageName==null|| imageName.isEmpty() ) {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "필수 파라미터 누락");
return;
}
File image = new File(folder, imageName);
if(!image.exists()) {
resp.sendError(HttpServletResponse.SC_NOT_FOUND, "해당파일은 존재하지 않음");
return;
}
String mime = application.getMimeType(image.getName());
resp.setContentType(mime);
FileInputStream fis = new FileInputStream(image);
//앞에 슬러시 있으면 절대경로 없으면 상대경로라고 부른다
OutputStream os = resp.getOutputStream();
byte[] buffer = new byte[1024];
int length = -1;
while((length = fis.read(buffer)) != -1) {
os.write(buffer, 0, length);
}
fis.close();
os.close();
}
}
<%@page import="java.util.LinkedHashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- View 역할? -->
<!-- 1) UI 생성 : (model 확보, Controller가 사용한 scope에 저장된 model) -->
<!-- 2) 응답 전송 -->
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"></script>
</head>
<body>
<%
StringBuffer options = (StringBuffer) request.getAttribute("options");
%>
<h4>이미지 선택</h4>
<form action="<%=request.getContextPath() %>/02/streaming.do"
id=imageForm>
<!--이주소로 매핑걸려있는 서블릿필요 -->
<select name="image">
<%=options %>
</select> <input type="submit" value="전송">
</form>
<div id="imageArea"></div>
<script>
let selectTag = $("select[name='image']").on("change",function(){
$(this.form).trigger("submit");
$(this.form).submit();
});
let imageArea = $("#imageArea");
const SRCPTRN = "<%=request.getContextPath() %>/02/streaming.do?image=%v";
$("#imageForm").on("submit", function(event){
event.preventDefault();
//<img src="./streaming.do?image=%v"/>
let imageName = $(this.image).val();
let imgTag = $("<img>").attr("src", SRCPTRN.replace("%v", imageName));
imageArea.html(imgTag);
return false;
});
</script>
</body>
</html>
package kr.or.ddit.servlet03;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Model2 + MVC
* Controller 역할 ?
* 1) request 수령(command 수령).
* 2) 처리 -> 결과 데이터(Model)
* 3) model을 view로 전달(공유, controller와 view가 같은 model을 공유함)
* 4) view로 이동.
*/
@WebServlet("/03/model2ImageForm.do")
public class Model2ImageFormServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext application = getServletContext();
String folderPath ="D:\\contents";
File folder = new File(folderPath);
File[] children = folder.listFiles((dir,name)->{
String mime = application.getMimeType(name);//지정한 파일의 MIME 타입을 return
return mime!=null && mime.startsWith("image/");
});
String pattern = "<option>%s</option>";
StringBuffer options = new StringBuffer();
for(File tmp : children) {
options.append(String.format(pattern,tmp.getName()));
}
req.setAttribute("options", options);
String view ="/WEB-INF/views/imageStreamingView.jsp";
req.getRequestDispatcher(view).forward(req, resp);
}
}
>> Model2ImageFormServlet 실행
>> req.getRequestDispatcher로 인해 imageStreamingVeiw.jsp로 이동
>> action="<%=request.getContextPath() %>/02/streaming.do 으로 인해 streaming.do로 이동해 이미지 가공처리
'대덕공부 > Spring' 카테고리의 다른 글
get방식 vs post방식 참고** (0) | 2022.06.08 |
---|---|
Header && Enumeration (0) | 2022.06.08 |
Servlet - 생명주기 (0) | 2022.06.02 |
WAS에 서블릿 등록 (0) | 2022.06.02 |
서블릿과 서블릿컨테이너 (0) | 2022.06.02 |