JAVA

게시물목록,상세보기,Paging(jsp버전)

docc 2021. 7. 25. 00:13

게시물

1. 게시물등록준비: 게시물 폼

2. 게시물등록: 폼에서온 정보 DB에 저장(jdbc)

- 1. 업무규칙 검사(java)

- 2. 데이터수집(java)

- 3. 데이터전달( java <---> jdbc <---> DB)

3. 게시물목록: 저장된 DB에서 HTML출력(jdbc)

- 1. 데이터수집(java <---> jdbc <---> DB)

4. 게시물상세보기

* 게시물목록에서 링크로 정보담아 상세보기에서 얻어 html로 보여줌

* 조회수를 이 html을 실행시킬 때 올라가도록 update문을 넣어줌

* 게시물이 한페이지에 나오는 갯수를 정하여 밑에 페이징을( 1 2 3 4 5 )를 달아줌.

*if()문으로 작성일 받아와 현재날짜에서 뺀게 몇일안됐으면 새로 올라온 게시물로서 new가 뜨도록 넣어줌

서버쪽에서 하는일

1. 업무규칙 검사 (java)

2. 데이터수집(by 게시물번호) ( java <---> jdbc <---> DB )

3. 게시물출력


상세보기.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="boardmanage.게시물"%>

<%
	// 입력
	String str게시물번호 = request.getParameter("no");
	int 게시물번호 = Integer.valueOf(str게시물번호);
	
	// 1. 업무규칙 검사

	// 2. 데이터 수집
	게시물 게시물1 = null;
	
	try {
	Class.forName("com.mysql.cj.jdbc.Driver");

	Connection DB연결관리자 = DriverManager.getConnection("jdbc:mysql://localhost:3306/board1_1?useUnicode=true", "root",
	"1234");

	Statement 명령전달자 = DB연결관리자.createStatement();

	System.out.println("연결 성공");

	// %d = Decimal 이 표현구에 게시물번호가 대입
	String 조회수증가SQL = String.format("update 게시물 set 조회수 = 조회수 + 1 where 번호=%d", 게시물번호);
	명령전달자.executeUpdate(조회수증가SQL);
	//executdUpdate() 부터 전달안하면 오류남.
	String 수집SQL = String.format("select * from 게시물 where 번호=%d",게시물번호);
	ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);

	
	if (수집된표관리자.next()) {
	String 제목 = 수집된표관리자.getString("제목");
	String 내용 = 수집된표관리자.getString("내용");
	java.sql.Date 작성일 = 수집된표관리자.getDate("작성일");
	int 조회수 = 수집된표관리자.getInt("조회수");
	
	게시물1 = new 게시물();

	게시물1.set제목(제목);
	게시물1.set내용(내용);
	게시물1.set작성일(작성일);
	게시물1.set조회수(조회수);

		}

	수집된표관리자.close();
	DB연결관리자.close();
	} catch (Exception e) {
		e.printStackTrace();
	}	
	

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%-- 3. 게시물 출력 --%>
<h1>게시물 상세</h1>
제목<%= 게시물1.get제목() %><br>
내용 <textarea rows="10" cols="20" readonly="readonly"> <%= 게시물1.get내용() %> </textarea><br>
작성일 <%= 게시물1.get작성일().toString() %>
조회수 <%= 게시물1.get조회수() %><br>
<a href="게시물목록2.jsp">목록으로</a>
</body>
</html>

String.format 살펴보기

String a = "abc";
String b = "efg";
int c = 3;
//"_abc-efg_3"
// s = String, d = Decimal(숫자)
String.format("_%s-%s_%d", a,b,c);
//첫번째 s에 'a' 대입
//두번째 s에 'b' 대입
//마지막 d에 'c' 대입

>> 게시물목록.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@page import="java.util.*"%>
<%@ page import="boardmanage.게시물"%>

<%
//http://192.168.0.77:8080/down/board1.zip

	// 1. 업무규칙검사
// 했다치고

ArrayList<게시물> array게시물 = new ArrayList<게시물>();
// 2. 데이터수집
try {
	Class.forName("com.mysql.cj.jdbc.Driver");

	Connection DB연결관리자 = DriverManager.getConnection("jdbc:mysql://localhost:3306/board1_1?useUnicode=true", "root",
	"1234");

	Statement 명령전달자 = DB연결관리자.createStatement();

	System.out.println("연결 성공");

	String 수집SQL = "select * from 게시물";
	ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
		int 일련번호 = 1;

		while (수집된표관리자.next()) {
			
	int 게시물번호 = 수집된표관리자.getInt("번호");
	String 제목 = 수집된표관리자.getString("제목");
	java.sql.Date 작성일 = 수집된표관리자.getDate("작성일");
	int 조회수 = 수집된표관리자.getInt("조회수");
	
	게시물 게시물1 = new 게시물();

	게시물1.set번호(게시물번호);
	게시물1.set제목(제목);
	게시물1.set작성일(작성일);
	게시물1.set조회수(조회수);

	array게시물.add(게시물1);

		}

	수집된표관리자.close();
	DB연결관리자.close();
} catch (Exception e) {
	e.printStackTrace();
}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<!-- 3. 목록출력 -->
		<h1>게시물목록</h1>
		<ul>
			<%
				for(int i = 0; i<array게시물.size(); i++)
				{
					게시물 수집된게시물 = array게시물.get(i);
			%>

			<!-- 3-1. 게시물 1개출력 -->
			<li>
			<%= 수집된게시물.get번호() %>. &nbsp;&nbsp;
			<a href="상세보기.jsp?no=<%= 수집된게시물.get번호() %>"><%= 수집된게시물.get제목() %></a>
			<%= 수집된게시물.get작성일().toString() %>&nbsp;&nbsp; 
			<%= 수집된게시물.get조회수() %> 
			</li>
<%
 	}
 %>

