Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- github
- jdbc설정
- 내배카
- 페이지 재사용
- emmet환경설정
- Git
- 회원탈퇴
- 비밀번호변경
- 정처기
- 인코딩
- 회원정보수정
- live server 환경설정
- 배열
- 국취제
- forward
- 내일배움카드
- jsp기본
- 비밀번호암호화
- 입력메소드
- redirect
- 로그아웃
- 검색기능
- 별찍기
- mvc
- jdbc환경설정
- 국비학원
- 페이징
- 권한변경
- 관리자회원조회
- 국민취업지원제도
Archives
- Today
- Total
기록
*83일차 (게시글 상세보기 / 조회수 / 파일 다운로드) 본문
*BoardFileDownloadServlet
package board.controller;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
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 board.model.dto.Attachment;
import board.model.service.BoardService;
/**
* Servlet implementation class BoardFileDownloadServlet
*/
@WebServlet("/board/fileDownload")
public class BoardFileDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private BoardService boardService = new BoardService();
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.사용자입력값처리
int no = Integer.parseInt(request.getParameter("no"));
// 2.업무로직
Attachment attach = boardService.findAttachmentByNo(no);
System.out.println(attach);
// 3.응답처리
// 헤더작성
response.setContentType("application/octet-stream"); // 응답데이터 타입
// Content-Disposition 첨부파일인 경우, 브라우져 다운로드(Sava as)처리 명시
String resFilename = new String(attach.getOriginalFilename().getBytes("utf-8"), "iso-8859-1"); // tomcat 기본인코딩
response.setHeader("Content-Disposition", "attachment;filename=" + resFilename);
System.out.println("resFilename = " + resFilename);
// 파일을 읽어서(input) 응답메세지에 쓴다(output)
String saveDirectory = getServletContext().getRealPath("/upload/board");
File file = new File(saveDirectory, attach.getRenamedFilename());
// 기본스트림 - 대상과 연결
// 보조스트림 - 기본스트림과 연결. 보조스트림을 제어
try (
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
){
byte[] buffer = new byte[8192];
int len = 0; // 읽어낸 byte수
while((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len); // buffer의 0번지부터 len(읽은 개수)만치 출력
}
}
}
}
*BoardViewServlet
package board.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import board.model.dto.BoardExt;
import board.model.service.BoardService;
/**
* Servlet implementation class BoardViewServlet
*/
@WebServlet("/board/boardView")
public class BoardViewServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private BoardService boardService = new BoardService();
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// 1.사용자입력값처리
int no = Integer.parseInt(request.getParameter("no"));
// 쿠키처리
boolean hasRead = false;
String boardCookieVal = "";
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
if("boardCookie".equals(name)) {
boardCookieVal = value; // 기존쿠키값
if(value.contains("|" + no + "|")) {
hasRead = true;
}
break;
}
}
}
// 2.업무로직
// 조회수증가
if(!hasRead) {
int result = boardService.updateReadCount(no);
// 쿠키 새로 전송 (boardCookie 없는 경우 | 요청된 boardCookie에 현재 no가 없는 경우)
Cookie cookie = new Cookie("boardCookie", boardCookieVal + "|" + no + "|");
cookie.setPath(request.getContextPath() + "/board/boardView"); // 쿠키를 사용할 경로
cookie.setMaxAge(365 * 24 * 60 * 60); // 1년
response.addCookie(cookie); // 응답헤더에 Set-Cookie로 전송
System.out.println("> boardCookie가 새로 생성되었음.");
}
// 게시글 조회
BoardExt board = boardService.findByNo(no);
// XSS공격대비(Cross-site Scripting공격) 변환
board.setTitle(board.getTitle().replaceAll("<", "<").replaceAll(">", ">"));
board.setContent(board.getContent().replaceAll("<", "<").replaceAll(">", ">"));
// board#content 개행처리
board.setContent(board.getContent().replaceAll("\n", "<br/>"));
System.out.println(board);
// 3.view단 위임
request.setAttribute("board", board);
request.getRequestDispatcher("/WEB-INF/views/board/boardView.jsp")
.forward(request, response);
} catch(Exception e) {
e.printStackTrace();
throw e;
}
}
}
*BoardDao
package board.model.dao;
import static common.JdbcTemplate.close;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import board.model.dto.Attachment;
import board.model.dto.Board;
import board.model.dto.BoardExt;
import board.model.exception.BoardException;
public class BoardDao {
private Properties prop = new Properties();
public BoardDao() {
String fileName = BoardDao.class.getResource("/sql/board-query.properties").getPath();
try {
prop.load(new FileReader(fileName));
} catch (IOException e) {
e.printStackTrace();
}
}
public List<BoardExt> findAll(Connection conn, Map<String, Object> param) {
PreparedStatement pstmt = null;
ResultSet rset = null;
List<BoardExt> list = new ArrayList<>();
String sql = prop.getProperty("findAll");
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, (int) param.get("start"));
pstmt.setInt(2, (int) param.get("end"));
rset = pstmt.executeQuery();
while(rset.next()) {
BoardExt board = handleBoardResultSet(rset);
board.setAttachCount(rset.getInt("attach_cnt"));
list.add(board);
}
} catch (Exception e) {
throw new BoardException("회원목록 조회 오류", e);
} finally {
close(rset);
close(pstmt);
}
return list;
}
private BoardExt handleBoardResultSet(ResultSet rset) throws SQLException {
BoardExt board = new BoardExt();
board.setNo(rset.getInt("no"));
board.setTitle(rset.getString("title"));
board.setMemberId(rset.getString("member_id"));
board.setContent(rset.getString("content"));
board.setReadCount(rset.getInt("read_count"));
board.setRegDate(rset.getDate("reg_date"));
return board;
}
public int getTotalContents(Connection conn) {
PreparedStatement pstmt = null;
ResultSet rset = null;
int totalContents = 0;
String sql = prop.getProperty("getTotalContents");
try {
pstmt = conn.prepareStatement(sql);
rset = pstmt.executeQuery();
while(rset.next()) {
totalContents = rset.getInt(1);
}
} catch (Exception e) {
throw new BoardException("총게시물수 조회 오류", e);
} finally {
close(rset);
close(pstmt);
}
return totalContents;
}
public int insertBoard(Connection conn, Board board) {
PreparedStatement pstmt = null;
int result = 0;
String sql = prop.getProperty("insertBoard");
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, board.getTitle());
pstmt.setString(2, board.getMemberId());
pstmt.setString(3, board.getContent());
result = pstmt.executeUpdate();
} catch (Exception e) {
throw new BoardException("게시글 등록 오류", e);
} finally {
close(pstmt);
}
return result;
}
public int findCurrentBoardNo(Connection conn) {
PreparedStatement pstmt = null;
ResultSet rset = null;
int no = 0;
String sql = prop.getProperty("findCurrentBoardNo");
try {
pstmt = conn.prepareStatement(sql);
rset = pstmt.executeQuery();
while(rset.next())
no = rset.getInt(1);
} catch (SQLException e) {
throw new BoardException("게시글번호 조회 오류", e);
} finally {
close(rset);
close(pstmt);
}
return no;
}
public int insertAttachment(Connection conn, Attachment attach) {
PreparedStatement pstmt = null;
int result = 0;
String sql = prop.getProperty("insertAttachment");
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, attach.getBoardNo());
pstmt.setString(2, attach.getOriginalFilename());
pstmt.setString(3, attach.getRenamedFilename());
result = pstmt.executeUpdate();
} catch (Exception e) {
throw new BoardException("첨부파일 등록 오류", e);
} finally {
close(pstmt);
}
return result;
}
public BoardExt findByNo(Connection conn, int no) {
PreparedStatement pstmt = null;
ResultSet rset = null;
BoardExt board = null;
String sql = prop.getProperty("findByNo");
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, no);
rset = pstmt.executeQuery();
while(rset.next()) {
board = handleBoardResultSet(rset);
}
} catch (SQLException e) {
throw new BoardException("게시글 한건 조회 오류", e);
} finally {
close(rset);
close(pstmt);
}
return board;
}
public List<Attachment> findAttachmentByBoardNo(Connection conn, int no) {
PreparedStatement pstmt = null;
ResultSet rset = null;
List<Attachment> attachments = new ArrayList<>();
String sql = prop.getProperty("findAttachmentByBoardNo");
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, no);
rset = pstmt.executeQuery();
while(rset.next()) {
Attachment attach = handleAttachmentResultSet(rset);
attachments.add(attach);
}
} catch (SQLException e) {
throw new BoardException("게시글번호에 의한 첨부파일조회 오류", e);
} finally {
close(rset);
close(pstmt);
}
return attachments;
}
private Attachment handleAttachmentResultSet(ResultSet rset) throws SQLException {
Attachment attach = new Attachment();
attach.setNo(rset.getInt("no"));
attach.setBoardNo(rset.getInt("board_no"));
attach.setOriginalFilename(rset.getString("original_filename"));
attach.setRenamedFilename(rset.getString("renamed_filename"));
attach.setRegDate(rset.getDate("reg_date"));
return attach;
}
public int updateReadCount(Connection conn, int no) {
PreparedStatement pstmt = null;
int result = 0;
String sql = prop.getProperty("updateReadCount");
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, no);
result = pstmt.executeUpdate();
} catch (Exception e) {
throw new BoardException("조회수 증가처리 오류", e);
} finally {
close(pstmt);
}
return result;
}
public Attachment findAttachmentByNo(Connection conn, int no) {
PreparedStatement pstmt = null;
ResultSet rset = null;
Attachment attach = null;
String sql = prop.getProperty("findAttachmentByNo");
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, no);
rset = pstmt.executeQuery();
if(rset.next())
attach = handleAttachmentResultSet(rset);
} catch (SQLException e) {
throw new BoardException("첨부파일 조회 오류", e);
} finally {
close(rset);
close(pstmt);
}
return attach;
}
}
*BoardService
package board.model.service;
import static common.JdbcTemplate.close;
import static common.JdbcTemplate.commit;
import static common.JdbcTemplate.getConnection;
import static common.JdbcTemplate.rollback;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
import board.model.dao.BoardDao;
import board.model.dto.Attachment;
import board.model.dto.Board;
import board.model.dto.BoardExt;
public class BoardService {
private BoardDao boardDao = new BoardDao();
public List<BoardExt> findAll(Map<String, Object> param) {
Connection conn = getConnection();
List<BoardExt> list = boardDao.findAll(conn, param);
close(conn);
return list;
}
public int getTotalContents() {
Connection conn = getConnection();
int totalContents = boardDao.getTotalContents(conn);
close(conn);
return totalContents;
}
/**
* Transaction
* - all or none
*
*
* @param board
* @return
*/
public int insertBoard(Board board) {
int result = 0;
Connection conn = getConnection();
try {
// 1. board에 등록
result = boardDao.insertBoard(conn, board); // pk no값 결정 - seq_board_no.nextval
// 2. board pk 가져오기
int no = boardDao.findCurrentBoardNo(conn); // seq_board_no.currval
System.out.println("방금 등록된 board.no = " + no);
// 3. attachment에 등록
List<Attachment> attachments = ((BoardExt) board).getAttachments();
if(attachments != null && !attachments.isEmpty()) {
for(Attachment attach : attachments) {
attach.setBoardNo(no);
result = boardDao.insertAttachment(conn, attach);
}
}
commit(conn);
} catch(Exception e) {
rollback(conn);
throw e;
} finally {
close(conn);
}
return result;
}
public BoardExt findByNo(int no) {
Connection conn = getConnection();
BoardExt board = boardDao.findByNo(conn, no); // board테이블 조회
List<Attachment> attachments = boardDao.findAttachmentByBoardNo(conn, no); // attachment 테이블 조회
board.setAttachments(attachments);
close(conn);
return board;
}
public int updateReadCount(int no) {
int result = 0;
Connection conn = getConnection();
try {
result = boardDao.updateReadCount(conn, no);
commit(conn);
} catch(Exception e) {
rollback(conn);
throw e;
} finally {
close(conn);
}
return result;
}
public Attachment findAttachmentByNo(int no) {
Connection conn = getConnection();
Attachment attach = boardDao.findAttachmentByNo(conn, no);
close(conn);
return attach;
}
}
*BoardView.jsp
<%@page import="board.model.dto.Attachment"%>
<%@page import="java.util.List"%>
<%@page import="board.model.dto.BoardExt"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<%
BoardExt board = (BoardExt) request.getAttribute("board");
%>
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/board.css" />
<section id="board-container">
<h2>게시판</h2>
<table id="tbl-board-view">
<tr>
<th>글번호</th>
<td><%= board.getNo() %></td>
</tr>
<tr>
<th>제 목</th>
<td><%= board.getTitle() %></td>
</tr>
<tr>
<th>작성자</th>
<td><%= board.getMemberId() %></td>
</tr>
<tr>
<th>조회수</th>
<td><%= board.getReadCount() %></td>
</tr>
<%
List<Attachment> attachments = board.getAttachments();
if(attachments != null && !attachments.isEmpty()){
for(Attachment attach : attachments){
%>
<tr>
<th>첨부파일</th>
<td>
<%-- 첨부파일이 있을경우만, 이미지와 함께 original파일명 표시 --%>
<img alt="첨부파일" src="<%=request.getContextPath() %>/images/file.png" width=16px>
<a href="<%= request.getContextPath() %>/board/fileDownload?no=<%= attach.getNo() %>"><%= attach.getOriginalFilename() %></a>
</td>
</tr>
<%
}
}
%>
<tr>
<th>내 용</th>
<td><%= board.getContent() %></td>
</tr>
<% if(loginMember != null
&& (loginMember.getMemberId().equals(board.getMemberId())
|| loginMember.getMemberRole() == MemberRole.A)){ %>
<tr>
<%-- 작성자와 관리자만 마지막행 수정/삭제버튼이 보일수 있게 할 것 --%>
<th colspan="2">
<input type="button" value="수정하기" onclick="updateBoard()">
<input type="button" value="삭제하기" onclick="deleteBoard()">
</th>
</tr>
<script>
/**
* POST /board/boardDelete
* - no전송
* - 저장된 파일 삭제 : java.io.File
*/
const deleteBoard = () => {
};
</script>
<% } %>
</table>
</section>
<%@ include file="/WEB-INF/views/common/footer.jsp" %>
'학원 > 강의' 카테고리의 다른 글
*103일차 ncs테스트 - (애플리케이션 설계) (0) | 2022.06.24 |
---|---|
*92일차 - ncs테스트 (서버프로그램 구현) (0) | 2022.06.09 |
*82일차 (게시글 등록 / 파일업로드) (0) | 2022.05.24 |
*81일차 (페이징 / 게시판) (0) | 2022.05.23 |
*80일차- ncs테스트(요구사항 확인) (0) | 2022.05.20 |