일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 오버라이딩
- html기초
- 2020정보처리기사실기요약
- Oracle기초
- 2020정보처리기사실기
- 프로그래머스 쿼리문
- 프로그래머스 MYSQL
- jsp게시판만들기
- spring crud게시판
- 프로그래머스 SQL
- CRUD게시판만들기
- 스프링게시판만들기
- 자바기초
- 스프링 CRUD게시판
- 정보처리기사실기정리
- 날짜지정팝업
- js datepicker
- 정처기실기정리
- 2020정보처리기사실기정리
- 게시판만들기
- spring crud
- 오라클설치
- 자바 정규표현식 예제
- jsp 날짜팝업
- 스프링 crud
- 자바연산자
- crud게시판
- PLSQL
- jsp 팝업띄우기
- 자바배열예제
Archives
- Today
- Total
영보의 SystemOut.log
[JSP,MyBaits] CRUD 게시판 만들기(3) #업로드/다운로드/수정/삭제 본문
반응형
세번째 포스팅에서는 수정, 삭제, 검색, 업로드, 상세페이지 코드를 보여드리겠습니다.
아직 순차적으로 배우고있는 미숙한 학생이라 다소 비효율적일 수 있는 코드 양해 부탁드립니다.
공부하면서 필요한 설명은 주석으로 상세하게 썼으니 주석 보시면 될 것 같습니다 :-)
# list.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*,com.sist.dao.*"%> <%-- 목록 출력 : list.jsp : board폴더 --%> <!-- 데이터를 읽어 온다 (1page)있는 게시물 --> <% // DAO를 생성 => DAO를 통해서 데이터를 얻어온다 // static으로 메소드=> 이미 메모리에 저장 // 사용자로부터 페이지를 받아 본다 String strPage=request.getParameter("page"); if(strPage==null) // 페이지를 보내지 않을 경우 (맨처음에는 페이지를 보낼 수 없다) strPage="1";// 시작페이지를 설정해 준다 int curpage=Integer.parseInt(strPage); // start:1 , end:10 Map map=new HashMap(); int rowSize=10; int start=(curpage*rowSize)-(rowSize-1); int end=curpage*rowSize; // map에 저장 => map 저장하는 공간 => 키,값을 설정 할 수 있다 map.put("start",start); map.put("end",end); List<DataBoardVO> list=DataBoardDAO.boardListData(map);// 1page 1~10 // 총페이지읽기 int totalpage=DataBoardDAO.boardTotalPage(); // 화면에 출력 // 데이터 읽기 : 파일,XML,JSON,database(오라클),웹크롤링(날씨,인기검색어) // database(오라클):일반 JDBC,DBCP,***ORM(Mybatis:실무) %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> function send() { // 자바스크립트는 변수 종류가 없다 (var:자동 지정 변수) /* var a=10 ; var=int var b=10.0; var=double var c='a'; char var d="aaa"; String var e=[]; Array var k={}; Object */ var f=document.frm; // 반드시 입력을 할 수 있게 만든다 if(f.ss.value=="") { f.ss.focus(); return; } f.submit();// submit버튼과 동일한 역할 ==> Jquery => NodeJS => reactjs => vuejs => typescript } </script> </head> <body> <div class="row"> <h1 class="text-center">자료실</h1> <table class="table"> <tr> <td> <a href="main.jsp?mode=2" class="btn btn-sm btn-success">새글</a> <%-- 메뉴 , 로그인 , footer 고정 => main.jsp --%> </td> </tr> </table> <table class="table table-striped"> <tr class="warning"> <th class="text-center" width=10%>번호</th> <th class="text-center" width=45%>제목</th> <th class="text-center" width=15%>이름</th> <th class="text-center" width=20%>작성일</th> <th class="text-center" width=10%>조회수</th> </tr> <% /* 컬럼이 없는 값을 받는 경우 => VO에서 변수 설정 private String dbday; =>dbday값을 채운다 name,TO_CHAR(regdate,'YYYY-MM-DD') as dbday => mapper */ for(DataBoardVO vo:list) { /* ../main/main.jsp?mode=3&no=1 ====== ==== detail.jsp에서 사용 화면변경시 사용(main.jsp) include가 되면 ==> 모든 JSP에서 사용자가 보내준 데이터를 사용이 가능 ============ request가 공유 */ %> <tr> <td class="text-center" width=10%><%=vo.getNo() %></td> <td width=45%> <a href="../main/main.jsp?mode=3&no=<%=vo.getNo()%>"><%=vo.getSubject() %></a> <%-- include된 모든 JSP는 main.jsp로 보낸 모든 데이터값을 사용할 수 있다 main.jsp => mode=3 => 화면 변경 detail.jsp => no=1 => 해당되는 데이터를 받아서 출력 --%> </td> <td class="text-center" width=15%><%=vo.getName() %></td> <td class="text-center" width=20%><%=vo.getDbday() %></td> <td class="text-center" width=10%><%=vo.getHit() %></td> </tr> <% } %> </table> <table class="table"> <tr> <td class="text-left"> <!-- 데이터 전송하는 방식 = GET => URL뒤에 노출 데이터를 받을 파일명?변수명=값 변수명=값&변수명=값&변수명=값 구분문자는 & = POST => 내부 네트워크를 이용한 전송 (보안 ,URL주소 길어진면 숨겨서 전송) 변수명=값&변수명=값&변수명=값 --> <form method="post" action="../main/main.jsp" name=frm> Search: <select name="fd" class="input-sm"> <option value="name">이름</option> <option value="subject">제목</option> <option value="content">내용</option> </select> <%-- 검색어 입력 --%> <input type=text name=ss class="input-sm"> <input type=hidden name=mode value=4> <%-- 검색버튼 --%> <input type=button value=검색 class="btn btn-sm btn-danger" onclick="send()" > </form> </td> <td class="text-right"> <a href="#" class="btn btn-sm btn-primary">이전</a> <%=curpage %> page / <%=totalpage %> pages <a href="#" class="btn btn-sm btn-primary">다음</a> </td> </tr> </table> </div> </body> </html> | cs |
#insert.jsp (글쓰기)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <div class="row"> <h1 class="text-center">글쓰기</h1> <%-- 파일 업로드 : 프로토콜 (post) enctype="multipart/form-data" => 업로드시만 사용 프로토콜 http : 80 ftp : 21 smtp : 25 multipart/form-data : 파일을 업로드 범용적으로 사용되는 약속 --%> <form method="post" action="../board/insert_ok.jsp" enctype="multipart/form-data"> <table class="table table-hover"> <tr> <th class="danger text-right" width=15%>이름</th> <td width=85%> <input type=text name=name size=15 class="input-sm"> </td> </tr> <tr> <th class="danger text-right" width=15%>제목</th> <td width=85%> <input type=text name=subject size=45 class="input-sm"> </td> </tr> <tr> <th class="danger text-right" width=15%>내용</th> <td width=85%> <textarea rows="10" cols="50" name=content></textarea> </td> </tr> <tr> <th class="danger text-right" width=15%>첨부파일</th> <td width=85%> <input type=file name=upload size=20 class="input-sm"> </td> </tr> <tr> <th class="danger text-right" width=15%>비밀번호</th> <td width=85%> <input type=password name=pwd size=10 class="input-sm"> </td> </tr> <tr> <td colspan="2" class="text-center"> <input type=submit value=글쓰기 class="btn btn-sm btn-primary"> <input type=button value=취소 class="btn btn-sm btn-primary" onclick="javascript:history.back()" > </td> </tr> </table> </form> </div> </body> </html> | cs |
#insert_ok.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | <%@page import="com.sist.dao.*,java.io.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="com.oreilly.servlet.*,com.oreilly.servlet.multipart.*"%> <%-- 화면 출력은 하지 않는다 (html을 필요로 하지 않는다) 사용자가 보내준 글쓰기 데이터를 받아서 오라클에 전송 마지막에 => list.jsp로 이동 종료 사용자 보내준 => 데이터 받아서 처리를 하고 다른 파일 == insert_ok.jsp : list.jsp update_ok.jsp : detail.jsp delete_ok.jsp : list.jsp --%> <% request.setCharacterEncoding("utf-8");// 한글 디코딩 String path="c:\\download"; // 파일이 업로드가 되면 어디에 저장 폴더 String enctype="UTF-8"; //한글파일명을 사용 여부 int size=1024*1024*100;//파일의 최대크기 // 사용자가 보내준 데이터를 받는다 (request=>파일을 받을 수 없다 , 일반데이터만 받는다) MultipartRequest mr= new MultipartRequest(request,path,size,enctype,new DefaultFileRenamePolicy()); String name=mr.getParameter("name"); // 업로드시에만 사용 String subject=mr.getParameter("subject"); String content=mr.getParameter("content"); String pwd=mr.getParameter("pwd"); // 받은 데이터들을 DAO => DAO에서 오라클에 INSERT DataBoardVO vo=new DataBoardVO(); vo.setName(name); vo.setSubject(subject); vo.setContent(content); vo.setPwd(pwd); // filename,filesize => 없는 경우 (파일을 올리지 않을 경우,파일 올릴 경우) String filename=mr.getOriginalFileName("upload"); // 사용자가 보낸 파일명을 읽어 온다 // <input type=file name=upload size=20 class="input-sm"> if(filename==null)//파일을 올리지 않을 경우 { vo.setFilename(""); vo.setFilesize(0); } else//파일 올릴 경우 { File file=new File("c:\\download\\"+filename); // 업로드된 파일의 정보를 얻어온다 (파일 크기를 확인) => 다운로드 (프로그래바) vo.setFilename(filename); vo.setFilesize((int)file.length()); //length() => long } // DAO를 호출한 다음에 INSERT요청 => 저장하는 SQL (databoard-mapper.xml) DataBoardDAO.boardInsert(vo); response.sendRedirect("../main/main.jsp?mode=1"); %> | cs |
# update.jsp (수정)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="com.sist.dao.*"%> <% // detail.jsp ==> 번호(게시물) String no=request.getParameter("no"); // 다른 JSP에서 => 데이터값을 보내면 ==> request를 통해서 값을 받아 온다 // 오라클에서 게시물 번호에 해당되는 데이터를 읽어 온다 // 화면 출력 DataBoardVO vo=DataBoardDAO.boardUpdateData(Integer.parseInt(no)); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <div class="row"> <h1 class="text-center">수정하기</h1> <%-- 파일 업로드 : 프로토콜 (post) enctype="multipart/form-data" => 업로드시만 사용 프로토콜 http : 80 ftp : 21 smtp : 25 multipart/form-data : 파일을 업로드 범용적으로 사용되는 약속 --%> <form method="post" action="../board/update_ok.jsp"> <table class="table table-hover"> <tr> <th class="danger text-right" width=15%>이름</th> <td width=85%> <input type=text name=name size=15 class="input-sm" value="<%=vo.getName()%>"> <%--게시물 번호를 첨부해 보내준다 --%> <input type=hidden name=no value="<%=no%>"> </td> </tr> <tr> <th class="danger text-right" width=15%>제목</th> <td width=85%> <input type=text name=subject size=45 class="input-sm" value="<%=vo.getSubject()%>"> </td> </tr> <tr> <th class="danger text-right" width=15%>내용</th> <td width=85%> <textarea rows="10" cols="50" name=content><%=vo.getContent() %></textarea> </td> </tr> <tr> <th class="danger text-right" width=15%>비밀번호</th> <td width=85%> <input type=password name=pwd size=10 class="input-sm"> </td> </tr> <tr> <td colspan="2" class="text-center"> <input type=submit value=수정 class="btn btn-sm btn-primary"> <input type=button value=취소 class="btn btn-sm btn-primary" onclick="javascript:history.back()" > </td> </tr> </table> </form> </div> </body> </html> | cs |
# update_ok.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <%@page import="com.sist.dao.DataBoardDAO"%> <%@page import="com.sist.dao.DataBoardVO"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 기능만 처리 (화면 출력은 아니다) => 이동 --%> <% request.setCharacterEncoding("utf-8");//디코딩 // 한글 변환 (전송:인코딩 => 수신:디코딩) String name=request.getParameter("name"); String no=request.getParameter("no"); String subject=request.getParameter("subject"); String content=request.getParameter("content"); String pwd=request.getParameter("pwd"); // DAO => VO에 모아서 전송해 달라 DataBoardVO vo=new DataBoardVO(); vo.setName(name); vo.setNo(Integer.parseInt(no)); vo.setSubject(subject); vo.setContent(content); vo.setPwd(pwd); // DAO로 전송해서 처리 : 비밀번호 처리 => 본인이면 => 실제 수정 boolean bCheck=DataBoardDAO.boardUpdate(vo); /* 1 = list.jsp 2 = insert.jsp 3 = detail.jsp 4 = find.jsp 5 = delete.jsp 6 = update.jsp */ if(bCheck==true) { response.sendRedirect("../main/main.jsp?mode=3&no="+no);// detail로 이동 } else { %> <script> alert("비밀번호가 틀립니다"); history.back(); </script> <% } %> | cs |
# find.jsp (검색)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="com.sist.dao.*,java.util.*"%> <% request.setCharacterEncoding("UTF-8");//utf-8 String fd=request.getParameter("fd"); String ss=request.getParameter("ss"); System.out.println("fd:"+fd); System.out.println("ss:"+ss); // DAO로 전송 결과값을 받아 온다 ==> 검색한 내용 가지고 오기 위해서 SQL => databoard-mapper.xml => DAO처리 // DAO로부터 처리된 결과를 받아 온다 Map map=new HashMap(); map.put("fd",fd); map.put("ss",ss); int count=DataBoardDAO.boardFindCount(map); List<DataBoardVO> list=null; if(count>0) { list=DataBoardDAO.boardFindData(map); } %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <div class="row"> <h1 class="text-center">검색결과</h1> <% if(count==0)// 검색 결과가 없는 경우 { %> <table class="table"> <tr> <td class="text-center">검색결과가 없습니다</td> </tr> </table> <% } else // 검색결과 존재 { %> <table class="table table-striped"> <tr class="success"> <th class="text-center" width=10%>번호</th> <th class="text-center" width=45%>제목</th> <th class="text-center" width=15%>이름</th> <th class="text-center" width=20%>작성일</th> <th class="text-center" width=10%>조회수</th> </tr> <% for(DataBoardVO vo:list) { %> <tr> <td class="text-center" width=10%><%=vo.getNo() %></td> <td class="text-center" width=45%><%=vo.getSubject() %></td> <td class="text-center" width=15%><%=vo.getName() %></td> <td class="text-center" width=20%><%=vo.getDbday() %></td> <td class="text-center" width=10%><%=vo.getHit() %></td> </tr> <% } %> </table> <% } %> </div> </body> </html> | cs |
# delete.jsp (글 삭제)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // main.jsp => mode => 화면 변경 // ?mode=1&no=10 // ======== > 해당 jsp에서 받아서 처리한다 String no=request.getParameter("no"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <style type="text/css"> .row1{ margin: 0px auto; width: 300px; } </style> </head> <body> <div class="row row1"> <h1 class="text-center">삭제하기</h1> <form method=post action="../board/delete_ok.jsp"> <table class="table table-striped"> <tr> <td> 비밀번호 <input type=password name=pwd size=15 class="input-sm"> <%-- 출력은 하지 않고 데이터만 전송 : type=hidden --%> <input type=hidden name=no value=<%=no %>> </td> </tr> <tr> <td class="text-center"> <input type=submit value="삭제" class="btn btn-sm btn-danger"> <input type=button value="취소" class="btn btn-sm btn-info" onclick="javascript:history.back()"> </td> </tr> </table> </form> </div> </body> </html> | cs |
# delete_ok.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.io.*,com.sist.dao.*"%> <%-- delete_ok.jsp : 데이터 받아서 처리만 하고 다른 jsp로 이동 (HTML을 사용 할 필요가 없다)--%> <% // detail.jsp에서 데이터를 두개 보냄 (게시물 번호 , 비밀번호) // 한글이 없다 ==> request.setCharacterEncoding() X String no=request.getParameter("no"); String pwd=request.getParameter("pwd"); // DAO 연결 => 비밀번호가 같으면 (삭제) , 비밀번호가 틀리면 삭제하지 않는다 // DAO를 연결 => SQL문장 (databoard-mapper.xml) // java.io ==> File클래스 => 업로드된 파일 삭제한다 DataBoardVO vo=DataBoardDAO.boardGetInfoData(Integer.parseInt(no)); // 비밀번호 확인 => 삭제 boolean bCheck=DataBoardDAO.boardDelete(Integer.parseInt(no), pwd); if(bCheck==true)// 비밀번호 같다 => 게시물을 삭제 => 이동 => list.jsp로 이동 { // 처리 => 업로드된 파일을 삭제 if(vo.getFilesize()>0) // filesize=0(업로드없는 게시물) filesize>0(업로드된 파일) { File dir=new File("c:\\download"); // File => 실제 file , 폴더 directory File[] files=dir.listFiles(); // download안에 있는 모든 파일정보를 가지고 온다 for(File f:files) { if(f.getName().equals(vo.getFilename())) { f.delete(); break; } } } response.sendRedirect("../main/main.jsp?mode=1"); } else // 비밀번호가 다르다 (본인이 아니다) => 다시 삭제창으로 이동 { %> <script> alert("비밀번호가 틀립니다\n다시 입력하세요!!"); history.back(); </script> <% } %> | cs |
# detail.jsp (상세페이지)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="com.sist.dao.*"%> <%-- View(화면 출력만 한다) DAO안에 있는 메소드 호출 => 데이터를 가지고 온다 HTML,JavaScript => 오라클 연결이 불가능 ========== node.js = Spring (서버단) --%> <% // 1. main.jsp를 통해서 전달된 no(게시물)라는 변수값 // ../main/main.jsp?mode=3&no=10 String no=request.getParameter("no"); DataBoardVO vo=DataBoardDAO.boardDetailData(Integer.parseInt(no)); // 웹에서 데이터가 넘어오면 모든 데이터 문자열(String) => 필요시마다 정수,실수변환 // 사용자가 볼 수 있게 화면 출력한다 %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <div class="row"> <h1 class="text-center">내용보기</h1> <table class="table table-striped"> <tr> <th class="text-center danger" width=20%>번호</th> <td class="text-center" width=30%><%=vo.getNo() %></td> <th class="text-center danger" width=20%>작성일</th> <td class="text-center" width=30%><%=vo.getDbday() %></td> </tr> <tr> <th class="text-center danger" width=20%>이름</th> <td class="text-center" width=30%><%=vo.getName() %></td> <th class="text-center danger" width=20%>조회수</th> <td class="text-center" width=30%><%=vo.getHit() %></td> </tr> <tr> <th class="text-center danger" width=20%>제목</th> <td colspan="3"><%=vo.getSubject() %></td> </tr> <% if(vo.getFilesize()>0) // 업로드된 파일 존재하면 { %> <tr> <th class="text-center danger" width=20%>첨부파일</th> <td colspan="3"> <%-- 다운로드 board와 관련 => board폴더 => download.jsp 현재 상태 => detail.jsp => board(X),main(O) --%> <a href="../board/download.jsp?fn=<%=vo.getFilename()%>"><%=vo.getFilename() %></a>(<%=vo.getFilesize() %>Bytes) </td> </tr> <% } %> <tr> <td colspan="4" class="text-left" valign="top" height=200> <%-- 한줄 문자열 --%> <pre style="white-space: pre-wrap;background-color:white;border:none"><%=vo.getContent() %></pre> </td> </tr> <tr> <td colspan="4" class="text-right"> <%-- ../main/main.jsp?mode=6 --%> <%-- ../board/update.jsp --%> <a href="../main/main.jsp?mode=6&no=<%=vo.getNo() %>" class="btn btn-xs btn-primary">수정</a> <%-- ../board/delete.jsp --%> <a href="../main/main.jsp?mode=5&no=<%=vo.getNo() %>" class="btn btn-xs btn-success">삭제</a> <%-- ../board/list.jsp --%> <a href="../main/main.jsp?mode=1" class="btn btn-xs btn-danger">목록</a> </td> </tr> </table> </div> </body> </html> | cs |
# download.jsp (다운로드)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.io.*,java.net.*"%> <% request.setCharacterEncoding("UTF-8"); // 한글 파일 /* ../board/download.jsp?fn=a.jpg */ String fn=request.getParameter("fn"); // 다운로드 => 서버 (설정) : 1. 파일명 , 2. 파일크기 ==> 실제데이터 보내기전에 필요한 데이터 보내준다(header) try { response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode(fn,"UTF-8")); File file=new File("c:\\download\\"+fn); // 파일 크기 response.setContentLength((int)file.length()); // 다운로드 창을 보내주는 방법 // 실제 데이터를 복사 BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream bos=new BufferedOutputStream(response.getOutputStream()); // response.getOutputStream() : 다운로드를 하는 사람의 저장공간 byte[] buffer=new byte[1024]; int i=0;// 몇바이트 읽었는지 확인 while((i=bis.read(buffer, 0, 1024))!=-1) { // -1 EOF (End Of File) bos.write(buffer, 0, i);//실제 사용자의 파일에 복사 } out.clear(); // out=>파일 쓰기 => 파일을 다 쓴 경우에 메모리를 지운다 // out => 원래 기능 => html을 출력 (임시로 파일 출력) out=pageContext.pushBody();// 원래 out의 기능으로 돌려주는 상태 bis.close();// 서버의 파일 닫기 bos.close(); // 사용자의 파일 닫기 }catch(Exception ex){} %> | cs |
이해 안되시는 부분 주석 보시면 될 것 같아요
마지막 포스팅에서 비루하지만 완성된 기능 보여드리겠습니다
: )
반응형
'Web > JSP' 카테고리의 다른 글
[JSP] JSP에서 JSTL사용하여 타임 셋팅해서 팝업띄우기 (0) | 2021.02.10 |
---|---|
[JSP] java로 특정 날짜(Date) 지정해서 popup 팝업 뜨게 하기(2) (0) | 2021.02.10 |
[JSP] jsp창에 java로 특정 날짜 지정해서 popup 팝업 뜨게 하기 (0) | 2021.02.08 |
[JSP,MyBatis] CRUD 게시판 만들기(2) #업로드/다운로드/수정/삭제 (0) | 2020.09.24 |
[JSP,MyBatis] CRUD 게시판 만들기(1) #업로드/다운로드/수정/삭제 (1) | 2020.09.24 |