23.03.24(Jsp)

MH S·2023년 3월 24일
0

Jsp

목록 보기
9/16

파일 전송

cos.jar 사용

http://servlets.com/

라이브러리 추가 후 코드 작성

ch13/fileSelect.jsp

<!-- ch13/fileSelect.jsp -->
<%@page contentType="text/html; charset=UTF-8"%>
<form method="post" enctype="multipart/form-data" action="viewPage.jsp">
user: <input name = "user" value="홍길동"><br>
user: <input name = "title" value="파일업로드"><br>
file: <input type="file" name="myfile" value="upload"><br>
<input type="submit" value="파일전송">
</form>

viewPage.jsp

<!-- ch13/viewPage.jsp -->
<%@page import="java.io.File"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
	// 업로드 파일 저장 위치		
	final String SAVEFOLDER = "C:/Jsp/myapp/src/main/webapp/ch13/storage/";
	// 업로드 파일명 인코딩
	final String ENCODING = "UTF-8";
	// 업로드 파일 크기
	final int MAXSIZE = 1024*1024*20; // 20MB 
	try{
		MultipartRequest multi = 
				new MultipartRequest(request, SAVEFOLDER, 
						MAXSIZE, ENCODING, new DefaultFileRenamePolicy());
		String user = multi.getParameter("user");
		String title = multi.getParameter("title");
		String fileName = multi.getFilesystemName("myfile");
		String fileType = multi.getContentType("myfile");
		// 파일정보
		File f = multi.getFile("myfile");
		long len  = 0;
		if(f!=null)
			len = f.length();
		out.println("user : " + user + "<br>");
		out.println("title : " + title + "<br>");
		out.println("파일명 : " + fileName + "<br>");
		out.println("파일타입 : " + fileType + "<br>");
		out.println("파일크기 : " + len + "byte");
	}catch(Exception e){
		e.printStackTrace();
	}
%>


window -> preferences refresh 체크 되어있는지 확인

결과화면




동일한 파일이 업로드가 될 경우 파일명 뒤에 1,2,3.. 이 붙음



파일업로드 및 삭제 다운로드 DB연동

table.sql

create table tblFileload(
 num int primary key auto_increment,
 upFile char(50) not null,
 size int default 0
)COLLATE='euckr_korean_ci';

mydb2 에 테이블 생성

FileloadBean.java

package ch13;

public class FileloadBean {
	private int num;
	private String upFile;
	private int size;
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getUpFile() {
		return upFile;
	}
	public void setUpFile(String upFile) {
		this.upFile = upFile;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	
}

FileloadMgr.java

package ch13;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;

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

public class FileloadMgr {
	private DBConnectionMgr pool;
	// 업로드 파일 저장 위치
	public static final String SAVEFOLDER = "C:/Jsp/myapp/src/main/webapp/ch13/storage/";
	// 업로드 파일명 인코딩
	public static final String ENCODING = "UTF-8";
	// 업로드 파일 크기
	public static final int MAXSIZE = 1024 * 1024 * 20; // 20MB

	public FileloadMgr() {
		pool = DBConnectionMgr.getInstance();
	}

