
✏️ Test1.
💻 입력
Java Resources폴더
com.board폴더
BoardDAO.java
BoardDTO.java
MyUtil.java
DBConn.java
board폴더
css폴더
style.css- 공용
created.css
article.css
list.css
js폴더
article.jsp
created.jsp
list.jsp
💻 입력
⬇️ Quantum SQL
테이블 생성


⬇️ BoardDTO.java
package com.board;
public class BoardDTO {
private int num;
private String name;
private String pwd;
private String email;
private String subject;
private String content;
private String ipAddr;
private int hitCount;
private String created;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getIpAddr() {
return ipAddr;
}
public void setIpAddr(String ipAddr) {
this.ipAddr = ipAddr;
}
public int getHitCount() {
return hitCount;
}
public void setHitCount(int hitCount) {
this.hitCount = hitCount;
}
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
}
⬇️ BoardDAO.java
package com.board;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class BoardDAO {
private Connection conn; //conn받을 준비 - 필수 요건
public BoardDAO (Connection conn) {
this.conn = conn;
}
//num의 max 구하기 (Data insert할 때마다 max값 구하기)
public int getMaxNum() {
int maxNum = 0; // 반환값 최대값 돌려주니까
PreparedStatement pstmt = null; // ?일때 preparedstatement , Statement : 빠르다
ResultSet rs = null;
String sql;
try {
sql = "select nvl(max(num),0) from board";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
maxNum = rs.getInt(1); // 1쓰는 이유 : max(num) 파생컬럼명이라 못쓰니까 무조건 1개나와서
}
pstmt.close();
rs.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return maxNum;
}
//입력
public int insertData(BoardDTO dto) { //dto에 꺼내서 데이터 넣어줘
int result = 0;
PreparedStatement pstmt = null;
String sql;
try {
sql = "insert into board (num, name, pwd, email, subject, content, ipAddr, hitCount, created) ";
sql += "values (?, ?, ?, ?, ?, ?, ?, 0, sysdate)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, dto.getNum());
pstmt.setString(2, dto.getName());
pstmt.setString(3, dto.getPwd());
pstmt.setString(4, dto.getEmail());
pstmt.setString(5, dto.getSubject());
pstmt.setString(6, dto.getContent());
pstmt.setString(7, dto.getIpAddr());
//hitcount랑 created는 (0,sysdate)로 인해 자동으로 들어갈 예정
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//전체 데이터 개수 == maxNum메서드와 거의 비슷함
public int getDataCount() {
int dataCount = 0; // 반환값 전체 데이터 개수 돌려주니까
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select nvl(count(*),0) from board";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
dataCount = rs.getInt(1); // 1쓰는 이유 :파생컬럼명이라 못쓰니까 무조건 1개나와서
}
pstmt.close();
rs.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return dataCount;
}
//전체데이터 가져오기
public List<BoardDTO> getLists(int start, int end){ // (로넘을 기준으로 한 시작값 과 끝값 공식을 활용해) 데이터 가져와야함
List<BoardDTO> lists = new ArrayList<BoardDTO>();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
//kim-sql에 있음 가운데 별칭 rnum만들어서 묶어주고 그 별칭으로 >= 원하는번호 구하기
sql = "select * from (";
sql += "select rownum rnum, data.* from (";
sql += "select num,name,subject,hitCount,";
sql += "to_char(created, 'YYYY-MM-DD') created ";
sql += "from board order by num desc) data)";
sql += "where rnum>=? and rnum<=?"; //start랑 end
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, start);
pstmt.setInt(2, end);
rs = pstmt.executeQuery();
while(rs.next()) {
BoardDTO dto = new BoardDTO();
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setSubject(rs.getString("subject"));
dto.setHitCount(rs.getInt("hitCount"));
dto.setCreated(rs.getString("created"));
lists.add(dto);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
//num으로 한개의 데이터 가져오기 - article.jsp
public BoardDTO getReadData(int num) { //num을 주면 한개의 BoardDTO의 데이터를 주는 메서드
BoardDTO dto = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
//몽땅 (전체) 가져오는 select문 - 두개만 가지고오고싶다해서 따로 만들지 않기!!!!
sql = "select num,name,pwd,email,subject,content,";
sql += "ipAddr,hitCount,created from board where num=?"; //num=? - 프라이머리 key값있는 친구
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if(rs.next()) {
dto = new BoardDTO();
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setPwd(rs.getString("pwd"));
dto.setEmail(rs.getString("email"));
dto.setSubject(rs.getString("subject"));
dto.setContent(rs.getString("content"));
dto.setIpAddr(rs.getString("ipAddr"));
dto.setHitCount(rs.getInt("hitCount"));
dto.setCreated(rs.getString("created"));
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return dto;
}
//조회수 증가
public int updateHitCount(int num) {
//num의 조회수올리기
int result = 0;
PreparedStatement pstsmt = null;
String sql;
//select 문이 아니면 resultset은 필요없음
try {
sql = "update board set hitCount = hitCount+1 ";
sql += "where num=?";
pstsmt= conn.prepareStatement(sql);
pstsmt.setInt(1, num);
result = pstsmt.executeUpdate();
pstsmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
}
⬇️ MyUtil.java
package com.util;
//page처리 클래스
public class MyUtil {
//전체 페이지의 개수 (반환해야함)
public int getPageCount(int numPerPage, int dataCount) {
int pageCount = 0;
pageCount = dataCount / numPerPage ;
if(dataCount % numPerPage !=0 ) {
pageCount++;
}
return pageCount;
}
//페이징 처리 메소드 - 아래 세개의 값이 있어야 페이징 만들 수 있음
public String pageIndexList(int currentPage, int totalPage, String listUrl) { //현재 몇페이지 출력할거야? - 1 -
int numPerBlock = 5; // - 6 7 8 9 10 -
int currentPageSetup; // 이전누르면 6-1 = 5p, 다음
int page; //page++ = i++처럼 사용
StringBuffer sb = new StringBuffer();
if(currentPage==0 || totalPage==0) {
return ""; //반응 보이지 않음 , 반환값 String이므로 ""표시
}
//listUrl에는 list.jsp를 넣어놓을거임
//?가 없으면 <a href="list.jsp~~~>검색을 안한거임 -> ? + pageNum=2붙여야함
//l?가 있으면 <a href="list.jsp?searchKey~~~~> + & pageNum붙여야함
if(listUrl.indexOf("?")!=-1) { //없지않으면 = 있으면
listUrl = listUrl + "&";
}else {
listUrl = listUrl + "?";
}
//이전 6 7 8 9 10 다음
//(현재 페이지 / 5)*5
currentPageSetup = (currentPage/numPerBlock)*numPerBlock;
if(currentPage % numPerBlock == 0) { //10처럼 numPerBlock의 배수일때
currentPageSetup = currentPage - numPerBlock;
}
//◀ 이전
if(totalPage > numPerBlock && currentPageSetup > 0) {
sb.append("<a href=\"" + listUrl + "pageNum="+currentPageSetup + "\">◀ 이전</a> ");
//<a href = "list.jsp?pageNum=5">◀ 이전</a> >
}
//바로가기 페이지 6 7 8 9 10
//currentPageSetup = 5 = ◀ 이전
page = currentPageSetup + 1; //6부터시작
while(page <= totalPage &&
page <= (currentPageSetup + numPerBlock)) {
if(page==currentPage) {
//[ <a href = "list.jsp?pageNum=5">◀ 이전</a> > ]뒤에 계속 누적
//<font color = "Fuchsia">9</font>
sb.append("<font color = \"Fuchsia\">" + page +
"</font> ");
}else {
// 현재페이지가 아니면 링크 다 달아줘야함
// <a href = "list.jsp?pageNum=2">2</a>
sb.append("<a href=\"" + listUrl + "pageNum=" +
page + "\">" + page + "</a> ");
}
page++;
}
//다음 ▶
// ◀ 6 7 8 9 10 ▶
// <a href = "list.jsp?pageNum=11">다음 ▶</a>
if(totalPage - currentPageSetup > numPerBlock) { //조건 충족하면 10 옆에 ▶ 만들어
sb.append("<a href=\""+listUrl + "pageNum=" +
page + "\">다음▶</a> ");
}
return sb.toString();
}
}
⬇️ list.jsp
<%@page import="com.util.MyUtil"%>
<%@page import="com.board.BoardDTO"%>
<%@page import="java.util.List"%>
<%@page import="com.board.BoardDAO"%>
<%@page import="com.util.DBConn"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
MyUtil myUtil = new MyUtil();
//넘어온 페이지 번호
String pageNum = request.getParameter("pageNum"); //넘어오는 매개변수
int currentPage = 1;
//처음 실행시 - null
if(pageNum!=null){
currentPage = Integer.parseInt(pageNum);//실제변수 18 line
}
//전체 데이터 개수 구하기
int dataCount = dao.getDataCount();
//한 페이지에 보여질 데이터 개수와 전체 페이지 개수
int numPerPage = 5;
int totalPage = myUtil.getPageCount(numPerPage, dataCount);
//전체 페이지수보다 표시할 페이지가 큰 경우, 표시할 페이지를 전체 페이지로 만듦
//ex, 11페이지에서 123이었고, 12페이지에 1이 있었는데, 11페이지에서 2가 삭제됐으면 12페이지에 있던게 땡겨와야함
if(currentPage > totalPage){
currentPage = totalPage;
}
//가져올 데이터의 시작과 끝
int start = (currentPage - 1) * numPerPage +1;
int end = currentPage * numPerPage;
//int end = start + numPerPage -1;
List<BoardDTO> lists = dao.getLists(start,end);
//select한거라서 redirect시킬 필요 없음
//페이징 처리
String listUrl = "list.jsp";
String pageIndexList = myUtil.pageIndexList(currentPage, totalPage, listUrl); //현재 페이지 보고싶고, 토탈페이지는12개이며, 이 주소로 넘길거야
DBConn.close();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>board/list.jsp//게시판</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp %>/board/css/list.css"/>
<script type="text/javascript">
function searchData() {
var f = document.searchForm;
f.submit();
}
</script>
</head>
<body>
<div id="bbsList">
<div id="bbsList_title">
게 시 판
</div>
<div id="bbsList_header">
<div id="leftHeader">
<form action="" name="searchForm" method="post">
<select name="searchKey" class="selectField">
<option value="subject">제목</option>
<option value="name">작성자</option>
<option value="content">내용</option>
</select>
<input type="text" name="searchValue" class="textField"/>
<input type="button" value=" 검 색 " class="btn2" onclick="searchData();">
</form>
</div>
<div id="rightHeader">
<input type="button" value=" 글올리기 " class="btn2" onclick="location='<%=cp%>/board/created.jsp';"/>
</div>
</div>
<div id="bbsList_list">
<div id="title">
<dl>
<dt class="num">번호</dt>
<dt class="subject">제목</dt>
<dt class="name">작성자</dt>
<dt class="created">작성일</dt>
<dt class="hitCount">조회수</dt>
</dl>
</div>
<div id="lists">
<%for(BoardDTO dto : lists) {%>
<dl>
<dd class="num"><%=dto.getNum() %></dd>
<dd class="subject">
<a href="<%=cp%>/board/article.jsp?
num=<%=dto.getNum()%>&pageNum=<%=currentPage%>">
<%=dto.getSubject() %></a>
</dd>
<dd class="name"><%=dto.getName() %></dd>
<dd class="created"><%=dto.getCreated() %></dd>
<dd class="hitCount"><%=dto.getHitCount() %></dd>
</dl>
<%} %>
</div>
<div id="footer">
<p>
<%if(dataCount!=0){ %>
<%=pageIndexList %>
<%}else {%>
등록된 게시물이 없습니다
<%} %>
</p>
</div>
</div>
</div>
</body>
</html>
⬇️ article.jsp
<%@page import="com.board.BoardDTO"%>
<%@page import="com.board.BoardDAO"%>
<%@page import="com.util.DBConn"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
int num = Integer.parseInt(request.getParameter("num"));
String pageNum = request.getParameter("pageNum");
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
//조회수 증가
dao.updateHitCount(num);
//글 읽기
BoardDTO dto = dao.getReadData(num); //반환값이 dto라서 = 왼쪽에 받아줘야함
if(dto == null){
response.sendRedirect("list.jsp");
}
//글(dto.content)라인 수
int lineSu = dto.getContent().split("\n").length; //엔터의 개수세기
//글의 엔터를 <br/>로 변경 (i=i+1)
//enter는 web에서 인식 불가
dto.setContent(dto.getContent().replaceAll("\n", "<br/>")); //get으로 꺼내와서 <br/>을 넣기만 한거라서 -> 다시 content에 넣어줘야함
DBConn.close();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게 시 판</title>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/article.css"/>
</head>
<body>
<div id="bbs">
<div id="bbs_title">
게 시 판
</div>
<div id="bbsArticle">
<div id="bbsArticle_header">
<%=dto.getSubject() %>
</div>
<div class="bbsArticle_bottomLine">
<dl>
<dt>작성자</dt>
<dd><%=dto.getName() %></dd>
<dt>줄수</dt>
<dd><%=lineSu %></dd>
</dl>
</div>
<div class="bbsArticle_bottomLine">
<dl>
<dt>등록일</dt>
<dd><%=dto.getCreated() %></dd>
<dt>조회수</dt>
<dd><%=dto.getHitCount() %></dd>
</dl>
</div>
<div id="bbsArticle_content">
<table width="600" border="0">
<tr><td style="padding: 20px 80px 20px 62px;"
valign="top" height="200">
<%=dto.getContent() %>
</td></tr>
</table>
</div>
</div>
<div class="bbsArticle_noLine" style="text-align: right;">
From : <%=dto.getIpAddr() %>
</div>
<div id="bbsArticle_footer">
<div id="leftFooter">
<input type="button" value=" 수정 " class="btn2"
onclick=""/>
<input type="button" value=" 삭제 " class="btn2"
onclick=""/>
</div>
<div id="rightFooter">
<input type="button" value=" 리스트 " class="btn2"
onclick="location='<%=cp%>/board/list.jsp?pageNum=<%=pageNum%>';"/>
</div>
</div>
</div>
</body>
</html>
⬇️ created_ok.jsp
<%@page import="com.board.BoardDAO"%>
<%@page import="com.util.DBConn"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<jsp:useBean id="dto" class="com.board.BoardDTO" scope="page"/>
<jsp:setProperty property="*" name="dto"/>
<%
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
int maxNum = dao.getMaxNum();//현재 테이블 num컬럼 안에 있는 최대값 반환
dto.setNum(maxNum+1); //다음번호 생성
dto.setIpAddr(request.getRemoteAddr()); //클라이언트ip를 request에서 꺼냄
//지금까지 5개 + 2개 추가함 = 7개 -> dao2번메서드 7개 필요해서 짝이 맞음
dao.insertData(dto);
//insert/delete..하면 redirect해줘야함 (멍하니 화면보고있을필요없으므로)
response.sendRedirect("list.jsp");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
---
⬇️ `created.jsp`
```html
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게 시 판</title>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/created.css"/>
<script type="text/javascript" src="<%=cp%>/board/js/util.js"></script>
<script type="text/javascript">
function sendIt(){
var f = document.myForm;
str = f.subject.value;
str = str.trim();
if(!str){
alert("\n제목을 입력하세요!");
f.subject.focus();
return;
}
f.subject.value = str;
str = f.name.value;
str = str.trim();
if(!str){
alert("\n이름을 입력하세요.");
f.name.focus();
return;
}
/*
if(!isValidKorean(str)){
alert("\n이름을 정확히 입력하세요.");
f.name.focus();
return
} */
f.name.value = str;
if(f.email.value){
if(!isValidEmail(f.email.value)){
alert("\n정상적인 E-Mail을 입력하세요.");
f.email.focus();
return;
}
}
str = f.content.value;
str = str.trim();
if(!str){
alert("\n내용을 입력하세요!");
f.content.focus();
return;
}
f.content.value = str;
str = f.pwd.value;
str = str.trim();
if(!str){
alert("\n패스워드를 입력하세요!");
f.pwd.focus();
return;
}
f.pwd.value = str;
f.action = "<%=cp%>/board/created_ok.jsp";
f.submit();
}
</script>
</head>
<body>
<div id="bbs">
<div id="bbs_title">
게 시 판
</div>
<form action="" method="post" name="myForm">
<div id="bbsCreated">
<div class="bbsCreated_bottomLine">
<dl>
<dt>제 목</dt>
<dd>
<input type="text" name="subject" size="60"
maxlength="100" class="boxTF"/>
</dd>
</dl>
</div>
<div class="bbsCreated_bottomLine">
<dl>
<dt>작 성 자</dt>
<dd>
<input type="text" name="name" size="35"
maxlength="20" class="boxTF"/>
</dd>
</dl>
</div>
<div class="bbsCreated_bottomLine">
<dl>
<dt>E-Mail</dt>
<dd>
<input type="text" name="email" size="35"
maxlength="50" class="boxTF"/>
</dd>
</dl>
</div>
<div id="bbsCreated_content">
<dl>
<dt>내 용</dt>
<dd>
<textarea rows="12" cols="63" name="content" class="boxTA"
style="resize: none; background-color: #ffffff"></textarea>
</dd>
</dl>
</div>
<div class="bbsCreated_noLine">
<dl>
<dt>패스워드</dt>
<dd>
<input type="password" name="pwd" size="35"
maxlength="7" class="boxTF"/>
(게시물 수정 및 삭제시 필요!)
</dd>
</dl>
</div>
</div>
<div id="bbsCreated_footer">
<input type="button" value=" 등록하기 " class="btn2"
onclick="sendIt();"/>
<input type="reset" value=" 다시입력 " class="btn2"
onclick="document.myForm.subject.focus();"/>
<input type="button" value=" 작성취소 " class="btn2"
onclick="location='<%=cp%>/board/list.jsp';"/>
</div>
</form>
</div>
</body>
</html>
1) DB - talble생성
2) 패키지 - > class : dto.dao만들기
중복되지않는 데이터 넣는 법 :
sequence MAX값 구하기 : (0) +112345 일렬번호가 아니라서 3을 삭제해도 12456로 중복되지않음.일렬번호: 셀렉트를 하는 순간에 데이터순서를 가져옴 ROWNUM
request는 사용자 데이터 5개와 함께 + request정보 (메모장)
ip꺼내오는 명령어 : request정보 (메모장)있음



BoardDAO 생성 -> 데이터 QUERY개수 확인!
: (desc num 했기때문에)


✅ 가장최근에 등록한 순으로 게시글 등록완료!
: (desc num 했기때문에)


[쌤이 주신] 34개 데이터 추가로 넣어주기
: (cmd - insert로!)들어간거 확인 완료!


✅ ⭐ 페이징작업 ⭐
하나의 페이지에 3개씩 보이도록 설정
1페이지 : 123
2페이지 : 456
3페이지 : 789..가져올 수 있음
but,
중간에 삭제가 되었다면
12 3 4가아니라
12 3으로 대함

처음번호 : ( 보고싶은 페이지 -1 ) 3개 데이터 띄우니까 +1
끝번호 : 보고싶은 페이지 3
ex)
4페이징 10-12 :일땐
순서:
① 전체 데이터 개수를 알아야 함
② 로넘 처음번호 :(페이징 -1) * 데이터 개수값 +1
③ 나머지가 있으면 +1 : %했을때 나머지가 0이 아니면 - ex) 34/3 +1 => 나머지가 있으면
삭제된 데이터가 없다는 가정하에 1~10 (3개씩 페이징)
검색시에는
-> searchKey searchValue가 필요함!!
삭제 할때 체크!
11페이지에서 123이었고, 12페이지에 1이 있었는데
11페이지에서 2가 삭제됐으면 12페이지에 있던게 땡겨와야함
<%for(BoardDTO dto : lists) {%> 
✅ 원하는 넘버 범위 선택하고 싶을 때


✅ 제목을 클릭해서 내용을 볼 수 있는 것 -
article.jsp
: list.jsp 시작점에 적어주기 : 클릭할때 넘어가야하니까
-> <dd class="subject"><%=dto.getSubject() %></dd>

자바영역에서 하이퍼링크 넣을 때 " " 헷갈리지 말기!

✅ article 내용 클릭 후 다시 나갈 때 -> 해당 페이지에 그대로 있고싶으면?
article.jsp?num=35만 있었다면

✅ ⭐ 검색하기!!!
list.jsp

-변경안


수정하기 버튼 눌렀을 때 updated_ok로 넘기기위해선

get방식 - server. url utf-8처리post방식 - request.setCharacterEncoding("UTF-8"); 맨 위 처리
currentPage > totalPage:마지막페이지에서 1개 남은걸 삭제했을 때 멀뚱멀뚱 쳐다보게끔 하는게 아니라, 그 이전 페이지로 넘어오게 하는 작업


searchKey(작성자/제목..)
searchValue (한글 / 영문 / 특수기호)
📌 : Encoding Decoding 처리해줘야함
<form action="" name="searchForm" method="post">
13579 로넘 : 135/79-> BoardDAO
public int getDataCount() { } 한테
전체 데이터 개수 == maxNum메서드와 거의 비슷함
public int getDataCount(String searchKey, String searchValue) {


-> list
검색된 데이터를 가진상태의 페이지로 나갔다가 들어와야하므로


✅ 중간 결과창 (검색해도 페이징이 풀리지않음)

작업 1

작업2 ) 주소와 같은 걸 확인

검색이 된 상태에서
리스트로 다시 나올때 유지하는 방법

패스워드랑 일치하지않으면 수정 못함

📌 이메일 null값일때 원하는 출력물 내기 (삼항연산자)

index.jsp

