티스토리 뷰

자 두번째 시간입니다..

한번에 다 올리고 싶은 욕망도 있었으나.. 한달에 글 60개 쓰려면.. 이것도 나눠써야하는 처지라;..
내가 왜 한달에 글 60개 쓰기로 약속했는지;..

이런 간단한 약속 하나 못 지키면 다른것도 다 못할것 같기에.. 최대한 약속은 지키려고 노력하고 있어서 그렇습니다;..
이해해주세요;..

자 저장하는것 까지는 끝냈고.. 이제 리스트에 표시 글 내용 보기를 해봅시다..

리스트 파일에 추가를 해줍니다..

notice_list.jsp..
<%@ page language="java" import="java.sql.*,java.util.*,java.io.*,util.*" contentType="text/html;charset=euc-kr" %>

<%!
 // 오라클 커넥션을 위한 메소드
 Connection DB_Connection() throws ClassNotFoundException, SQLException, Exception
 {
  String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; // 오라클 @ 주소:포트:오라클호스트
  String username = "study";
  String userpass = "study";
  Class.forName( "oracle.jdbc.driver.OracleDriver" );
  Connection conn = DriverManager.getConnection( url, username, userpass );
  return conn;
 }
%>

<html>
<head>
<title>공지사항</title>
</head>
<body>

<iframe name='action' width="0" height="0" frameborder="0" scrolling='yes'></iframe>

<table>
 <tr>
  <td><a href="/notice/notice_add.jsp"><img src="이미지주소" border="0" alt="등록"></a></td>
 </tr>
</table>

<!-- 추가 부분 -->
<table>
 <tr>
  <td>번호</td>
  <td>제목</td>
  <td>아이디</td>
  <td>등록일자</td>
 </tr>

<%
 Connection conn = DB_Connection();
 Statement stmt = null;
 ResultSet rs = null;
 StringBuffer query = null;
 StringBuffer where = null;

 String totalCount = "";
 String link = "";
 String user_id = "";
 String subject = "";
 String contents = "";

 int page_no = 20;

 try {
  stmt = conn.createStatement();
  query = new StringBuffer();
  where = new StringBuffer();

  query.setLength(0);
  query.append("SELECT COUNT(SEQ) TOTAL FROM NOTICE ")  // DB에 저장된 글의 갯수를 가지고 옵니다..
    .append("WHERE SEQ IS NOT NULL \n");
  query.append(where);

  rs = stmt.executeQuery(query.toString());
  if (rs.next()) {
   totalCount = rs.getString("totalCount ");
  }
  rs.close();

  if (totalCount.equals("0")) {   // total 값이 0 이면 공지사항 글이 없는것이기 때문에 공지사항 없음 출력
%>
 <tr>
  <td>공지사항 없음</td>
 </tr>
<%
  } else {
   query.setLength(0);
   query.append("SELECT SEQ, SUBJECT, USER_ID, REG_DATE1, RNUM ")
     .append("FROM ( ")
     .append(" SELECT SEQ, SUBJECT, USER_ID, REG_DATE1, ROWNUM RNUM ")
     .append(" FROM ( ")
     .append("  SELECT SEQ, SUBJECT, USER_ID, TO_CHAR(REG_DATE, 'YYYY-MM-DD') REG_DATE1 ")
     .append("  FROM NOTICE ")
     .append("  ORDER BY REG_DATE DESC ")
     .append("  ) ")
     .append(" ) ")
     .append("WHERE RNUM BETWEEN 1 AND 100");
   rs = stmt.executeQuery(query.toString());

   for (int i = 0; rs.next(); i++) {
%>
  <tr>
   <td><%=i+1 %></td>
   <td><a href="/notice/notice_view.jsp?seq=<%=rs.getString("SEQ") %>"><%=rs.getString("SUBJECT") %></a></td>
   <td><%=rs.getString("USER_ID") %></td>
   <td><%=rs.getString("REG_DATE1") %></td>
  </tr>
<%
   }
  }
 } catch( Exception e ) {
  out.println( e.toString() );
 }
%>
 </table>

원래 이런식으로 쿼리를 작성해야.. 글이 많아졌을때 페이지 넘김이 잘되는데..
SELECT SUBJECT, USER_ID, REG_DATE, RNUM
FROM (
 SELECT  SUBJECT, USER_ID, REG_DATE, ROWNUM RNUM
 FROM (
  SELECT SUBJECT, USER_ID, TO_CHAR(REG_DATE, 'YYYY-MM-DD') REG_DATE1
  FROM NOTICE
  ORDER BY REG_DATE DESC
  )
 )
