// 이 프로그램은 하동욱님의 서블릿 강좌 예제를
//  토대로 만들어 졌습을 밝힘니다.
/*
	Access를 이용하여 간단한 게시판을 서블릿으로 구현해 보았습니다.
	WebServer는 JavaWebServer2.0를 이용했구요.
	게시판의 기초적인 기능만 만들어 보았으니 관심 있으신분은
	추가적인 기능을 추가해보시면 좀더 나은 게시판이
	될것 같네요.

	질문사항이나 조언해주실분 메일부탁드립니다.

	email : batmanii@dreamx.net
*/
import java.io.*;
import java.util.*;
import java.sql.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;

/**----------------------------------------------------------------------------
 * BoardSearch_db
 *
 * author  batmanii
 * version 1.0 (2000/07/22)
 */
///////////////////////////////////////////////////////////////////////////////

public class BoardSearch_db extends HttpServlet
{
    	BoardData bd[];
    	// BoardData객체가 저장될 배열
    	String list[];
    	// list디렉토리 아래의 파일이름들이 저장될 배열
    	int totalListNum;
    	int page;
    	int totalPage;

    	int pageListNum;
    	String SearchCode, SearchString;

    	// list 디렉토리로 부터 파일이름을 읽어 list[i]배열에 저장하고, 그에 해당하는 파일을
    	// 각각 open해서 BoardData형 배열 bd에 저장합니다.
    	public void loadList(PrintWriter out)
    	{
    		SearchItem searchItem = new SearchItem();

     		// Drive 설정
      		try
      		{
         	  	searchItem.loadDriver();
     		}
     		catch(java.lang.ClassNotFoundException e)
     		{
         	  	System.err.print("ClassNotFoundException:");
        	  		System.err.println(e.getMessage());
     		}
     		catch(Exception e)
     		{
            		System.err.println(e);
      		}

     		try
     		{
			bd = searchItem.search(SearchCode, SearchString);
			if(bd == null) return;
			
			totalListNum = searchItem.getTotalListNum();
			totalPage = searchItem.getTotalPage();
			pageListNum = searchItem.getPageListNum();

      		}
      		catch(SQLException ex)
      		{
          	 	System.err.println("SQLException :" + ex.getMessage());
    		} // try
   	}

