티스토리 뷰

728x90
BbsCommand.java 라는 클래스가 모든 요청을 처리하고
MvcProcessor.java 라는 클래스는 각각의 요청을 DB와 연결하여 작업을 처리할 것이며
xxxxImpl.java라는 각 모델에 해당하는 클래스는 BbsInterface 라는 인터페이스를 구현해서 handling() 이라는 메소드로 모든 작업을 할꺼다
각 작업에 대한 결과는 xxxx.jsp 라는 뷰를 통해서 보여줄거다
모델1, 모델2 두가지 방식이 있다고 하는데 이건 모델2 방식이다

먼저.. JavaEE 이클립스와 톰캣 7.0을 사용했다

톰캣 7.0 부터는 web.xml을 자동으로 만들어 주지 않는다
왠만하면 바로 Finish를 누르지 말고 Next로 넘어가서 마지막 페이지에서 "Generate web.xml deployment descriptor" 옵션을 체크해주는 것이 편하다



위와 같이 프로젝트를 하나 만들어 준다
아 당연히 Dynamic Web Project로 만든다

실제 코딩에 들어가기 전에 약간의 작업이 필요하다
ㅇ web.xml 수정
ㅇ MvcProperty.properties 생성

[web.xml]

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID"
version="3.0">

<display-name>MVC_BBS_Oracle</display-name>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<!-- BbsCommand가 MvcProperty.properties를 읽어서 요청된 주소에 맞는 작업 실행시킨다 -->
        <!-- BbsCommand에서는 propertyConfig 라는 이름으로 파일내용을 불러온다 --> 
<servlet>
<servlet-name>BbsCommand</servlet-name>
<servlet-class>MVC.BbsCommand</servlet-class>
<init-param>
<param-name>propertyConfig</param-name>
<param-value>
   D:\Java\WorkSpace\MVC_BBS\WebContent\MvcProperty.properties
   </param-value>
</init-param>
</servlet>

<!-- 주소창에서 *.do라는 요청이 들어오면 BbsCommand로 연결시킨다 -->
<servlet-mapping>
<servlet-name>BbsCommand</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

</web-app> 


[MvcProcessor.properties] ==> MVC_BBS/WebContent 안에 만들어 준다

/list.do=MVC.ListImpl

/write_form.do=MVC.WriteFormImpl

/write.do=MVC.WriteImpl

/reply_form.do=MVC.ReplyFormImpl

/reply.do=MVC.ReplyImpl

/read.do=MVC.ReadImpl

/delete.do=MVC.DeleteImpl

/modify_form.do=MVC.ModifyFormImpl

/modify.do=MVC.ModifyImpl

/login.do=MVC.LoginImpl

/login_confirm.do=MVC.LoginConfirmImpl

/logout.do=MVC.LogoutImpl


list.do 라고 주소창에 입력하면 MVC 패키지 안에 ListImpl.java 가 실행된다

이제 MVC라는 패키지를 먼저 만들어주고 [BbsCommand.java]를 만든다

package MVC;


import java.io.*;

import java.util.*;


import javax.servlet.*;

import javax.servlet.http.*;


public class BbsCommand extends HttpServlet {

    private static final long serialVersionUID = 1L;

    // [/xxxx.do], [xxxxImpl] 형태로 저장된다  

    private Map<String, Object> commandMap = new HashMap<String, Object>();


    @Override

    public void init(ServletConfig config) throws ServletException {

        // MvcProperty.properties 파일의 내용을 props에 저장시킨다

        String props = config.getInitParameter("propertyConfig");

        Properties properties = new Properties();

        FileInputStream fileInputStream = null;

        try {

            fileInputStream = new FileInputStream(props);

            properties.load(fileInputStream);

        } catch(IOException ioe) {

            throw new ServletException(ioe);

        } finally {

            if(fileInputStream != null) {

                try {

                    fileInputStream.close();

                } catch(IOException ioe) {}

            }

        }


        Iterator<?> keyIter = properties.keySet().iterator();

        while(keyIter.hasNext()) {

            String command = (String)keyIter.next();

            String className = properties.getProperty(command);

            try {

                // 문자열 xxxxImpl을 실제 클래스로 쓸수 있도록 인스턴스화 시켜준다

                Class<?> commandClass = Class.forName(className);

                Object commandInstance = commandClass.newInstance();

                commandMap.put(command, commandInstance);

            } catch(ClassNotFoundException cnfe) {

                cnfe.printStackTrace();

            } catch (InstantiationException ie) {

                ie.printStackTrace();

            } catch (IllegalAccessException iae) {

                iae.printStackTrace();

            }

        }

    }


