방명록 작성, JSP

문이빈·2023년 8월 31일
0

---------------guestbookWriteForm.html---------------

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
#guestbookForm div {
	color: red;
	font-size: 9pt;
	font-weight: bold;
}
</style>
</head>
<body>
<form name="guestbookForm" id="guestbookForm" method="post" action="/guestbookServlet/write">
<table border="1" cellpadding="5" cellspacing="0">
	<tr>
		<th width="100">이름</th>
        <td>
        	<input type="text" name="name" id="name" size="20" 
            	   maxlehgth="5" placeholder="작성자 입력">
		</td>
	</tr>
	<tr>
		<th>이메일</th>
		<td>
        	<input type="email" name="email" id="email" size="30" placeholder="이메일 입력">
		</td>
	</tr>
	<tr>
		<th>홈페이지</th>
		<td>
        	<input type="url" name="homepage" id="url" size="40" value="http://">
		</td>
	</tr>
	<tr>
		<th>제목</th>
    	<td>
        	<input type="text" name="subject" id="subject" size="50" placeholder="제목 입력">
            <div id="subjectDiv"></div>
        </td>
	</tr>
	<tr>
		<th>내용</th>
    	<td>
        	<textarea name="content" id="content" rows="15" cols="50"></textarea>
            <div id="contentDiv"></div>
        </td>
	</tr>
	<tr>
    	<td colspan="2" align="center">
			<input type="button" value="글작성" id="writeBtn">
        	<input type="reset" value="다시작성">
        	<input type="button" value="글목록" 
            	   onclick="location.href='/guestbookServlet/list?pg=1'"/>
       	</td>
	</tr>
</table>
</form>

<!-- jQuery 라이브러리 추가 -->
<script type="text/javascript" src="http://code.jquery.com/jquery-3.7.0.min.js"></script>

<!-- jQuery 라이브러리 추가 -->
<script>
$('#writeBtn').click(function(){
	$('#subjectDiv').text('');
	$('#contentDiv').empty();
	
	if($('#subject').val() == '') 
		$('#subjectDiv').text('제목 입력'); 
	else if($('#content').val() == '') 
		$('#contentDiv').text('내용 입력');
	else 
		$('#guestbookForm').submit();
	
});
</script>
</body>
</html>

---------------GuestbookWriteServlet.java---------------
이 서블릿은 방명록 글을 데이터베이스에 저장하는 역할을 합니다. 
사용자가 작성한 글의 정보를 받아와서 데이터베이스에 저장한 후, 등록 성공 메시지를 출력합니다.

package guestbook.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import guestbook.bean.GuestbookDTO;
import guestbook.dao.GuestbookDAO;

@WebServlet("/write")
public class GuestbookWriteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    	throws ServletException, IOException {
        
		// 데이터 수신 및 인코딩 설정
		request.setCharacterEncoding("UTF-8"); //post일 경우
		
        // 입력한 데이터 받아오기
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		String homepage = request.getParameter("homepage");
		String subject = request.getParameter("subject");
		String content = request.getParameter("content");
		
        // DTO 객체 생성 및 데이터 설정
		GuestbookDTO guestbookDTO = new GuestbookDTO();
        
		guestbookDTO.setName(name);
		guestbookDTO.setEmail(email);
		guestbookDTO.setHomepage(homepage);
		guestbookDTO.setSubject(subject);
		guestbookDTO.setContent(content);
		
		// DAO를 통해 데이터베이스에 저장
		GuestbookDAO guestbookDAO = new GuestbookDAO();
		guestbookDAO.write(guestbookDTO);
		
		// 응답 설정
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter(); 
		out.println("<html>");
		out.println("<body>");
		out.println("<h3>작성하신 글을 등록하였습니다.</h3>");
		out.println("<br/><br/>");
		out.println("<input type='button' value='글목록' 
       				 onclick=location.href='/guestbookServlet/list?pg=1'>");
		out.println("</body>");
		out.println("</html>");
	}

}

---------------GuestbookDTO.servlet---------------
이 클래스는 방명록 글 정보를 담는 데이터 객체입니다. 
각 글의 정보(이름, 이메일, 홈페이지, 제목, 내용 등)를 멤버 변수로 가지고 있습니다.

package guestbook.bean;

import java.util.Date;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class GuestbookDTO {
	private int seq;
	private String name;
	private String email;
	private String homepage;
	private String subject;
	private String content;
	private Date logtime;
	
}

