2016년 10월 5일 수요일

51day / WEB / Model2 게시판 만들기

# 주위 : 개인적인 낙서판 같은 블로그이지만 어쩌다가 들어오셔서 참고하시게 된다면
참고만 하시길 바랍니다. 기초가 많이 부족한 쓰레기 코드입니다.



  • 구동화면

초기화면
글 목록
글 제목을 클릭하면 NO 컬럼의 PK값과 함께 상세글보기로 이동한다
글쓰기

글 작성이 완료되면 작성한 글을 상세글 보기로 바로 이동시켜서 확인시킨다

상세글보기
1. 목록에서 제목을 클릭
2. 글 작성 후
3. 수정 후
볼 수 있으며
목록 / 삭제 / 수정 3가지의 버튼을 제공한다.

수정 or 삭제 전 비밀번호 체크
수정을 하거나 삭제를 할 때는 비밀번호를 필히 체크한다.

수정여부 체크 팝업
만약 비밀번호가 일치한다면.
삭제 -> 글 삭제 후 글 목록으로 이동한다.
수정 - > 수정 폼으로 이동시켜준다.

수정 폼 제공
글번호는 수정을 못하도록 막는다.
수정 or 글작성 후 확인은 상세글보기를 통함

수정화면 체크

  • Controll
Factory Pattern 적용
public class HandlerMapping {
    private static HandlerMapping instance = new HandlerMapping();
    private HandlerMapping() {
    }
    public static HandlerMapping getInstance() {
        return instance;
    }
    public Controller create(String command) {
        Controller c = null;
        if (command.equals("write")) {
            c = new WriterController();
        } else if (command.equals("list")) {
            c = new ListController();
        } else if (command.equals("detail")) {
            c = new DetailController();
        } else if (command.equals("update")) {
            c = new UpdateController();
        } else if (command.equals("updateCheck")) {
            c = new UpdateCheckController();
        } else if (command.equals("updateAccept")) {
            c = new UpdateAcceptController();
        } else if (command.equals("delete")) {
            c = new DeleteController();
        } else if (command.equals("deleteCheck")) {
            c = new DeleteCheckController();
        } 
        return c;
    }
}
cs

ModelAndView  적용

public class ModelAndView {
    private String viewName;//응답할 View url 할당 
    //Model 계층과 연동하여 View에 공유할 정보를 할당 
    //request.setAttribute(name,value) 할 정보가 저장된다 
    //다수의 정보가 request에 저장될 수 있으므로 Map에 저장한다
    private HashMap<String,Object> map
                    =new HashMap<String,Object>();    
    public ModelAndView(){}
    public ModelAndView(String viewName){
        this.viewName=viewName;
    }
    public ModelAndView(String viewName,String name,Object value){
        this.viewName=viewName;
        map.put(name, value);
    }    
    public ModelAndView(String viewName,HashMap<String, Object> map) {
        super();
        this.viewName = viewName;
        this.map = map;
    }
    //request.setAttribute(name,value) 할 정보가 저장된다
    public void addObject(String name,Object value){
        map.put(name, value);
    }
    public String getViewName() {
        return viewName;
    }
    public void setViewName(String viewName) {
        this.viewName = viewName;
    }
    public HashMap<String, Object> getMap() {
        return map;
    }
    public void setMap(HashMap<String, Object> map) {
        this.map = map;
    }
    @Override
    public String toString() {
        return "ModelAndView [viewName=" + viewName + ", map=" + map + "]";
    }
}

cs

글 목록을 보여준다

public class ListController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
        throws Exception {
        return new ModelAndView("board/list.jsp""list", BoardDAO.getInstance().getAllList());
    }
}
cs

상세글보기

public class DetailController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
        // 상세정보가 조회될 글의 number
        int no = Integer.parseInt(request.getParameter("no"));
        BoardVO vo = BoardDAO.getInstance().getDetailByNo(no);
        return new ModelAndView("board/detail.jsp""vo", vo);
    }
}
cs


