[Web] - Day7 : (JSP)게시판 만들기

sue·2024년 1월 10일

📒국비학원 [Web]

목록 보기
9/21
post-thumbnail

1.

✏️ 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>&nbsp;");
			
			//<a href = "list.jsp?pageNum=5">◀ 이전</a>&nbsp;>
		}
		
		
		//바로가기 페이지 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>&nbsp;> ]뒤에 계속 누적
				//<font color = "Fuchsia">9</font>&nbsp;
				sb.append("<font color = \"Fuchsia\">" + page +
						"</font>&nbsp;");
				
			}else {
				
				// 현재페이지가 아니면 링크 다 달아줘야함
				// <a href = "list.jsp?pageNum=2">2</a>&nbsp;
				sb.append("<a href=\"" + listUrl + "pageNum=" + 
						page + "\">" + page + "</a>&nbsp;");
			}
			page++;

		}
		
		//다음 ▶
		// ◀ 6 7 8 9 10 ▶ 
		// <a href = "list.jsp?pageNum=11">다음 ▶</a>&nbsp;
		if(totalPage - currentPageSetup > numPerBlock) { //조건 충족하면 10 옆에 ▶ 만들어
			
			sb.append("<a href=\""+listUrl + "pageNum=" + 
					page + "\">다음▶</a>&nbsp;");
		}
			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>&nbsp;&nbsp;&nbsp;&nbsp;</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>&nbsp;&nbsp;&nbsp;&nbsp;</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"/>&nbsp;
				(게시물 수정 및 삭제시 필요!)
				</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만들기

  • DAO : DB연결

중복되지않는 데이터 넣는 법 :

  • 1)sequence
  • 2) 맨 처음 생성 후 초기 데이터 개수 MAX값 구하기 : (0) +1
    12345 일렬번호가 아니라서 3을 삭제해도 12456로 중복되지않음.

일렬번호: 셀렉트를 하는 순간에 데이터순서를 가져옴 ROWNUM


request는 사용자 데이터 5개와 함께 + request정보 (메모장)

ip꺼내오는 명령어 : request정보 (메모장)있음


📌 출력




BoardDAO 생성 -> 데이터 QUERY개수 확인!

: (desc num 했기때문에)


✅ 가장최근에 등록한 순으로 게시글 등록완료!

: (desc num 했기때문에)


[쌤이 주신] 34개 데이터 추가로 넣어주기

: (cmd - insert로!)들어간거 확인 완료!


✅ ⭐ 페이징작업 ⭐

하나의 페이지에 3개씩 보이도록 설정

  • rownum

    : 일련번호 123456...부여될거임

1페이지 : 123
2페이지 : 456
3페이지 : 789..가져올 수 있음

but,
중간에 삭제가 되었다면
12 3 4가아니라
12 3으로 대함


  • ✅ rownum 의 시작값과 끝값 구하는 공식!!

처음번호 : ( 보고싶은 페이지 -1 ) 3개 데이터 띄우니까 +1
끝번호 : 보고싶은 페이지
3

ex)
4페이징 10-12 :일땐

순서:

① 전체 데이터 개수를 알아야 함

  • 전체 데이터 count(*)에서 / 뿌리고싶은 데이터 개수 나누기!

② 로넘 처음번호 :(페이징 -1) * 데이터 개수값 +1

③ 나머지가 있으면 +1 : %했을때 나머지가 0이 아니면 - ex) 34/3 +1 => 나머지가 있으면


삭제된 데이터가 없다는 가정하에 1~10 (3개씩 페이징)

  • 홀수로 검색된 상태의 페이징이 나와야함
    : 9 7 5 / 3 1

검색시에는
-> searchKey searchValue가 필요함!!


삭제 할때 체크!

11페이지에서 123이었고, 12페이지에 1이 있었는데
11페이지에서 2가 삭제됐으면 12페이지에 있던게 땡겨와야함


  • <%for(BoardDTO dto : lists) {%>
    lists = (하나의페이지에) 3개의 데이터


✅ 원하는 넘버 범위 선택하고 싶을 때


✅ 제목을 클릭해서 내용을 볼 수 있는 것 - article.jsp

: list.jsp 시작점에 적어주기 : 클릭할때 넘어가야하니까
-> <dd class="subject"><%=dto.getSubject() %></dd>


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


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

  • 원래 주소가 article.jsp?num=35만 있었다면

  • currentPaget 데이터도 가지고 나가야 함


✅ ⭐ 검색하기!!!

list.jsp

  • 기존안

-변경안

  • ✔️ 이메일을 안쓰는 경우


  • ✔️ 수정하기 버튼 눌렀을 때 updated_ok로 넘기기위해선
    pageNum = ? 이 필요함!



  • ✔️ 한글이 깨지는걸 방지하는 2가지 :
    get방식 - server. url utf-8처리
    post방식 - request.setCharacterEncoding("UTF-8"); 맨 위 처리

currentPage > totalPage:마지막페이지에서 1개 남은걸 삭제했을 때 멀뚱멀뚱 쳐다보게끔 하는게 아니라, 그 이전 페이지로 넘어오게 하는 작업

  • 변경 전


  • 변경 후


searchKey(작성자/제목..)
searchValue (한글 / 영문 / 특수기호)

📌 : Encoding Decoding 처리해줘야함


<form action="" name="searchForm" method="post">

  • action이 없으면 다시 리로딩 해라
  • 검색을 하면 검색된 데이터에서 리로딩해야함
    123/567/89 전체데이터 -> 13579 로넘 : 135/79

-> BoardDAO

public int getDataCount() { } 한테

  • 검색했는지? - 검색된 개수 반환
  • 검색안했는지? - 전체 데이터 개수 반환받아야함

전체 데이터 개수 == maxNum메서드와 거의 비슷함

public int getDataCount(String searchKey, String searchValue) {



-> list

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


  • 페이징 풀리지않게 처리해줘야 함

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


작업 1


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


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

  • searchKey & searchValue값 데이터 주소에 추가해줘야함


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


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


index.jsp

0개의 댓글