210524_1(일반형게시판3_글입력, 페이징)
일반형게시판3
의존성이 낮은순서
테이블 ---> 빈구현 DTO ---> 빈구현 DAO ---> JSP 또는 servelet ---> 브라우져
시퀀스.nextval : 1만큼 증가된 번호 반환
시퀀스.currval : 현재 가장 큰 번호
<textarea>바디</textarea> 는 value 속성이 없고, 바디가 value 역할을 하므로
<textarea></textarea> 는 empty이고
<textarea> </textarea> 공백문자가 입력된 상태가 된다.
write.jsp
1.입력 폼 - 폼구성 + 유효성 검사 , 디자인
write_ok.jsp
---컨트롤 : 요청을 받아서 처리한다. 결과를 알려주고 이동
1.입력 처리 --1) encoding
2) DTO 생성
2) 전송된 폼데이타를 DTO에 저장
3) DAO 생성
4) DTO를 인자로 입력메서드(dto인자)호출
5) 리턴-- 참 --> 입력성공메시지 --> 이동 --> 글목록 (우리소스는 5번없음)
거짓--> 실패메시지 --> 이동 --> 글입력폼
DTO 손댈게 없다. BoardBean.java
DAO : BoardQuery.java
입력메서드 생성
sysdate 는 oracle에서 현재 시간, now() 는 mysql에서 현재시간
한글 encode는 원칙적으로 폼값을 받기전에 들어가지만, 만약 놓쳤다면 dao에서 최종으로 encoding을 해준다.
sql=new String(sql.getBytes("8859_1"),"euc-kr");
즉, 처리 과정중 한번은 encode 명령이 나와야 하는 것이다. 주의) 한번만 나온다.
write_ok.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<jsp:useBean id="boardBean" class="board.BoardBean"/>
<jsp:setProperty name="boardBean" property="*"/>
<jsp:useBean id="boardQuery" class="board.BoardQuery"/>
<%
boardQuery.boardInsert(boardBean);
%>
<script language="JavaScript">
<!--
document.location.href ="list.jsp";
//-->
</script>
boardQuery추가
public void boardInsert(BoardBean boardBean) throws SQLException{
///////////////////////////pooling
Connection conn = pool.getConnection();
Statement stat = conn.createStatement();
String sql ="";
String name=boardBean.getName();
String email=boardBean.getEmail();
String homepage=boardBean.getHomepage();
String title=boardBean.getTitle();
String content=boardBean.getContent();
String pwq=boardBean.getPwd();
try {
sql=" insert into " +board+" values( "+idxNum+",'"+name+"','"
+email+"','"+homepage+"','"+title+"','"+content+"','"
+pwq+"',sysdate,0)";
sql=new String(sql.getBytes("8859_1"),"euc-kr");
stat.executeUpdate(sql);
}catch(Exception e) {
System.out.println(e);
}finally {
//rs.close();
stat.close();
pool.releaseConnection(conn);
}
} //boardInsert()
list.jsp 글목록
우리가 지금 만들고자 하는 리스트 목록은 여러가지 기능이 복합적으로 섞여 있다.
1) 기본 : 목록이다. <== 10개씩 가져온다.
2) 10개씩 한페이지 <--- 이동하는 페이징처리
3) 글 검색폼 <--- 검색기능 <-- 게시판 마지막 부분에서 구현할 것이다.
구현은 먼저 1번을 구현하고, 다음에 2번, 더 후에 3번을 구현한다.
1) 목록처리----------------------list.jsp
1. dao를 생성한다
2. 목록반환 메서드Vector getBoardList() 호출
3. 뷰로직 처리 -- boardBean, Vector
475~487, 550~557 은 페이징할때
491~503, 562~579 은 검색할때
----------------------------------boardQuery.java
목록 반환 메서드
10개씩 어떻게 꺼내지?
------------------------------일부만선택하는
1. mysql은 limit 라는 키워드 ex) limit 10 순서상10개 / limit 0,10 0부터 10개
2. mssql은 top 키워드 ex) top 10, top 10 percent
3. oracle은 없다 ===> subQuery를 이용해야 한다.
public int boardCount() 글 총갯수 세기 ==>총 페이지 숫자
public Vector getBoardList(offset,limit) 글의 일부만 반환
----------------------서브쿼리
1)쿼리문 안쪽의 쿼리문이다.
2) 반드시 ( ) 로 감싼다.
3) 서브쿼리부터 실행된다.
4) 서브쿼리의 결과는 바깥쿼리의 인자로 사용된다.
5) 서브쿼리만으로도 실행된다.
from절에 있는 subquery를 inline View 라고한다.
-------------ROWNUM 오라클예약어
쿼리의 결과에 행번호를 부여한다.
그래서 rownum을 이용해서 일부만 선택할 수 있다.
select a.* from ( select ROWNUM as RNUM, b.* from
( select * from board2 order by idx desc )b
)a where a.RNUM > offset and a.RNUM <= (offset+limit)
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR" import="java.util.*" import="board.*"%>
<!DOCTYPE html>
<jsp:useBean id="boardQuery" class="board.BoardQuery" />
<%
/////////////////////페이징준비
int limit = 10;
int offset = 0;
int pagelink = 1;
/* String offset_get = request.getParameter("offset");
if (offset_get == null) {
offset = 0;
} else {
offset = Integer.parseInt(offset_get);
}
String pagelink_get = request.getParameter("pagelink");
if (pagelink_get == null) {
pagelink = 1;
} else {
pagelink = Integer.parseInt(pagelink_get);
} */
///////////////////////////////////////
%>
<!-- <script language="JavaScript">
function send(theform) {
if (theform.search.value == "") {
alert("검색어를 입력 하세요.");
theform.search.focus();
return false;
}
theform.submit();
}
</script> -->
<%
int rcnt = boardQuery.boardCount(); //글의 총갯수를 계산
%>
<table width="500" align="center" border="1">
<tr>
<td align="left" width="20%"> [글수:<%=rcnt%>]
</td>
<td align="center" width="60%"><font size="4" color="">게시판 리스트</font></td>
<td align="right" width="20%">[<a href="write.jsp">글쓰기</a>]
</td>
</tr>
</table>
<br>
<table width="550" align="center" border="1">
<tr>
<td width="10%" bgcolor="#CCCCCC"> 번호</td>
<td width="17%" bgcolor="#CCCCCC"> 일자</td>
<td width="50%" bgcolor="#CCCCCC"> 제목</td>
<td width="13%" bgcolor="#CCCCCC"> 이름</td>
<td width="10%" bgcolor="#CCCCCC"> 조회</td>
<%
Vector listVector = boardQuery.getBoardList(offset,limit); //시작번지부터 limit10개
//JSP 빈에서 가져와서 뿌리기
for (int k = 0; k < listVector.size(); k++) {
BoardBean boardBean = (BoardBean) listVector.elementAt(k);
%>
<tr>
<td> <%=boardBean.getIdx()%></td>
<td> <%=boardBean.getWdate()%></td>
<td> <a href="content.jsp?idx=<%=boardBean.getIdx()%>"><%=boardBean.getTitle()%></a></td>
<td> <%=boardBean.getName()%></td>
<td> <%=boardBean.getHit()%></td>
</tr>
<%
} //반복문 닫기
%>
</table>
<%
//페이지 처리하기
//PagingCount pc = new PagingCount(rcnt);
%>
<%//pc.showPaging(pagelink, "list.jsp") %>
<br>
<!-- ///////////////////////////////////////////// --><!--
<form action="search.jsp" method=post name="sform">
<table width="550" align="center" border="1">
<tr>
<td align="center"><select name=find>
<option value=name>이 름</option>
<option value=title selected>제 목</option>
<option value=content>내 용</option>
</select> <input type=text name=search size=20> <input type="button"
value="글찾기" onclick="send(this.form);"></td>
</tr>
</table>
</form> -->
BoardQuery추가
public int boardCount() throws SQLException{
int cnt=0;
Connection conn = null;
Statement stat = null;
ResultSet rs= null;
String sql= null;
try {
conn = pool.getConnection();
stat = conn.createStatement();
sql=" select count(*) from "+board+" ";
rs = stat.executeQuery(sql);
rs.next();
cnt=rs.getInt(1);
System.out.println(cnt); //테스트용도
}catch(Exception e) {
//TODO: handle exception
System.out.println(e);
}finally {
rs.close();
stat.close();
pool.releaseConnection(conn);
}
return cnt;
}//BoardCount()
<% int rcnt = boardQuery.boardCount(); //글의 총갯수를 계산 %>
오류창은 여기서 오류났다했는데
sql=" insert into " +board+" values( "+idxNum+",'"+name+"','" +email+"','"+homepage+"','"+title+"','"+content+"','" +pwq+"',sysdate,0)";
여기서고침;
당연히.. 쿼리처리하는메서드가 고장났으니까...
<a onClick="window.location.reload()" style="cursor:pointer;"></a>
새고로침 태그
SQL 작성시 " 문자열쿼리 " 안쪽은 무조건 공란을 한칸씩 띄우고 작성하라.
페이징원리
public showPaging(int pagelink, String pagename){~~~~~
처음 이전10 1 2 3 4 .... 10 다음10 끝
1)단계------------------------------1~10 루프
1 2 3 4 ..... 10 이라면
limit : 페이지 링크의 갯수는 10개다. <== 고정된 값
for(int i=1; i<=10; i++ ){
i
}
11 12 13 14 .......... 20 이라면
for(i=11; i<=20; i++){
i
}
int i = 1 11 21 31 .... 은 페이지 시작값
우리는 i값을 구하는 방법을 생각하면 된다.
limit + i 해서 다음 블럭의 시작값을 구하면 될 것 같지만,
특정블럭 내에서 어떤 값을 선택하여도 그 블럭의 시작값이 구하는 방법을 생각해야 한다.
특정블럭 내에서 어떤 값을 선택하여도 그 블럭의 시작값 구하는 방법
sel=10,19 선택페이지
limit=10 페이지 링크 갯수
10 == ((sel-1) /limit )==>0.9(정수형으로변해서.9탈락) * limit==>0 +1 =1
19 == ((sel-1) /limit )==>1.8(정수형으로변해서.8탈락) * limit==>10 +1 =11
((sel-1)/limit)*limit+1;
2단계
페이지 링크시 +10을 해서 다음10개 링크하거나, -10을 해서 이전 10개링크하거나 넘겨주면
1단계에 의하여 시작값이 구해진다.
주의 )
3단계
시작이나 끝페이지 가기
현재페이지가 1 아니면 또는 1보다 크면 1페이지로 링크
현재페이지가 마지막페이지 아니면 또는 마지막페이지보다 작으면 마지막페이지로 링크
} 이게 하나의 메서드로
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR" import="java.util.*" import="board.*" import="util.*"%>
<!DOCTYPE html>
<jsp:useBean id="boardQuery" class="board.BoardQuery" />
<%
/////////////////////페이징준비
int limit = 10;
int offset = 0;
int pagelink = 1;
String offset_get = request.getParameter("offset");
if (offset_get == null) {
offset = 0;
} else {
offset = Integer.parseInt(offset_get);
}
String pagelink_get = request.getParameter("pagelink");
if (pagelink_get == null) {
pagelink = 1;
} else {
pagelink = Integer.parseInt(pagelink_get);
}
///////////////////////////////////////
%>
<script language="JavaScript">
function send(theform) {
if (theform.search.value == "") {
alert("검색어를 입력 하세요.");
theform.search.focus();
return false;
}
theform.submit();
}
</script>
<%
int rcnt = boardQuery.boardCount(); //글의 총갯수를 계산
%>
<table width="500" align="center" border="1">
<tr>
<td align="center" width="20%"> [글수:<%=rcnt%>]
</td>
<td align="center" width="60%"><font size="4" color="">
<a onClick="window.location.reload()" style="cursor:pointer;">게시판 리스트</a></font></td>
<td align="center" width="20%">[<a href="write.jsp">글쓰기</a>]
</td>
</tr>
</table>
<br>
<table width="550" align="center" border="1">
<tr>
<td width="10%" bgcolor="#CCCCCC"> 번호</td>
<td width="17%" bgcolor="#CCCCCC"> 일자</td>
<td width="50%" bgcolor="#CCCCCC"> 제목</td>
<td width="13%" bgcolor="#CCCCCC"> 이름</td>
<td width="10%" bgcolor="#CCCCCC"> 조회</td>
<%
Vector listVector = boardQuery.getBoardList(offset,limit); //시작번지부터 limit10개
//JSP 빈에서 가져와서 뿌리기
for (int k = 0; k < listVector.size(); k++) {
BoardBean boardBean = (BoardBean) listVector.elementAt(k);
%>
<tr>
<td> <%=boardBean.getIdx()%></td>
<td> <%=boardBean.getWdate()%></td>
<td> <a href="content.jsp?idx=<%=boardBean.getIdx()%>"><%=boardBean.getTitle()%></a></td>
<td> <%=boardBean.getName()%></td>
<td> <%=boardBean.getHit()%></td>
</tr>
<%
} //반복문 닫기
%>
</table>
<table width="550" align="center">
<tr>
<td>
<%
//페이지 처리하기
PagingCount pc = new PagingCount(rcnt);
%>
<%=pc.showPaging(pagelink, "list.jsp")%>
</td></tr>
</table>
<br>
<!-- ///////////////////////////////////////////// -->
<form action="search.jsp" method=post name="sform">
<table width="550" align="center" border="1">
<tr>
<td align="center"><select name=find>
<option value=name>이 름</option>
<option value=title selected>제 목</option>
<option value=content>내 용</option>
</select> <input type=text name=search size=20> <input type="button"
value="글찾기" onclick="send(this.form);"></td>
</tr>
</table>
</form>
package util;
public class PagingCount {
private int links=10;
private int limit=10; //행의갯수
private int totalpage=0; //총페이지수
public PagingCount() { //기본생성자
// super();
}
public PagingCount(int numrows) { //인자1 생성자
// super();
this.totalpage=((numrows)/limit)+1;
}
public PagingCount(int numrows, int links, int limit) { //인자3 생성자 //링크와 리미트갯수 바꾸고싶을때
// super();
this.links=links;
this.limit=limit;
this.totalpage=((numrows-1)/limit)+1;
}
public int countOffset(int page) { //행번호를 구해줌
int offset =(page-1)*this.limit;
return offset;
}
public String showPaging(int pagelink, String pagename) {
String str="";
str="<Tabel width=\"550\" border=\"1\" align=\"center\">";
str=str + "<tr><Td align=\"center\" bgcolor=\"#CCCCCC\">";
int bpage=0;
int boffset=0;
int cpage=0;
int coffset=0;
int vpage=0;
int noffset=0;
int loffset=0;
//<!-- 1페이지 -->
if(pagelink != 1) {
str=str+"[<A href="+pagename+"?pagelink=1&offset=0><font size=2 color=red>처음</font></a>]";
}else {
str=str+"[<font size=2 color=gray>처음</font>]";
}
//<!-- 이전10-->
bpage=pagelink-10;
boffset=countOffset(bpage);
if(pagelink > links) {
str=str+"[<A href="+pagename+"?pagelink="+bpage+"&offset="+boffset+"><font size=2 color=lbue>이전10</font></a>]";
}else {
str=str+"[<font size=2 color=gray>이전10</font>]";
}
// <!-- 링크페이지 -->
vpage=pagelink; //현재페이지를 잠깐 다른변수에 아래서 사용함
pagelink = ((pagelink-1)/links)*links+1; //시작 페이지 구하기
for(cpage=pagelink; cpage < pagelink+links; cpage++) {
if(cpage>totalpage) {
break;
}
coffset=countOffset(cpage);
if(cpage!= vpage) {
str=str+"[<A href="+pagename+"?pagelink="+cpage+"&offset="+coffset+"><font size=2 color=black>"+cpage+"</font></a>]";
}else{
str=str+"[<font size=2 color=red>"+cpage+"</font>]";
}
}
// <!-- 다음10 -->
//for문을 빠져 나왔을때 cpage의 값은 1만큼 더 증가되어 있기 때문에 그냥 사용한다.
noffset=countOffset(cpage);
if((totalpage-pagelink)>=links){
str=str+"[<a href="+pagename+"?pagelink="+cpage+"&offset="+noffset+"><font size=2 color=blue>다음10</font></a>]";
}else {
str=str+"[<font size=2 color=gray>다음</font>]";
}
//<!--마지막 페이지>
loffset=countOffset(totalpage);
if(vpage!=totalpage) {
str=str+"[<a href="+pagename+"?pagelink="+totalpage+"&offset="+loffset+"><font size=2 color=red>마지막</font></a>]";
}else {
str=str+"[<font size=2 color=gray>마지막</font>";
}
str=str+"</td></tr></table>";
return str;
}//showPaging 메서드
}//class