PdsDAO
package net.pds;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import net.bbs.BbsDTO;
import net.utility.DBClose;
import net.utility.DBOpen;
public class PdsDAO {
private DBOpen dbopen=null;
private Connection con=null;
private PreparedStatement pstmt=null;
private ResultSet rs=null;
private StringBuilder sql=null;
public PdsDAO() {
dbopen=new DBOpen();
}
PdsDTO
package net.pds;
public class PdsDTO {
private int pdsno;
private String wname;
private String subject;
private String regdate;
private String passwd;
private int readcnt;
private String filename;
private long filesize;
public PdsDTO() {}
public int getPdsno() {
return pdsno;
}
public void setPdsno(int pdsno) {
this.pdsno = pdsno;
}
public String getWname() {
return wname;
}
public void setWname(String wname) {
this.wname = wname;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public int getReadcnt() {
return readcnt;
}
public void setReadcnt(int readcnt) {
this.readcnt = readcnt;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public long getFilesize() {
return filesize;
}
public void setFilesize(long filesize) {
this.filesize = filesize;
}
@Override
public String toString() {
return "PdsDTO [pdsno=" + pdsno + ", wname=" + wname + ", subject=" + subject + ", regdate=" + regdate
+ ", passwd=" + passwd + ", readcnt=" + readcnt + ", filename=" + filename + ", filesize=" + filesize
+ "]";
}
}//class end
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- ssi.jsp 공통 코드를 포함하는 페이지
-->
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="net.utility.*" %>
<%@ page import="net.pds.*" %>
<jsp:useBean id="dao" class="net.pds.PdsDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.pds.PdsDTO" scope="page"></jsp:useBean>
<%request.setCharacterEncoding("UTF-8");%>
--테이블 생성
CREATE TABLE tb_pds (
pdsno NUMBER NOT NULL
,wname VARCHAR2(100) NOT NULL
,subject VARCHAR2(250) NOT NULL
,regdate DATE NOT NULL
,passwd VARCHAR2(15) NOT NULL
,readcnt NUMBER DEFAULT 0
,filename VARCHAR2(250) NOT NULL --파일명
,filesize NUMBER DEFAULT 0 --파일크기
,PRIMARY KEY(pdsno)
);
--시퀀스 생성
create sequence pds_seq;
--행추가
pdsno: 시퀀스에서 일련번호 발생
wname,subject,passwd: 사용자한테서 입력받음.<form></form>
regdate: 오늘날짜 (sysdate)
filename, filesize :첨부파일 관련 정보
public ArrayList<PdsDTO> list(){
ArrayList<PdsDTO> list=null;
try {
con=dbopen.getConnection();
sql=new StringBuilder();
sql.append(" select pdsno,wname,subject,filename,readcnt,regdate ");
sql.append(" from tb_pds ");
sql.append(" order by regdate desc ");
pstmt=con.prepareStatement(sql.toString());
rs=pstmt.executeQuery();
if (rs.next()) {
list= new ArrayList<PdsDTO>();
do {
PdsDTO dto=new PdsDTO();
dto.setPdsno(rs.getInt("pdsno"));
dto.setWname(rs.getString("wname"));
dto.setSubject(rs.getString("subject"));
dto.setFilename(rs.getString("filename"));
dto.setReadcnt(rs.getInt("readcnt"));
dto.setRegdate(rs.getString("regdate"));
list.add(dto);
}while(rs.next());
}
} catch (Exception e) {
System.out.println("포토 갤러리 목록 실패"+e);
}finally {
DBClose.close(con, pstmt, rs);
}
return list;
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 본문 시작 -->
<h3>포토 갤러리</h3>
<p><a href="pdsForm.jsp">[사진올리기]</a> </p>
<%
ArrayList<PdsDTO> list=dao.list();
if(list==null){
out.println("글 없음");
}else{
out.println("글 갯수"+list.size());
%>
<table class="table table-hover" border="1">
<thead>
<tr class="info" >
<th>제목</th>
<th>사진</th>
<th>조회수</th>
<th>작성자</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<%
for(int i=0;i<list.size();i++){
dto=list.get(i);
%>
<tr>
<td><%=dto.getSubject()%></td>
<td><%=dto.getFilename()%></td>
<td><%=dto.getReadcnt()%></td>
<td><%=dto.getWname()%></td>
<td><%=dto.getRegdate().substring(0,10)%></td>
</tr>
<%
}
%>
</tbody>
</table>
<%
}
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../header.jsp" %>
<!-- 본문 시작 -->
<h3>사진 올리기</h3>
<p><a href="pdsList.jsp">[목록]</a></p>
<form method="post" action="pdsIns.jsp" enctype="multipart/form-data" onsubmit="return pdsCheck()">
<table class="table">
<tr>
<th>이름</th>
<td style="text-align: left"><input type="text" name="wname" id="wname" size="20" maxlength="100" required autofocus></td>
</tr>
<tr>
<th>제목</th>
<td style="text-align: left">
<textarea rows="5" cols="30" name="subject" id="subject"></textarea>
</td>
</tr>
<tr>
<th>비밀번호</th>
<td style="text-align: left"><input type="password" name="passwd" id="passwd" maxlength="15" required></td>
</tr>
<tr>
<th>파일 첨부</th>
<td style="text-align: left">
<input type="file" name="filename" id="filename"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="업로드 하기" class="btn btn-success">
<input type="reset" value="취소" class="btn btn-danger">
</td>
</tr>
</table>
</form>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 본문 시작 -->
<h3>사진 올리기 결과</h3>
<%
try{
//1.첨부된 파일 저장하기
String saveDirectory=application.getRealPath("/storage");
int maxPostSize=1024*1024*10;
String encoding="UTF-8";
MultipartRequest mr=new MultipartRequest(request,saveDirectory,maxPostSize,encoding,new DefaultFileRenamePolicy());
//파일크기는 알려주지 않음 ( 요청방식,파일이있다면 저장,용량, 인코딩,기본적으로 제공해주는 파일 이름 사용)
//smart editor ckeditor
//2. 1단계에서 저장한 파일의 파일명, 파일크기 가져오기
String fileName=""; //파일명
long fileSize=0; //파일크기
//파일크기를 알려주는 클래스가 없으므로 새로 생성
File file=null; //실제파일
String item=""; //name="filename"
Enumeration files=mr.getFileNames(); //mr이 가진 파일 전부 긁어오기
//파일을 하나씩 꺼내오기 반복문 사용
while(files.hasMoreElements()){ //여러개의 파일을 첨부하는 경우 한개씩 처리
item=(String)files.nextElement(); //name=filename
fileName=mr.getFilesystemName(item); //mr객체에서 item이 가지고 있는 실제 파일명
if(fileName!=null){ //실제 파일 가져왔다면
file=mr.getFile(item); //파일 사이즈때문에 파일에 담는다
if(file.exists()){ //파일 존재시
fileSize=file.length();//파일 크기 가져오기
}
}
}
//3. tb_pds 테이블 저장하기
String wname=mr.getParameter("wname").trim();
String subject=mr.getParameter("subject").trim();
String passwd=mr.getParameter("passwd").trim();
dto.setWname(wname);
dto.setSubject(subject);
dto.setPasswd(passwd);
dto.setFilename(fileName);
dto.setFilesize(fileSize);
int cnt=dao.create(dto);
if(cnt==0){
out.println("<p>사진 추가 실패</p>");
out.println("<p><a href='javascript:history.back()'>재시도</a></p>");
}else{
out.println("<script>");
out.println(" alert(' 사진 추가 성공');");
out.println(" location.href='pdsList.jsp';"); //목록페이지 이동
out.println("</script>");
}
}catch(Exception e){
out.print(e);
out.println("<p>사진 추가 실패</p>");
out.println("<p><a href='javascript:history.back()'>재시도</a></p>");
}
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>
public int create(PdsDTO dto) {
int cnt=0;
try {
con=dbopen.getConnection();
sql=new StringBuilder();
sql.append(" insert into tb_pds(pdsno,wname,subject,passwd,filename,filesize,regdate) ");
sql.append(" values(bbs_seq.nextval,?,?,?,?,?,sysdate) ");
pstmt=con.prepareStatement(sql.toString());
pstmt.setString(1, dto.getWname());
pstmt.setString(2, dto.getSubject());
pstmt.setString(3, dto.getPasswd());
pstmt.setString(4, dto.getFilename());
pstmt.setLong(5, dto.getFilesize());
cnt=pstmt.executeUpdate();
} catch (Exception e) {
System.out.println("포토 갤러리추가 실패"+e);
}finally {
DBClose.close(con,pstmt);
}
return cnt;
}
function pdsCheck() {
//1. 이름 유효성 검사
let wname= document.getElementById("wname").value;
wname=wname.trim();
if (wname.length<2) {
alert("이름은 2글자 이상 입력");
document.getElementById("wname").focus();
return false;
}
//2.제목
let subject= document.getElementById("subject").value;
subject=subject.trim();
if (subject.length<2) {
alert("제목은 2글자 이상 입력해야 합니다");
document.getElementById("subject").focus();
return false;
}
//3.비밀번호
let passwd= document.getElementById("passwd").value;
passwd=passwd.trim();
if (!(passwd.length<=10 && passwd.length>=5)) {
alert("비밀번호는 5~10글자 이내로 입력해야 합니다");
document.getElementById("passwd").focus();
return false;
}
//4. 첨부파일
//파일의 확장명이 이미지 파일인지 확인(jpg,gif,png)
let filename=document.getElementById("filename").value;
//sky.png
filename=filename.trim();
if (filename.length==0) {
alert("첨부 파일을 선택하세요~");
return false;
} else {
//filename변수값에서 마지막 "."의 순서값
let dot=filename.lastIndexOf(".");
//확장명 : 마지막.이후 문자열 자르기
let ext=filename.substr(dot+1);
//확장명을 전부 소문자 치환
ext=ext.toLowerCase();
if (ext=="png" || ext=="jpg" || ext=="gif") {
return true;
} else {
alert("이미지 파일만 업로드 가능합니다");
return false;
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 본문 시작 -->
<h3>게시판 상세보기</h3>
<p><a href="pdsForm.jsp">사진 올리기</a>
<a href="pdsList.jsp">사진 목록</a></p>
<%
int pdsno=Integer.parseInt(request.getParameter("pdsno"));
dto=dao.read(pdsno);
if(dto==null){
out.println("해당 글 없음");
}else{
dao.incrementCnt(pdsno);
%>
<table class="table">
<tr>
<th class="danger">글제목</th>
<td><%=dto.getSubject()%></td>
</tr>
<tr><th class="danger">사진</th>
<td><img src='../storage/<%=dto.getFilename()%>' width="80px"></td>
</tr>
<tr>
<th class="danger">파일크기</th>
<td><%=dto.getFilesize()%></td>
</tr>
<tr>
<th class="danger">작성자</th>
<td><%=dto.getWname()%></td>
</tr>
<tr>
<th class="danger">작성일</th>
<td><%=dto.getRegdate()%></td>
</tr>
<tr>
<th class="danger">조회수</th>
<td><%=dto.getReadcnt()%></td>
</tr>
</table>
<input type="button" value="수정" class="btn btn-primary" onclick="location.href='pdsUpdate.jsp?pdsno=<%=pdsno%>&filename=<%=dto.getFilename()%>'">
<input type="button" value="삭제" class="btn btn-secondary" onclick="location.href='pdsDel.jsp?pdsno=<%=pdsno%>'">
<%
}
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>
public PdsDTO read(int pdsno) {
PdsDTO dto=null;
try {
con=dbopen.getConnection();
sql=new StringBuilder();
sql.append(" select pdsno, wname, subject,passwd,readcnt,regdate,filename,filesize ");
sql.append(" from tb_pds ");
sql.append(" where pdsno=? ");
pstmt=con.prepareStatement(sql.toString());
pstmt.setInt(1, pdsno);
rs=pstmt.executeQuery();
if(rs.next()){
dto=new PdsDTO();
dto.setPdsno(rs.getInt("pdsno"));
dto.setWname(rs.getString("wname"));
dto.setSubject(rs.getString("subject"));
dto.setPasswd(rs.getString("passwd"));
dto.setReadcnt(rs.getInt("readcnt"));
dto.setRegdate(rs.getString("regdate"));
dto.setFilename(rs.getString("filename"));
dto.setFilesize(rs.getLong("filesize"));
}
}catch (Exception e) {
System.out.println("상세보기 실패"+e);
}finally {
DBClose.close(con,pstmt,rs);
}
return dto;
}
public void incrementCnt(int pdsno) {
try {
con=dbopen.getConnection();
sql=new StringBuilder();
sql.append(" update tb_pds ");
sql.append(" set readcnt=readcnt+1 ");
sql.append(" where pdsno=? ");
pstmt=con.prepareStatement(sql.toString());
pstmt.setInt(1, pdsno);
rs=pstmt.executeQuery();
}catch (Exception e) {
System.out.println("조회수 증가 실패"+e);
}finally {
DBClose.close(con,pstmt);
}
}
public int delete(int pdsno,String passwd,String saveDir) {
int cnt=0;
try {
//테이블의 행 삭제하기 전에, 삭제하고자 하는 파일명을 가져와야 한다
String filename="";
PdsDTO oldDTO=read(pdsno);
if(oldDTO !=null) {
filename=oldDTO.getFilename();
}
con=dbopen.getConnection();
sql=new StringBuilder();
sql.append(" delete ");
sql.append(" from tb_pds ");
sql.append(" where pdsno=? and passwd=? ");
pstmt=con.prepareStatement(sql.toString());
pstmt.setInt(1, pdsno);
pstmt.setString(2, passwd);
cnt=pstmt.executeUpdate();
if(cnt==1) {
//테이블에서 행삭제 성공시 첨부한 파일도 같이 삭제
//utility 클래스 이용
Utility.deleteFile(saveDir, filename);
}
}catch (Exception e) {
System.out.println("삭제 실패"+e);
}finally {
DBClose.close(con,pstmt);
}
return cnt;
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 글번호와 비밀번호가 일치하면 삭제
첨부파일도 함께 삭제 -->
<h3>글 삭제</h3>
<p>
<a href="pdsList.jsp">글목록</a>
</p>
<%
int pdsno=Integer.parseInt(request.getParameter("pdsno"));
%>
<form method="post" action="bbsDelProc.jsp" onsubmit="return pwCheck2()">
<input type="hidden" name="bbsno" value="<%=pdsno%>">
<table class="table">
<tr>
<th class="info">비밀번호</th>
<td><input type="password" name="passwd" id="passwd" maxlength="15" required>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="삭제" class="btn btn-danger" >
</td>
</tr>
</table>
</form>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 본문 시작 -->
<%
int pdsno=Integer.parseInt(request.getParameter("pdsno"));
String passwd=request.getParameter("passwd").trim();
String saveDir=application.getRealPath("/storage");
//첨부된 파일을 삭제하기 위해서(파일 저장 실제 경로)
dto.setPdsno(pdsno);
dto.setPasswd(passwd);
int cnt=dao.delete(pdsno, passwd, saveDir);
if (cnt == 0) {
out.println("<p>비밀번호가 틀립니다</p>");
out.println("<p><a href='javascript:history.back()'>재시도</a></p>");
} else {
out.println("<script>");
out.println(" alert('삭제 성공');");
out.println(" location.href='pdsList.jsp';"); //목록페이지 이동
out.println("</script>");
}
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>
storage 폴더에서 완전히 이미지가 삭제된것을 볼수 있다.
public int updatepro(PdsDTO dto,String saveDirectory) {
int cnt=0;
try {
String filename="";
PdsDTO oldDTO=read(dto.getPdsno());
if(oldDTO !=null) {
filename=oldDTO.getFilename();
}
con=dbopen.getConnection();
sql=new StringBuilder();
sql.append(" update tb_pds ");
sql.append(" set wname=?,subject=?,filename=?, filesize=? ");
sql.append(" where pdsno=? and passwd=? ");
pstmt= con.prepareStatement(sql.toString());
pstmt.setString(1, dto.getWname());
pstmt.setString(2, dto.getSubject());
pstmt.setString(3,dto.getFilename());
pstmt.setLong(4, dto.getFilesize());
pstmt.setInt(5, dto.getPdsno());
pstmt.setString(6, dto.getPasswd());
cnt=pstmt.executeUpdate();
if(cnt==1) {
//테이블에서 업데이트 성공시 첨부한 이전파일도 같이 삭제
//utility 클래스 이용
Utility.deleteFile(saveDirectory, filename);
}
} catch (Exception e) {
System.out.println("업데이트 실패"+e);
}finally {
DBClose.close(con,pstmt);
}
return cnt;
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 본문 시작 -->
<h3>포토 게시판 수정</h3>
<p><a href="pdsForm.jsp">사진 올리기</a>
<a href="pdsList.jsp">사진 목록</a></p>
<%
int pdsno=Integer.parseInt(request.getParameter("pdsno"));
dto=dao.read(pdsno);
if(dto==null){
out.println("해당 글 없음");
}else{
%>
<form method="post" action="pdsUpdateProc.jsp" enctype="multipart/form-data" onsubmit="return pdsCheck()">
<input type="hidden" name="pdsno" value="<%=pdsno%>">
<table class="table">
<tr>
<th>이름</th>
<td>
<input type="text" name="wname" id="wname" class="form-control" maxlength="20" value="<%=dto.getWname()%>" required>
</td>
</tr>
<tr>
<th>제목</th>
<td style="text-align: left">
<textarea rows="5" cols="30" name="subject" id="subject"><%=dto.getSubject() %></textarea>
</td>
</tr>
<tr>
<th>사진</th>
<td>
<img src='../storage/<%=dto.getFilename()%>' width="80px"><br>
<%=dto.getFilename()%><br>
<input type="file" name="filename" id="filename">
</td>
</tr>
<tr>
<th>비밀번호</th>
<td>
<input type="password" name="passwd" id="passwd" class="form-control" maxlength="15" required>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="수정하기" class="btn btn-primary">
<input type="reset" value="취소" class="btn btn-secondary">
</td>
</tr>
</table>
</form>
<%
}
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>
요청 정보를 가져올 경우 request 사용하지 않고
mr을 사용해서 가져온다.
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp" %>
<!-- 본문시작 bbsUpdateProc.jsp -->
<!-- 수정 요청한 정보을 가져와서, DB에 가서 행 수정하기 -->
<%
try{
//1.첨부된 파일 저장하기
String saveDirectory=application.getRealPath("/storage");
int maxPostSize=1024*1024*30;
String encoding="UTF-8";
MultipartRequest mr=new MultipartRequest(request,saveDirectory,maxPostSize,encoding,new DefaultFileRenamePolicy());
String fileName="";
long fileSize=0;
File file=null;
String item="";
Enumeration files=mr.getFileNames(); //mr이 가진 파일 전부 긁어오기
while(files.hasMoreElements()){ //여러개의 파일을 첨부하는 경우 한개씩 처리
item=(String)files.nextElement();
fileName=mr.getFilesystemName(item);
if(fileName!=null){ //실제 파일 가져왔다면
file=mr.getFile(item);
if(file.exists()){
fileSize=file.length();
}
}
}
//수정 요청한 정보 가져오기
int pdsno=Integer.parseInt(mr.getParameter("pdsno"));
String wname=mr.getParameter("wname").trim();
String subject=mr.getParameter("subject").trim();
String passwd=mr.getParameter("passwd").trim();
//dto에 담기
dto.setPdsno(pdsno);
dto.setWname(wname);
dto.setPasswd(passwd);
dto.setSubject(subject);
dto.setFilename(fileName);
dto.setFilesize(fileSize);
int cnt=dao.updatepro(dto, saveDirectory);
if(cnt==0){
out.println("<p>비밀번호가 일치하지 않습니다</p>");
out.println("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
}else{
out.println("<script>");
out.println(" alert('게시글이 수정되었습니다');");
out.println(" location.href='pdsList.jsp';");//목록페이지 이동
out.println("</script>");
}//if end
}catch(Exception e){
out.print(e);
out.println("<p>게시글 수정 실패</p>");
out.println("<p><a href='javascript:history.back()'>재시도</a></p>");
}
%>
<!-- 본문 끝 -->
<%@ include file="../footer.jsp" %>