WHERE RNUM BETWEEN 1 AND 100

이건 나중에 js, java 파일 써서 하는 방법을 소개해 드리겠습니다..

그냥 우선 간단하게 소개해드리면..

스트링 선언부터하고..
String page_num = request.getParameter("page_num");
String pages = request.getParameter("pages");

이런식으로 java 파일을 작성해서..
 public static int pagingStatus(String totalCount, int page_no, String pageNum, String Mode){
  int page_num = 1;
  if(!pageNum.equals("")) page_num = Integer.parseInt(pageNum); //페이지 번호..
  int link_no=5; //하단 링크[1][2]의 갯수..
  int total = Integer.parseInt(totalCount); //전체 게시물수..
  int half_page=((total-1)/page_no)+1; //전체 페이지를 글수대로 나눈 값 = 전체 페이지수..
  if(page_num > half_page) page_num = half_page; //페이지수가 전체페이지수를 넘어서면 마지막페이지로 지정..
  int f_article = (page_num-1) * page_no + 1; //현재 페이지가 몇번째 글인지 알아냄..
  if( page_no > total) page_no = total;
  int e_article = f_article + page_no - 1; //현재 페이지의 마지막 글 번호를 구함..

  int f_link = ((page_num-1)/link_no+1)*link_no-(link_no-1); //하단 링크[1][2]의 시작 값을 구함..
  int l_link = f_link+(link_no-1); //하단 링크[1][2]의 마지막 값을 구함..

  if( l_link> half_page) l_link= half_page;

  int prev = f_link-1;
  int next = l_link+1;
  int back = page_num-1;
  int forward = page_num+1;
  if(Mode.equals("page_no")) return page_no;
  if(Mode.equals("f_article")) return f_article;
  if(Mode.equals("e_article")) return e_article;
  return 0;
 }

이런식으로 사용하는 방법을 소개해드리겠습니다..
 WHERE RNUM BETWEEN "+pagingStatus(totalCount, page_no, page_num, "f_article")+" AND "+pagingStatus(totalCount, page_no, page_num, "e_article")+"

그럼 전에 게시판 만들기에서 썼던것 처럼..
<%
 if( ( total_cnt % list_num ) == 0 )
  t_page = total_cnt / list_num;
 else
  t_page = ( total_cnt / list_num ) + 1;

 int block_num = 5;
 int t_block = t_page / block_num;

 if( t_page % block_num != 0 )
  t_block++;
 
 int c_block = c_page / block_num;
 
 if( c_page % block_num != 0 )
  c_block++;
%>
</table>

<table cellspacing=1 width=600 border=1>
 <tr><td>
<%
 for( int i=(c_block-1)*block_num+1; i<=c_block*block_num && i<=t_page; i++ )
 {
%>
 <a href="board_list.jsp?str_c_page=<%=i%>">
<%
 if( c_page == i )
  out.print( "<b>" );
%>
 [<%=i%>]
<%
 if( c_page == i )
  out.print( "</b>" );
%>
<%
 }
%>

쓸때마다 이렇게 안써도 되겠죠..

우선 저 방법은 나중에 소개시켜드리겠습니다; 안바쁠때;.. 정 페이지 넘김을 추가하고 싶다면..
게시판 만들기에 있는 소스 쓰세요;..

그리고 글 번호도 순서대로 아래서부터 1,2,3,4 로 증가해야하지만..
이것도 위에 방법처럼 하면 간단한데.. 나중에 소개해드리기로 했으니까;.. 그냥 예전소스 있는것 쓰시면 됩니다;..

이렇게 그냥 대충 하게 되면.. 요렇게 나옵니다.. 앗.. 링크 추가한게 빠진게 찍혔군요;.. 다시;..



자 이제 리스트도 대충 꾸며졌구요;.. 뭐 대충 된것 같습니다..

이제 글 내용 보기를 해봅시다.. 뭔가 이상한 내용들이 많아지면.. 링크값 넘길때 복잡한데..
최대한 간단하게 작성하기로 한거라 시퀀스 값을 넘긴것을 받아 검색!.. 해서 notice_view 에 뿌려줍니다..

 notice_view.jsp..