    // Get 방식으로 요청이 들어왔을때

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        handling(request, response);

    }


    // Post 방식으로 요청이 들어왔을때

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        handling(request, response);

    }


    private void handling(HttpServletRequest request, HttpServletResponse response) 

throws ServletException, IOException {

        String view = null;

        BbsInterface bbsInterface = null;

        try {

            // 한글이 깨지지 않도록 EUC-KR로 인코딩

            request.setCharacterEncoding("euc-kr");

            // 요청 주소만 저장 

            // ex)http://xxx.xxx.xxx/MVC_BBS/xxxx.do ==> /MVC_BBS/xxxx.do 

            String command = request.getRequestURI();

            if(command.indexOf(request.getContextPath()) == 0) {

                // 위에서 저장한 /MVC_BBS/xxxx.do 에서 /xxxx.do만 잘라내서 다시 저장

                command = command.substring(request.getContextPath().length());

            }

            // /xxxx.do에 해당하는 클래스, 즉 xxxxImpl 반환

            bbsInterface = (BbsInterface)commandMap.get(command);

            // handling()실행

            // 모든 클래스는 BbsInterface를 구현했기 때문에 업캐스팅해서 실행 가능하다(다형성)

            view = bbsInterface.handling(request, response);

        } catch(Throwable e) {

            throw new ServletException(e);

        }

        // 해당 클래스를 거쳐 반환된 view 페이지로 이동

        RequestDispatcher dispatcher = request.getRequestDispatcher(view);

        dispatcher.forward(request, response);

    }


}


[BbsInterface.java]

package MVC;


import javax.servlet.http.*;


    public interface BbsInterface {

    public String handling(HttpServletRequest request, HttpServletResponse response);

}


별 내용은 없다
단순히 각 모델 클래스들이 동일한 메소드명을 사용할 수 있도록만 해준다

이제 게시물을 보여줄 list.jsp를 만들어보자

<!-- 한글 문제 때문에 모든 페이지는 EUC-KR로 인코딩 했다 -->

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>


<!-- JSTL 문법을 사용하기 위해서 -->

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>리스트</title>

</head>

<body>

<!-- count라는 변수를 이용해서 게시물수가 0이면 "없음"이라고 찍어준다 -->

<c:if test="${count > 0}">

<table border="2" align="center">

<tr align="center">

<td width="50">글번호</td>

<td width="100">글쓴이</td>

<td width="300">제목</td>

<td width="100">첨부파일</td>

<td width="50">조회수</td>

<td width="150">날짜</td>

</tr>

<!-- 얻어온 게시물 개수만큼 루프를 돌면서 찍어준다 -->

<c:forEach var="i" items="${articleList}">

<tr align="center">

<td>${i.articleNumber}</td>

<td>${i.id}</td>

<td align="left">

<!-- 댓글을 달았을때 들여쓰기를 하기 위해서 체크 -->

<c:if test="${i.depth > 0}">

<c:forEach begin="0" end="${i.depth-1}">

&nbsp;&nbsp;

</c:forEach>

<c:if test="${i.depth > 0}">

<c:forEach begin="0" end="${i.depth-1}">

<img src="images/re.gif" />

</c:forEach>

</c:if>

</c:if>


<!-- 게시물의 제목을 클릭하면 read로 이동하면서 해당 게시물의 번호와 현재 페이지를 Get방식으로 넘겨준다 -->

<!-- 현재 페이지를 넘겨주는 이유는 리스트로 돌아갈때 원래 있었던 페이지를 보여줘야 되기 때문-->

