일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 파일질라설치
- 주석이 먹히지 않을 때
- selectedIndex
- toFixed()
- hide
- SUB함수
- FileZilla다운로드
- 1521
- Math.round()
- calc.minus
- Parent
- 증가값
- Excel
- 파일질라다운로드
- selectoptions
- is_check
- Math.ceil()
- calc.plus
- index %
- 소스트리인증실패
- FileZilla설치
- push오류
- slideUp
- excel중복체크
- 파일질라설치오류
- removeClass
- addClass
- Math.floor()
- ctrl+/
- Git
- Today
- Total
잡동사니에도 사랑을
[JSP] 방명록 만들기(2) 본문
[21.10.01] 방명록 만들기(2) - guestbookWriteForm.jsp / guestbookWrite.jsp / guestbookList.jsp / GuestbookDAO.java / GuestbookDTO.java / guestbook.js / web.xml / lombok.jar / ojdbc8.jar(guestbookJSP)
//////// guestbookWriteForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>방명록</title>
<style type="text/css">
div {
color: red;
font-size: 8pt;
font-weight: bold;
}
table {
border-collapse: collapse;
}
</style>
</head>
<body>
<h2>글쓰기</h2>
<form name="guestbookWriteForm" method="post" action="guestbookWrite.jsp">
<table border="1">
<tr>
<td width="100" align="center">작성자</td>
<td>
<input type="text" name="name" id="name" size="15">
</td>
</tr>
<tr>
<td width="100" align="center">이메일</td>
<td>
<input type="email" name="email" id="email">
</td>
</tr>
<tr>
<td width="100" align="center">홈페이지</td>
<td>
<input type="text" name="homepage" id="homepage" value="http://" size="35">
</td>
</tr>
<tr>
<td width="100" align="center">제목</td>
<td>
<input type="text" name="subject" id="subject" size="50">
<div id= "subjectDiv"></div>
</td>
</tr>
<tr>
<td width="100" align="center">내용</td>
<td>
<textarea name="content" id="content" cols="50" rows="15"></textarea>
<div id= "contentDiv"></div>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" value="글작성" onclick="checkGuestbookWrite()">
<input type="reset" value="다시작성">
<input type="button" value="글목록"
onclick="location.href='guestbookList.jsp?pg=1'">
</td>
</tr>
</table>
</form>
<script type="text/javascript" src="../js/guestbook.js"></script>
</body>
</html>
*주요 내용
<form name="guestbookWriteForm" method="post" action="guestbookWrite.jsp">
→ JavaScript을 이용한 유효성 검사 시 폼의 이름을 submit() 시켜준다.
→ "글작성" 버튼 클릭 시 onclick을 통해 checkGuestbookWrite()로 이동해 유효성 검사를 하고 페이지를 넘긴다.
/////////guestbook.js
function checkGuestbookWrite(){
document.getElementById("subjectDiv").innerText = ""
document.getElementById("contentDiv").innerText = ""
if(document.guestbookWriteForm.subject.value == "")
document.getElementById("subjectDiv").innerText = "제목을 입력해주세요";
else if(document.guestbookWriteForm.content.value == "")
document.getElementById("contentDiv").innerText = "내용을 입력해주세요";
else
document.guestbookWriteForm.submit();
}
////////guestbookWrite.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="guestbook.bean.GuestbookDTO"%>
<%@ page import="guestbook.dao.GuestbookDAO"%>
<%
//데이터
request.setCharacterEncoding("UTF-8");
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");
GuestbookDTO guestbookDTO = new GuestbookDTO();
guestbookDTO.setName(name);
guestbookDTO.setEmail(email);
guestbookDTO.setHomepage(homepage);
guestbookDTO.setSubject(subject);
guestbookDTO.setContent(content);
//DB
GuestbookDAO guestbookDAO = GuestbookDAO.getInstance();
guestbookDAO.write(guestbookDTO); //호출
//응답
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>작성하신 글을 저장하였습니다.</h3>
<br>
<input type="button" value="글목록"
onclick="location.href='guestbookList.jsp?pg=1'">
</body>
</html>
////////guestbookList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="guestbook.dao.GuestbookDAO" %>
<%@ page import="guestbook.bean.GuestbookDTO" %>
<%@ page import="java.util.List" %>
<%
//데이터
int pg = Integer.parseInt(request.getParameter("pg"));
//DB
//페이징 처리 - 1페이지당 3개씩
int endNum = pg*3;
int startNum = endNum-2;
GuestbookDAO guestbookDAO = GuestbookDAO.getInstance();
List<GuestbookDTO> list = guestbookDAO.getGuestbookList(startNum, endNum);
int totalA = guestbookDAO.getTotalA(); //총글수
int totalP = (totalA+2)/3;//페이지 번호
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
#currentPagingA{
color: red;
text-decoration: underline;
}
#pagingA {
color: black;
text-decoration: none;
}
</style>
</head>
<body>
<%if(list != null){ %>
<%for(GuestbookDTO guestbookDTO : list) { %>
<table border="1">
<tr>
<td width="100" align="center">작성자</td>
<td width="100" align="center"><%=guestbookDTO.getName() %></td>
<td width="100" align="center">작성일</td>
<td width="100" align="center"><%=guestbookDTO.getLogtime() %></td>
</tr>
<tr>
<td>이메일</td>
<td colspan="3" align="center"><%=guestbookDTO.getEmail() %></td>
</tr>
<tr>
<td>홈페이지</td>
<td colspan="3" align="center"><%=guestbookDTO.getHomepage() %></td>
</tr>
<tr>
<td>제목</td>
<td colspan="3" align="center"><%=guestbookDTO.getSubject() %></td>
</tr>
<tr>
<td colspan="4"><pre><%=guestbookDTO.getContent() %></pre></td>
</tr>
</table>
<hr width="450" align="left" color="red">
<%}//for %>
<div style="width: 450px; text-align: center;">
<%for(int i=1; i<=totalP; i++){ %>
<%if(i==pg) { %>
[<a href="guestbookList.jsp?pg=<%=i %>" id="currentPagingA"><%= i %></a>]
<%}else{ %>
[<a href="guestbookList.jsp?pg=<%=i %>" id="pagingA"><%= i %></a>]
<%} %>
<%}//for %>
</div>
<%}//if %>
</body>
</html>
////////guestbookDTO
package guestbook.bean;
import lombok.Data;
/*import lombok.Getter;
import lombok.Setter;*/
//@Getter
//@Setter
@Data
public class GuestbookDTO {
private int seq;
private String name;
private String email;
private String homepage;
private String subject;
private String content;
private String logtime;
}
////////guestbookDAO
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 javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import guestbook.bean.GuestbookDTO;
public class GuestbookDAO {
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
private DataSource ds;
private static GuestbookDAO instance = null;
public static GuestbookDAO getInstance() {
if (instance == null) {
synchronized (GuestbookDAO.class) {
instance = new GuestbookDAO();//생성
}
}
return instance;
}
public GuestbookDAO() {
try {
Context ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/oracle"); //Tomcat의 경우
} catch (NamingException e) {
e.printStackTrace();
}
}
public void write(GuestbookDTO guestbookDTO) {
String sql = "insert into guestbook values(seq_guestbook.nextval, ?, ?, ?, ?, ?, sysdate)";
try {
conn = ds.getConnection();
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();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public List<GuestbookDTO> getGuestbookList(int startNum, int endNum){
List<GuestbookDTO> list = new ArrayList<GuestbookDTO>();
String sql = "select *"
+ " from (select rownum rn, tt.*"
+ " from (select seq, name, email, homepage, subject, content,"
+ " to_char(logtime, 'YYYY.MM.DD') as logtime"
+ " from guestbook"
+ " order by seq desc) tt"
+ " )where rn>=? and rn<=?";
try {
conn = ds.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, startNum);
pstmt.setInt(2, endNum);
rs = pstmt.executeQuery();
while(rs.next()) {
GuestbookDTO guestbookDTO = new GuestbookDTO();
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.getString("logtime"));
list.add(guestbookDTO);
}//while
} 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;
}
public int getTotalA(){
int totalA=0;
String sql = "select count(*) from guestbook";
try {
conn = ds.getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();//실행
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;
}
}
/////////context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="guestbookJSP"
path="/guestbookJSP"
reloadable="true"
source="org.eclipse.jst.jee.server:guestbookJSP">
<Resource name="jdbc/oracle"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="c##java"
password="bit"
maxActive="20"
maxIdle="3"
removeAbandoned="true"/>
</Context>
*주요 내용
Context.xml 을 사용한 이유가 무엇일까??
그 이유를 알기 전 먼저 개념 하나를 이해하고 넘어갈 필요가 있는데, 바로 'Connection Pool'이다.
Connection Pool이란?
- 웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가 클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납 받아 pool에 저장하는 방식을 말한다. 김밥집에서 사장님이 김밥을 미리 싸놓고 손님이 오면 바로바로 주는 것과 같은 개념이라고 생각하면 이해가 빠를 것이다.
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
sql = "SELECT * FROM T_BOARD"
// 1. 드라이버 연결 DB 커넥션 객체를 얻음
connection = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);
// 2. 쿼리 수행을 위한 PreparedStatement 객체 생성
pstmt = conn.createStatement();
// 3. executeQuery: 쿼리 실행 후
// ResultSet: DB 레코드 ResultSet에 객체에 담김
rs = pstmt.executeQuery(sql);
} catch (Exception e) {
} finally {
conn.close();
pstmt.close();
rs.close();
}
}
다음은 기존에 자주 사용하던 자바에서 DB에 직접 연결해서 처리하는 방법(JDBC)이다. 이와 같은 방법을 쓸 경우 드라이버(Driver)를 로드하고 커넥션(connection) 객체를 받아와야 한다. 그러면 매번 사용자가 요청을 할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 매우 비효율적이다. 이런 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.
Context.xml은 바로 이 Connection Pool을 적용한 것이다. <context> 태그에 들어가는 내용은 Servers - server.xml에서 복사해오면 되는데, 반드시 복사 & 붙여넣기를 해서 넣어야 하며 직접 기입하는 것이 아니다.
/////////Database
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);
create sequence seq_guestbook nocycle nocache;
'JAVA_EE > JSP' 카테고리의 다른 글
[JSP] 게시판 만들기(1) - jQuery 유효성 검사, Connection Pool 사용, 페이징 처리 등 (0) | 2021.10.03 |
---|---|
[JSP] 방명록 만들기(1) (0) | 2021.10.01 |