일단은 어쩔 수 없으니 학원컴퓨터로 수업을 열심히 듣자.

한동안 맥만 쓰다 윈도우 낯설어질 뻔 했는데 오히려 좋아 굿  ^^

 

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에 저장되어 있던 내용을 갱신합니다(파일 업로드 지원).

}

+ Recent posts