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("", "&nbsp;");
			content=content.replace(" ", "&nbsp;").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("", "&nbsp;");  / content=content.replace(" ", "&nbsp;").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");
%>