열심히 끝까지

디바이스 융합 자바(Java) day41 - html 기본 정리,jsp의 VO,DAO,Controller 분리,두 개의 sql 연결 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day41 - html 기본 정리,jsp의 VO,DAO,Controller 분리,두 개의 sql 연결

노유림 2022. 8. 8. 17:57

[저번주 내용 복습]

ctrl + f11 -> NewFile.jsp 페이지를 요청
     http://local:8088/daya39/NewFile.jsp
     ex ) 로고 " 네이버 보여줘."
           만화 " 신의 탑 보여줘."
     Get 요청

화면에 내가 원하는대로 출력이 되지 않았따면?
     404, 500 -> 예외처리가 존재하기 때문에 페이지 출력 자체는 정상적으로 진행됨
                  => Console에 에러가 출력되어 있을 예정(e.printStackTrace();)
     404 : 요청이 틀린 경우 / 페이지가 없는 경우
     500 : 로직(java의 코드)이 틀린 경우

INSERT INTO MEMBER (name, score) VALUE ("","")

※ SQL 기본 문법은 파일을 숙지할 것!

★★★★★
.jsp 파일은 결국에 .java(Servlet 서블릿) 파일이 됨!!!!!!!

NewFile.jsp 라인 설명
1~2 페이지 지시어

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.vo.MemberVO" %>
<%
	request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO" />