정보수정 Controller 구성

비밀번호를 가져와준다
public class UpdateController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
        throws Exception {
        // 수정 될 글의 number
        int no = Integer.parseInt(request.getParameter("no"));
        // number의 password를 가져온다
        BoardVO vo = BoardDAO.getInstance().getPasswordByNO(no);
        // 비밀번호 체크 팝업으로 보낸다
        return new ModelAndView("board/update_before.jsp""vo", vo);
    }
}

비밀번호가 체크된 후 정보수정 폼으로 보내준다.

public class UpdateCheckController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
        throws Exception {
        int no = Integer.parseInt(request.getParameter("no"));
        BoardVO vo = BoardDAO.getInstance().getDetailByNo(no);
        return new ModelAndView("board/update.jsp""vo", vo);
    }
}
수정된 정보를 DB에 반영시킨 후 결과를 보여준다.

public class UpdateAcceptController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
        throws Exception {
        // 수정될 정보를 폼에서 가져온다
        int no = Integer.parseInt(request.getParameter("no"));
        String title = request.getParameter("title");
        String writer = request.getParameter("writer");
        String content = request.getParameter("content");
        BoardDAO.getInstance().update(new BoardVO(no, title, writer, content));
        // 수정완료가 된 후에 바로 수정된 정보를 확인한다
        return new ModelAndView("redirect:dispatcher?command=detail&no=" + no);
    }
}
cs

글 삭제 Controller 구성

글 삭제를 위하여 비밀번호를 가져온다
public class DeleteController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
        // 삭제 될 글의 number
        int no = Integer.parseInt(request.getParameter("no"));
        // 글 number의 비밀번호를 가져온다
        BoardVO vo = BoardDAO.getInstance().getPasswordByNO(no);
        return new ModelAndView("board/delete_popup.jsp""vo", vo);
    }
}

글 삭제를 한 후 글 목록으로 보내준다.
public class DeleteCheckController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response)
throws Exception {
        // 삭제 될 글의 number
        int no = Integer.parseInt(request.getParameter("no"));
        BoardDAO.getInstance().delete(no);
        return new ModelAndView("board/list.jsp","list", BoardDAO.getInstance().getAllList());
    }
}
cs

글 작성 폼을 DB에 반영한 후 상세글보기를 통하여 결과조회
public class WriterController implements Controller {
    @Override
    public ModelAndView execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
        int no = BoardDAO.getInstance().seqCreate();
        
        String title = request.getParameter("title");
        String writer = request.getParameter("writer");
        String password = request.getParameter("password");
        String content = request.getParameter("content");
        
        BoardDAO.getInstance().write(new BoardVO(no, title, writer, password, content));
        
        return new ModelAndView("redirect:dispatcher?command=detail&no="+no);
    }
}
cs

  • Model
