열심히 끝까지
디바이스 융합 자바(Java) day41 - html 기본 정리,jsp의 VO,DAO,Controller 분리,두 개의 sql 연결 본문
디바이스 융합 자바(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="변경"> <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="데이터 변경">
<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로 들어올 수 있도록 구성