	// file save
	public void uploadFile(HttpServletRequest req) {
		Connection con = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
			MultipartRequest multi = new MultipartRequest(req, SAVEFOLDER, MAXSIZE, ENCODING,
					new DefaultFileRenamePolicy());
			String upFile = multi.getFilesystemName("upFile");
			// multi.getOriginalFileName(upFile);
			File f = multi.getFile("upFile");
			long size = f.length();
			con = pool.getConnection();
			sql = "insert tblFileload(upFile,size) values(?,?)";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, upFile);
			pstmt.setLong(2, size);
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pool.freeConnection(con, pstmt);
		}
		return;
	}

	// file list
	public Vector<FileloadBean> listFile() {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		Vector<FileloadBean> vlist = new Vector<>();
		try {
			con = pool.getConnection();
			sql = "select * from tblfileload";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while (rs.next()) {
				FileloadBean bean = new FileloadBean();
				bean.setNum(rs.getInt(1));
				bean.setUpFile(rs.getString(2));
				bean.setSize(rs.getInt(3));
				vlist.add(bean);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pool.freeConnection(con, pstmt, rs);
		}
		return vlist;
	}

	// file delete : multi delete
	public void deleteFile(int num[]) {
		Connection con = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
			con = pool.getConnection();
			for (int i = 0; i < num.length; i++) {
				// table 삭제 및 파일 삭제 
				String upFile = getFile(num[i]);
				File f = new File(SAVEFOLDER+upFile);
				if(f.exists()) // 파일이 존재한다면 
					f.delete(); // 파일 삭제
				sql = "delete from tblfileload where num = ?";
				pstmt = con.prepareStatement(sql);
				pstmt.setInt(1, num[i]);
				pstmt.executeUpdate();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pool.freeConnection(con, pstmt);
		}
	}
	
	// file information
	public String getFile(int num) {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		String upFile = null;
		try {
			con = pool.getConnection();
			sql = "select upFile from tblfileload where num = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, num);
			rs = pstmt.executeQuery();
			if(rs.next())
				upFile = rs.getString(1);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			pool.freeConnection(con, pstmt, rs);
		}
		return upFile;
	}
}

참고

getOriginalFileName();
업로드되는 파일에서 확장자를 포함한 파일의 이름을 반환

같은 파일을 업로드시 파일명을 각각 지정하기 위해 원본 파일명을 저장하기 위해 사용하는 메소드

fupload.jsp

<!-- fupload.jsp -->
<%@page contentType="text/html; charset=UTF-8"%>
<!doctype html>
<html>
<head>
<link href="style.css" rel="stylesheet" type="text/css">
<script>
	function check() {
		frm = document.forms[0];
		if(frm.upFile.value==0){
			alert("파일을 선택하세요.");
			return ;
		}
		frm.submit();
	}
</script>
</head>
<body>
<div align="center">
<h2>File Upload</h2>
<form method="post" action="fuploadProc.jsp?flag=update" 
enctype="multipart/form-data" >
<table border="1">
 <tr>
 	<td>파일선택</td>
 	<td><input type="file" name="upFile"></td>
 </tr>
 <tr>
 	<td colspan="2">
 		<input type="button" value="파일업로드" onclick="check()">
 	</td>
 </tr>
</table>
</form>
<a href="flist.jsp">파일리스트</a>
</div>
</body>
</html>

fuploadProc.jsp

<!-- fuploadProc.jsp -->
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch13.FileloadMgr"/>
<%
	String flag = request.getParameter("flag");
	mgr.uploadFile(request);
	response.sendRedirect("flist.jsp");
	
%>

flist.jsp

<!-- flist.jsp -->
<%@page import="java.net.URLEncoder"%>
<%@page import="ch13.UtilMgr"%>
<%@page import="ch13.FileloadBean"%>
<%@page import="java.util.Vector"%>
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch13.FileloadMgr"/>
<%
	Vector<FileloadBean> vlist = mgr.listFile();
%>
<!doctype html>
<html>
<head>
<link href="style.css" rel="stylesheet" type="text/css">
<script>
	function allChk() {
		f = document.frm;
		if(f.allCh.checked){
			for(i=1;i<f.fch.length;i++){
				f.fch[i].checked = true;
			}
			f.btn.disabled = false; // 버튼의 활성화
			f.btn.style.color = "blue";
		}else{
			for(i=1;i<f.fch.length;i++){
				f.fch[i].checked = false;
			}
			f.btn.disabled = true; // 버튼의 비활성화
			f.btn.style.color = "gray";
		}
	}
	
	function chk() {
		f = document.frm;
		for(i=1;i<f.fch.length;i++){
			if(f.fch[i].checked){
				f.btn.disabled = false; // 버튼의 비활성화
				f.btn.style.color = "blue";
				return ;
			} // --if
		}
		f.allCh.checkd=false;
		f.btn.disabled=true;
		f.btn.style.color = "gray";
	}
	
	function down(file) {
		//alert(file);
		document.downFrm.upFile.value=file;
		document.downFrm.submit();
	}