public class BoardDAO {
    /**
     *  싱글톤 선언과 DB접속을 준비한다.
     */
    private static BoardDAO instance;
    private DataSource dataSource;
    private BoardDAO() {
        dataSource = DataSourceManager.getInstance().getDataSource();
    }
    public static BoardDAO getInstance() {
        if (instance == null)
            instance = new BoardDAO();
        return instance;
    }
    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    /**
     * 글 쓰기 후 먼저 시퀀스번호부터 생성한다.
     *
     * @return Sequence Number
     * @throws SQLException
     */
    public int seqCreate() throws SQLException {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        int num = 0;
        try {
            con = getConnection();
            String sql = "SELECT board_seq.NEXTVAL FROM dual";
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                num = rs.getInt(1);
            }
        } finally {
            closeAll(rs, pstmt, con);
        }
        return num;
    }
    /**
     * 글 작성을 위하여 DB에 Insert 하여 update한다.
     *
     * @param vo(폼에서 작성된 정보)
     * @throws SQLException
     */
    public void write(BoardVO vo) throws SQLException {
        Connection con = null;
        PreparedStatement pstmt = null;
        try {
            con = getConnection();
            String sql = "INSERT INTO board(no,title,writer,password,content,time_posted)"
                    + "VALUES(?,?,?,?,?,SYSDATE)";
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, vo.getNo());
            pstmt.setString(2, vo.getTitle());
            pstmt.setString(3, vo.getWriter());
            pstmt.setString(4, vo.getPassword());
            pstmt.setString(5, vo.getContent());
            pstmt.executeUpdate();
        } finally {
            closeAll(pstmt, con);
        }
    }
    /**
     * 물고온 PK number를 통하여 글을 삭제한다.
     *
     * @param no (Sequence number or Primary key)
     * @throws SQLException
     */
    public void delete(int no) throws SQLException {
        Connection con = null;
        PreparedStatement pstmt = null;
        try {
            con = getConnection();
            String sql = "DELETE FROM board WHERE no = ?";
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, no);
            pstmt.executeUpdate();
        } finally {
            closeAll(pstmt, con);
        }
    }
    /**
     * 필요한 컬럼만 가져와서 게시판 리스트를 구성한다.
     *
     * @return list(글 목록)
     * @throws SQLException
     */
    public ArrayList<BoardVO> getAllList() throws SQLException {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        ArrayList<BoardVO> list = new ArrayList<BoardVO>();
        try {
            con = getConnection();
            String sql = "SELECT no,title,writer,hits,TO_CHAR(time_posted,'YYYY.MM.DD')"
                    + "FROM board ORDER BY no DESC";
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                BoardVO vo = new BoardVO(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getInt(4), rs.getString(5));
                list.add(vo);
            }
        } finally {
            closeAll(rs, pstmt, con);
        }
        return list;
    }
    /**
     * 글 삭제 or 수정을 비밀번호 체크를 위해
     * 해당 서비스를 원하는 글의 비밀번호를 가져온다.
     *
     * @param no (Sequence number or Primary key)
     * @return vo (no의 password를 가져온다)
     * @throws SQLException
     */
    public BoardVO getPasswordByNO(int no) throws SQLException {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        BoardVO vo = null;
        try {
            con = getConnection();
            String sql = "select password from board where no = ?";
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, no);
            rs = pstmt.executeQuery();
            if (rs.next())
                vo = new BoardVO(no, rs.getString(1));
        } finally {
            closeAll(rs, pstmt, con);
        }
        return vo;
    }
    /**
     * 상세글 보기
     * 조회수도 1 증가 시킨다.
     *
     * @param no (Sequence number or Primary key)
     * @return vo (상세글보기에서 필요한 정보만 가져온다)
     * @throws SQLException
     */
    public BoardVO getDetailByNo(int no) throws SQLException {
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        BoardVO vo = null;
        try {
            con = getConnection();
            String hit = "UPDATE board SET hits = hits + 1 WHERE no = ?";
            String sql = "SELECT title,writer,content,hits,to_char(time_posted,'YYYY/MM/DD HH24:MI:SS') FROM board WHERE no=?";
            pstmt = con.prepareStatement(hit);
            pstmt.setInt(1, no);
            pstmt.executeUpdate();
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, no);
            rs = pstmt.executeQuery();
            if (rs.next())
                vo = new BoardVO(no, rs.getString(1), rs.getString(2), rs.getString(3), rs.getInt(4),
                        rs.getString(5));
        } finally {
            closeAll(rs, pstmt, con);
        }
        return vo;
    }
    /**
     *
     * @param vo(수정 폼에서 제공받은 수정될 정보)
     * @throws SQLException
     */
    public void update(BoardVO vo) throws SQLException {
        Connection con = null;
        PreparedStatement pstmt = null;
        try {
            con = getConnection();
            String sql = "update board set title=?, writer=?, content=? where no = ?";
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, vo.getTitle());
            pstmt.setString(2, vo.getWriter());
            pstmt.setString(3, vo.getContent());
            pstmt.setInt(4, vo.getNo());
            pstmt.executeUpdate();
        } finally {
            closeAll(pstmt, con);
        }
    }
    /**
     * PreparedStatement AND Connection 연결을 끊어준다.
     *
     * @param pstmt
     * @param con
     */
    public void closeAll(PreparedStatement pstmt, Connection con) {
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     *
     * ResultSet AND PreparedStatement AND Connection
     * 연결을 끊어준다.
     *
     * @param rs
     * @param pstmt
     * @param con
     */
    public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection con) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        closeAll(pstmt, con);
    }
}
cs