   	public void doGet(HttpServletRequest req, HttpServletResponse res)	throws IOException
   	{
        		res.setContentType("text/html;charset=euc-kr");
        		// 이렇게 charset을 지정해야지 한글이 깨지지 않는다는군요.
       		PrintWriter  out = res.getWriter();

       		page = Integer.parseInt((req.getParameter("page")==null)?"0":req.getParameter("page"));

       		SearchCode = req.getParameter("searchcode");
	      	SearchString = req.getParameter("searchstring");
        // 페이지간 이동할때 현제 페이지를 기억할 수 있도록 ViewDataListServlet?page=2 등과
        // 같이 URL에 물고(?) 다닙니다.
        // 하지만 http://localhost:8080/ViewDataListServlet으로 부르면req.getParameter("page")가
        // null을 리턴해서 이것 int형으로 바꾸려니 NullPointException이 나는군요.. 그래서
        // 조건 연사자를 사용해서 억지로 "0"을 만들었습니다.

      	if(page==0)
      	     page=1;
	//page가 0인것의 의미가 없기때문에.. 1을 대입..
	      out.println(HTMLLib.getHTMLTitle("게시판 보기"));
       	out.println("<body><center><br>");
	      out.println("<h3>서블릿 스터디 테스트용 게시판입니다.</h3><hr width=80%><br>");
       	out.println("<table border=0 width=80%>");
	      out.println("<tr bgcolor=8f8fbd><th width=5% align=center>");
	      out.println("<font size=2>번호</font></th>");
        out.println("<th width=10% align=center><font size=2>이름</font></th>");
	      out.println("<th><font size=2>제목</font></th>");
	      out.println("<th width=15% align=center><font size=2>등록일</font></th></tr>");
      	// HTML 테이블입니다... 클래스를 하나 만들어 두면면 편하겠죠?

	      loadList(out);
 	      // 조기 위로 올라가 리스트를 읽도록 하겠습니다.

      	if((bd== null) || (totalListNum==0)) 	{
	           out.println("<tr><td colspan=4 align=left>"+HTMLLib.getMakeLink(HTMLLib.SERVERURL+
	                                        "input.html","[글쓰기]"));
	           out.println("</table>");
	           out.println("<font color=red><b>등록된 글이 없습니다.</b></font>");
	           return;
	      }
	      // 이건 게시물이 한개도 없을때를 위한 부분이니.. 이 부분이 사용될 일은 몇번 없겠
 	      // 네요.. 그래두 암것두 안나오면 밍숭맹숭하니까..

	// 페이지당 일정 단위로 끊어서 보기 위해 ...
	      if(page<totalPage)
	               pageListNum=HTMLLib.LINENUM;
	// 마지막 페이지이면 화면에 게시될 게시물 숫자 계산
	      else
	               pageListNum = totalListNum - (totalPage-1)*HTMLLib.LINENUM;
	// for(int j=0 ,i = (page-1)*HTMLLib.LINENUM; j<pageListNum ; i++,j++)
	// i : 현재 화면의 첫번째부터 (bd[0]부터 저장))
	// 최근 리스트부터 출력

      	for(int j=0 ,i = (bd.length-HTMLLib.LINENUM*(page-1))-1; j<pageListNum ; i--,j++)
      	{
      	    out.println("<tr bgcolor=cdcdcd><td align=center><font size=2>"+ bd[i].num +"</font></td>");
	    // Email
       	    out.println("<td align=center><font size=2>"+bd[i].getLinkName()+"</font></td>");
	    // BoardView_db Servlet호출
       	    out.println("<td><font size=2>"	+HTMLLib.getMakeLink(HTMLLib.SERVLETURL +
	                 "BoardView_db?num=" + bd[i].num + "&page=" + page,bd[i].title) + "</font></td>");
	    // 날짜
      	    out.println("<td align=center><font size=2>"+HTMLLib.getFormattedDate(bd[i].date)+"</font></td>");
       	}
       	out.println("<tr><td colspan=4 align=right>");
        // 찾기
      	out.println("<form action="+HTMLLib.SERVLETURL+"BoardSearch_db method=get>");
      	out.println("<select name=searchcode>");
       	out.println("<option value='namesearch'>글쓴이</option>");
	      out.println("<option value='titlesearch'>제목</option>");
	      out.println("</select>");
	      out.println("<input type=text name=searchstring size=40>");
	      out.println("<input type=submit value='찾기'>");
	      out.println("</form>");
	      out.println("<tr><td colspan=4 align=left><br>"	+HTMLLib.getMakeLink(HTMLLib.SERVERURL
                                                                      			+"input.html","[글쓰기]"));
       	out.println(HTMLLib.getMakeLink(HTMLLib.SERVLETURL + "BoardList_db","[리스트]"));
      	out.println("</td></tr><tr><td colspan=4 align=right>");
        // 이전 글리스트로 옳겨가기 위한 링크.. 1page일땐 필요 없겠죠?
       	if(page!=1)
         	    out.println(HTMLLib.getMakeLink(HTMLLib.SERVLETURL+"BoardSearch_db?page="+
         	                  (page-1)+"&searchcode="+SearchCode+"&searchstring="+SearchString,"<<이전 "));
        // 다음 글리스트로 옳겨가기 위한 링크.. 마지막page일땐 필요 없겠죠?
       	if(totalPage!=page)
        	    out.println(HTMLLib.getMakeLink(HTMLLib.SERVLETURL+"BoardSearch_db?page="
        	              +(page+1)+"&searchcode="+SearchCode+"&searchstring="+SearchString," 다음>>"));
       	out.println(" </td></tr>");
      	out.println("</table>");
       	out.println("</center>");
      	out.println("</body></html>");
    }

      // 데이타베이스에 쓸때
    public String hangulTo(String str)
    {
        if (str == null)
             return null;
        try  {
             return new String(str.getBytes("KSC5601"), "8859_1");
        } catch (UnsupportedEncodingException e) {
        }
        return null;
    }

}
////////////////////////////  END  /////////////////////////////////////////////