</script>
</head>
<body>
<div align="center">
<h2>File List</h2>
<form name="frm" action="fdeleteProc.jsp">
<input type="hidden" name="fch" value="0">
<table border="1" width="300">
	<tr align="center">
		<td><input type="checkbox" name="allCh" onclick="allChk()"></td>
		<td width="30">번호</td>
		<td>파일명</td>
		<td>파일크기</td>
	</tr>
	<%
		for(int i=0;i<vlist.size();i++){
			FileloadBean bean = vlist.get(i);
			int num = bean.getNum();
			String upFile = bean.getUpFile();
			int size = bean.getSize();	
	%>
	<tr align="center">
		<td><input type="checkbox" name="fch" onclick="chk()" value ="<%=num%>"></td>
		<td><%=i+1%></td>
		<td>
		<%-- <a href="storage/<%=URLEncoder.encode(upFile)%>"
		download><%=upFile%></a> --%>
		<a href="javascript:down('<%=upFile%>')">
		<%=upFile%></a>
		</td>
		<td><%=UtilMgr.monFormat(size)%>byte</td>
	</tr>
	<%}// --for %>
	<tr>
		<td colspan="4">
			<input type="submit" name="btn" value="DELETE" disabled>
		</td>
	</tr>
</table>
</form><p>
<a href="fupload.jsp">입력폼</a>
<form name="downFrm" method="post" action="fdownload.jsp">
	<input type="hidden" name="upFile">
</form>
</div>
</body>
</html>

fdeleteProc.jsp

<!-- fdeleteProc.jsp -->
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="ch13.FileloadMgr"/>
<%
	String snum[] = request.getParameterValues("fch");	
	// 0,1,3,5
	int num [] =new int[snum.length-1];
	for(int i=0;i<num.length;i++){
		num[i] = Integer.parseInt(snum[i+1]);
	}
	// num[] = {1,3,5};
	mgr.deleteFile(num);
	response.sendRedirect("flist.jsp");	
%>

fdownload.jsp

<%@page import="java.io.File"%>
<%@page import="ch13.FileloadMgr"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.BufferedOutputStream"%>
<%@page import="java.io.BufferedInputStream"%>
<%@page contentType="application; charset=UTF-8"%>
<%
	try {
		String filename = request.getParameter("upFile");
		File file = new File(FileloadMgr.SAVEFOLDER + File.separator + filename);
		byte b[] = new byte[(int) file.length()];

		response.setHeader("Accept-Ranges", "bytes");
		String strClient = request.getHeader("User-Agent");
		if (strClient.indexOf("Trident") > 0 || strClient.indexOf("MSIE") > 0) {
			response.setContentType("application/smnet;charset=EUC-KR");
			response.setHeader("Content-Disposition",
					"filename=" + new String(filename.getBytes("EUC-KR"), "8859_1") + ";");
		} else {
			response.setContentType("application/smnet;charset=EUC-KR");
			response.setHeader("Content-Disposition",
					"attachment;filename=" + new String(filename.getBytes("EUC-KR"), "ISO-8859-1") + ";");
		}
		out.clear();
		if (file.isFile()) {
			BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
			BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
			int read = 0;
			while ((read = fin.read(b)) != -1) {
				outs.write(b, 0, read);
			}
			outs.close();
			fin.close();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
%>

fdownload.jsp 파일은 저장할 파일의 이름이 길거나 한글일 경우 제대로 다운받지 못하는 상황이 있기 때문에 fdownload.jsp 를 통해 파일 이름을 분리하여 euc-kr 방식으로 파일이름을 받아와서 정상적으로 파일을 저장할 수 있게하는 파일


결과 화면




서블릿

  1. jsp이전에 동적인 웹페이지 콘텐츠를 생성하는 기술로 제공
  2. 서블릿은 자바의 많은 장점 사용가능
  3. HTML,CSS 및 js 그리고 웹디자인과 연동하기에는 많은 단점

  4. 단점이 많지만 서블릿이 존재하는 이유
  • jsp에는 없는 서버 측 프로그램의 기능
  • 대규모 프로젝트에 사용되는 프레임워크의 기술에 사용

서블릿 만들기

ch08 패키지 생성후 서블릿 생성



더블 클릭

이름 변경


ExServlet1.java

package ch08;

import java.io.IOException;
import java.io.PrintWriter;

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 javax.servlet.http.HttpSession;

@WebServlet("/ch08/exServlet1")
public class ExServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    @Override
    protected void service(HttpServletRequest req, 
    		HttpServletResponse resp) throws ServletException, IOException {
    	resp.setContentType("text/html; charset=UTF-8");
    	// 응답 스크림
    	PrintWriter out = resp.getWriter();
    	HttpSession session = req.getSession();
    	
    	out.println("<html>");
		out.println("<body>");
		out.println("<h1>이클립스로 서블릿 만들기</h1>");
		out.println("세션ID : " + session.getId());
		out.println("</body>");
		out.println("</html>");
    }
}

ExServlet2.jsp

package ch08;

import java.io.IOException;

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

@WebServlet("/ch08/exServlet2")
public class ExServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	// 서블릿 라이프 사이클 : init, service, destory
	
	@Override // 서블릿 처음 요청될때 한번만 실행
	public void init() throws ServletException {
		System.out.println("init 호출");
	}
	@Override  // 클라이언트가 요청이 있을때 마다 실행
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("service 호출");
	}
	@Override // 서비스가 종료 및 서블릿 코드가 수정이 될때
	public void destroy() {
		System.out.println("destroy 호출");
	}
}