public class BoardVO {
    // 글 Number 유일값
    private int no;
    // 제목
    private String title;
    // 작성자
    private String writer;
    // 비밀번호
    private String password;
    // 글 내용
    private String content;
    // 조회수
    private int hits;
    // 작성날짜
    private String time_posted;
    public BoardVO() {
        super();
    }
    public BoardVO(int no) {
        super();
        this.no = no;
    }
    // 비밀번호 겟! 생성자
    public BoardVO(int no, String password) {
        super();
        this.no = no;
        this.password = password;
    }
    // 수정 생성자!
    public BoardVO(int no, String title, String writer, String content) {
        super();
        this.no = no;
        this.title = title;
        this.writer = writer;
        this.content = content;
    }
    // 글 작성 생성자
    public BoardVO(int no, String title, String writer, String password, String content, String time_posted) {
        super();
        this.no = no;
        this.title = title;
        this.writer = writer;
        this.password = password;
        this.content = content;
        this.time_posted = time_posted;
    }
    // 글 작성 생성자
    public BoardVO(int no, String title, String writer, String password, String content) {
        super();
        this.no = no;
        this.title = title;
        this.writer = writer;
        this.password = password;
        this.content = content;
    }
    // 글 목록 생성자
    public BoardVO(int no, String title, String writer, int hits, String time_posted) {
        super();
        this.no = no;
        this.title = title;
        this.writer = writer;
        this.hits = hits;
        this.time_posted = time_posted;
    }
    // 글 Detail 생성자
    public BoardVO(int no, String title, String writer, String content, int hits, String time_posted) {
        super();
        this.no = no;
        this.title = title;
        this.writer = writer;
        this.content = content;
        this.hits = hits;
        this.time_posted = time_posted;
    }
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getWriter() {
        return writer;
    }
    public void setWriter(String writer) {
        this.writer = writer;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public int getHits() {
        return hits;
    }
    public void setHits(int hits) {
        this.hits = hits;
    }
    public String getTime_posted() {
        return time_posted;
    }
    public void setTime_posted(String time_posted) {
        this.time_posted = time_posted;
    }
    @Override
    public String toString() {
        return "BoardVO [no=" + no + ", title=" + title + ", writer=" + writer + ", password=" + password + ", content="
                + content + ", hits=" + hits + ", time_posted=" + time_posted + "]";
    }
}
cs

