일단은 어쩔 수 없으니 학원컴퓨터로 수업을 열심히 듣자.
한동안 맥만 쓰다 윈도우 낯설어질 뻔 했는데 오히려 좋아 굿 ^^
Windows 로고 키 + Shift 키 + S를 누릅니다. → 윈도우 캡쳐
큰 프로젝트의 경우 모델2방식으로 처리를 해야 한다.
🍀 서블릿
지금은 자바 클래스, 컨트롤러로서의 역할을 한다.
JSP 는 큰 틀에서는 html 언어로, 그 안에 <% %>를 이용해 자바언어 넣어주기
서블릿은 반대. 자바 언어 안에 html 넣어주기
ServletTest.jsp
<%@page import="java.util.Calendar"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>
현재 시간
<%=hour%>시
<%=minute%>분
<%=second%>초
</h1>
</body>
</html>
ServletTest.java
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
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("/ServletTest")
public class ServletTest extends HttpServlet{
// 서블릿 클래스는 무조건 HttpServlet 상속을 받아야 한다.
// get, post 방식 사용
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 요청이 들어오면 get 방식에 대해 요청 처리
resp.setContentType("text/html"); // 일반적인 타입
resp.setCharacterEncoding("utf-8");
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
PrintWriter out = resp.getWriter();
out.write("<!DOCTYPE html>");
out.write("<html>");
out.write("<head>");
out.write("<meta charset=\"EUC-KR\">");
out.write("<title>Insert title here</title>");
out.write("</head>");
out.write("<body>");
out.write("<h1>");
out.write(Integer.toString(hour));
out.write("시");
out.write(Integer.toString(minute));
out.write("분");
out.write(Integer.toString(second));
out.write("초");
out.write("</h1>");
out.write("</body>");
out.write("</html>");
// URL을 통해 요청
}
}
Servlet Life-Sycle
init() - 서블릿이 메모리에 로드될 때 한번만 호출
doGet() - GET 방식으로 date 전송 시 호출
doPost() - POST 방식으로 date 전송 시 호출
service() - 모든 요청은 service()를 통해 do__()메소드로 이동
destroy() - 서블릿이 메모리에서 해제되면 호출
request 객체에서 주소를 가지고 오는 함수
- request.getContextPath()
- 예) http://localhost:8080/project/list.jsp
- [return] /project
- request.getRequestURI() : 프로젝트 + 파일경로까지 가져옵니다.
- 예) http://localhost:8080/project/list.jsp
- [return] /project/list.jsp
- String url = request.getRequestURI.split("/");
- String Name = url[url.length -1]; // list.jsp
- request.getRequestURL() : 전체 경로를 가져옵니다.
- 예) http://localhost:8080/project/list.jsp
- [return] http://localhost:8080/project/list.jsp
- request.ServletPath() : 파일명만 가져옵니다.
- 예) http://localhost:8080/project/list.jsp
- [return] /list.jsp
- request.getRealPath() : 서버 or 로컬 웹 애플리케이션 절대경로를 가져옵니다.
- 예) http://localhost:8080/projectname/list.jsp
- [return] c:\project\webapps\projectname\
출처: https://yi-chi.tistory.com/12 [2chi:티스토리]
+어플리케이션 내장 객체도 알아보기
🍀 절대경로와 상대경로
→ 페이지 이동을 위해 꼭 알아야 함!
http://localhost:9999/FristJsp 절대경로
http://localhost:9999/FristJsp/Servlet/DirectServletPrint.jsp 절대경로
http://localhost:9999/Servlet/DirectServletPrint.do → not found (경로 표시가 안되어 있다.)
"../Servlet/DirectServletPrint.do" 상대경로
"FristJsp/Servlet/DirectServletPrint.do" 절대경로
💡 같은 위치의 파일이 있다고 생각하면 안되고 url의 주소로 생각해야 한다.
http://localhost:9999/FristJsp/Servlet/DirectServletPrint.jsp 와
http://localhost:9999/FristJsp/Servlet/DirectServletPrint.do 의 경우, 같은 위치에 파일이 있는 것이 아님. 주소를 나타낸 것일 뿐.
🌀 doPost() 방식
DirectServletPrint.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form method="post" action="../Servlet/DirectServletPrint.do"> <!-- 상대경로 -->
<input type="submit" value="바로가기">
</form>
</body>
</html>
DirectServletPrint.java
package servlet;
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("/Servlet/DirectServletPrint.do")
public class DirectServletPrint extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("<html>");
writer.println("<head><title>DirectServletPrint</title></head>");
writer.println("<body>");
writer.println("<h2>서블릿에서 직접 출력합니다.</h2>");
writer.println("<p>jsp로 포워드하지 않습니다.</p>");
writer.println("</body>");
writer.println("</html>");
writer.close();
}
}
🍀 서블릿 매핑
브라우저는 URL을 이용해 웹 프로젝트에 접근,
👉 http:// IP주소: 포트번호 / 프로젝트 이름/<패키지 이름>.<클래스 이름>
클래스 이름이 길어지면 입력하기 불편, 보안 취약의 문제로 실제 서블릿 클래스 파일 이름을 대체할 수 있는 별명을 붙이는 것이 바로 매핑
매핑하는 방법은 web.xml 파일에 직접 작성하는 방법과 서블릿 어노테이션을 사용하는 방법 두 가지가 있는데 이번 수업에서는 서블릿 어노테이션을 이용해보았다.
AnnoMapping.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<p>
<strong>${message}</strong>
<br>
<a href="<%=request.getContextPath() %>/Servlet/AnnoMapping.do">바로가기</a>
</p>
</body>
</html>
AnnoMapping.java
package servlet;
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("/Servlet/AnnoMapping.do")
public class AnnoMapping extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("message", "@WebServlet으로 매핑");
request.getRequestDispatcher("/Servlet/AnnoMapping.jsp").forward(request, response);
}
}
▼ 질문) 서블릿에서 매핑 시 이름 뒤에 붙는 do, one, mvc 의 차이
더보기
서블릿에서 매핑 시 이름 뒤에 붙는 do, one, mvc 등의 접미사는 특정한 차이를 나타내지 않습니다. 이 접미사들은 단순히 URL 패턴을 식별하기 위해 사용되는 문자열일 뿐입니다. 예를 들어, *.do, *.one, *.mvc와 같은 패턴은 각각 do, one, mvc로 끝나는 모든 요청 URL을 서블릿으로 매핑하는 것을 의미합니다.
이러한 패턴은 개발자가 URL 구조를 논리적으로 구분하고 쉽게 식별할 수 있도록 도와줍니다. 예를 들어:
- .do: 주로 일반적인 요청을 처리할 때 사용
- .one: 특정한 기능이나 모듈을 구분할 때 사용
- .mvc: MVC 패턴에서 컨트롤러 요청을 처리할 때 사용
이처럼 접미사는 개발자의 의도와 프로젝트의 구조에 따라 자유롭게 사용할 수 있습니다.
출처) 노션 AI
👉 @WebServlet("/mvcboard/list.do")
→ <a href="../mvcboard/list.do">게시판 목록 바로가기</a>
💡 서블릿을 만들 때 설정해두었던 매핑 이름이 @WebServlet(__)에 나온다.
서블릿을 사용할 파일에 가서
<a href="../mvcboard/list.do">게시판 목록 바로가기</a>
이런 식으로 매핑한 이름의 경로를 적어주면 된다.
한번의 매핑으로 여러 가지 요청 처리하기
🌀 doGet() 방식
FrontController.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h3>한 번의 매핑으로 여러 가지 요청 처리하기</h3>
<ol>
<!--화면에서 ${ } 정보를 읽어온다 -->
<li>URL : ${uri }</li>
<li>요청명 : ${commandStr }</li>
</ol>
<ul>
<li><a href="../Servlet/regist.one">회원가입</a></li>
<li><a href="../Servlet/login.one">로그인</a></li>
<li><a href="../Servlet/freeboard.one">자유게시판</a></li>
</ul>
</body>
</html>
FrontController.java
package servlet;
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("*.one")
public class FrontController extends HttpServlet {
// 생명주기
// init() 처음 서블릿이 동작될 때 알아서 호출
// service() => doGet(), doPost()의 역할을 수행 - 요청이 있을 때
// destory() 서블릿이 종료될 때 알아서 호출
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri = req.getRequestURI(); // /FristJsp/Servelt/AnnoMapping.one
int lastSlash = uri.lastIndexOf("/");
String commendStr = uri.substring(lastSlash); // /AnnoMapping.one
if (commendStr.equals("/regist.one")) {
registFunc(req);
} else if (commendStr.equals("/login.one")) {
loginFunc(req);
} else if (commendStr.equals("/freeboard.one")) {
freeboardFunc(req);
}
// 뷰로 이동
req.setAttribute("uri", uri);
req.setAttribute("commandStr", commendStr);
req.getRequestDispatcher("/Servlet/FrontController.jsp").forward(req, resp); // 제어권을 넘긴다
}
void registFunc(HttpServletRequest req) {
req.setAttribute("resultValue", "<h4>회원가입</h4>");
}
void loginFunc(HttpServletRequest req) {
req.setAttribute("resultValue", "<h4>로그인</h4>");
}
void freeboardFunc(HttpServletRequest req) {
req.setAttribute("resultValue", "<h4>자유게시판</h4>");
}
}
🍀 MVC 방식(패턴)
리엑트, 뷰 → 노드js 프론트엔드
스프링, 스프링부트 백엔드
전자정부 프레임 기반이 스프링. 자바 수요가 많은 이유.
Go 언어도 전자정부의 표준언어로 지정
서블릿은 컨트롤러의 역할. → 모델과 뷰를 연결해주는 중간자
클라이언트 → 프레젠테이션 계층 (서블릿) → DTO→
비즈니스 계층 → DTO→ 퍼시스턴트 계층 = 영속 계층(DAO) → DB
비즈니스 계층 → DTO→ 퍼시스턴트 계층 = moel 이라고 한다.
클라이언트는 뷰(V), 프레젠테이션 계층은 컨트롤러 뷰(C), 비즈니스+퍼시스턴스는 모델(M)
→ MVC 방식(패턴)이라고 한다.
우리가 만들어볼 MVC 구조
클라이언트 → 서블릿 → DAO → DB
DB)
musthave 계정에서
-- mvc2
create table mvcboard (
idx number primary key,
name varchar2(50) not null,
title varchar2(200) not null,
content varchar2(2000) not null,
postdate date default sysdate not null,
ofile varchar2(200),
sfile varchar2(30),
downcount number(5) default 0 not null,
pass varchar2(50) not null,
visitcount number default 0 not null
);
insert into mvcboard (idx, name, title, content, pass)
values (seq_board_num.nextval, '김유신', '자료실 제목1 입니다.','내용','1234');
insert into mvcboard (idx, name, title, content, pass)
values (seq_board_num.nextval, '장보고', '자료실 제목2 입니다.','내용','1234');
insert into mvcboard (idx, name, title, content, pass)
values (seq_board_num.nextval, '이순신', '자료실 제목3 입니다.','내용','1234');
insert into mvcboard (idx, name, title, content, pass)
values (seq_board_num.nextval, '강감찬', '자료실 제목4 입니다.','내용','1234');
insert into mvcboard (idx, name, title, content, pass)
values (seq_board_num.nextval, '대조영', '자료실 제목5 입니다.','내용','1234');
commit;
model2.board 패키지)
MVCBoardDAO.java
package model2.board;
import common.DBConnPool;
public class MVCBoardDAO extends DBConnPool {
// 검색 조건에 맞는 게시물의 개수를 반환합니다.
// 검색 조건에 맞는 게시물 목록을 반환합니다(페이징 기능 지원).
// 게시글 데이터를 받아 DB에 추가합니다(파일 업로드 지원).
// 주어진 일련번호에 해당하는 게시물을 DTO에 담아 반환합니다.
// 주어진 일련번호에 해당하는 게시물의 조회수를 1 증가시킵니다.
// 다운로드 횟수를 1 증가시킵니다.
// 입력한 비밀번호가 지정한 일련번호의 게시물의 비밀번호와 일치하는지 확인합니다.
// 지정한 일련번호의 게시물을 삭제합니다.
// 게시글 데이터를 받아 DB에 저장되어 있던 내용을 갱신합니다(파일 업로드 지원).
}
MVCBoardDTO.java
package model2.board;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class MVCBoardDTO {
private String idx;
private String name;
private String title;
private String content;
private java.sql.Date postDate;
private String ofile;
private String sfile;
private int downcount;
private String pass;
private int visitcount;
}
model2.mvcboard 패키지)
ListController.java
package model2.mvcboard;
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 org.apache.jasper.runtime.ProtectedFunctionMapper;
import fileupload.MyfileDAO;
import model2.board.MVCBoardDAO;
@WebServlet("/mvcboard/list.do")
public class ListController extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
MVCBoardDAO dao = new MVCBoardDAO();
req.getRequestDispatcher("/MVCBoard/List.jsp").forward(req, resp); // 제어권을 넘긴다
}
}
webapp에서 MVCBoard 폴더)
index.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<!-- 대문 페이지 -->
<h2>파일 첨부형 게시판</h2>
<a href="../mvcboard/list.do">게시판 목록 바로가기</a>
</body>
</html>
List.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h2>파일 첨부형 게시판 - 목록 보기(List)</h2>
</body>
</html>
listcontroller
package model2.mvcboard;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
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 org.apache.jasper.runtime.ProtectedFunctionMapper;
import fileupload.MyfileDAO;
import model1.board.BoardDTO;
import model2.board.MVCBoardDAO;
import model2.board.MVCBoardDTO;
import utils.BoardPage;
@WebServlet("/mvcboard/list.do")
public class ListController extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
MVCBoardDAO dao = new MVCBoardDAO();
Map<String , Object> param = new HashMap<>();
String searchField = req.getParameter("searchField");
String searchWord = req.getParameter("searchWord");
if (searchWord != null){
param.put("searchField",searchField);
param.put("searchWord",searchWord);
}
// --------------------- 페이징 ---------------------
int totalCount = dao.selectCount(param); // 게시물 전체 개수
// 어플리케이션 내장객체 ServletContext로 가지고 오기
ServletContext application = getServletContext();
int pageSize = Integer.parseInt(application.getInitParameter("POSTS_PER_PAGE"));
int blockPage = Integer.parseInt(application.getInitParameter("PAGES_PER_BLOCK"));
// 기본적으로 1 페이지에서 시작
int pageNum = 1;
String pageTemp = req.getParameter("pageNum"); // 바뀐 번호를 이용해 페이지 출력
// 페이지 번호를 이용해서 잘라오기, 페이징하기 위한 기준값으로 pagNum 사용
if(pageTemp != null && !pageTemp.equals("")){
pageNum = Integer.parseInt(pageTemp);
}
// (현재페이지 - 1) * POSTS_PER_PAGE + 1
int start = (pageNum - 1) * pageSize + 1;
// 현재페이지 * POSTS_PER_PAGE
int end = pageNum * pageSize;
// Map에 담기
param.put("start",start);
param.put("end",end);
List<MVCBoardDTO> boardLists = dao.selectListPage(param);
dao.close();
// 매핑했던 주소를 넘겨준다. (index.jsp에서 받았던 페이지 주소)
String pagingImg = BoardPage.pagingStr(totalCount, pageSize, blockPage, pageNum, "../mvcboard/list.do");
param.put("pagingImg", pagingImg);
param.put("totalCount", totalCount);
param.put("pageSize", pageSize);
param.put("pageNum", pageNum);
req.setAttribute("boardLists", boardLists);
req.setAttribute("map", param);
// http://localhost:9999/FristJsp
req.getRequestDispatcher("/MVCBoard/List.jsp").forward(req, resp); // 제어권을 넘긴다
}
}
package model2.mvcboard;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.text.SimpleDateFormat;
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 com.oreilly.servlet.MultipartRequest;
import fileupload.FileUtil;
import model2.board.MVCBoardDAO;
import model2.board.MVCBoardDTO;
import utils.JSFunction;
@WebServlet("/mvcboard/write.do")
public class WriteController extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/MVCBoard/Write.jsp").forward(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 어플리케이션 객체 생성
// ServletContext application = getServletContext(); 이렇게 받아와도 된다
String saveDirectory = req.getServletContext().getRealPath("Uploads");
int maxPostSize = 1024 * 1000; //(1MB)
// 객체를 생성해서 업로드하는 부분을 모듈화시킨다
// 클래스 (업로드, 다운로드, 삭제)
// MultipartRequest(request,저장할 경로,파일의최대대크기,인코딩,이름정책)
MultipartRequest mr = FileUtil.uploadFile(req, saveDirectory, maxPostSize);
if (mr == null) {
JSFunction.alertLocation(resp, "첨부 파일이 제한 용량을 초과합니다.", "../mvcboard/write.do");
return;
}
MVCBoardDTO dto = new MVCBoardDTO();
dto.setName(mr.getParameter("name"));
dto.setTitle(mr.getParameter("title"));
dto.setContent(mr.getParameter("content"));
dto.setPass(mr.getParameter("pass"));
String fileName = mr.getFilesystemName("ofile");
if (fileName != null) {
String ext = fileName.substring(fileName.lastIndexOf(".")); // 파일 확장자 .txt
String now = new SimpleDateFormat("yyyyMMdd_HmsS").format(new Date()); // 20240101123456
String newFileName = now + ext; // 20240101123456.txt
File oldFile = new File(saveDirectory + File.separator + fileName);
File newFile = new File(saveDirectory + File.separator + newFileName);
oldFile.renameTo(newFile);
dto.setOfile(fileName);
dto.setSfile(newFileName);
}
// 데이터를 받아 DB에 추가
MVCBoardDAO dao = new MVCBoardDAO();
int result = dao.insertWrite(dto);
dao.close();
if (result > 0) {
resp.sendRedirect("../mvcboard/list.do");
}else {
resp.sendRedirect("../mvcboard/write.do");
}
}
}
package model2.board;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import common.DBConnPool;
public class MVCBoardDAO extends DBConnPool {
// 검색 조건에 맞는 게시물의 개수를 반환합니다.
// 전체 레코드의 개수를 알아야 페이징을 할 수 있다.
public int selectCount(Map<String, Object> map) {
int totalcount = 0;
String query = " select count(*) from mvcboard ";
if (map.get("searchWord") != null) {
query += " where " + map.get("searchField")
+ " like '%" + map.get("searchWord") + "%'";
}
try {
psmt = con.prepareStatement(query);
rs = psmt.executeQuery();
if (rs.next()) {
totalcount = rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}
return totalcount;
}
// 검색 조건에 맞는 게시물 목록을 반환합니다(페이징 기능 지원).
public List<MVCBoardDTO> selectListPage(Map<String, Object> map){
List<MVCBoardDTO> board = new ArrayList<>();
String query = " select * "
+ " from ("
+ " select rownum rNum, Tb.*"
+ " from ("
+ " select *"
+ " from mvcboard ";
if(map.get("searchWord") != null) {
query += " where " + map.get("searchField")
+ " like '%" + map.get("searchWord") + "%'";
}
query += " order by idx desc "
+ " ) Tb"
+ " )"
+ " where rnum between ? and ? ";
try {
psmt = con.prepareStatement(query);
psmt.setString(1, map.get("start").toString());
psmt.setString(2, map.get("end").toString());
rs = psmt.executeQuery();
while (rs.next()) {
MVCBoardDTO dto = new MVCBoardDTO();
dto.setIdx(rs.getString("idx"));
dto.setName(rs.getString("Name"));
dto.setTitle(rs.getString("title"));
dto.setContent(rs.getString("content"));
dto.setPostDate(rs.getString("postdate"));
dto.setOfile(rs.getString("Ofile"));
dto.setSfile(rs.getString("Sfile"));
dto.setDowncount(rs.getInt("downcount"));
dto.setPass(rs.getString("Pass"));
dto.setVisitcount(rs.getInt("Visitcount"));
board.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
}
return board;
}
// 게시글 데이터를 받아 DB에 추가합니다(파일 업로드 지원).
public int insertWrite(MVCBoardDTO dto) {
int result = 0;
String query = " insert into mvcboard "
+ " (idx, name, title, content, ofile, sfile, pass) "
+ " values ( seq_board_num.nextval,?,?,?,?,?,?)";
try {
psmt = con.prepareStatement(query);
psmt.setString(1, dto.getName());
psmt.setString(2, dto.getTitle());
psmt.setString(3, dto.getContent());
psmt.setString(4, dto.getOfile());
psmt.setString(5, dto.getSfile());
psmt.setString(6, dto.getPass());
result = psmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
// 주어진 일련번호에 해당하는 게시물을 DTO에 담아 반환합니다.
// 주어진 일련번호에 해당하는 게시물의 조회수를 1 증가시킵니다.
// 다운로드 횟수를 1 증가시킵니다.
// 입력한 비밀번호가 지정한 일련번호의 게시물의 비밀번호와 일치하는지 확인합니다.
// 지정한 일련번호의 게시물을 삭제합니다.
// 게시글 데이터를 받아 DB에 저장되어 있던 내용을 갱신합니다(파일 업로드 지원).
}