<jsp:useBean id="mVO" class="model.vo.MemberVO" />
<jsp:setProperty property="*" name="mVO" />
<%
	if(request.getMethod().equals("POST")){		
		if(mDAO.insert(mVO)){
			out.println("<SCRIPT>alert('"+request.getParameter("name")+" 등록완료!');</SCRIPT>");
		}
		else{
			out.println("<SCRIPT>alert('등록실패...');</SCRIPT>");
		}
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	a {
		color: black;
		text-decoration: none;
	}
</style>
</head>
<body>

<form action="NewFile.jsp" method="post">
이름: <input type="text" name="name"> <br>
점수: <input type="number" min="0" max="100" name="score"> <br>
<input type="submit" value="데이터 등록하기">
</form>

<hr>

<h2>데이터 목록</h2>
<table border="2">
	<tr>
		<th>학생 번호</th>
		<th>학생 이름</th>
	</tr>
<%
	for(MemberVO v:mDAO.selectAll(mVO)){
		out.println("<TR>");
		out.println("<TH><A HREF='NewFile1.jsp?mpk="+v.getMpk()+"'>"+v.getMpk()+"</A></TH>");
		out.println("<TD>"+v.getName()+"</TD>");
		out.println("</TR>");
	}
%>
</table>

</body>
</html>


6번부터 중요!
6           jsp:useBean action
            : MemberDAO mDAO = NEW MemberDAO();
              - 기본생성자를 호출하여 new 진행함
                 >> 기본생성자를 사용하므로 멤버변수 초기화가 진행되어있지 않음

8          mVO.setXxx(request.getParameter("xxx"));
            : useBean 기본생성자로 진행하지 못한 멤버변수 초기화를 진행함
            - 요청정보(request 내장객체)에 포함된 파라미터와 이름이 동일한 멤버변수를 초기화
            >> 이름이 같으면 자동으로 메핑됨으로 이름을 동일하게 설정하는 것이 중요!

48         mVO를 new 했지만 mVO.setXxx은 못함
            : 그렇기에 비어있음
            >> if(mVO == null){}을 넘어가지 못함
            VO가 비어있어도 안에 출력문은 돌아감
            vo를 쓰는 이유는? 유지보수 때문
---------------------

36         submit을 하게 되면
            1. NewFile.jsp로 POST 요청 보내라. 라는 것이 수행
                   - 34번 라인 name, 35번 라인 score라는 이름의 파라미터값을 요청정보에 포함
            2. 8번 라인의 mVO.setName(request.getParameter("name"));
                8번 라인의 mVO.setScore(request.getParameter("score"));
            3. 10번 라인 대문자임에 유의!!!
--------------------
NewFile1.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO" />
<jsp:useBean id="mVO" class="model.vo.MemberVO" />
<jsp:setProperty property="*" name="mVO"/>
<%
	mVO=mDAO.selectOne(mVO);
	if(mVO==null){		
		response.sendRedirect("NewFile.jsp");
	}
	else{
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1><%=mVO.getName()%> 학생 정보</h1>
<form action="NewFile2.jsp" method="post">
<table border="1">
	<tr>
		<td>학번</td>
		<td><input type="text" name="mpk" value="<%=mVO.getMpk()%>" readonly></td>
	</tr>
	<tr>
		<td>이름</td>
		<td><input type="text" name="name" value="<%=mVO.getName()%>"></td>
	</tr>
	<tr>
		<td>점수</td>
		<td><input type="number" name="score" min="0" max="100" value="<%=mVO.getScore()%>"></td>
	</tr>
	<tr>
		<td colspan="2" align="right">
			<input type="submit" value="변경">&nbsp;<input type="button" id="btn" onclick="del(<%=mVO.getMpk()%>);" value="삭제">
		</td>
	</tr>
</table>
</form>
<script type="text/javascript">
	function del(mpk){
		if(confirm("정말 삭제하시겠습니까?")){
			location.href="NewFile3.jsp?mpk="+mpk;
			// URL? 파라미터명=값
			// URL에 해당하는 페이지에서 request.getParameter("파라미터명")을 통해 값을 얻어낼 수 있음!
		}
		else{
			return false;
		}
	}
</script>
<%
	}
%>

</body>
</html>


50         <a href="URL"> GET 요청
            URL?파라미터명 = 값
            URL?파라미터명=값 & 파라미터명=값 &...
5          mVO.setMpk(request.getParameter("mpk"));
------------------  
NewFile2.jsp 페이지는? Controller!

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO" />
<jsp:useBean id="mVO" class="model.vo.MemberVO" />
<jsp:setProperty property="*" name="mVO" />
<%
	if(mDAO.update(mVO)){
		%>
		<script type="text/javascript">
			alert('<%=mVO.getMpk()%>번 데이터 변경 완료!');
			location.href="NewFile.jsp";
		</script>
		<%
	}
	else{
	%>
		<script type="text/javascript">
			alert('데이터 변경에 문제가 발생했습니다...');
			location.href="NewFile.jsp";
		</script>
	<%
	}
%>


            M : VO, DAO, Util
            V : 브라우저에 출력되는 페이지
                   >> 화면에 보여지는 페이지가 아니기 때문에 NewFile.jsp는 V파트는 아님
            C : V에서 넘어온 정보를 vo객체에 setter하고,
                M에게 vo 객체를 넘겨줌

NewFile.jsp 페이지는 V + C 혼합 페이지
             >> 향후 유지보수의 대상이 될 페이지
             >> 나중에 나누게 될 것
     >> NewFile2.jsp는 제대로 된 실무형 페이지

-----------------
1. 기존 vo, dao, util 복사
2. jsp페이지 1개 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.vo.MemberVO, java.util.ArrayList" %>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO"/>
<jsp:useBean id="mVO" class="model.vo.MemberVO"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>오늘 수업</title>
</head>
<body>

<form action="controller.jsp" method="post"> <%-- post는 권장사항 --%>
	이름 : <input type="text" name="name" required> <br>
	점수 : <input type="number" min = "0" max="100" name="score" required> <br><br>
	<input type="submit" value="데이터 등록하기">
</form>
<br>
<hr>
<br>
<h1>데이터 목록</h1>
<hr>
<%
	ArrayList<MemberVO> datas= mDAO.selectAll(mVO);
	if(datas.size()==0){
		out.println("<h3>출력할 데이터가 없습니다...</h3>");
	}
	else{
%>
<table border="2">
	<tr>
		<th>번 호</th><th>이 름</th>
	</tr>
	<%
		for(MemberVO v : datas){
	%>
	<tr>
		<th><a href="NewFile5.jsp?mpk=<%=v.getMpk()%>"><%=v.getMpk() %></a></th> 
		<td><%=v.getName() %></td>
	</tr>
	<%
		}
	%>
</table>
<%
	}
%>
</body>
</html>


1. 번호를 누르면
2. NewFile5.jsp로 이동
3. NewFile5.jsp 에서는
         번호에 해당하는 Member 정보를 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.vo.MemberVO"%>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO"/>
<jsp:useBean id="mVO" class="model.vo.MemberVO"/>
<jsp:setProperty property="*" name="mVO"/>
<%
	MemberVO data=mDAO.selectOne(mVO);
	if(data==null){		
		response.sendRedirect("NewFile4.jsp");
	}
	else{
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>연습용</title>
</head>
<body>
<h1><%=data.getName() %> 데이터 정보</h1>
<hr>
<form action="NewFile6.jsp" method="post">
<table border="1">
	<tr>
		<th>번 호</th><th>이 름</th><th>점 수</th>
	</tr>
	<tr>
		<th><input type="number" name="mpk" value="<%=data.getMpk() %>" required readonly></th> 
		<td><input type="text" name="name" value="<%=data.getName() %>" required></td>
		<td><input type="number" name="score" value="<%=data.getScore() %>" required></td>
	</tr>
	<tr>
		<td colspan="3" align="right">
			<input type="submit" value="데이터 변경">&nbsp;
			<input type="button" id="btn" onclick="del(<%=mVO.getMpk()%>);" value="삭제">
		</td>
	</tr>
</table>
<%
	}
%>
<script type="text/javascript">
	function del(mpk){
		if(confirm("정말 삭제하시겠습니까?")){
			location.href="NewFile7.jsp?mpk="+mpk;
		}
		else{
			return false;
		}
	}
	
</script>
</form>
</body>
</html>


==============================
4. 데이터 정보를 변경
         controller에 해당하는
         NewFile6.jsp 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>

<jsp:useBean id="mVO" class="model.vo.MemberVO"/>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO"/>
<jsp:setProperty property="*" name="mVO"/>
<%
	if(mDAO.update(mVO)){
	%>
	<script type="text/javascript">
		alert('<%=mVO.getMpk()%>번 데이터 변경 완료!');
		location.href='NewFile4.jsp';
	</script>
	<%	
	}else{
		%>
		<script type="text/javascript">
		alert('<%=mVO.getMpk()%>번 데이터 변경 실패...');
		location.href='NewFile4.jsp';
		</script>
		<%
	}
%>


--------------------------------
5. 데이터 삭제
         controller에 해당하는
         NewFile7.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="mVO" class="model.vo.MemberVO"/>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO"/>
<jsp:setProperty property="*" name="mVO"/>

<%
	
	if(mDAO.delete(mVO)){
		%>
		<script type="text/javascript">
			alert('<%=mVO.getMpk()%>번 데이터 삭제 완료!');
			location.href='NewFile4.jsp';
		</script>
		<%
	} else{
		%>
		<script type="text/javascript">
			alert('<%=mVO.getMpk()%>번 데이터 삭제 실패...');
			location.href='NewFile4.jsp';
		</script>
		<%
	}
%>


--------------------------------------------
MEMBER 테이블
 ID
 PW
 이름
 계정등급

SELECT * FROM USER_TABLES;

CREATE TABLE MEMBER(
	MID VARCHAR(20) PRIMARY KEY,
	MPW VARCHAR(20) NOT NULL,
	MNAME VARCHAR(20) NOT NULL,
	ROLE VARCHAR(20) NOT NULL
);

INSERT INTO MEMBER VALUES('admin', '1234', '관리자', 'ADMIN');

SELECT * FROM MEMBER;



BOARD 테이블
 BID
 제목
 내용
 작성자

CREATE TABLE BOARD(
	BID INT PRIMARY KEY, -- MYSQL : AUTO_INCREMENT
	TITLE VARCHAR(20) NOT NULL,
	CONTENT VARCHAR(50) NOT NULL,
	WRITER VARCHAR(20) NOT NULL -- MEMBER의 MID 들어가는 것이 효율적!
);
-- MEMBER의 MID 사용 : 외래키는 상대 테이블의 PK 사용

-- 추가해볼만한 칼럼(차례로 해놓으면 좋은 것)
--   1. 작성일 : 날짜 타입(날짜 타입을 다룰 수 있어요 라고 픽업)
--   2. 좋아요 수 : 테이블의 관계, 이퀄조인, 외래키(잘 다룰 수 있다고 어필 가능)
--   3. 조회수 : scope 이슈/ 로직(잘 다룰 수 있다고 어필)

INSERT INTO BOARD VALUES((SELECT NVL(MAX(BID),0)+1 FROM BOARD), '제목', '내용', 'admin');

 



<form action="controller.jsp?action=insert" method="post">
// 동네방네 작성했다고 자랑질 중 = 공개
<input type="hidden" name="action" value="insert">
// 일반적으로 히든 많이 쓰임 = 숨김

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>작성페이지</title>
</head>
<body>

<form action="controller.jsp" method="post">
	<input type="hidden" name="action" value="insert">
	<table border ="1">
		<tr>
			<td>제목</td>
			<td><input type="text" name="title" required></td>
		</tr>
		<tr>
			<td>내용</td>
			<td><input type="text" name="content" required></td>
		</tr>
		<tr>
			<td>작성자</td>
			<td><input type="text" name="writer" required></td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="글 작성하기">
			</td>
		</tr>
	</table>
</form>
<hr>
<a href="controller.jsp?action=main">메인으로 돌아가기</a>

</body>
</html>




메인에서
controller 코드가 숨겨져 있는 것인 줄 모르고
hidden된 액션 값을 controller에서 수행해야함

2. 메인에서 controller 분리
datas 요청하는 아이
원하는 것 잘 만들어서 보내줌 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="error/error.jsp" import="java.util.ArrayList, model.vo.BoardVO" %>

<%request.setCharacterEncoding("UTF-8");%>
<jsp:useBean id="bDAO" class="model.dao.BoardDAO"/>
<jsp:useBean id="bVO" class="model.vo.BoardVO"/>
<jsp:setProperty property="*" name="bVO"/>
<%
	// 어떤 요청을 받았는지 파악
	// -> 해당 요청을 수행하는 것이 controller 페이지의 핵심
	
	String action=request.getParameter("action");
	System.out.println("로그 : "+action);
	
	if(action.equals("main")){	
		ArrayList<BoardVO> datas=bDAO.selectAll(bVO);
		request.setAttribute("datas", datas);
		// session 단위로 유지해도 되지 않나요? 
		// 라고 하기엔 매번 db에 있는 데이터를 불러오는 것이 효율적
		pageContext.forward("main1.jsp"); // forwawrd 액션
		// 전달할 정보가 있기 때문에 forward 사용
	}	
	else if(action.equals("insert")){
		if(bDAO.insert(bVO)){
			response.sendRedirect("controller.jsp?action=main");
		}
		else{
			throw new Exception("insert 오류");
		}
	}
	else if(action.equals("titlesearch")){
		ArrayList<BoardVO> datas=bDAO.selectTitle(bVO);
		request.setAttribute("datas", datas);
		pageContext.forward("form1.jsp"); 
	}
	else if(action.equals("writersearch")){
		ArrayList<BoardVO> datas=bDAO.selectWriter(bVO);
		request.setAttribute("datas", datas);
		pageContext.forward("form1.jsp"); 
	}
	else{
		out.println("<script>alert('action 파라미터 값이 올바르지 않습니다...');location.href='controller.jsp?action=main'</script>");
	}
%>



1, sql, images, error,..
           별도의 폴더로 관리
           리소스를 관리
2. 표지페이지 index.jsp 
          >> 앞으로 시작을 이렇게 할 예정
          main.jsp의 datas 등을 위해서는 Controller 방문이 필수이기 때문!

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 표지페이지 -->
<!-- 앞으로 main.jsp에서 datas를 출력하려면 C를 방문해야하기 때문! -->
<jsp:forward page="controller.jsp?action=main"/>
<%
	// pageContext.forward("controller.jsp?action=main");
%>


3. Model, View, Controller 분명히 나눌 것
4. hidden으로 정보를 보냄
5. Controller에서는 action 파라미터를 통해 어떤 요청인지 파악
6. 에러 페이지를 쓰려면 '에러페이지를 설정'해주어야 함
7. 로깅 처리


1. 메인페이지


2. 작성페이지
-----------------
복습 다하면, 추가로

+) 검색페이지 만들어보기
    이름, 제목 등으로 검색할 수 있는 form
    selectAll() 메서드 로직 변경
    C의 로직 코드 변경

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.vo.BoardVO,java.util.ArrayList"%>
<jsp:useBean id="datas" class="java.util.ArrayList" scope="request"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지-2</title>
</head>
<body>
<table border="1">
	<tr>
		<th>번 호</th><th>제 목</th><th>작성자</th>
	</tr>
	<%
		for(BoardVO v : (ArrayList<BoardVO>)datas){
	%>
	<tr>
		<th><%=v.getBid() %></th>
		<th><%=v.getTitle() %></th>
		<th><%=v.getWriter() %></th>
	</tr>
	<%
		}