  • View(역할은 title참조)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>초기화면</title>
<link rel="stylesheet" href="${initParam.root}css/board.css" type="text/css">
</head>
<body>
<c:import url="/template/header.jsp"></c:import>
<hr>
<h1>Model2 MVC Board</h1>
</body>
</html>
cs

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>글목록</title>
<link rel="stylesheet" href="${initParam.root}css/board.css" type="text/css">
<script type="text/javascript">
</script>
</head>
<body>    
<c:import url="/template/header.jsp"></c:import>
<hr>    
    <table class="list">
        <caption>목 록</caption>
        <thead>
        <tr>
            <th class="no">NO</th>
            <th class="title">제목</th>
            <th class="name">이름</th>
            <th class="date">작성일</th>
            <th class="hit">조회수</th>
            </tr>
        </thead>
        <tbody>            
    <c:forEach items="${requestScope.list}" var="board">
            <tr>
                <td>${board.no}</td>                
                <td><a href="${initParam.root}dispatcher?command=detail&no=${board.no}">
                ${board.title}</a></td>
                <td>${board.writer}</td>
                <td>${board.time_posted}</td>
                <td>${board.hits}</td>
            </tr>            
            </c:forEach>        
        </tbody>                    
    </table><br></br>    
    <a href="${initParam.root}board/write.jsp"><img src="글쓰기버튼" border="0"></a>
    <br><br>    
</body>
</html>
cs

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>상세정보</title>
<link rel="stylesheet" href="${initParam.root}css/board.css" type="text/css">
<script type="text/javascript">
    function sendList(){
        location.href = "${initParam.root}dispatcher?command=list";
    }
    function winOpen(url, no){
        window.open("${initParam.root}dispatcher?command="+url+"&no="+no, "popup",
        "width = 550, height = 350, top = 150, left = 200");
    }
</script>
</head>
<body>
<p>
<c:import url="/template/header.jsp"></c:import>
</p>        
    <table class="content">
        <tr>
            <td>NO : ${requestScope.vo.no}</td>
            <td colspan="2">제목 : ${requestScope.vo.title}</td>
        </tr>
        <tr>
            <td>작성자 : ${requestScope.vo.writer}</td>
            <td>${requestScope.vo.time_posted}</td>
            <td>조회수 : ${requestScope.vo.hits}</td>
        </tr>
        <tr>
            <td colspan="3">
            <pre>${requestScope.vo.content}</pre>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="center" colspan="3">
             <img class="action" src="${initParam.root}img/list_btn.jpg" onclick="sendList()" >
             <img class="action"  onclick="winOpen('delete','${requestScope.vo.no}')"     src="${initParam.root}img/delete_btn.jpg" > 
             <img class="action"  onclick="winOpen('update','${requestScope.vo.no}')"  src="${initParam.root}img/modify_btn.jpg" ></td>
        </tr>
    </table>
</body>
</html>
cs

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게시글쓰기</title>
<link rel="stylesheet" href="${initParam.root}css/board.css" type="text/css">
<script type="text/javascript">
    function formCheck(){
        var title = document.write_form.title.value;
        var writer = document.write_form.writer.value;
         var pw = document.write_form.password.value;
         var content = document.write_form.content.value;
        
         if(title == ""){
             alert("제목을 입력하세요");
             return false;
         }
         if(writer == ""){
             alert("작성자를 입력하세요");
             return false;
         }
         if(pw == ""){
             alert("비밀번호를 입력하세요");
             return false;
         }
         if(content == ""){
             alert("내용을 입력하세요");
             return false;
         }
    }
        
