JSP & Servlet

DAY 47 - 미니프로젝트(member) - 세션 / 회원정보 수정 / 글 작성 (2024.09.06)

summ.n 2024. 9. 6. 17:32

세션

: 웹서버쪽의 웹컨테이너에 상태를 유지하기 위한 정보가 저장 (눈에 안 보임)

: 세션은 기본 시간 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;