실행시 콘솔 창에 init호출과 service 호출이 나오는데
이후에 페이지 새로고침을 할 경우 service 호출만 콘솔창에 나오는것을 확인할 수 있음.
destroy는 코드 수정후 저장한 후 웹페이지 반응시 호출이된다.


webapp/ch08/getJsp.jsp

<!-- getJsp.jsp -->
<%@page contentType="text/html; charset=UTF-8"%>
<h3>Get 방식 서블릿 호출</h3>
<form method="get" action="getServlet">
	msg : <input name="msg" value="축하~ 코로나 종식">
	<input type="submit" value="전송">
</form>

GetServlet.java

package ch08;

import java.io.IOException;
import java.io.PrintWriter;

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

@WebServlet("/ch08/getServlet")
public class GetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		String msg = request.getParameter("msg");
		out.println("<h1>Get Servlet</h1>");
		out.println("msg: " + msg);
	}
}

결과화면



postJsp.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<html>
<head>
<body>
<h1>Post Servlet 방식</h1>
<form method="post" action="postServlet">
id : <input name="id" value="홍길동"><br/>
pwd : <input type="password" name="pwd" value="1234"><br/>
email : <input name="email" value="aaa@aaa.com"><br/>
<input type="submit" value="가입">
</form>
</body>
</html>

PostServlet.java

package ch08;

import java.io.IOException;
import java.io.PrintWriter;

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

@WebServlet("/ch08/postServlet")
public class PostServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		String email = request.getParameter("email");
		out.println("<h1>Post Servlet</h1>");
		out.println("id: " + id + "<br>");
		out.println("pwd: " + pwd + "<br>");
		out.println("email: " + email + "<br>");
	}
}

결과화면



login.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%
		//세션에 id값을 가져온다.
		String id = (String)session.getAttribute("idKey");
%>
<h1>로그인</h1>
<%
		if(id!=null){
%>
<!-- 로그인 된 영역 -->
<%=id%>님 반갑습니다.
<a href="logout.jsp">로그아웃</a>
<%}else{%>
<!-- 로그인 안된 영역 -->
<form method="post" action="loginServlet">
id : <input name="id"><br/>
pwd : <input type="password" name="pwd"><br/>
<input type="submit" value="로그인">
</form>
<%}%>

logout.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%
		//서버에 만들어진 세션 객체를 제거 -> 새로운 세션객체가 생성
		session.invalidate();
		//현재 페이지를 login.jsp 호출
		response.sendRedirect("login.jsp");
%>

LoginServlet.java

package ch08;

import java.io.IOException;

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 javax.servlet.http.HttpSession;

@WebServlet("/ch08/loginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
      
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		HttpSession session = request.getSession();
		if(id!=null&&pwd!=null) {
			session.setAttribute("idKey", id);
		}
		response.sendRedirect("login.jsp");
	}
}

결과화면


0개의 댓글

관련 채용 정보