HTML_JS(Sol)/JSP(sol)

210524_1(일반형게시판3_글입력, 페이징)

너굴셉 2021. 5. 24. 15:43

일반형게시판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%">&nbsp;[글수:<%=rcnt%>]
		</td>
		<td align="center" width="60%"><font size="4" color="">게시판 리스트</font></td>
		<td align="right" width="20%">[<a href="write.jsp">글쓰기</a>]&nbsp;
		</td>
	</tr>
</table>

<br>
<table width="550" align="center" border="1">
	<tr>
		<td width="10%" bgcolor="#CCCCCC">&nbsp;번호</td>
		<td width="17%" bgcolor="#CCCCCC">&nbsp;일자</td>
		<td width="50%" bgcolor="#CCCCCC">&nbsp;제목</td>
		<td width="13%" bgcolor="#CCCCCC">&nbsp;이름</td>
		<td width="10%" bgcolor="#CCCCCC">&nbsp;조회</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>&nbsp;<%=boardBean.getIdx()%></td>
		<td>&nbsp;<%=boardBean.getWdate()%></td>
		<td>&nbsp;<a href="content.jsp?idx=<%=boardBean.getIdx()%>"><%=boardBean.getTitle()%></a></td>
		<td>&nbsp;<%=boardBean.getName()%></td>
		<td>&nbsp;<%=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%">&nbsp;[글수:<%=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>]&nbsp;
		</td>
	</tr>
</table>

<br>
<table width="550" align="center" border="1">
	<tr>
		<td width="10%" bgcolor="#CCCCCC">&nbsp;번호</td>
		<td width="17%" bgcolor="#CCCCCC">&nbsp;일자</td>
		<td width="50%" bgcolor="#CCCCCC">&nbsp;제목</td>
		<td width="13%" bgcolor="#CCCCCC">&nbsp;이름</td>
		<td width="10%" bgcolor="#CCCCCC">&nbsp;조회</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>&nbsp;<%=boardBean.getIdx()%></td>
		<td>&nbsp;<%=boardBean.getWdate()%></td>
		<td>&nbsp;<a href="content.jsp?idx=<%=boardBean.getIdx()%>"><%=boardBean.getTitle()%></a></td>
		<td>&nbsp;<%=boardBean.getName()%></td>
		<td>&nbsp;<%=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