---------------GuestbookDAO.servlet---------------
이 클래스는 데이터베이스와 관련된 작업을 수행합니다. 
각 메서드에서는 데이터베이스와의 상호 작용을 처리하고 필요한 자원을 해제하는 일련의 과정을 수행합니다. 
이러한 기능들을 통해 데이터베이스와의 효율적인 상호 작용을 도와주는 중요한 역할을 수행합니다.

write 메서드는 방명록 글을 데이터베이스에 저장하는 역할을 합니다. 
getAllList 메서드는 페이지별로 글 목록을 가져오는 기능을 제공하며,
getTotalA 메서드는 전체 글의 개수를 반환하여 
페이지네이션( 웹 페이지에서 많은 양의 데이터를 여러 개의 페이지로 나누어 표시하는 기술 
			ex.검색 결과, 게시판 글 목록, 상품 목록 등 )
을 위한 정보를 제공합니다.


package guestbook.dao;

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

import guestbook.bean.GuestbookDTO;


// 생성자와 DB 연결 설정
public class GuestbookDAO {
	private String driver = "oracle.jdbc.driver.OracleDriver";
	private String url = "jdbc:oracle:thin:@localhost:1521:xe";
	private String username = "c##java";
	private String password = "1234";
	
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	public GuestbookDAO() {
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public void getConnection() {
		try {
			conn = DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
    
    
// 글 작성 처리 메서드 (write)
	public void write(GuestbookDTO guestbookDTO) {
//String sql = "insert into guestbook values(seq_guestbook.nextval, ?, ?, ?, ?, ?, sysdate)";
		String sql = "insert into guestbook(seq, name, email, homepage, subject, content) 
        			  values(seq_guestbook.nextval, ?, ?, ?, ?, ?)";
		
		getConnection(); // 데이터베이스 연결
		
		try {
			pstmt = conn.prepareStatement(sql); // 생성
			
			// ? 에 데이터 대입
			pstmt.setString(1, guestbookDTO.getName());
			pstmt.setString(2, guestbookDTO.getEmail());
			pstmt.setString(3, guestbookDTO.getHomepage());
			pstmt.setString(4, guestbookDTO.getSubject());
			pstmt.setString(5, guestbookDTO.getContent());
			
			pstmt.executeUpdate(); // SQL실행 - 개수 리턴
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
    
// 글 목록 조회 메서드 (getAllList)
getAllList 메서드는 페이지별로 글 목록을 가져오는 역할을 합니다. 
페이지 번호에 따라 SQL을 실행하고, 조회된 결과를 GuestbookDTO 객체로 만들어 리스트에 추가합니다.

	public List<GuestbookDTO> getAllList(int startNum, int endNum) {
		List<GuestbookDTO> list = new ArrayList<GuestbookDTO>();
		String sql = "select * from "
				   + "(select rownum rn, tt.* from "
				   + "(select * from guestbook order by seq desc)tt "
				   + ") where rn>=? and rn<=?";
		getConnection(); // 데이터베이스 연결
		
		try {
			pstmt = conn.prepareStatement(sql); // 생성
			
			//?에 데이터 대입
			pstmt.setInt(1, startNum);
			pstmt.setInt(2, endNum);
			
			rs = pstmt.executeQuery(); // SQL실행
			
			while(rs.next()) {
				GuestbookDTO guestbookDTO = new GuestbookDTO();
                
                // ResultSet에서 데이터를 가져와서 DTO에 설정
				guestbookDTO.setSeq(rs.getInt("seq"));
				guestbookDTO.setName(rs.getString("name"));
				guestbookDTO.setEmail(rs.getString("email"));
				guestbookDTO.setHomepage(rs.getString("homepage"));
				guestbookDTO.setSubject(rs.getString("subject"));
				guestbookDTO.setContent(rs.getString("content"));
				guestbookDTO.setLogtime(rs.getDate("logtime"));
				
				list.add(guestbookDTO);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			list = null;
		} finally {
			try {
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return list;
	}
// 전체 글 개수 조회 메서드 (getTotalA)
getTotalA 메서드는 전체 글의 개수를 조회하여 페이지네이션을 위한 정보를 제공합니다.

	public int getTotalA() {
		int totalA = 0;
		String sql = "select count(*) from guestbook";
		getConnection(); // 데이터베이스 연결
		
		try {
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery(); // SQL 실행
			
			rs.next();
			totalA = rs.getInt(1); // 결과 처리
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return totalA;
	}
}

---------------GuestbookListServlet.servlet---------------

package guestbook.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import guestbook.bean.GuestbookDTO;
import guestbook.dao.GuestbookDAO;

@WebServlet("/list")
public class GuestbookListServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
                
		//데이터
		int pg = Integer.parseInt(request.getParameter("pg"));
		
		int endNum = pg*3;
		int startNum = endNum-2;
		
		//DB
		GuestbookDAO guestbookDAO = new GuestbookDAO();
		List<GuestbookDTO> list = guestbookDAO.getAllList(startNum, endNum);
		
		//페이징 처러
		int totalA = guestbookDAO.getTotalA(); 		// 총글수
		int totalP = (totalA-1)/3+1; 				//총페이지수, int totalP = (총글수+2)/3;
			
		//응답
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		
		out.println("<head>");
		out.println("<style>");
		out.println("#currentPaging { color: red; text-decoration: underline; }");
		out.println("#paging { color: black; text-decoration: none; }");
		out.println("</style>");
		out.println("</head>");
				
		out.println("<body>");
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");

		if(list != null) {
			for(GuestbookDTO guestbookDTO : list) {
				out.println("<table border='1' align='center'>");
				out.println("<tr>");
				out.println("<td width='100' align = 'center'>작성자</td>");
				out.println("<td width='150' align = 'center'>" + guestbookDTO.getName()
                			+ "</td>");
				out.println("<td width='100' align = 'center'>날짜</td>");
				out.println("<td width='150' align = 'center'>" 
                			+ sdf.format(guestbookDTO.getLogtime()) + "</td>");
				out.println("</tr>");
				
				out.println("<tr>");
				out.println("<td align = 'center'>이메일</td>");
				out.println("<td colspan='3' align='center'>" + guestbookDTO.getEmail() 
                			+ "</td>");
				out.println("</tr>");
				
				out.println("<tr>");
				out.println("<td align = 'center'>홈페이지</td>");
				out.println("<td colspan='3' align='center'>" + guestbookDTO.getHomepage()
                			+ "</td>");
				out.println("</tr>");
				
				out.println("<tr>");
				out.println("<td align = 'center'>제목</td>");
				out.println("<td colspan='3' align='center'>" + guestbookDTO.getSubject()
                			+ "</td>");
				out.println("</tr>");
				
				out.println("<tr>");
				out.println("<td colspan='4'><pre>" + guestbookDTO.getContent() + "</pre></td>");
				out.println("</tr>");
				out.println("</table>");
				
				out.println("<hr>");
			}//for
			
			//페이징 처리
			 out.println("<div>");
	         out.println("<div style='width: 500px; margin: auto;'>");
	         for(int i=1; i<=totalP; i++) {
	            if(i == pg)
	               out.println("<a href='/guestbookServlet/list?pg=" + i + 
                   			   "' id='currentPaging'>" + i + "</a>");
	            else
	               out.println("<a href='/guestbookServlet/list?pg=" + i +
                   			   "' id='paging'>" + i + "</a>");
	         }//for

		}//if
		
		out.println("</body>");
		out.println("</html>");
		
		
	}

}

---------------Guestbook.sql---------------

[테이블]
create table guestbook(
seq number primary key, -- 시퀀스 객체로부터 값을 얻어온다
name varchar2(30),
email varchar2(30),
homepage varchar2(35),
subject varchar2(500) not null,
content varchar2(4000) not null,
logtime date default sysdate);

[시퀀스]
create sequence seq_guestbook nocycle nocache;

JSP(Java Server Page)

: 웹에서 실행하는 프로그램
: java in HTML

  1. 선언문
    <%! 전역변수 or 메소드 - 1번 처리 %> = init( )

  2. 스크립트릿 (scriptlet)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%!
// 전역변수, 1번 수행(딱 1번 수행하고 끝남)
String name = "홍길동";
int age = 25;
%>

<%
// 지역변수, 요청 시 마다 처리 된다.
age++;
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello JSP!! <br>

안녕하세요 JSP!! <br>

나의 이름은 <%= name %>이고 내 나이는 <%= age %>살 입니다.<br>

<%out.println("나의 이름은 " + name + "이고 내 나이는 " + age +"살 입니다.");%>
</body>
</html>

새로 고침할 때 마다(요청할 때 마다) 지역변수 age++로 나이가 1살씩 올라감 (지역변수만 요청됨)

컴파일이 되면 톰캣서버가 껏다가 켜진다. (JSP는 자동으로 다 처리함)


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<% for(int i=1; i<10; i++){ %>
	<tr>
	<% for(int j=2; j<10; j++){ %>
		<td><%=j%> * <%=i%> = <%=j*i%></td>
		<%}%>
		</tr>
	<%}%>
</table>
</body>
</html>


----------input.jsp----------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="sum.jsp">
<table>
	<tr>
		<td width="30" align="center">X </td>
		<td><input type="text" name="x"></td>
	</tr>
	
	<tr>
		<td align="center">Y </td>
		<td><input type="text" name="y"></td>
	</tr> 
	<tr >
		<td colspan="2" align="center">
			<input type="submit"value="계산" >
			<input value="취소" type="reset">
		</td>
	</tr> 
</table>
</form>
</body>
</html>

----------sum.jsp----------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
// 데이터
int x = Integer.parseInt(request.getParameter("x"));
int y = Integer.parseInt(request.getParameter("y"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="mul.jsp">

<input type="text" name="x" value="<%= x %>">
<input type="text" name="y" value="<%= y %>">

<%= x %> + <%= y %> = <%= x+y %> <br><br>

<input value="곱 구하기-button" type="button" 
	   onclick="location.href='mul.jsp?x=<%= x %>&y=<%= y %>'"> 
<input type="submit" value="곱 구하기-submit">
<!-- 
버튼은 변수 안가지고 감 해결방법 -> (location.href='mul.jsp?변수=값&변수=값)

submit은 form태그가 있어야 하고 action을 타고 감
위 둘중에 한개 input만 사용해도 작동함
-->
</form>
</body>
</html>

----------mul.jsp----------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
// 데이터
int x = Integer.parseInt(request.getParameter("x"));
int y = Integer.parseInt(request.getParameter("y"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%= x %> * <%= y %> = <%= x*y %> <br>
</body>
</html>

버튼은 변수 안가지고 감 해결방법
->location.href='mul.jsp?변수=값&변수=값
= "location.href='mul.jsp?x=<%= x %>&y=<%= y %>'"
submit은 form태그가 있어야 하고 action을 타고 감

위 둘중에 한개 input만 사용해도 작동함

<input type="hidden"~~~>으로 박스를 안보이게 만들어 주기


만들어 보기

----------personInput.jsp----------
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="personResult.jsp">
	<table border="1">
		<tr>
			<td>이름</td>
			<td><input type="text" name="name"></td>
		</tr>
		
		<tr>
			<td>성별</td>
			<td>
				<input type="radio" name="gender" value="남자">남자
				<input type="radio" name="gender" value="여자">여자
			</td>
		</tr>
		
		<tr>
			<td>색깔</td>
			<td>
				<select name="color">
					<option value="red">빨강</option>
					<option value="yellow">노랑</option>
					<option value="green">초록</option>
					<option value="blue">파랑</option>
				</select>
			</td>
		</tr>
		
		<tr>
			<td>취미</td>
			<td>
				<input name="hobby" type="checkbox" value="독서">독서
				<input name="hobby" type="checkbox" value="영화">영화
				<input name="hobby" type="checkbox" value="음악">음악
				<input name="hobby" type="checkbox" value="게임">게임
				<input name="hobby" type="checkbox" value="쇼핑">쇼핑
			</td>
		</tr>
		
		<tr>
			<td>과목</td>
			<td>
				<select name="subject" size="6" multiple>
					<option value="java">java</option>
					<option value="Servlet">Servlet</option>
					<option value="JSP">JSP</option>
					<option value="SPRING">SPRING</option>
				</select>
			</td>
		</tr>
		
		<tr >
			<td colspan="2" align="center">
				<input type="submit" value="SEND">
				<input type="reset" value="CANCEL">
			</td>
		</tr>
		
	</table>
</form>
</body>
</html>

----------personResult.jsp----------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
// 데이터
String name = request.getParameter(name="name");
String gender = request.getParameter("gender");
String color = request.getParameter("color");

String[] hobby = request.getParameterValues("hobby");
String[] subject = request.getParameterValues("subject");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>신상 명세서</h1>
● 이름 : <%=name %><br>
● 성별 : <%=gender %><br>
● 색깔 : <%=color %><br>
● 취미 : <%for(String data: hobby){out.println(data);} %><br>
● 과목 : <%for(String data: subject){out.println(data);} %>
</body>
</html>

0개의 댓글