[JSP] MVC PATTERN
모델1 : JSP 페이지에서 화면을 보여주고 요청을 하게 되면 J네 페이지에서 직접 모델에 접근하여 처리
- 데이터 베이스 연동하는 JSP 페이지를 만들 때 디자인 부분과 데이터 베이스와 연동하는 로직 부분이 모두 같은 페이지에 코딩
모델2 : 디자인 부분과 로직 부분을 나누어서 개발하기 때문에, 디자이너는 디자인 부분만, 프로그래머는 로직 부분만 개발 가능
- 독립적 (디자이너는 JSP페이지, 프로그래머는 JAVA 클래스)
MVC : Model, View, Controller
- Model : 데이터 베이스와 연동하는 부분등의 로직 부분
- View : 화면 출력
- Controller : 위 두 부분을 적절하게 연결시켜주는 역할
#모델2는 Model과 View를 독립적으로 코디하기 때문에 Controller를 만들어서 Model과 View 사이에 개입하여 서로 연동하는 역할
Model : JavaBean
- MVC에서 실제로 비즈니스 로직 처리
- 비즈니스 로직을 처리하여 결과를 Controller를 통해 View 페이지로 전달
- 데이터 베이스 부분을 모델에서 구현
- 처리가 완료되면 결과를 Controller를 통해서 View로 전달하여 처리된 내용이 화면에 표시
- 클래스 파일로 이루어져있음
- 실제로 모델 클래스의 비즈니스 로직을 가져다가 쓰는 곳은 Controller와 Model 사이에 존재하는 Command 클래스
View : JSP
- MVC 패턴 중 화면 출력 부분
- 화면 출력 담당으로 JSP 페이지로 구성
- 절대로 데이터 베이스 연동과 같은 비즈니스 로직을 구현하지 않음
Controller : 서블릿
- 요청을 받아서 요청에 해당하는 Model과 View를 호출하는 역할만 하기 때문에 View처럼 JSP 페이지로 구현
- 보여지는 페이지가 아닌 연결시켜주는 통로 역할만 함
- MVC패턴에서 중심역할을 한다는것과 반드시 서블릿으로 이루어짐
설정
파일 종류 및 위치
- XML 파일
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>0502</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>
<!-- Servlet 맵핑 -->
<servlet>
<servlet-name>BoardFrontController</servlet-name>
<servlet-class>net.board.action.BoardFrontController</servlet-class>
</servlet>
<!-- 파일이 .bo일 때 BoardFrontController로 간다 -->
<servlet-mapping>
<servlet-name>BoardFrontController</servlet-name>
<url-pattern>*.bo</url-pattern>
</servlet-mapping>
<resource-ref>
<description>Connection</description>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
context.xml
<Context>
<Resource
name="jdbc/OracleDB"
auth="Container"
driverClassName="oracle.jdbc.driver.OracleDriver"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@localhost:1521:database"
username="scott"
password="tiger"
maxActive="20"
maxIdle="10"
maxWait="-1" />
</Context>
- JAVA 파일
패키지 : net.board.action
Action.java
package net.board.action;
import javax.servlet.http.*;
public interface Action {
public ActionForward execute(HttpServletRequest request,HttpServletResponse response) throws Exception;
}
ActionForward.java
package net.board.action;
public class ActionForward {
private boolean isRedirect=false;
private String path=null;
public boolean isRedirect(){
return isRedirect;
}
public String getPath(){
return path;
}
public void setRedirect(boolean b){
isRedirect=b;
}
public void setPath(String string){
path=string;
}
}
BoardFrontController.java
package net.board.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BoardFrontController
extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
protected void doProcess(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("¸Þ·Õ·Õ");
String RequestURI=request.getRequestURI();
String contextPath=request.getContextPath();
String command=RequestURI.substring(contextPath.length());
ActionForward forward=null;
Action action=null;
if(command.equals("/BoardList.bo")) {
action = new BoardListAction();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}
else if(command.equals("/BoardWrite.bo")){
forward=new ActionForward();
forward.setRedirect(false);
forward.setPath("./board/qna_board_write.jsp");
}else if(command.equals("/BoardReplyAction.bo")){
action = new BoardReplyView();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}else if(command.equals("/BoardDelete.bo")){
forward=new ActionForward();
forward.setRedirect(false);
forward.setPath("./board/qna_board_delete.jsp");
}else if(command.equals("/BoardModify.bo")){
action = new BoardModifyView();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}else if(command.equals("/BoardAddAction.bo")){
action = new BoardAddAction();
try {
forward=action.execute(request, response );
} catch (Exception e) {
e.printStackTrace();
}
}else if(command.equals("/BoardReplyView.bo")){
action = new BoardReplyAction();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}else if(command.equals("/BoardModifyAction.bo")){
action = new BoardModifyAction();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}else if(command.equals("/BoardDeleteAction.bo")){
action = new BoardDeleteAction();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}else if(command.equals("/BoardList.bo")){
action = new BoardListAction();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}else if(command.equals("/BoardDetailAction.bo")){
action = new BoardDetailAction();
try{
forward=action.execute(request, response);
}catch(Exception e){
e.printStackTrace();
}
}
if(forward.isRedirect()){
response.sendRedirect(forward.getPath());
}else{
RequestDispatcher dispatcher=
request.getRequestDispatcher(forward.getPath());
dispatcher.forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request,response);
}
}
BoardListAction.java
package net.board.action;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.board.db.BoardDAO;
public class BoardListAction implements Action {
public ActionForward execute(HttpServletRequest request,HttpServletResponse response) throws Exception{
BoardDAO boarddao=new BoardDAO();
List boardlist=new ArrayList();
int page=1;
int limit=10;
if(request.getParameter("page")!=null){
page=Integer.parseInt(request.getParameter("page"));
}
int listcount=boarddao.getListCount(); //총 리스트 수를 받아옴.
boardlist = boarddao.getBoardList(page,limit); //리스트를 받아옴.
//총 페이지 수.
int maxpage=(int)((double)listcount/limit+0.95); //0.95를 더해서 올림 처리.
//현재 페이지에 보여줄 시작 페이지 수(1, 11, 21 등...)
int startpage = (((int) ((double)page / 10 + 0.9)) - 1) * 10 + 1;
//현재 페이지에 보여줄 마지막 페이지 수.(10, 20, 30 등...)
int endpage = maxpage;
if (endpage>startpage+10-1) endpage=startpage+10-1;
request.setAttribute("page", page); //현재 페이지 수.
request.setAttribute("maxpage", maxpage); //최대 페이지 수.
request.setAttribute("startpage", startpage); //현재 페이지에 표시할 첫 페이지 수.
request.setAttribute("endpage", endpage); //현재 페이지에 표시할 끝 페이지 수.
request.setAttribute("listcount",listcount); //글 수.
request.setAttribute("boardlist", boardlist);
ActionForward forward= new ActionForward();
forward.setRedirect(false);
forward.setPath("./board/qna_board_list.jsp");
return forward;
}
}
BoardModifyAction.java
package net.board.action;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.board.db.*;
public class BoardModifyAction implements Action {
public ActionForward execute(HttpServletRequest request,HttpServletResponse response)
throws Exception{
request.setCharacterEncoding("euc-kr");
ActionForward forward = new ActionForward();
boolean result = false;
int num=Integer.parseInt(request.getParameter("BOARD_NUM"));
BoardDAO boarddao=new BoardDAO();
BoardBean boarddata=new BoardBean();
boolean usercheck=boarddao.isBoardWriter(num, request.getParameter("BOARD_PASS"));
if(usercheck==false){
response.setContentType("text/html;charset=euc-kr");
PrintWriter out=response.getWriter();
out.println("<script>");
out.println("alert('수정할 권한이 없습니다.');");
out.println("location.href='./BoardList.bo';");
out.println("</script>");
out.close();
return null;
}
try{
boarddata.setBOARD_NUM(num);
boarddata.setBOARD_SUBJECT(request.getParameter("BOARD_SUBJECT"));
boarddata.setBOARD_CONTENT(request.getParameter("BOARD_CONTENT"));
result = boarddao.boardModify(boarddata);
if(result==false){
System.out.println("게시판 수정 실패");
return null;
}
System.out.println("게시판 수정 완료");
forward.setRedirect(true);
forward.setPath("./BoardDetailAction.bo?num="+boarddata.getBOARD_NUM());
return forward;
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
}
BoardModifyView.java
package net.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.board.db.BoardDAO;
import net.board.db.BoardBean;
public class BoardModifyView implements Action {
public ActionForward execute(HttpServletRequest request,HttpServletResponse response) throws Exception{
ActionForward forward = new ActionForward();
request.setCharacterEncoding("euc-kr");
BoardDAO boarddao=new BoardDAO();
BoardBean boarddata=new BoardBean();
int num=Integer.parseInt(request.getParameter("num"));
boarddata=boarddao.getDetail(num);
if(boarddata==null){
System.out.println("(수정)상세보기 실패");
return null;
}
System.out.println("(수정)상세보기 성공");
request.setAttribute("boarddata", boarddata);
forward.setRedirect(false);
forward.setPath("./board/qna_board_modify.jsp");
return forward;
}
}
BoardReplayAction.java
package net.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.board.db.BoardDAO;
import net.board.db.BoardBean;
public class BoardReplyAction implements Action {
public ActionForward execute(HttpServletRequest request,HttpServletResponse response)
throws Exception{
request.setCharacterEncoding("euc-kr");
ActionForward forward = new ActionForward();
BoardDAO boarddao=new BoardDAO();
BoardBean boarddata=new BoardBean();
int result=0;
boarddata.setBOARD_NUM(Integer.parseInt(request.getParameter("BOARD_NUM")));
boarddata.setBOARD_NAME(request.getParameter("BOARD_NAME"));
boarddata.setBOARD_PASS(request.getParameter("BOARD_PASS"));
boarddata.setBOARD_SUBJECT(request.getParameter("BOARD_SUBJECT"));
boarddata.setBOARD_CONTENT(request.getParameter("BOARD_CONTENT"));
boarddata.setBOARD_RE_REF(Integer.parseInt(request.getParameter("BOARD_RE_REF")));
boarddata.setBOARD_RE_LEV(Integer.parseInt(request.getParameter("BOARD_RE_LEV")));
boarddata.setBOARD_RE_SEQ(Integer.parseInt(request.getParameter("BOARD_RE_SEQ")));
result=boarddao.boardReply(boarddata);
if(result==0){
System.out.println("´äÀå ½ÇÆÐ");
return null;
}
System.out.println("´äÀå ¿Ï·á");
forward.setRedirect(true);
forward.setPath("./BoardDetailAction.bo?num="+result);
return forward;
}
}
BoardReplayView.java
package net.board.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.board.db.BoardDAO;
import net.board.db.BoardBean;
public class BoardReplyView implements Action {
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
ActionForward forward = new ActionForward();
BoardDAO boarddao = new BoardDAO();
BoardBean boarddata = new BoardBean();
int num = Integer.parseInt(request.getParameter("num"));
boarddata = boarddao.getDetail(num);
if (boarddata == null) {
System.out.println("답장 페이지 이동 실패");
return null;
}
System.out.println("답장 페이지 이동 완료");
request.setAttribute("boarddata", boarddata);
forward.setRedirect(false);
forward.setPath("./board/qna_board_reply.jsp");
return forward;
}
}
패키지 : net.board.db
BoardBean.java
package net.board.db;
import java.sql.Date;
public class BoardBean {
private int BOARD_NUM;
private String BOARD_NAME;
private String BOARD_PASS;
private String BOARD_SUBJECT;
private String BOARD_CONTENT;
private String BOARD_FILE;
private int BOARD_RE_REF;
private int BOARD_RE_LEV;
private int BOARD_RE_SEQ;
private int BOARD_READCOUNT;
private Date BOARD_DATE;
public int getBOARD_NUM() {
return BOARD_NUM;
}
public void setBOARD_NUM(int board_num) {
BOARD_NUM = board_num;
}
public String getBOARD_NAME() {
return BOARD_NAME;
}
public void setBOARD_NAME(String board_name) {
BOARD_NAME = board_name;
}
public String getBOARD_PASS() {
return BOARD_PASS;
}
public void setBOARD_PASS(String board_pass) {
BOARD_PASS = board_pass;
}
public String getBOARD_SUBJECT() {
return BOARD_SUBJECT;
}
public void setBOARD_SUBJECT(String board_subject) {
BOARD_SUBJECT = board_subject;
}
public String getBOARD_CONTENT() {
return BOARD_CONTENT;
}
public void setBOARD_CONTENT(String board_content) {
BOARD_CONTENT = board_content;
}
public String getBOARD_FILE() {
return BOARD_FILE;
}
public void setBOARD_FILE(String board_file) {
BOARD_FILE = board_file;
}
public int getBOARD_RE_REF() {
return BOARD_RE_REF;
}
public void setBOARD_RE_REF(int board_re_ref) {
BOARD_RE_REF = board_re_ref;
}
public int getBOARD_RE_LEV() {
return BOARD_RE_LEV;
}
public void setBOARD_RE_LEV(int board_re_lev) {
BOARD_RE_LEV = board_re_lev;
}
public int getBOARD_RE_SEQ() {
return BOARD_RE_SEQ;
}
public void setBOARD_RE_SEQ(int board_re_seq) {
BOARD_RE_SEQ = board_re_seq;
}
public int getBOARD_READCOUNT() {
return BOARD_READCOUNT;
}
public void setBOARD_READCOUNT(int board_readcount) {
BOARD_READCOUNT = board_readcount;
}
public Date getBOARD_DATE() {
return BOARD_DATE;
}
public void setBOARD_DATE(Date board_date) {
BOARD_DATE = board_date;
}
}
BoardDAO.java
package net.board.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class BoardDAO {
Connection con;
PreparedStatement pstmt;
ResultSet rs;
public BoardDAO() {
try{
Context init = new InitialContext();
DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/OracleDB");
con = ds.getConnection();
}catch(Exception ex){
System.out.println("DB 연결 실패 : " + ex);
return;
}
}
//글의 개수 구하기.
public int getListCount() {
int x= 0;
try{
pstmt=con.prepareStatement("select count(*) from board");
rs = pstmt.executeQuery();
if(rs.next()){
x=rs.getInt(1);
}
}catch(Exception ex){
System.out.println("getListCount 에러: " + ex);
}finally{
if(rs!=null) try{rs.close();}catch(SQLException ex){}
if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
}
return x;
}
//글 목록 보기.
public List getBoardList(int page,int limit){
String board_list_sql="select * from "+
"(select rownum rnum,BOARD_NUM,BOARD_NAME,BOARD_SUBJECT,"+
"BOARD_CONTENT,BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,"+
"BOARD_RE_SEQ,BOARD_READCOUNT,BOARD_DATE from "+
"(select * from board order by BOARD_RE_REF desc,BOARD_RE_SEQ asc)) "+
"where rnum>=? and rnum<=?";
List list = new ArrayList();
int startrow=(page-1)*10+1; //읽기 시작할 row 번호.
int endrow=startrow+limit-1; //읽을 마지막 row 번호.
try{
pstmt = con.prepareStatement(board_list_sql);
pstmt.setInt(1, startrow);
pstmt.setInt(2, endrow);
rs = pstmt.executeQuery();
while(rs.next()){
BoardBean board = new BoardBean();
board.setBOARD_NUM(rs.getInt("BOARD_NUM"));
board.setBOARD_NAME(rs.getString("BOARD_NAME"));
board.setBOARD_SUBJECT(rs.getString("BOARD_SUBJECT"));
board.setBOARD_CONTENT(rs.getString("BOARD_CONTENT"));
board.setBOARD_FILE(rs.getString("BOARD_FILE"));
board.setBOARD_RE_REF(rs.getInt("BOARD_RE_REF"));
board.setBOARD_RE_LEV(rs.getInt("BOARD_RE_LEV"));
board.setBOARD_RE_SEQ(rs.getInt("BOARD_RE_SEQ"));
board.setBOARD_READCOUNT(rs.getInt("BOARD_READCOUNT"));
board.setBOARD_DATE(rs.getDate("BOARD_DATE"));
list.add(board);
}
return list;
}catch(Exception ex){
System.out.println("getBoardList 에러 : " + ex);
}finally{
if(rs!=null) try{rs.close();}catch(SQLException ex){}
if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
}
return null;
}
//글 내용 보기.
public BoardBean getDetail(int num) throws Exception{
BoardBean board = null;
try{
pstmt = con.prepareStatement(
"select * from board where BOARD_NUM = ?");
pstmt.setInt(1, num);
rs= pstmt.executeQuery();
if(rs.next()){
board = new BoardBean();
board.setBOARD_NUM(rs.getInt("BOARD_NUM"));
board.setBOARD_NAME(rs.getString("BOARD_NAME"));
board.setBOARD_SUBJECT(rs.getString("BOARD_SUBJECT"));
board.setBOARD_CONTENT(rs.getString("BOARD_CONTENT"));
board.setBOARD_FILE(rs.getString("BOARD_FILE"));
board.setBOARD_RE_REF(rs.getInt("BOARD_RE_REF"));
board.setBOARD_RE_LEV(rs.getInt("BOARD_RE_LEV"));
board.setBOARD_RE_SEQ(rs.getInt("BOARD_RE_SEQ"));
board.setBOARD_READCOUNT(rs.getInt("BOARD_READCOUNT"));
board.setBOARD_DATE(rs.getDate("BOARD_DATE"));
}
return board;
}catch(Exception ex){
System.out.println("getDetail 에러 : " + ex);
}finally{
if(rs!=null)try{rs.close();}catch(SQLException ex){}
if(pstmt !=null)try{pstmt.close();}catch(SQLException ex){}
}
return null;
}
//글 등록.
public boolean boardInsert(BoardBean board){
int num =0;
String sql="";
int result=0;
try{
pstmt=con.prepareStatement("select max(board_num) from board");
rs = pstmt.executeQuery();
if(rs.next())
num =rs.getInt(1)+1;
else
num=1;
sql="insert into board (BOARD_NUM,BOARD_NAME,BOARD_PASS,BOARD_SUBJECT,";
sql+="BOARD_CONTENT, BOARD_FILE, BOARD_RE_REF,"+
"BOARD_RE_LEV,BOARD_RE_SEQ,BOARD_READCOUNT,"+
"BOARD_DATE) values(?,?,?,?,?,?,?,?,?,?,sysdate)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.setString(2, board.getBOARD_NAME());
pstmt.setString(3, board.getBOARD_PASS());
pstmt.setString(4, board.getBOARD_SUBJECT());
pstmt.setString(5, board.getBOARD_CONTENT());
pstmt.setString(6, board.getBOARD_FILE());
pstmt.setInt(7, num);
pstmt.setInt(8, 0);
pstmt.setInt(9, 0);
pstmt.setInt(10, 0);
result=pstmt.executeUpdate();
if(result==0)return false;
return true;
}catch(Exception ex){
System.out.println("boardInsert 에러 : "+ex);
}finally{
if(rs!=null) try{rs.close();}catch(SQLException ex){}
if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
}
return false;
}
//글 답변.
public int boardReply(BoardBean board){
String board_max_sql="select max(board_num) from board";
String sql="";
int num=0;
int result=0;
int re_ref=board.getBOARD_RE_REF();
int re_lev=board.getBOARD_RE_LEV();
int re_seq=board.getBOARD_RE_SEQ();
try{
pstmt=con.prepareStatement(board_max_sql);
rs = pstmt.executeQuery();
if(rs.next())num =rs.getInt(1)+1;
else num=1;
sql="update board set BOARD_RE_SEQ=BOARD_RE_SEQ+1 where BOARD_RE_REF=? ";
sql+="and BOARD_RE_SEQ>?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1,re_ref);
pstmt.setInt(2,re_seq);
result=pstmt.executeUpdate();
re_seq = re_seq + 1;
re_lev = re_lev+1;
sql="insert into board (BOARD_NUM,BOARD_NAME,BOARD_PASS,BOARD_SUBJECT,";
sql+="BOARD_CONTENT, BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,BOARD_RE_SEQ,";
sql+="BOARD_READCOUNT,BOARD_DATE) values(?,?,?,?,?,?,?,?,?,?,sysdate)";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.setString(2, board.getBOARD_NAME());
pstmt.setString(3, board.getBOARD_PASS());
pstmt.setString(4, board.getBOARD_SUBJECT());
pstmt.setString(5, board.getBOARD_CONTENT());
pstmt.setString(6, ""); //답장에는 파일을 업로드하지 않음.
pstmt.setInt(7, re_ref);
pstmt.setInt(8, re_lev);
pstmt.setInt(9, re_seq);
pstmt.setInt(10, 0);
pstmt.executeUpdate();
return num;
}catch(SQLException ex){
System.out.println("boardReply 에러 : "+ex);
}finally{
if(rs!=null)try{rs.close();}catch(SQLException ex){}
if(pstmt!=null)try{pstmt.close();}catch(SQLException ex){}
}
return 0;
}
//글 수정.
public boolean boardModify(BoardBean modifyboard) throws Exception{
String sql="update board set BOARD_SUBJECT=?,BOARD_CONTENT=? where BOARD_NUM=?";
try{
pstmt = con.prepareStatement(sql);
pstmt.setString(1, modifyboard.getBOARD_SUBJECT());
pstmt.setString(2, modifyboard.getBOARD_CONTENT());
pstmt.setInt(3, modifyboard.getBOARD_NUM());
pstmt.executeUpdate();
return true;
}catch(Exception ex){
System.out.println("boardModify 에러 : " + ex);
}finally{
if(rs!=null)try{rs.close();}catch(SQLException ex){}
if(pstmt!=null)try{pstmt.close();}catch(SQLException ex){}
}
return false;
}
//글 삭제.
public boolean boardDelete(int num){
String board_delete_sql="delete from board where BOARD_num=?";
int result=0;
try{
pstmt=con.prepareStatement(board_delete_sql);
pstmt.setInt(1, num);
result=pstmt.executeUpdate();
if(result==0)return false;
return true;
}catch(Exception ex){
System.out.println("boardDelete 에러 : "+ex);
}finally{
try{
if(pstmt!=null)pstmt.close();
}catch(Exception ex) {}
}
return false;
}
//조회수 업데이트.
public void setReadCountUpdate(int num) throws Exception{
String sql="update board set BOARD_READCOUNT = "+
"BOARD_READCOUNT+1 where BOARD_NUM = "+num;
try{
pstmt=con.prepareStatement(sql);
pstmt.executeUpdate();
}catch(SQLException ex){
System.out.println("setReadCountUpdate 에러 : "+ex);
}
}
//글쓴이인지 확인.
public boolean isBoardWriter(int num,String pass){
String board_sql="select * from board where BOARD_NUM=?";
try{
pstmt=con.prepareStatement(board_sql);
pstmt.setInt(1, num);
rs=pstmt.executeQuery();
rs.next();
if(pass.equals(rs.getString("BOARD_PASS"))){
return true;
}
}catch(SQLException ex){
System.out.println("isBoardWriter 에러 : "+ex);
}
return false;
}
}
- JSP 파일
index.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="BoardList.bo"/>
</body>
</html>
qna_board_list.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="net.board.db.*"%>
<%
List boardList = (List) request.getAttribute("boardlist");
int listcount = ((Integer) request.getAttribute("listcount")).intValue();
int nowpage = ((Integer) request.getAttribute("page")).intValue();
int maxpage = ((Integer) request.getAttribute("maxpage")).intValue();
int startpage = ((Integer) request.getAttribute("startpage")).intValue();
int endpage = ((Integer) request.getAttribute("endpage")).intValue();
%>
<html>
<head>
<title>MVC 게시판</title>
</head>
<body>
<!-- 게시판 리스트 -->
<table width=50% border="0" cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td colspan="4">MVC 게시판</td>
<td align=right><font size=2>글 개수 : ${listcount }</font></td>
</tr>
<tr align="center" valign="middle" bordercolor="#333333">
<td style="font-family: Tahoma; font-size: 8pt;" width="8%"
height="26">
<div align="center">번호</div>
</td>
<td style="font-family: Tahoma; font-size: 8pt;" width="50%">
<div align="center">제목</div>
</td>
<td style="font-family: Tahoma; font-size: 8pt;" width="14%">
<div align="center">작성자</div>
</td>
<td style="font-family: Tahoma; font-size: 8pt;" width="17%">
<div align="center">날짜</div>
</td>
<td style="font-family: Tahoma; font-size: 8pt;" width="11%">
<div align="center">조회수</div>
</td>
</tr>
<%
for (int i = 0; i < boardList.size(); i++) {
BoardBean bl = (BoardBean) boardList.get(i);
%>
<tr align="center" valign="middle" bordercolor="#333333"
onmouseover="this.style.backgroundColor='F8F8F8'"
onmouseout="this.style.backgroundColor=''">
<td height="23" style="font-family: Tahoma; font-size: 10pt;"><%=bl.getBOARD_NUM()%>
</td>
<td style="font-family: Tahoma; font-size: 10pt;">
<div align="left">
<%
if (bl.getBOARD_RE_LEV() != 0) {
%>
<%
for (int a = 0; a <= bl.getBOARD_RE_LEV() * 2; a++) {
%>
<%
}
%>
▶
<%
} else {
%>
▶
<%
}
%>
<a href="./BoardDetailAction.bo?num=<%=bl.getBOARD_NUM()%>"> <%=bl.getBOARD_SUBJECT()%>
</a>
</div>
</td>
<td style="font-family: Tahoma; font-size: 10pt;">
<div align="center"><%=bl.getBOARD_NAME()%></div>
</td>
<td style="font-family: Tahoma; font-size: 10pt;">
<div align="center"><%=bl.getBOARD_DATE()%></div>
</td>
<td style="font-family: Tahoma; font-size: 10pt;">
<div align="center"><%=bl.getBOARD_READCOUNT()%></div>
</td>
</tr>
<%
}
%>
<tr align=center height=20>
<td colspan=7 style="font-family: Tahoma; font-size: 10pt;">
<%
if (nowpage <= 1) {
%> [이전] <%
} else {
%> <a href="./BoardList.bo?page=<%=nowpage - 1%>">[이전]</a> <%
}
%> <%
for (int a = startpage; a <= endpage; a++) {
if (a == nowpage) {
%> [<%=a%>] <%
} else {
%> <a href="./BoardList.bo?page=<%=a%>">[<%=a%>]
</a> <%
}
%> <%
}
%> <%
if (nowpage >= maxpage) {
%> [다음] <%
} else {
%> <a href="./BoardList.bo?page=<%=nowpage + 1%>">[다음]</a> <%
}
%>
</td>
</tr>
<tr align="right">
<td colspan="5"><a href="./BoardWrite.bo">[글쓰기]</a></td>
</tr>
</table>
</body>
</html>
qna_board_delete.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%
int num=Integer.parseInt(request.getParameter("num"));
%>
<html>
<head>
<title>MVC 게시판</title>
</head>
<body>
<form name="deleteForm" action="./BoardDeleteAction.bo?num=<%=num %>"
method="post">
<table border=1>
<tr>
<td>
<font size=2>글 비밀번호 : </font>
</td>
<td>
<input name="BOARD_PASS" type="password">
</td>
</tr>
<tr>
<td colspan=2 align=center>
<a href="javascript:deleteForm.submit()">삭제</a>
<a href="javascript:history.go(-1)">돌아가기</a>
</td>
</tr>
</table>
</form>
</body>
</html>
qna_board_modify.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ page import="net.board.db.*" %>
<%
BoardBean board = (BoardBean)request.getAttribute("boarddata");
%>
<html>
<head>
<title>MVC 게시판</title>
<script type="text/javascript">
function modifyboard(){
modifyform.submit();
}
</script>
</head>
<body>
<!-- 게시판 수정 -->
<form action="BoardModifyAction.bo" method="post" name="modifyform">
<input type="hidden" name="BOARD_NUM" value=<%=board.getBOARD_NUM() %>>
<table cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td colspan="5">MVC 게시판</td>
</tr>
<tr>
<td height="16" style="font-family:돋음; font-size:12">
<div align="center">제 목</div>
</td>
<td>
<input name="BOARD_SUBJECT" size="50" maxlength="100"
value="<%=board.getBOARD_SUBJECT()%>">
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">내 용</div>
</td>
<td>
<textarea name="BOARD_CONTENT" cols="67" rows="15">
<%=board.getBOARD_CONTENT() %>
</textarea>
</td>
</tr>
<%if(!(board.getBOARD_FILE()==null)){ %>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">파일 첨부</div>
</td>
<td>
<%=board.getBOARD_FILE() %>
</td>
</tr>
<%} %>
<tr>
<td height="16" style="font-family:돋음; font-size:12">
<div align="center">비밀번호</div>
</td>
<td>
<input name="BOARD_PASS" type="password">
</td>
</tr>
<tr bgcolor="cccccc">
<td colspan="2" style="height:1px;">
</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr align="center" valign="middle">
<td colspan="5">
<font size=2>
<a href="javascript:modifyboard()">[수정]</a>
<a href="javascript:history.go(-1)">[뒤로]</a>
</font>
</td>
</tr>
</table>
</form>
<!-- 게시판 수정 -->
</body>
</html>
</html>
qna_board_replay.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ page import="net.board.db.*" %>
<%
BoardBean board=(BoardBean)request.getAttribute("boarddata");
%>
<html>
<head>
<title>MVC 게시판</title>
<script language="javascript">
function replyboard(){
boardform.submit();
}
</script>
</head>
<body>
<!-- 게시판 답변 -->
<form action="./BoardReplyView.bo" method="post" name="boardform">
<input type="hidden" name="BOARD_NUM" value="<%=board.getBOARD_NUM() %>">
<input type="hidden" name="BOARD_RE_REF" value="<%=board.getBOARD_RE_REF() %>">
<input type="hidden" name="BOARD_RE_LEV" value="<%=board.getBOARD_RE_LEV() %>">
<input type="hidden" name="BOARD_RE_SEQ" value="<%=board.getBOARD_RE_SEQ() %>">
<table cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td colspan="5">MVC 게시판</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12" height="16">
<div align="center">글쓴이</div>
</td>
<td>
<input name="BOARD_NAME" type="text"/>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12" height="16">
<div align="center">제 목</div>
</td>
<td>
<input name="BOARD_SUBJECT" type="text" size="50"
maxlength="100" value="Re: <%=board.getBOARD_SUBJECT() %>"/>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">내 용</div>
</td>
<td>
<textarea name="BOARD_CONTENT" cols="67" rows="15"></textarea>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">비밀번호</div>
</td>
<td>
<input name="BOARD_PASS" type="password">
</td>
</tr>
<tr bgcolor="cccccc">
<td colspan="2" style="height:1px;">
</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr align="center" valign="middle">
<td colspan="5">
<a href="javascript:replyboard()">[등록]</a>
<a href="javascript:history.go(-1)">[뒤로]</a>
</td>
</tr>
</table>
</form>
<!-- 게시판 답변 -->
</body>
</html>
qna_board_view.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ page import="net.board.db.*" %>
<%
BoardBean board = (BoardBean)request.getAttribute("boarddata");
%>
<html>
<head>
<title>MVC 게시판</title>
</head>
<body>
<!-- 게시판 수정 -->
<table cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td colspan="5">MVC 게시판</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12" height="16">
<div align="center">제 목 </div>
</td>
<td style="font-family:돋음; font-size:12">
<%=board.getBOARD_SUBJECT()%>
</td>
</tr>
<tr bgcolor="cccccc">
<td colspan="2" style="height:1px;">
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">내 용</div>
</td>
<td style="font-family:돋음; font-size:12">
<table border=0 width=490 height=250 style="table-layout:fixed">
<tr>
<td valign=top style="font-family:돋음; font-size:12">
<%=board.getBOARD_CONTENT() %>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">첨부파일</div>
</td>
<td style="font-family:돋음; font-size:12">
<%if(!(board.getBOARD_FILE()==null)){ %>
<a href="./boardupload/<%=board.getBOARD_FILE()%>">
<%=board.getBOARD_FILE() %>
</a>
<%} %>
</td>
</tr>
<tr bgcolor="cccccc">
<td colspan="2" style="height:1px;"></td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr align="center" valign="middle">
<td colspan="5">
<font size=2>
<a href="./BoardReplyAction.bo?num=<%=board.getBOARD_NUM() %>">
[답변]
</a>
<a href="./BoardModify.bo?num=<%=board.getBOARD_NUM() %>">
[수정]
</a>
<a href="./BoardDelete.bo?num=<%=board.getBOARD_NUM() %>">
[삭제]
</a>
<a href="./BoardList.bo">[목록]</a>
</font>
</td>
</tr>
</table>
<!-- 게시판 수정 -->
</body>
</html>
qna_board_write.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<html>
<head>
<title>MVC 게시판</title>
<script language="javascript">
function addboard(){
boardform.submit();
}
</script>
</head>
<body>
<!-- 게시판 등록 -->
<form action="./BoardAddAction.bo" method="post"
enctype="multipart/form-data" name="boardform">
<table cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td colspan="5">MVC 게시판</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12" height="16">
<div align="center">글쓴이</div>
</td>
<td>
<input name="BOARD_NAME" type="text" size="10" maxlength="10"
value=""/>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12" height="16">
<div align="center">비밀번호</div>
</td>
<td>
<input name="BOARD_PASS" type="password" size="10" maxlength="10"
value=""/>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12" height="16">
<div align="center">제 목</div>
</td>
<td>
<input name="BOARD_SUBJECT" type="text" size="50" maxlength="100"
value=""/>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">내 용</div>
</td>
<td>
<textarea name="BOARD_CONTENT" cols="67" rows="15"></textarea>
</td>
</tr>
<tr>
<td style="font-family:돋음; font-size:12">
<div align="center">파일 첨부</div>
</td>
<td>
<input name="BOARD_FILE" type="file"/>
</td>
</tr>
<tr bgcolor="cccccc">
<td colspan="2" style="height:1px;">
</td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr align="center" valign="middle">
<td colspan="5">
<a href="javascript:addboard()">[등록]</a>
<a href="javascript:history.go(-1)">[뒤로]</a>
</td>
</tr>
</table>
</form>
<!-- 게시판 등록 -->
</body>
</html>