%>
</table>
<hr>
<a href="form.jsp">새로운 글 작성</a>
<a href="form1.jsp">검색 페이지</a>
</body>
</html>

 

package model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import model.util.JDBCUtil;
import model.vo.BoardVO;

public class BoardDAO {
	Connection conn;
	PreparedStatement pstmt;
	final String sql_selectOne="SELECT * FROM BOARD WHERE BID=?";
	final String sql_selectAll="SELECT * FROM BOARD ORDER BY BID DESC";
	final String sql_insert="INSERT INTO BOARD VALUES((SELECT NVL(MAX(BID),0)+1 FROM BOARD),?,?,?)";
	            // INSERT INTO BOARD () VALUES(?,?,?)
	final String sql_update="UPDATE BOARD SET TITLE=?,CONTENT=? WHERE BID=?";
	final String sql_delete="DELETE FROM BOARD WHERE BID=?";
	final String sql_selectWriter="SELECT * FROM BOARD WHERE WRITER=? ORDER BY BID DESC";
	final String sql_selectTitle="SELECT * FROM BOARD WHERE TITLE=? ORDER BY BID DESC";
	public BoardVO selectOne(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectOne);
			pstmt.setInt(1, vo.getBid());
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()) {
				BoardVO data=new BoardVO();
				data.setBid(rs.getInt("BID"));
				data.setContent(rs.getString("CONTENT"));
				data.setTitle(rs.getString("TITLE"));
				data.setWriter(rs.getString("WRITER"));
				return data;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}		
		return null;
	}
	public ArrayList<BoardVO> selectAll(BoardVO vo){
		ArrayList<BoardVO> datas=new ArrayList<BoardVO>();
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectAll);
			ResultSet rs=pstmt.executeQuery();
			while(rs.next()) {
				BoardVO data=new BoardVO();
				data.setBid(rs.getInt("BID"));
				data.setContent(rs.getString("CONTENT"));
				data.setTitle(rs.getString("TITLE"));
				data.setWriter(rs.getString("WRITER"));
				datas.add(data);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}		
		return datas;
	}
	public ArrayList<BoardVO> selectWriter(BoardVO vo){
		ArrayList<BoardVO> datas=new ArrayList<BoardVO>();
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectWriter);
			pstmt.setString(1, vo.getWriter());
			ResultSet rs=pstmt.executeQuery();
			while(rs.next()) {
				BoardVO data=new BoardVO();
				data.setBid(rs.getInt("BID"));
				data.setContent(rs.getString("CONTENT"));
				data.setTitle(rs.getString("TITLE"));
				data.setWriter(rs.getString("WRITER"));
				datas.add(data);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}		
		return datas;
	}
	public ArrayList<BoardVO> selectTitle(BoardVO vo){
		ArrayList<BoardVO> datas=new ArrayList<BoardVO>();
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectTitle);
			pstmt.setString(1, vo.getTitle());
			ResultSet rs=pstmt.executeQuery();
			while(rs.next()) {
				BoardVO data=new BoardVO();
				data.setBid(rs.getInt("BID"));
				data.setContent(rs.getString("CONTENT"));
				data.setTitle(rs.getString("TITLE"));
				data.setWriter(rs.getString("WRITER"));
				datas.add(data);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}		
		return datas;
	}
	public boolean insert(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_insert);
			pstmt.setString(1, vo.getTitle());
			pstmt.setString(2, vo.getContent());
			pstmt.setString(3, vo.getWriter());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public boolean update(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_update);
			pstmt.setString(1, vo.getTitle());
			pstmt.setString(2, vo.getContent());
			pstmt.setInt(3,vo.getBid());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public boolean delete(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_delete);
			pstmt.setInt(1,vo.getBid());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.vo.BoardVO,java.util.ArrayList"%>