<a href="게시물등록준비.jsp">글쓰기</a>
 
</ul>
</center>

</body>
</html>

http://localhost:8080/board1/상세보기.jsp?no=1

?: 이후가 서버로 넘어오는 정보다.

질의 문자로 client가 원하는 정보가 질의 문자로 넘어오는 것이다.

(post방식은 적혀있지 않지만, get방식일 때 보면 알 수 있다.)

물론 컴퓨터에서 client 입장으로 보면 '%EC%83%81% ' 이런 code형식으로 나타난다.

아직 넘어온 정보가 없으니 인위로 페이지에 name이 no인 태그에 값이 1이 들어갔다는 표현을 쓴것이다.

?key=value&key2=value2&...

이것을 a태그로 주소를 가져와 그 주소에 이어서 '?질의문'이 들어가게 하면 위와 똑같이 된다.

항상 자바식이 먼저 실행되어 <%= %>이 html로 먼저 변환된다.


Paging

>> 기초데이터입력.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="control.ConnectionInfo" %>
<%
try {
	Class.forName("com.mysql.cj.jdbc.Driver");

	Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,ConnectionInfo.DBPORT,ConnectionInfo.DBName)
																		,ConnectionInfo.UID , ConnectionInfo.PASSWORD);

	Statement 명령전달자 = DB연결관리자.createStatement();
	System.out.println("연결 성공");
	
	for(int 회=1; 회<=332; 회++){
	String 삽입SQL = String.format("insert into 게시물(제목,내용) values('제목%d','내용%d')",회,회);
	명령전달자.executeUpdate(삽입SQL); // 명령전달자가 보낸다.		
	}

	DB연결관리자.close();
	System.out.println("모두 입력");
} catch (Exception e) {
	e.printStackTrace();
}
%>

일련번호: 수집된 게시물을 정렬한 순번 (고정되지 않는 번호)

게시물번호: 튜플들의 번호열값 (고정번호)

만약 제목에 '여름'단어가 있는 게시물을 찾는다 하면 찾은 게시물 옆에 게시물번호이면 4,6,20 등 들쑥날쑥이다.

검색했을 때 나오는 게시물도 정렬순으로 일련번호로 출력해줘야 한다.

마찬가지로 paging을 달면

1-1. 페이지번호

페이지번호를 몇개까지 나오도록 만들지(1~10, 11~20 로 10개씩일지 아니면 1~5, 6~10 로 5개씩일지)

2-1. 시작 일련번호 , 끝 일련번호

모든 페이지가 일련번호로 출력할 수도 있고(각 페이지마다 1부터 시작하도록)

2-2. 시작 일련번호, 갯수

그냥 게시물이 올라온 순으로 쭉 번호를 매길수도 있다(마지막페이지까지 누적되어 총 300개면 마지막 게시물은 300번으로 출력되도록)

- 최대가능 갯수(10라던가) 설정하거나(대신 나머지로 2개가 남으면 오류가 발생할 수도)

- 계산해서 10개가 있으면 10개 2개면 2개를 주던가


1. 페이지당 게시물을 가져온다.

select * from 게시물 order by 번호 desc limit %d, %d
-- limit index, num
-- index부터 num개 가져온다

limit를 사용해 페이지당 게시물 수를 가져온다.

index자리에는 '(페이지-1) X 페이지당 게시물 수' 가 들어가면 된다.(첫페이지는 1페이지이며, index는 0부터 시작하므로)

2. 페이지당 게시물 수를 담을 페이지의 마지막페이지 구하기

select count(*) as 총갯수 from 게시물;

총게시물수를 가져온다.

그 갯수를 페이지당 게시물 수로 나누면 총페이지(마지막페이지숫자)를 알 수 있다

나머지가 있을수 있으니 나누고 Math.ceil 해주자

int 마지막페이지번호 = (int)Math.ceil((float)총게시물수 / 페이지당게시물수);

3. 반복문으로 모든 페이지번호 나타내기

시작페이지 1부터 마지막페이지까지 for문으로 출력하고, a링크를 같이 달되