<a href="/MVC_BBS/read.do?articleNumber=${i.articleNumber}&pageNumber=${currentPage}">

${i.title}

</a>

</td>

<td>


<!-- 첨부된 파일이 있을 경우에는 파일 이미지를 보여준다 -->

<c:if test="${i.fileName != null}">

  <a href="/MVC_BBS/UpLoad/${i.fileName}">

<img src="icon_file_down.gif" border="0" />

</a>

</c:if>


<!-- 첨부파일이 없는경우 -->

<!-- JSTL에는 else문이 없어서 if를 두번 써줘야 한다 -->

<c:if test="${i.fileName == null}">

없음

</c:if>

</td>

<td>${i.hitNumber}</td>

<td>${i.writeDate}</td>

</tr>

</c:forEach>

</table>


<table align="center">

<tr>

<!-- 아래 계산식은 너무 길어지기 때문에 설명은 생략.. -->

<!-- 한 페이지에 10개씩 보여주는데 10페이지가 넘어가면 이전, 다음이라는 버튼을 보여준다 -->

<c:if test="${count > 10}">

<c:if test="${endPage > totalPage}">

<c:set var="endPage" value="${totalPage}" />

</c:if>

<td>

<c:if test="${startPage > 10}">

<a href="/MVC_BBS/list.do?pageNumber=${currentPage - pageSize}">[이전]</a>

</c:if>

<c:forEach var="i" begin="${startPage}" end="${endPage}" varStatus="status">

<c:if test="${currentPage == startPage - 1 + status.count}">

[${startPage - 1 + status.count}]

</c:if>

<c:if test="${currentPage > startPage - 1 + status.count}">

<a href="/MVC_BBS/list.do?pageNumber=${startPage - 1 + status.count}">[${startPage - 1 + status.count}]</a>

</c:if>

<c:if test="${currentPage < startPage - 1 + status.count}">

<a href="/MVC_BBS/list.do?pageNumber=${startPage - 1 + status.count}">[${startPage - 1 + status.count}]</a>

</c:if>

</c:forEach>

<c:if test="${endPage < totalPage}">

<a href="/MVC_BBS/list.do?pageNumber=${startPage + pageSize}">[다음]</a>

</c:if>

</td>

</c:if>

</tr>

</table>

</c:if>

<c:if test="${count <= 0}">

검색 결과 없음

</c:if>

<center>

<form method="post" action="/MVC_BBS/write_form.do">

<input type="submit" value="글쓰기">

<input type="hidden" value="${currentPage}" name="pageNumber">

</form>

<!-- 로그인이 된 상태이면 로그아웃을, 로그인 되지 않았다면 로그인을 보여준다 -->

  <c:if test="${id == null}">

<form method="post" action="/MVC_BBS/login.do">

<input type="submit" value="로그인">

<input type="hidden" value="${currentPage}" name="pageNumber">

<input type="hidden" value="list.do" name="state">

</form>

</c:if>

<c:if test="${id != null}">

<form method="post" action="/MVC_BBS/logout.do">

<input type="submit" value="로그아웃">

<input type="hidden" value="${currentPage}" name="pageNumber">

</form>

</c:if>

</center>

</body>

</html>


대충 위와 같은 방법으로 list.jsp를 만들어 준다
별로 꾸민 것은 없고 한 페이지에 게시물을 10개씩 보여주고
이런 페이지가 10개를 넘어가면 이전, 다음을 표시해주는 기능만 넣었다

ListImpl을 먼저 만들든, list.jsp를 먼저 만들든 서로 짝만 잘 맞춰주면 된다 ㅎ

JSTL Jar 파일을 넣어주지 않으면
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 요기서 에러가 난다

JSTL Jar 파일은 http://java.sun.com/products/jsp/jstl/downloads/ 이 주소로 가면 구할 수 있지만
영어를 잘 모르는 사람들을 위해서...


이제 [ListImpl]을 만들어 보자

package MVC;


import java.util.Vector;

import javax.servlet.http.*;


