라이브러리 추가 후 코드 작성
<!-- 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>
<!-- 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.. 이 붙음
create table tblFileload(
num int primary key auto_increment,
upFile char(50) not null,
size int default 0
)COLLATE='euckr_korean_ci';
mydb2 에 테이블 생성
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;
}
}
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 -->
<%@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 -->
<%@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 -->
<%@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 -->
<%@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");
%>
<%@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 방식으로 파일이름을 받아와서 정상적으로 파일을 저장할 수 있게하는 파일
- jsp이전에 동적인 웹페이지 콘텐츠를 생성하는 기술로 제공
- 서블릿은 자바의 많은 장점 사용가능
- HTML,CSS 및 js 그리고 웹디자인과 연동하기에는 많은 단점
- 단점이 많지만 서블릿이 존재하는 이유
- jsp에는 없는 서버 측 프로그램의 기능
- 대규모 프로젝트에 사용되는 프레임워크의 기술에 사용
ch08 패키지 생성후 서블릿 생성
더블 클릭
이름 변경
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>");
}
}
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는 코드 수정후 저장한 후 웹페이지 반응시 호출이된다.
<!-- 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>
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);
}
}
<%@ 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>
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>");
}
}
<%@ 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>
<%}%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
//서버에 만들어진 세션 객체를 제거 -> 새로운 세션객체가 생성
session.invalidate();
//현재 페이지를 login.jsp 호출
response.sendRedirect("login.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;
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");
}
}