Language/JSP
게시판 만들기(DTO DAO 적용전)
보라색츄르
2021. 5. 24. 10:06
1. SQL 테이블 및 데이터생성
create table board(
num number primary key,
writer varchar2(20),
title varchar2(60),
content varchar2(4000),
regtime varchar2(20),
hits int
);
create sequence board_seq
start with 1
increment by 1
;
commit;
2. jsp 파일 만들기
구분 | 파일명 | 역할 |
직접 화면에 출력하는 프로그램 |
list.jsp | 등록된 글들의 리스트를 보여줌 |
view.jsp | 하나의 글 내용을 보여줌 | |
write.jsp | 글쓰기 또는 수정 양식 | |
독자적인 화면 출력이 없는 프로그램 |
insert.jsp | write.jsp에서 입력된 글을 데이터베이스에 추가 |
update.jsp | write.jsp에 입력된 글을 데이터베이스에 업데이트 | |
delete.jsp | 하나의 글을 데이터베이스에서 삭제 |
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 리스트 화면</title>
<style>
table{width: 680px; text-align: center;}
th{background-color:cyan;}
.num{width: 80px;}
.title{width: 230px;}
.writer{width: 100px;}
.regtime{width: 180px;}
a:link{text-decoration: none; color: blue;}
a:visited{text-decoration: none; color: gray;}
a:hover{text-decoration: none; color:red;}
</style>
</head>
<body>
<table>
<tr>
<th class="num">번호</th>
<th class="title">제목</th>
<th class="writer">작성자</th>
<th class="regtime">작성일시</th>
<th>조회수</th>
</tr>
<%
/**게시글 리스트 읽어오기**/
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:XE", "test", "1234");
String sql="select * from board order by num desc";
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
%>
<tr>
<td><%=rs.getInt("num")%></td>
<td style="text-align: left;"><a href="view.jsp?num=<%=rs.getInt("num")%>"><%=rs.getString("title") %> </a></td>
<td><%= rs.getString("writer")%></td>
<td><%= rs.getString("regtime")%></td>
<td><%= rs.getInt("hits")%></td>
</tr>
<%
}
}catch(ClassNotFoundException e){
System.err.println("게시글 리스트 접속 err:"+e.getMessage());
}catch(SQLException e){
System.err.println("게시글 리스트 읽어오기 err:"+e.getMessage());
}
%>
</table>
<br/>
<input type="button" value="글쓰기" onclick="location.href='write.jsp'"><!-- button클릭시 write.jsp 이동 -->
</body>
</html>
write.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%
//글번호 값 얻기, 주어지지 않았으면 0으로 설정
String tmp=request.getParameter("num");
int num=(tmp!=null&& tmp.length()>0)? Integer.parseInt(tmp):0;
//새글쓰기 모드를 가정하고 변수 초기값 설정
String writer="";
String title="";
String content="";
String action="insert.jsp";
//글 번호가주어졌으면, 글 수정 모드
if(num>0){
String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection(url, "test", "1234");
String sql="select * from board where num="+num;
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
if(rs.next()){
//읽어들인 글 데이터를 변수에저장
writer=rs.getString("writer");
title=rs.getString("title");
content=rs.getString("content");
//글 수정 모드일 때는 저장 버튼을 누르면 Update실행
action="update.jsp?num="+num;
}
}catch(ClassNotFoundException e){
System.out.print("dirver err:"+e.getMessage());
}catch(SQLException e){
System.out.print("select err:"+e.getMessage());
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기 화면</title>
<style>
table{width: 680px; text-align: center;}
th{width: 100px; background-color: cyan;}
input[type=text], textarea{width: 100%}
</style>
</head>
<body>
<form action="insert.jsp" method="post">
<table>
<tr>
<th>제목</th>
<td><input type="text" name="title" maxlength="80" value="<%=title%>" /></td>
</tr>
<tr>
<th>작성자</th>
<td><input type="text" name="writer" maxlength="20" value="<%=writer %>" /></td>
</tr>
<tr>
<th>내용</th>
<td><textarea name="content" rows="10" ><%=content %></textarea></td>
</tr>
</table>
<br/>
<input type="submit" value="저장"> <!-- submit버튼클릭시 insert.jsp이동-->
<input type="button" value="취소" onclick="history.back()"> <!--history.back():실행직전으로돌아가기 -->
</form>
</body>
</html>
view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%
//지정된 글 번호 얻기
int num=Integer.parseInt(request.getParameter("num"));
//게시글 데이터를 담을 변수 정의
String writer="";
String title="";
String content="";
String regtime="";
int hits=0;
//지정된 글 번호를 가진 레코드 읽기
String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection(url, "test", "1234");
String sql="select * from board where num="+num;
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(sql);
if(rs.next()){
//글 데이터를 변수에 저장
writer=rs.getString("writer");
title=rs.getString("title");
content=rs.getString("content");
regtime=rs.getString("regtime");
hits=rs.getInt("hits");
//글제목과 내용이 웹 페이지에 올바르게 출력되도록 공백과 줄 바꿈 처리
title=title.replace("", " ");
content=content.replace(" ", " ").replace("\n", "<br />");
//이 글의 조회수를 1 올림
stmt.executeUpdate("update board set hits=hits+1 where num="+num);
}
}catch(ClassNotFoundException e){
System.out.print("dirver err:"+e.getMessage());
}catch(SQLException e){
System.out.print("select err:"+e.getMessage());
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 내용 보기 화면</title>
<style>
table{ width: 680px; text-align: center;}
th{ width: 100px; background-color: cyan;}
td{ text-align: left; border: 1px solid gray;}
</style>
</head>
<body>
<table>
<tr>
<th>제목</th>
<td><%=title %></td>
</tr>
<tr>
<th>작성자</th>
<td><%=writer %></td>
</tr>
<tr>
<th>작성일자</th>
<td><%=regtime %></td>
</tr>
<tr>
<th>조회수</th>
<td><%=hits %></td>
</tr>
<tr>
<th>내용</th>
<td><%=content %></td>
</tr>
</table><br/>
<input type="button" value="목록보기" onclick="location.href='list.jsp'" >
<input type="button" value="수정" onclick="location.href='write.jsp?num=<%=num%>'">
<input type="button" value="삭제" onclick="location.href='delete.jsp?num=<%=num%>'">
</body>
</html>
- if(rs.next()) :
while이 아니라 if를 사용한 이유는 읽어 들일 레코드가 하나뿐이라 반복할 필요가 없기 때문이다.
- title=title.replace("", " "); / content=content.replace(" ", " ").replace("\n", "<br />"); :
<변경될문자열=문자열객체.replace(찾는문자열, 바꿀문자열)>;
replace() 메서드는 ''문자열 객체"에 담긴 문자열에서 "찾는문자열"을모두 찾아서 "바꿀문자열"로 바꾸어 준 문자열을 반환한다.
따라서 이 코드는 변수 title에 담긴 문자열에서 공백분자를 발견하면 이것을 모두 %nbsp;(띄어쓰기)로 바꾸어준 문자열을 만들고,
이것을 다시문자열 변수 title에 담아주는 역할을 하게 된다.
insert.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.time.*" %>
<%
request.setCharacterEncoding("UTF-8");
//양식에 입력되었던 값 읽기
String writer=request.getParameter("writer");
String title=request.getParameter("title");
String content=request.getParameter("content");
//빈 칸이 하나라도 있으면 오류 출력하고 종료
if(writer == null || writer.length() == 0 ||
title == null || title.length() == 0 ||
content == null || content.length() == 0){
%>
<script>
alert('모든 항목이 빈칸 없이 입력되어야 합니다.');
history.back();
</script>
<%
return;
}
//입력된 내용으로 새 글 레코드 추가
String Driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
String id="test";
String pwd="1234";
Connection conn=null;
PreparedStatement pstmt=null;
//현재시간 얻기
String curTime=LocalDate.now()+""+LocalTime.now().toString().substring(0,8);
try{
Class.forName(Driver);
conn=DriverManager.getConnection(url, id, pwd);
String sql="insert into board (num, writer, title, content, regtime, hits) values (board_seq.nextval,?,?,?,?,0)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, writer);
pstmt.setString(2, title);
pstmt.setString(3, content);
pstmt.setString(4, curTime);
pstmt.executeUpdate();
}catch(ClassNotFoundException e){
System.err.println("접속err:"+e.getMessage());
}catch(SQLException e){
System.err.println("insert err:"+e.getMessage());
}
//목록보기 화면으로 돌아감
response.sendRedirect("list.jsp");
%>
update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.time.*" %>
<%
request.setCharacterEncoding("UTF-8");
//전달받은 값 읽기
int num=Integer.parseInt(request.getParameter("num"));
String writer=request.getParameter("writer");
String title=request.getParameter("title");
String content=request.getParameter("content");
//빈칸이 하나라도 있으면 오류 출력하고 종료
if(writer ==null || writer.length()==0 ||
title == null || title.length() == 0||
content==null || content.length()==0){
%>
<script>
alert('모든 항목이 빈칸 없이입력되어야 합니다.');
history.back();
</script>
<%
return;
}
//입력된 내용으로 새 글 레코드 추가
String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
//현재시간 얻기
String curTime=LocalDate.now()+""+LocalTime.now().toString().substring(0,8);
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection(url, "test", "1234");
String sql="update board set writer=?, title=?, content=?, regtime=? where num=?";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1, writer);
pstmt.setString(2, title);
pstmt.setString(3, content);
pstmt.setString(4, curTime);
pstmt.setInt(5, num);
pstmt.executeUpdate();
}catch(ClassNotFoundException e){
System.err.println("접속err:"+e.getMessage());
}catch(SQLException e){
System.err.println("insert err:"+e.getMessage());
}
//글 보기 화면으로 돌아감
response.sendRedirect("view.jsp?num="+num);
%>
delete.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%
//지정된 글 번호 얻기
int num=Integer.parseInt(request.getParameter("num"));
//지정된 글 번호의 레코드를 db에서 삭제
String Driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
try{
Class.forName(Driver);
Connection conn=DriverManager.getConnection(url, "test", "1234");
String sql="delete from board where num="+num;
Statement stmt=conn.createStatement();
stmt.executeQuery(sql);
}catch(ClassNotFoundException e){
System.out.print("dirver err:"+e.getMessage());
}catch(SQLException e){
System.out.print("select err:"+e.getMessage());
}
response.sendRedirect("list.jsp");
%>