public class ListImpl implements BbsInterface {


@Override

public String handling(HttpServletRequest request, HttpServletResponse response) {

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

if(pageNumber == null) {

pageNumber = "1";

}

int pageSize = 10;

int currentPage = Integer.parseInt(pageNumber);

int startRow = (currentPage - 1) * pageSize + 1;

int startPage = ((currentPage - 1) / 10) * 10 + 1;

int endPage = startPage + 10 - 1;

int count = 0;

Vector<BoardBean> articleList = null;

MvcProcessor mvcProcessor = MvcProcessor.getInstance();

count = mvcProcessor.getArticleCount();


int totalPage = count / pageSize + (count % pageSize == 0 ? 0 : 1);

if(count > 0) {

articleList = mvcProcessor.getArticles(startRow, startRow + pageSize);

} else {

articleList = null;

}

request.setAttribute("currentPage", new Integer(currentPage));

request.setAttribute("startPage", new Integer(startPage));

request.setAttribute("endPage", new Integer(endPage));

request.setAttribute("count", new Integer(count));

request.setAttribute("totalPage", new Integer(totalPage));

request.setAttribute("pageSize", new Integer(pageSize));

request.setAttribute("articleList", articleList);

return "list.jsp";

}

}



맨 처음 브라우저를 통해 접속을 하면 당연히 페이지 번호가 없다
그래서 request.getParameter("pageNumber"); 를 이용해 페이지 번호를 얻어오고 null 이면 1을 입력해준다
pageNumber를 String으로 하는 이유는 Get / Post 방식들은 파라메터를 문자열로 처리하기 때문이다
숫자로 처리할 경우가 생기면 Integer.parseInt()로 적절히 해결해주면 된다

int pageSize = 10;

int currentPage = Integer.parseInt(pageNumber);

int startRow = (currentPage - 1) * pageSize + 1;

int startPage = ((currentPage - 1) / 10) * 10 + 1;

int endPage = startPage + 10 - 1;

int count = 0;


이런 애들은 페이지에 게시물을 얼만큼 보여줄지 처리하기 위한 계산들이라서 설명은 생략한다

아 그리고 모든 DB 접속 작업들은 MvcProcessor.java에 모아놓고 처리한다
(글쓰기, 수정, 삭제, 답글 등등등)

MvcProcessor mvcProcessor = MvcProcessor.getInstance();
요 부분은 매번 작업할때마다 new new 할 수 없으므로 한번만 static으로 new 해놓고 계속 가져다 쓰는 거다

어쨌든 DB로 부터 게시물들을 얻어와서 articleList라는 Vector에 저장해 준다
articleList는 BoardBean을 저장하는데
BoardBean은 
번호, 글쓴이, 제목, 본문 등을 가지고 있으며 아래와 같다

package MVC;