<jsp:useBean id="datas" class="java.util.ArrayList" scope="request"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>작성페이지-2(검색 페이지)</title>
</head>
<body>

<form action="controller.jsp" method="post">
	<input type="hidden" name=action value="titlesearch">

	<table border="1">
		<tr>
			<td>제목으로 검색하기</td>
			<td><input type="text" name="title" required></td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="제목 검색">
			</td>
		</tr>
	</table>
</form>
<form action="controller.jsp" method="post">
	<input type="hidden" name=action value="writersearch">

	<table border="1">
		<tr>
			<td>작성자로 검색하기</td>
			<td><input type="text" name="writer" required></td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="작성자 검색">
			</td>
		</tr>
	</table>
</form>
<hr>
<table border="2">
<%
	for(BoardVO v : (ArrayList<BoardVO>)datas){
		if(datas==null){
	
		}
		else{
%>
	<tr>
		<th>번 호</th><th>제 목</th><th>작성자</th>
	</tr>
	<tr>
		<th><a href="board.jsp"><%=v.getBid() %></a></th>
		<td><%=v.getTitle() %></td>
		<td><%=v.getWriter() %></td>
	</tr>
<%
		}
	}
%>
</table>
<hr>
<a href="controller.jsp?action=main">메인으로 돌아가기</a>

</body>
</html>



++) 로그인 페이지 만들어보기
    로그인해서 main.jsp로 들어올 수 있도록 구성