세션
: 웹서버쪽의 웹컨테이너에 상태를 유지하기 위한 정보가 저장 (눈에 안 보임)
: 세션은 기본 시간 1800초(30분)
: 각 클라이언트 고유 Session ID를 부여한다
Session ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스 제공
세션 생성
HttpSession session = request.getSession();
session.setMaxInactiveInterval(30*60); //초 단위
세션 부여
session.setAttribute("세션명“, ”값“)
세션 얻어오기
session.getAttribute("세션명“)
세션 삭제
session.removeAttribute("세션명“)
모든 세션 삭제 - 무효화
session.invalidate()
memberLogin.jsp
세션 생성
//세션
HttpSession session = request.getSession(); //세션 생성
세션은 내장객체로 제공하고 있기 때문에 생성안하고 사용해도 된다.
session.setAttribute("memName", name);
session.setAttribute("memId", id);
response.sendRedirect("loginOk.jsp");
loginOk.jsp
세션 얻어오기
String name = null;
String id = null;
//세션
name = session.getAttribute("memName");
//세션
name = (String)session.getAttribute("memName");
id = (String)session.getAttribute("memId");
memberLogout.jsp
세션 제거
//세션
session.removeAttribute("memName");
session.removeAttribute("memId");
한 번에 지우고싶으면 밑에처럼 해도된다.
session.invalidate();
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script type="text/javascript">
window.onload = function(){
alert("로그아웃되었습니다.");
location.href = '../index.jsp';
}
</script>
</body>
</html>
index.jsp
<body>
<h2>메인화면</h2>
<div class="nav-bar">
<% if(session.getAttribute("memId") == null){ %>
<h3><a href="./member/memberWriteForm.jsp">회원가입</a></h3>
<h3><a href="./member/memberLoginForm.jsp">로그인</a></h3>
<% } else { %>
<h3><a href="./member/memberLogout.jsp">로그아웃</a></h3>
<h3><a href="">글쓰기</a></h3>
<% } %>
<h3><a href="">목록</a></h3>
</div>
</body>
</html>
처음에 로그인 하기 전에는 로그아웃 버튼이 없는 것을 확인할 수 있음.
DB에 있는 아이디와 비밀번호를 입력하면
로그인하였습니다.라는 alert 창과 함께
메인화면에서 로그아웃으로 바뀌는 것을 확인할 수 있다.
그다음 로그아웃을 하게되면
다시 메인화면에서 로그인 버튼이 나오는 것을 확인할 수 있다.
membeLoginForm.jsp
로그인 성공했을 때 자동으로 index.jsp 페이지로 가게하기
<script type="text/javascript">
$('#loginBtn').click(function(event) {
event.preventDefault(); // 기본 제출 동작 방지
$('#idDiv').empty();
$('#pwdDiv').empty();
if ($('#id').val() == '') {
$('#idDiv').html('아이디를 입력하세요.');
} else if ($('#pwd').val() == '') {
$('#pwdDiv').html('비밀번호를 입력하세요.');
} else {
$.ajax({
type: 'POST',
url: 'memberLogin.jsp',
data: {
'id': $('#id').val(),
'pwd': $('#pwd').val()
},
dataType: 'text', // 서버로부터 순수한 텍스트만 받음
success: function(data) {
if (data.trim() === 'fail') {
alert("아이디 또는 비밀번호가 틀렸습니다.");
} else {
alert(data.trim() + "님이 로그인하였습니다.");
location.href = '../index.jsp'
}
},
error: function(e) {
console.log(e);
}
});
}
});
회원정보수정
index.jsp
: 회원정보수정 추가하기
<body>
<h2>메인화면</h2>
<div class="nav-bar">
<% if(session.getAttribute("memId") == null){ %>
<h3><a href="./member/memberWriteForm.jsp">회원가입</a></h3>
<h3><a href="./member/memberLoginForm.jsp">로그인</a></h3>
<% } else { %>
<h3><a href="./member/memberLogout.jsp">로그아웃</a></h3>
<h3><a href="./member/memberUpdateForm.jsp">회원정보수정</a></h3>
<h3><a href="">글쓰기</a></h3>
<% } %>
<h3><a href="">목록</a></h3>
</div>
</body>
회원정보수정은 로그인이 되어있는 상태에서만 떠야한다.
memberUpdateForm.jsp
회원가입 화면과 다른 점
모든정보가 미리 다 떠야한다.
밑에 버튼도 회원정보수정으로 바꾸면 된다.
클라이언트 쪽에서 Connection Pool에 못 들어감.
실행하자마자 자동으로 DateSource가 모든 커넥션 풀을 다 쥐고있다.
거래는 DatsSource와 클라이언트가 하는 것
거래가 끝나면 close하는 것
은행창고에 여직원이 출근에서 창고에서 돈을 받으면 손님과 거래를 한다.
context.xml에서 type: DataSource로부터 모든 커넥션 풀을 얻어와라 하는 것
DAO가 열리지마자 jdbc.oracle이라는 커넥션에서 모든 커넥션 풀을 ds가 쥐고있는 것
gender는 배열로 가져온다.
gender[0] = checked -- 남자
gender[1] = checked -- 여자
window.onload --> body 태그까지 다 읽은 다음 세팅하는 것
<script type="text/javascript">
window.onload = function(){
document.memberUpdateForm.gender[0].checked = true; // 남자로 세팅
document.memberUpdateForm.gender[1].checked = true; // 여자로 세팅
}
세션 id에 해당하는 데이터 값 받아오기
MemberDAO.java
public MemberDTO getMember(String id) {
MemberDTO memberDTO = null;
String sql = "select * from member where id=?";
try {
con = ds.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
memberDTO = new MemberDTO();
memberDTO.setName(rs.getString("name"));
memberDTO.setId(rs.getString("id"));
memberDTO.setPwd(rs.getString("pwd"));
memberDTO.setGender(rs.getString("gender"));
memberDTO.setEmail1(rs.getString("email1"));
memberDTO.setEmail2(rs.getString("email2"));
memberDTO.setTel1(rs.getString("tel1"));
memberDTO.setTel2(rs.getString("tel2"));
memberDTO.setTel3(rs.getString("tel3"));
memberDTO.setZipcode(rs.getString("zipcode"));
memberDTO.setAddr1(rs.getString("addr1"));
memberDTO.setAddr2(rs.getString("addr2"));
}
}catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rs != null)
rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return memberDTO;
}
memberUpdateForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="member.bean.MemberDTO"%>
<%@page import="member.dao.MemberDAO"%>
<%
String id = (String)session.getAttribute("memId");
//DB
MemberDAO memberdao = MemberDAO.getInstance();
MemberDTO memberDTO = memberdao.getMember(id);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
table {
border-collapse: collapse;
width: 700px;
border: 1px solid;
margin: 0 auto;
}
th {
padding: 7px 15px;
border: 1px solid;
}
td {
padding: 7px 10px;
border: 1px solid;
}
div {
color: red;
font-size: 8pt;
font-weight: bold;
}
input[type="button"], input[type="submit"], input[type="reset"] {
background-color: #E0E0E0;
border: 1px solid;
text-align: center;
font-size: 14px;
margin: 4px 2px;
padding: 4px 5px;
}
input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover {
background-color: #BFBFBF;
}
</style>
</head>
<body>
<img src="../image/free-icon-love-4096198.png" alt="홈" width="60" height="60" onclick="location.href='../index.jsp'" style="cursor: pointer; display: block; margin: 0 auto;" />
<form name="memberUpdateForm" method="post" action="memberUpdate.jsp">
<table border="1">
<tr>
<th>이름</th>
<td>
<input type="text" name="name" id="name" value="<%=memberDTO.getName() %>" size="15"/>
<div id="nameDiv"></div>
</td>
</tr>
<tr>
<th>아이디</th>
<td>
<input type="text" name="id" id="id" value="<%=memberDTO.getId() %>" readonly />
</td>
</tr>
<tr>
<th>비밀번호</th>
<td>
<input type="password" name="pwd" id="pwd" placeholder="비밀번호 입력" size="25"/>
<div id="pwdDiv"></div>
</td>
</tr>
<tr>
<th>재확인</th>
<td>
<input type="password" name="repwd" id="repwd" placeholder="비밀번호 입력" size="25"/>
<div id="repwdDiv"></div>
</td>
</tr>
<tr>
<th>성별</th>
<td>
<input type="radio" name="gender" value="0"/>남자
<input type="radio" name="gender" value="1"/>여자
</td>
</tr>
<tr>
<th>이메일</th>
<td >
<input type="text" name="email1" value="<%=memberDTO.getEmail1() %>"/> @
<input type="text" name="email2" id="email2" value="<%=memberDTO.getEmail2() %>"/>
<input type="text" name="email3" id="email3" list="email3_list" oninput="change()"/>
<datalist id="email3_list">
<option value="직접입력">직접입력</option>
<option value="naver.com"></option>
<option value="gmail.com"></option>
<option value="daum.net"></option>
</datalist>
</td>
</tr>
<tr>
<th>휴대전화</th>
<td>
<select name="tel1" style="width: 70px;">
<option value="010">010</option>
<option value="011">011</option>
<option value="019">019</option>
</select>
-
<input type="text" name="tel2" value="<%=memberDTO.getTel2() %>" size="4" maxlength="4"/>
-
<input type="text" name="tel3" value="<%=memberDTO.getTel3() %>" size="4" maxlength="4"/>
</td>
</tr>
<tr>
<th>주소</th>
<td>
<input type="text" name="zipcode" id="zipcode" value="<%=memberDTO.getZipcode() %>" placeholder="우편번호" size="6" readonly/>
<input type="button" value="우편번호 검색" onclick="checkPost()"/><br>
<input type="text" name="addr1" id="addr1" value="<%=memberDTO.getAddr1() %>" placeholder="주소" size="50" readonly/><br>
<input type="text" name="addr2" id="addr2" value="<%=memberDTO.getAddr2() %>" placeholder="상세주소" size="50"/>
</td>
</tr>
<tr >
<td colspan="2" align="center">
<input type="submit" value="회원정보수정" />
<input type="reset" value="다시입력" />
</td>
</tr>
</table>
</form>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script src="../js/member.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-3.7.1.min.js"></script>
<script type="text/javascript">
window.onload = function(){
document.memberUpdateForm.gender['<%=memberDTO.getGender()%>'].checked = true;
document.memberUpdateForm.tel1.value = '<%=memberDTO.getTel1() %>';
}
</script>
</body>
</html>
onclick="location.reload()"
다시 입력을 눌렀을 때 성별은 로드하지 못하므로
나머지는 value 속성이 있으므로 들어온다.
<input type="reset" value="다시입력" onclick="location.reload()"/>
onclick="location.reload()" 이 코드를 추가해준다.
회원정보 수정
회원정보 수정하면 session을 만료시켜서 다시 로그인하게 해야한다.
logtime을 수정된 시간으로 변경해야한다.
memberUpdateForm.jsp
<input type="submit" value="회원정보수정" id="updateBtn"/>
member.js
//회원정보 수정
$('#updateBtn').on('click', function(event){
event.preventDefault();
$('#nameDiv').empty();
$('#pwdDiv').empty();
$('#repwdDiv').empty();
let isValid = true;
// 이름 검사
if($('#name').val().trim() == ''){
$('#nameDiv').html('비밀번호를 입력하세요.').css('color', 'red');
$('#name').focus();
isValid = false;
}
// 비밀번호 검사
if($('#pwd').val().trim() == ''){
$('#pwdDiv').html('비밀번호를 입력하세요.').css('color', 'red');
$('#user_pwd').focus();
isValid = false;
}
// 비밀번호 확인 검사
if($('#repwd').val() == ''){
$('#repwdDiv').html('비밀번호 확인을 해주세요.').css('color', 'red');
$('#repwd').focus();
isValid = false;
} else if($('#pwd').val() != $('#repwd').val()){
$('#repwdDiv').html('비밀번호가 일치하지 않습니다.').css('color', 'red');
$('#repwdDiv').val('');
$('#repwdDiv').focus();
isValid = false;
}
if(isValid){
$.ajax({
type: 'post',
url: 'memberUpdate.jsp',
data: $('form').serialize(),
dataType: 'text',
success: function(data){
alert('회원정보가 수정되었습니다.');
window.location.href = "../index.jsp";
},
error: function(e){
console.log(e);
}
});
}
});
memberUpdate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="member.bean.MemberDTO"%>
<%@page import="member.dao.MemberDAO"%>
<%
String id = (String)session.getAttribute("memId");
//데이터
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String gender = request.getParameter("gender");
String email1 = request.getParameter("email1");
String email2 = request.getParameter("email2");
String tel1 = request.getParameter("tel1");
String tel2 = request.getParameter("tel2");
String tel3 = request.getParameter("tel3");
String zipcode = request.getParameter("zipcode");
String addr1 = request.getParameter("addr1");
String addr2 = request.getParameter("addr2");
MemberDTO memberDTO = new MemberDTO();
memberDTO.setName(name);
memberDTO.setPwd(pwd);
memberDTO.setGender(gender);
memberDTO.setEmail1(email1);
memberDTO.setEmail2(email2);
memberDTO.setTel1(tel1);
memberDTO.setTel2(tel2);
memberDTO.setTel3(tel3);
memberDTO.setZipcode(zipcode);
memberDTO.setAddr1(addr1);
memberDTO.setAddr2(addr2);
//DB
MemberDAO memberDAO = MemberDAO.getInstance();
int result = memberDAO.memberUpdate(id, memberDTO);
session.removeAttribute("memId");
%>
<%=result %>
MemberDAO.java
public void memberUpdate(String id, MemberDTO memberDTO) {
String sql = "update member set name = ?,"
+ "pwd = ?,"
+ "gender = ?,"
+ "email1 = ?,"
+ "email2 = ?,"
+ "tel1 = ?,"
+ "tel2 = ?,"
+ "tel3 = ?,"
+ "zipcode = ?,"
+ "addr1 = ?,"
+ "addr2 = ?,"
+ "logtime = sysdate where id = ?";
try {
con = ds.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, memberDTO.getName());
pstmt.setString(2, memberDTO.getPwd());
pstmt.setString(3, memberDTO.getGender());
pstmt.setString(4, memberDTO.getEmail1());
pstmt.setString(5, memberDTO.getEmail2());
pstmt.setString(6, memberDTO.getTel1());
pstmt.setString(7, memberDTO.getTel2());
pstmt.setString(8, memberDTO.getTel3());
pstmt.setString(9, memberDTO.getZipcode());
pstmt.setString(10, memberDTO.getAddr1());
pstmt.setString(11, memberDTO.getAddr2());
pstmt.setString(12, id);
pstmt.executeUpdate();
}catch(SQLException e) {
e.printStackTrace();
}finally {
try {
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
회원정보 수정을 하면 세션이 만료돼서 다시 로그인이 뜨는 것을 확인할 수 있다.
게시판 - 글작성
1. 테이블 작성
sql --> board.sql
-- [테이블] Oracle
CREATE TABLE board(
seq NUMBER NOT NULL, -- 글번호 (시퀀스 객체 이용)
id VARCHAR2(20) NOT NULL, -- 아이디
name VARCHAR2(40) NOT NULL, -- 이름
email VARCHAR2(40), -- 이메일
subject VARCHAR2(255) NOT NULL, -- 제목
content VARCHAR2(4000) NOT NULL, -- 내용
ref NUMBER NOT NULL, -- 그룹번호
lev NUMBER DEFAULT 0 NOT NULL, -- 단계
step NUMBER DEFAULT 0 NOT NULL, -- 글순서
pseq NUMBER DEFAULT 0 NOT NULL, -- 원글번호
reply NUMBER DEFAULT 0 NOT NULL, -- 답변수
hit NUMBER DEFAULT 0, -- 조회수
logtime DATE DEFAULT SYSDATE
);
-- [시퀀스]
CREATE SEQUENCE seq_board NOCACHE NOCYCLE;
2. board -- boardWriteForm.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>
<style type="text/css">
table {
border-collapse: collapse;
width: 700x;
margin: auto;
}
th, td {
padding: 5px;
}
div {
color: red;
font-size: 8pt;
font-weight: bold;
}
input[type="button"], input[type="submit"], input[type="reset"] {
background-color: #E0E0E0;
border: 1px solid;
text-align: center;
font-size: 14px;
margin: 4px 2px;
padding: 4px 5px;
}
input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover {
background-color: #BFBFBF;
}
</style>
</head>
<body>
<img src="../image/free-icon-love-4096198.png" alt="홈" width="60" height="60" onclick="location.href='../index.jsp'" style="cursor: pointer; display: block; margin: 0 auto;" />
<form id="boardkWriteForm" method="post" action="">
<table border="1" >
<tr>
<th>제목</th>
<td>
<input type="text" name="subject" id="subject" size="65" placeholder="제목 입력"/>
<div id="subjectDiv"></div>
</td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea name="content" id="content" cols="65" rows="20"></textarea>
<div id="contentDiv"></div>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" id="writeBtn" value="글쓰기" />
<input type="reset" value="다시작성" />
</td>
</tr>
</table>
</form>
</body>
</html>
3. board.bean.BoardDTO.java
package board.bean;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class BoardDTO {
private String id;
private String name;
private String email;
private String subject;
private String content;
private int ref;
private int lev;
private int step;
private int pseq;
private int reply;
private int hit;
private Date logtime;
}
board.dao.BoardDAO.java
package board.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class BoardDAO {
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
private DataSource ds;
private static BoardDAO boardDAO = new BoardDAO();
public static BoardDAO getInstance() {
return boardDAO;
}
public BoardDAO() {
// 실행하자마자 커넥션 받아야한다.
Context ctx;
try {
ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/oracle"); //Tomcat의 경우 - java:comp/env/
} catch (NamingException e) {
e.printStackTrace();
}
}
}
4. 세션 생성
- memName
- memId
- memEmail (email1@email2 -- 붙여서 세션에 저장해야한다.) ★★★
memberLogin.jsp
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String email1 = request.getParameter("email1");
String email2 = request.getParameter("email2");
String email = email1 + "@" + email2;
session.setAttribute("memName", name);
session.setAttribute("memId", id);
session.setAttribute("memEmail", email);
세션생성을 회원가입할 때 하려고 했는데 그렇게 하면 안된다.... 로그인할 때 하는게 맞다.. 먼저 MemberDAO부터 고쳐부면 Map 함수를 이용해서 name, email1, email2를 받아야한다.
return name, email1, email2 이렇게 해도 안된다 !!
MemberDTO를 이용하기엔 3개의 값만 받으므로 Map함수가 더 좋다는 거 !!
put을 이용해서 userInfo에 값을 넣는다.
public Map<String, String> memberLogin(String id, String pwd){
Map<String, String> userInfo = new HashMap<>();
String sql = "select name, email1, email2 from member where id=? and pwd=?";
try {
con = ds.getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
if(rs.next()) {
userInfo.put("name", rs.getString("name"));
userInfo.put("email1", rs.getString("email1"));
userInfo.put("email2", rs.getString("email2"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return userInfo;
}
이제 memberLogin.jsp도 수정해야되는데 원래는 name만 받았다면 이제는 Map객체를 이용하여 userInfo를 통째로 받는 것이다.
그다음 get을 이용해서 값을 하나하나 받으면 된다.
email1과 email2를 합치는 방식은 위에서와 같다.
그리고 세션에 저장을 하고
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="member.dao.MemberDAO"%>
<%@page import="java.util.Map"%>
<%
//데이터
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
//DB
MemberDAO memberDAO = MemberDAO.getInstance();
Map<String, String> userInfo = memberDAO.memberLogin(id, pwd);
if (userInfo.isEmpty()) {
//페이지 이동
response.sendRedirect("loginFail.jsp");
} else {
//중요한 데이터를 주소표시줄에 실어서 보내지 말자
//response.sendRedirect("loginOk.jsp?name=" + URLEncoder.encode(name, "UTF-8") + "&id=" + id);
// 쿠키 설정
/*
Cookie cookie = new Cookie("memName", name);//쿠키 생성
cookie.setMaxAge(30 * 60); //초 단위 - 30분
response.addCookie(cookie);//클라이언트에 저장
Cookie cookie2 = new Cookie("memId", id);//쿠키 생성
cookie2.setMaxAge(30 * 60); //초 단위 - 30분
response.addCookie(cookie2);//클라이언트에 저장
*/
//세션
//HttpSession session = request.getSession(); //세션 생성
String name = userInfo.get("name");
String email1 = userInfo.get("email1");
String email2 = userInfo.get("email2");
System.out.println(name);
System.out.println(id);
// 세션에 저장
session.setAttribute("memName", name);
session.setAttribute("memId", id);
session.setAttribute("memEmail", email1 + "@" + email2);
response.sendRedirect("loginOk.jsp");
}
%>
loginOk.jsp 부분에서 세션을 얻으면 된다. 그럼 이메일도 세션으로 저장해서 얻기 성공 !!!!
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//String name = request.getParameter("name");
//String id = request.getParameter("id");
String name = null;
String id = null;
String email = null;
//쿠키
/*
Cookie[] ar = request.getCookies(); //특정 쿠키만을 가져오지 못하고, 모든 쿠키들을 다 가져온다.
if(ar != null){
for(int i=0; i<ar.length; i++){
String cookieName = ar[i].getName(); //쿠키명
String cookieValue = ar[i].getValue(); //쿠키값
System.out.println("쿠키명 = " + cookieName);
System.out.println("쿠키값 = " + cookieValue);
System.out.println();
if(cookieName.equals("memName"))
name = ar[i].getValue();
if(cookieName.equals("memId"))
id = ar[i].getValue();
} //for
} //if
*/
//세션
name = (String)session.getAttribute("memName");
id = (String)session.getAttribute("memId");
email = (String)session.getAttribute("memEmail");
System.out.println(name);
System.out.println(id);
System.out.println(email);
%>
<%=name%>
board.js
$(function () {
$('#writeBtn').on('click', function(event) {
event.preventDefault(); // 기본 폼 제출 방지
$('#subjectDiv').empty();
$('#contentDiv').empty();
let isValid = true;
// 제목 검사
if ($('#subject').val().trim() === '') {
$('#subjectDiv').html('제목을 입력하세요.');
$('#subject').focus();
isValid = false;
}
// 내용 검사
if ($('#content').val().trim() === '') {
$('#contentDiv').html('내용을 입력하세요.');
$('#content').focus();
isValid = false;
}
// 유효성 검사를 모두 통과한 경우에만 ajax 요청 실행
if (isValid) {
$.ajax({
type: 'post',
url: '../board/boardWrite.jsp',
data: $('#boardWriteForm').serialize(),
success: function() {
alert('게시물 작성에 성공하였습니다!');
window.location.href = "../index.jsp";
},
error: function(e) {
console.log(e);
}
});
}
});
});
boardWrite.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="board.bean.BoardDTO"%>
<%@page import="board.dao.BoardDAO"%>
<%
String id = (String)session.getAttribute("memId");
String name = (String)session.getAttribute("memName");
String email = (String)session.getAttribute("memEmail");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
BoardDTO boardDTO = new BoardDTO();
boardDTO.setId(id);
boardDTO.setName(name);
boardDTO.setEmail(email);
boardDTO.setSubject(subject);
boardDTO.setContent(content);
BoardDAO boardDAO = BoardDAO.getInstance();
boardDAO.boardWrite(boardDTO);
%>
5. insert할 때
seq -> 시퀀스 얻어오기
id, name, email -> 세션을 통해서 얻어온다.
subject
content
ref -> seq와 똑같은 값이 들어가게 해야한다.
BoardDAO.java
ref -> seq와 똑같은 값이 들어가게 해야한다. 이 부분이 관건인데 시퀀스값을 다른 변수에 미리 저장을 하는 것이다. 그리고 그 변수를 seq와 ref에 넣게되면 같은 값을 넣을 수 있게 된다 !!
public void boardWrite(BoardDTO boardDTO) {
String sql = "insert into board values(?,?,?,?,?,?,?,?,?,?,?,?,sysdate)";
try {
con = ds.getConnection();
// 시퀀스 값 가져오기
String seqSql = "select seq_board.NEXTVAL from dual";
pstmt = con.prepareStatement(seqSql);
rs = pstmt.executeQuery();
int seqValue = 0;
if (rs.next()) {
seqValue = rs.getInt(1);
}
// SQL 준비
pstmt = con.prepareStatement(sql);
// ? 데이터 매핑
pstmt.setInt(1, seqValue);
pstmt.setString(2, boardDTO.getId());
pstmt.setString(3, boardDTO.getName());
pstmt.setString(4, boardDTO.getEmail());
pstmt.setString(5, boardDTO.getSubject());
pstmt.setString(6, boardDTO.getContent());
pstmt.setInt(7, seqValue); // ref에 시퀀스 값 사용
// lev, step, pseq 값이 0인 경우 기본값 0으로 설정
pstmt.setInt(8, boardDTO.getLev() != 0 ? boardDTO.getLev() : 0);
pstmt.setInt(9, boardDTO.getStep() != 0 ? boardDTO.getStep() : 0);
pstmt.setInt(10, boardDTO.getPseq() != 0 ? boardDTO.getPseq() : 0);
pstmt.setInt(11, boardDTO.getReply() != 0 ? boardDTO.getReply() : 0);
pstmt.setInt(12, boardDTO.getHit() != 0 ? boardDTO.getHit() : 0);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) pstmt.close();
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
seq_board.NEXTVAL / seq_board.CURRVAL 이런식으로 해서 같은 값을 넣어도된다.
public void boardWrite(BoardDTO boardDTO) {
String sql = "insert into board values(seq_board.NEXTVAL,?,?,?,?,?,seq_board.CURRVAL,?,?,?,?,?,sysdate)";
try {
con = ds.getConnection();
// SQL 준비
pstmt = con.prepareStatement(sql);
// ? 데이터 매핑
pstmt.setString(1, boardDTO.getId());
pstmt.setString(2, boardDTO.getName());
pstmt.setString(3, boardDTO.getEmail());
pstmt.setString(4, boardDTO.getSubject());
pstmt.setString(5, boardDTO.getContent());
// lev, step, pseq 값이 0인 경우 기본값 0으로 설정
pstmt.setInt(6, boardDTO.getLev() != 0 ? boardDTO.getLev() : 0);
pstmt.setInt(7, boardDTO.getStep() != 0 ? boardDTO.getStep() : 0);
pstmt.setInt(8, boardDTO.getPseq() != 0 ? boardDTO.getPseq() : 0);
pstmt.setInt(9, boardDTO.getReply() != 0 ? boardDTO.getReply() : 0);
pstmt.setInt(10, boardDTO.getHit() != 0 ? boardDTO.getHit() : 0);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) pstmt.close();
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
여기서 중요한 부분은 lev, step, pseq에 빈값이 들어갈 때 0으로 설정을 따로 해줘야한다는 것이다 !!
public void boardWrite(BoardDTO boardDTO) {
String sql = "insert into board (seq, id, name, email, subject, content, ref) "
+ "values(seq_board.NEXTVAL,?,?,?,?,?,seq_board.CURRVAL)";
try {
con = ds.getConnection();
// SQL 준비
pstmt = con.prepareStatement(sql);
// ? 데이터 매핑
pstmt.setString(1, boardDTO.getId());
pstmt.setString(2, boardDTO.getName());
pstmt.setString(3, boardDTO.getEmail());
pstmt.setString(4, boardDTO.getSubject());
pstmt.setString(5, boardDTO.getContent());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) pstmt.close();
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
아 구냥 값을 뒤에껀 안 넣어주면 된다~ 호호호
select * from board;
'JSP & Servlet' 카테고리의 다른 글
DAY 48 - MyBatis ( 2024.09.09) (0) | 2024.09.09 |
---|---|
DAY 46 JSP - Connection Pool / 로그인 / 쿠키(2024.09.05) (1) | 2024.09.06 |
DAY 45 JSP - 주석 / 미니프로젝트(member) - 중복체크 ( 2024.09.04 ) (4) | 2024.09.04 |
DAY 45 Servlet - Guestbook2 ( 2024.09.04 ) (0) | 2024.09.04 |
DAY 44 - Servlet - Guestbook ( 2024.09.03 ) (0) | 2024.09.04 |