public class BoardBean {

int articleNumber;

String id;

String title;

String content;

String password;

int hitNumber;

int depth;

String writeDate;

String fileName;


public int getArticleNumber() {

return articleNumber;

}

public void setArticleNumber(int articleNumber) {

this.articleNumber = articleNumber;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public int getHitNumber() {

return hitNumber;

}

public void setHitNumber(int hitNumber) {

this.hitNumber = hitNumber;

}

public int getDepth() {

return depth;

}

public void setDepth(int depth) {

this.depth = depth;

}

public String getWriteDate() {

return writeDate;

}

public void setWriteDate(String writeDate) {

this.writeDate = writeDate;

}


public String getFileName() {

return fileName;

}

public void setFileName(String fileName) {

this.fileName = fileName;

}

}


다음은 모든 작업을 하는 [MvcProcessor.java] 이다

package MVC;


import java.sql.*;

import java.util.Vector;


public class MvcProcessor {

private static MvcProcessor instance = new MvcProcessor();

private Connection connection;

private PreparedStatement pstmt;

private ResultSet rs;

private Vector<BoardBean> allArticles;

private BoardBean boardBean;

public static MvcProcessor getInstance() {

return instance;

}

private Connection getConnection() throws ClassNotFoundException, SQLException {

final String ServerUrl = "jdbc:oracle:thin:@localhost:1522:orcl";

final String ServerID = "seorab";

final String ServerPW = "dkagh";

Connection connection = null;

Class.forName("oracle.jdbc.driver.OracleDriver");

connection = DriverManager.getConnection(ServerUrl, ServerID, ServerPW);

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

return connection;

}

public int getArticleCount() {

int size = 0;


try {

connection = this.getConnection();

String query = "SELECT count(article_number) FROM article_model2";

pstmt = connection.prepareStatement(query);

rs = pstmt.executeQuery();

if(rs.next()) {

size = rs.getInt(1);

}

} catch(Exception e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

return size;

}

public Vector<BoardBean> getArticles(int startRow, int pageSize) {

String query = "SELECT * FROM (" +

"SELECT ROWNUM rm, a.* FROM (" +

"SELECT * FROM article_model2 ORDER BY article_number DESC" +

") a) WHERE rm BETWEEN ? AND ? ORDER BY article_number DESC";


allArticles = new Vector<BoardBean>();


try {

connection = this.getConnection();

pstmt = connection.prepareStatement(query);

pstmt.setInt(1, startRow);

pstmt.setInt(2, pageSize);

rs = pstmt.executeQuery();

while(rs.next()) {

boardBean = new BoardBean();

boardBean.setArticleNumber(rs.getInt("article_number"));

boardBean.setId(rs.getString("id"));

boardBean.setTitle(rs.getString("title"));

boardBean.setContent(rs.getString("content"));

boardBean.setPassword(rs.getString("password"));

boardBean.setHitNumber(rs.getInt("hit_number"));

boardBean.setDepth(rs.getInt("depth"));

String writeDateTemp = String.valueOf(rs.getTimestamp("write_date"));

String date = writeDateTemp.substring(0, 4) + "년 " + writeDateTemp.substring(5, 7) + "월" +

 writeDateTemp.substring(8, 10) + "일 " + writeDateTemp.substring(11, 19);

boardBean.setWriteDate(date);

boardBean.setFileName(rs.getString("file_name"));

allArticles.add(boardBean);

}

} catch(Exception e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}


return allArticles;

}

public void setArticle(BoardBean boardBean) {

String query = "INSERT INTO article_model2 " +

"values (article_model2_sequence.nextval, ?, ?, ?, ?, ?, ?, sysdate, ?)";

try {

connection = this.getConnection();

pstmt = connection.prepareStatement(query);

pstmt.setString(1, boardBean.getId());

pstmt.setString(2, boardBean.getTitle());

pstmt.setString(3, boardBean.getContent());

pstmt.setString(4, boardBean.getPassword());

pstmt.setInt(5, boardBean.getHitNumber());

pstmt.setInt(6, boardBean.getDepth());

pstmt.setString(7, boardBean.getFileName());

pstmt.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

}

public BoardBean getContent(String articleNumber) {

String query1 = "UPDATE article_model2 SET hit_number=hit_number+1 WHERE article_number=?";

String query2 = "SELECT * FROM article_model2 WHERE article_number=?";


try {

connection = this.getConnection();

// 조회수 증가

pstmt = connection.prepareStatement(query1);

pstmt.setInt(1, Integer.parseInt(articleNumber));

pstmt.executeUpdate();

// 해당 글 Read 

pstmt = connection.prepareStatement(query2);

pstmt.setInt(1, Integer.parseInt(articleNumber));

rs = pstmt.executeQuery();

if(rs.next()) {

boardBean = new BoardBean();

boardBean.setArticleNumber(rs.getInt("article_number"));

boardBean.setId(rs.getString("id"));

boardBean.setTitle(rs.getString("title"));

boardBean.setContent(rs.getString("content"));

boardBean.setPassword(rs.getString("password"));

boardBean.setHitNumber(rs.getInt("hit_number"));

boardBean.setDepth(Integer.parseInt(rs.getString("depth")));

boardBean.setFileName(rs.getString("file_name"));

String writeDateTemp = String.valueOf(rs.getTimestamp("write_date"));

String date = writeDateTemp.substring(0, 4) + "년 " + writeDateTemp.substring(5, 7) + "월" +

 writeDateTemp.substring(8, 10) + "일 " + writeDateTemp.substring(11, 19);

boardBean.setWriteDate(date);

}

} catch (SQLException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

return boardBean;

}

// 게시글 번호 수정

public void setReplyNumberChange(int articleStartNumber, int articleEndNumber) {

String query1 = "SELECT * FROM article_model2 WHERE article_number BETWEEN ? AND ? ORDER BY article_number ASC";

String query2 = "UPDATE article_model2 SET article_number=? WHERE article_number=?";

try {

connection = this.getConnection();

pstmt = connection.prepareStatement(query1);

pstmt.setInt(1, articleStartNumber);

pstmt.setInt(2, articleEndNumber);

rs = pstmt.executeQuery();

pstmt = connection.prepareStatement(query2);


while(rs.next()) {

pstmt.setInt(1, rs.getInt("article_number")-1);

pstmt.setInt(2, rs.getInt("article_number"));

pstmt.executeUpdate();

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

}

// 댓글 등록

public void setReply(BoardBean boardBean) {

String query = "INSERT INTO article_model2 values (?, ?, ?, ?, ?, 0, ?, SYSDATE, ?)";

try {

connection = this.getConnection();


pstmt = connection.prepareStatement(query);

pstmt.setInt(1, boardBean.getArticleNumber());

pstmt.setString(2, "seorab");

pstmt.setString(3, boardBean.getTitle());

pstmt.setString(4, boardBean.getContent());

pstmt.setString(5, boardBean.getPassword());

pstmt.setInt(6, boardBean.getDepth()+1);

pstmt.executeUpdate();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

}

public void setModify(BoardBean boardBean) {

String query = "UPDATE article_model2 SET " +

"title=?, content=?, password=?, write_date=SYSDATE WHERE article_number=?";

try {

connection = this.getConnection();

pstmt = connection.prepareStatement(query);

pstmt.setString(1, boardBean.getTitle());

pstmt.setString(2, boardBean.getContent());

pstmt.setString(3, boardBean.getPassword());

pstmt.setInt(4, boardBean.getArticleNumber());

pstmt.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

}

public void setDelete(String articleNumber) {

String query = "DELETE FROM article_model2 WHERE article_number=?";

try {

connection = this.getConnection();

pstmt = connection.prepareStatement(query);


pstmt.setInt(1, Integer.parseInt(articleNumber));

pstmt.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

}


public int checkLogin(String id, String password) {

String query = "SELECT password FROM article_model2_member WHERE id=?";


try {

connection = this.getConnection();

pstmt = connection.prepareStatement(query);


pstmt.setString(1, id);

rs = pstmt.executeQuery();

if(rs.next()) {

if(rs.getString("password").equals(password)) {

return 0;

}

return 1;

}

} catch (SQLException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} finally {

if(rs != null) {

try {

rs.close();

} catch(Exception e) {}

}

if(pstmt != null) {

try {

pstmt.close();

} catch(Exception e) {}

}

if(connection != null) {

try {

connection.close();

} catch(Exception e) {}

}

}

return 2;

}

}


상당히 길지만 별거 없다
하나씩 만들어가면서 글을 올리면 좋겠지만 그렇게 하기에는 너무 시간이 오래 걸릴것 같아서 만들어 놓은것을 한꺼번에 올렸다

SQL 문장을 조금만 안다면 충분히 알아 볼 수 있을거다
메소드명만 봐도 대충 무슨 작업을 하는 애들인지 알수 있을거고 ㅎ
개인적으로 가장 헷갈리는 부분은 오라클에서 정렬된 상위 10개 내용만 가져오는 것이다

SELECT * FROM (
    SELECT ROWNUM rm, a.* FROM (
SELECT * FROM article_model2 ORDER BY article_number DESC
    ) a
) WHERE rm BETWEEN ? AND ? ORDER BY article_number DESC";

오라클에서는 ROWNUM 이란 것이 있는데 아직 내공이 부족해서 불편하게만 느껴진다
 
 
아 그리고 "소스가 지저분하다", "비효율적이다", "대충 만들었다" 등등의 문제는 그냥 넘어가자
난 전문가가 아니다 ㅋㅋ 그래도 직접 코딩한거다

여기까지 만들어 놓으면 게시글은 잘 읽어온다

오라클에서 테이블은 따로 만들어줬다 치고..
구조는 대충 이렇다



자동으로 글번호를 증가시켜 줘야 하므로 시퀀스도 하나 만들어 준다


시퀀스를 1000부터 시작해서 1000씩 증가하도록 만드는 이유는 나중에 댓글을 달면 1000 밑으로 달아주기 위해서이다
1000번 원본글
 999번 원본의 댓글
 998번 원본의 댓글 또는 댓글의 댓글
뭐 이런식으로..
이런 방식이 편하긴 한데 단점은 댓글이 999개를 넘지 못한다는거 ㅡㅡㅋ
이렇게 배워서 이 방식만 써봤는데 나중에 시간나면 다른 방법을 고민해보고 MySQL로 만들어 볼 생각이다 ㅎ

이제 리스트를 잘 읽어오는지 실험해봐야 되므로 임의로 데이터를 입력해준다


commit은 꼭 해주고...

이클립스에서 list.jsp를 실행시켜서 주소창에 list.do로 바꿔주면..


요렇게 잘 뜬다 ㅎㅎ 

오늘은 리스트 읽어오는데까지만 해야겠다..
혼자 코딩하는 것과 블로그에 글을 올리는 것은 엄청나게 다르다는 것을 느낀다 -_-


========================================================================================
jar 파일 추가해주는 방법
========================================================================================
크게 3가지 정도로 나눌 수 있을 것 같습니다

1. 시스템 패스에 지정되어 있는.. 자바 JDK 또는 톰캣 디렉토리에 넣어주는 방법
     - 윈도우의 환경변수에서 따로 지정을 해줘야 하는 등 귀찮은 작업이 많으므로 비추
     - 프로젝트에 따라 필요한 jar 파일이 달라지므로 컴퓨터 자체에 전체 세팅을 해주는 것은 불필요하다고 생각합니다 ㅎ

2. 프로젝트 내에 따로 lib 등의 이름으로 디렉토리를 만들어서 넣어주는 방법
     - 웹 프로젝트가 아닌 일반 자바 프로젝트의 경우에 주로 쓰는 방법입니다
     - lib 또는 libs 등등 알아볼 수 있게 디렉토리를 하나 만들어 주고 Build Path 에서 [Add JARs] 메뉴를 통해 지정하면 됩니다


아 그리고 [Add External JARs] 이 메뉴는 말 그대로 외부에 있는 jar 파일을 라이브러리로 가져오고 싶을때 사용하는 겁니다
예를들면..
현재 프로젝트가 D:\work\AAA 라는 경로이고 C:\lib 에 있는 jar 파일을 추가하는 싶을때 입니다
부족한 제 경험으로는 왜 이렇게 쓰는지 모르겠습니다 ㅎㅎ;
파일 몇개 더 복사한다고 용량이 엄청나게 늘어나는 것도 아니고 그 경로에 그 파일이 존재해야 하니까 나중에 프로젝트 관리하기도 헷갈리고 뭐 암튼...

3. 해당 프로젝트의 WebContent\WEB-INF\lib에 넣어주는 방법
    - 웹 프로젝트일때 가장 쉽고 추천하는 방법입니다
    - 그냥 위 경로 lib에 넣어주기만 하면 됩니다


    - 혹시 바로 인식이 안된다면 이클립스 메뉴 - Project - Clean 을 한번 해주시면 제대로 될겁니다


'프로그래밍 > JSP' 카테고리의 다른 글

[JSP] EL 함수  (0) 2011.07.29
[JSP] EL(Expression Language)  (0) 2011.07.29
[JSP] JSTL 명령어 2  (0) 2011.07.29
[JSP] JSTL 명령어 1  (0) 2011.07.29
[JSP] MVC 게시판 만들기 2  (0) 2011.07.25