게시물목록.jsp를 다시 들어가게 한다.

이때 ?질의문으로 page=for문반복숫자(?질의문작성시 white space들어가면 a링크가 제대로 작동 안된다.)

를 같이 넣어주면 자기 페이지숫자에 링크를 누르면 page값으로 똑같은 페이지숫자가 들어가므로

원하는 페이지에 들어가기가 가능한것이다.

<%
	int 시작페이지번호 = 1;
	int 마지막페이지번호 = (int)Math.ceil((float)총게시물수 / 페이지당게시물수);
%>
<%
	for(int 출력페이지번호 = 시작페이지번호; 출력페이지번호 <= 마지막페이지번호; 출력페이지번호++){
		if(출력페이지번호 == 페이지){
%>

	<a href="게시물목록.jsp?page=<%= 출력페이지번호%>" ><b>[<%= 출력페이지번호%>]</b></a>

<%
	}else{
%>

<a href="게시물목록.jsp?page=<%= 출력페이지번호%>" >[<%= 출력페이지번호%>]</a>

<% 		
	} 
}
%>

>> 게시물목록.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@page import="java.util.*"%>
<%@ page import="boardmanage.게시물"%>
<%@ page import="control.ConnectionInfo" %>
<%
	String str페이지 = request.getParameter("page");
	int 페이지 = (str페이지 == null)? 1 : Integer.valueOf(str페이지);
	

	// 1. 업무규칙검사
	// 했다치고

// 2. 데이터수집
int 페이지당게시물수 = 10;
int 시작일련번호 = (페이지-1) * 페이지당게시물수;	//zero-base: 시작을 0으로 본다.
int 총게시물수 = 0;
ArrayList<게시물> array게시물 = new ArrayList<게시물>();

try {
	Class.forName("com.mysql.cj.jdbc.Driver");

	Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,ConnectionInfo.DBPORT,ConnectionInfo.DBName)
																		,ConnectionInfo.UID , ConnectionInfo.PASSWORD);

	Statement 명령전달자 = DB연결관리자.createStatement();

	System.out.println("연결 성공");

	// 2-1. 총 게시물수 구하기
		String 총개시물수SQL = "select count(*) as 갯수 from 게시물";
		ResultSet 수집된갯수표관리자 = 명령전달자.executeQuery(총개시물수SQL);
		수집된갯수표관리자.next();
		총게시물수 = 수집된갯수표관리자.getInt("갯수");
		수집된갯수표관리자.close();

	// 2-2. 페이지당 게시물들 가져오기
	String 수집SQL = String.format("select 번호,제목,작성일,조회수 from 게시물 order by 작성일 desc limit %d, %d" ,시작일련번호,페이지당게시물수);
	ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
	
		while (수집된표관리자.next()) {
			
	int 게시물번호 = 수집된표관리자.getInt("번호");
	String 제목 = 수집된표관리자.getString("제목");
	java.sql.Date 작성일 = 수집된표관리자.getDate("작성일");
	int 조회수 = 수집된표관리자.getInt("조회수");
	
	게시물 게시물1 = new 게시물();

	게시물1.set번호(게시물번호);
	게시물1.set제목(제목);
	게시물1.set작성일(작성일);
	게시물1.set조회수(조회수);

	array게시물.add(게시물1);
		}
		
	수집된표관리자.close();
	DB연결관리자.close();
} catch (Exception e) {
	e.printStackTrace();
}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<!-- 3. 목록출력 -->
		<h1>게시물목록</h1>
		<ul>
			<%
				for(int i = 0; i<array게시물.size(); i++)
				{
					게시물 수집된게시물 = array게시물.get(i);
			%>

			<%-- 3-1. 게시물 1개출력 --%>
			<li>
			<%= 수집된게시물.get번호() %>. &nbsp;&nbsp;
			<a href="상세보기.jsp?no=<%= 수집된게시물.get번호() %>"><%= 수집된게시물.get제목() %></a>
			<%= 수집된게시물.get작성일().toString() %>&nbsp;&nbsp; 
			<%= 수집된게시물.get조회수() %> 
			</li>
<%
 	}
 %>
<br><a href="게시물등록준비.jsp">글쓰기</a><br>

<%-- 3.2 페이지번호들 출력 --%>
<%
	int 시작페이지번호 = 1;
	int 마지막페이지번호 = (int)Math.ceil((float)총게시물수 / 페이지당게시물수);
%>
<%
	for(int 출력페이지번호 = 시작페이지번호; 출력페이지번호 <= 마지막페이지번호; 출력페이지번호++){
		if(출력페이지번호 == 페이지){
%>

	<a href="게시물목록.jsp?page=<%= 출력페이지번호%>" ><b>[<%= 출력페이지번호%>]</b></a>

<%
	}else{
%>

<a href="게시물목록.jsp?page=<%= 출력페이지번호%>" >[<%= 출력페이지번호%>]</a>

<% 		
	} 
}
%>

</ul>
</center>

</body>
</html>