<%@ page language="java" import="java.sql.*,java.util.*,java.io.*,util.*" contentType="text/html;charset=euc-kr" %>

<%!
// 오라클 커넥션을 위한 메소드
Connection DB_Connection() throws ClassNotFoundException, SQLException, Exception
{
String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; // 오라클 @ 주소:포트:오라클호스트
String username = "study";
String userpass = "study";
Class.forName( "oracle.jdbc.driver.OracleDriver" );
Connection conn = DriverManager.getConnection( url, username, userpass );
return conn;
}
%>

<html>
<head>
<title>게시판</title>
</head>
<body>

<iframe name='action' width="0" height="0" frameborder="0" scrolling='yes'></iframe>

<table>
 <tr>
  <td>

   <table>
    <tr>
     <td>공지사항 내용</td>
    </tr>
   </table>

<%
 Connection conn = DB_Connection();
 Statement stmt = null;
 ResultSet rs = null;
 StringBuffer query = null;

 String seq = request.getParameter("seq");


 try
  {
   stmt = conn.createStatement();
   query = new StringBuffer();

   query.setLength(0);
   query.append("SELECT SEQ, SUBJECT, USER_ID, CONTENTS ")
     .append("FROM NOTICE WHERE SEQ = '"+seq+"' ");
  rs = stmt.executeQuery(query.toString());
  if (rs.next()) {
%>
   <table>
    <tr>
     <td>아이디</td>
     <td><input name="user_id" size="50" maxlength="50" value="<%=rs.getString("USER_ID") %>"></td>
    </tr>
    <tr>
     <td>제목</td>
     <td><input name="subject" size="50" maxlength="100" value="<%=rs.getString("SUBJECT") %>"></td>
    </tr>
    <tr>
     <td>내용</td>
     <td><textarea name="contents" cols="50" rows="13"><%=rs.getString("CONTENTS") %></textarea></td>
    </tr>
   </table>

   <table>
    <tr>
     <td><a href="/notice/notice_list.jsp"><img src="이미지주소" border="0" alt="확인"></a></td>
    </tr>
   </table>
<%
  }
 } catch( Exception e ) {
  out.println( e.toString() );
 }
%>
  </td>
 </tr>
</table>

</body>
</html>
 
이렇게 하면 글 제목, 아이디, 내용이 보여야 하는데..
글 내용이 null 이 나옵니다..



안되면 수정해야죠!..

 try
  {
   stmt = conn.createStatement();
   query = new StringBuffer();

   query.setLength(0);
   query.append("SELECT SEQ, SUBJECT, USER_ID, CONTENTS ")
     .append("FROM NOTICE WHERE SEQ = '"+seq+"' ");
   rs = stmt.executeQuery(query.toString());

   if (rs.next()) {

// 추가 부분
    StringBuffer output = new StringBuffer();
    Reader input = rs.getCharacterStream("contents");
    char[] buffer = new char[1024];
    int byteRead;
    while((byteRead=input.read(buffer,0,1024))!=-1){
     output.append(buffer,0,byteRead);
    }
    String contents = output.toString();
%>

그리고 내용을 출력해주는곳을 아래와 같이 변경합니다..
    <tr>
     <td>내용</td>
     <td><textarea name="contents" cols="50" rows="13"><%=contents %></textarea></td>
    </tr>
   </table>

이제 잘 나오네요..




오늘의 소스를 올려드리겠습니다..



글 삭제, 수정 부분은 안해줘도 되겠죠?.. 그건 쉽잖아요..

글 삭제, 수정 부분까지 올렸다면 글 3개는 쓸 수 있는데.. 제가 좀 귀찮군요;..

삭제, 수정부분은 기존의 게시판 만들기 소스도로 간단하기 때문에 아마 쉽게 하실 수 있을겁니다..


내용은 2일치이지만.. 테이블 만들고 코딩하고 글 2개 올리는데 대충 3시간 정도 걸린것 같네요..
스샷 찍고 코딩 올리고 주석달고 하는게 너무 힘들어요;..

지금까지 했던 공지사항을 멋지게 꾸민다면.. 아래처럼 나오겠죠..















수정이랑 삭제 버튼은 아직 이미지를 안만들어서 엑박표시 ㅎㅎ;..

이메일 보내기를 빨리 끝내야 다른걸 올릴텐데 말이죠;.. 이게 생각보다 끈질기게 오래 달라 붙어서 힘드네요;..