    function cancel() {
        document.write_form.reset();
    }
</script>
</head>
<body>
<c:import url="/template/header.jsp"></c:import>
<hr>
 <br>
  <form action="${initParam.root}dispatcher" method="post" name="write_form" onsubmit="return formCheck()">  
   <table class="inputForm">
    <caption>글쓰기</caption>
    <tbody>
    <tr>
     <td>제목</td>
     <td colspan="3">
     <input type="text" name="title" size="48">
     </td>
    </tr>
    <tr>
     <td>이름</td>
     <td><input type="text" name="writer" size="20"></td>
     <td>비밀번호</td>
     <td>
     <input type="password" name="password" size="5">
     </td>
    </tr>
    <tr>
     <td colspan="4" align="left">
     &nbsp;&nbsp;
     <textarea cols="53" rows="15" name="content"></textarea>
     </td>
    </tr> 
    <tr>
     <td colspan="4" align="center" >
      <input type="hidden" name="command" value="write">
      <input type="image" class="action" src="${initParam.root}img/write_btn.jpg" alt="글입력">
      <img class="action" src="${initParam.root}img/cancel.gif" onclick="cancel()">      
     </td>  
    </tr>
    </tbody>
   </table>
  </form>
</body>
</html>
cs

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
<script>
    function deleteCk(vopw){
        var pw = document.checkForm.pw.value;
        
        if(pw!=vopw){
            alert("비밀번호가 일치하지 않습니다");
            return false;
        }else{
            if(confirm("삭제하시겠습니까?")){
                window.opener.location.href="${initParam.root}dispatcher?command=deleteCheck&no=${requestScope.vo.no}";
                self.close();
            }
        }
    }
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>delete_popup</title>
<link rel="stylesheet" href="${initParam.root}css/board.css" type="text/css">
</head>
<body>
    <hr>
    <form name = "checkForm" method = "post" action = "${initParam.root}dispatcher" onsubmit="return deleteCk()">
        <table class = "content">
            <tr>
                <td colspan = "2">비밀번호</td>
            </tr>
            <tr><td colspan = "2">
                <input type = "password" name= "pw"></td>
            </tr>
            <tr>
                <td colspan = "2">
            <input type = "hidden" name = "command" value = "deleteCheck">
            <input type = "hidden" name= "no" value = "${requestScope.vo.no}">
            <input type="button" value="삭제" class="action" onclick="deleteCk('${requestScope.vo.password}')">
            <input type="button" value="창끄기" onclick="javascript:self.close()">
            </td></tr>
        </table>
    </form>
</body>
</html>
cs

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>
<script>
    function deleteCk(vopw){
        var pw = document.checkForm.pw.value;
        
        if(pw!=vopw){
            alert("비밀번호가 일치하지 않습니다");
            return false;
        }else{
            if(confirm("수정페이지로 이동하시겠습니까?")){
                window.opener.location.href="${initParam.root}dispatcher?command=updateCheck&no=${requestScope.vo.no}"
                self.close();
            }
        }
    }
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>delete_popup(비밀번호체크)</title>
<link rel="stylesheet" href="${initParam.root}css/board.css" type="text/css">
</head>
<body>
    <hr>
    <form name = "checkForm" method = "post" action = "${initParam.root}dispatcher" onsubmit="return deleteCk()">
        <table class = "content">
            <tr>
                <td colspan = "2">비밀번호</td>
            </tr>
            <tr><td colspan = "2">
                <input type = "password" name= "pw"></td>
            </tr>
            <tr>
                <td colspan = "2">
            <input type = "hidden" name = "command" value = "deleteCheck">
            <input type = "hidden" name= "no" value = "${requestScope.vo.no}">
            <input type="button" value="수정페이지로" class="action" onclick="deleteCk('${requestScope.vo.password}')">
            </td></tr>
        </table>
    </form>
</body>
</html>
cs

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Update Form</title>
<link rel="stylesheet" href="${initParam.root}css/board.css" type="text/css">
<script>
function formCheck(){
    var title = document.update_form.title.value;
    var writer = document.update_form.writer.value;
     var content = document.update_form.content.value;
    
     if(title == ""){
         alert("제목을 입력하세요");
         return false;
     }
     if(writer == ""){
         alert("작성자를 입력하세요");
         return false;
     }
     if(content == ""){
         alert("내용을 입력하세요");
         return false;
     }
}
</script>
</head>
<body>
<c:import url="/template/header.jsp"></c:import>
<hr>    
<form action="dispatcher" name = "update_form" method = "post" onsubmit="return formCheck()">        
    <table class="content">
    <tr> 
        <td>
            <table>
                <tr>
                    <td>
                    글번호: <input type=text name=no value="${requestScope.vo.no}" readonly></input>
                    타이틀: <input type=text name= title value="${requestScope.vo.title}">                    
                    </td>
                </tr>
    <tr>
        <td>
        <font size="2">작성자: <input type=text name = writer value="${requestScope.vo.writer}">
            | ${requestScope.vo.time_posted} </font>
        </td>
    </tr>
            <tr>
                <td>                        
    <textarea rows="15" cols="75" name="content" >${requestScope.vo.content}</textarea>
                    </td>
                </tr>
                <tr>
                <td valign="middle">            
                    <input type="hidden" name="command" value="updateAccept">
                    <input type="submit" value="수정하기" class="action">            
                    </td>                
                </tr>
            </table>
        </td>
    </tr>
</table>
</form>    
</body>
</html>
cs