🍀 세션의 역할

 

http - 새로 접속하는 개념. 이전의 클라이언트가 만들어 놓은 정보를 사용할 수 없다.

서버가 클라이언트에게 cookie 정보에 sessionid 를 심어 보낸다. (response)

예) 비회원 주문

sessionid 는 유효시간이 있다.

 

 

SessonMain.jsp

<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	
<%
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

long creationTime = session.getCreationTime();
String creationTimeStr = dateFormat.format(new Date(creationTime));

long lastTime = session.getLastAccessedTime();
String lastTimeStr = dateFormat.format(new Date(lastTime));
%>

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

	<h2>Session 설정확인</h2>
	
	<ul>
		<li>세션 유지시간 : <%=session.getMaxInactiveInterval()%></li>
		<li>세션 아이디 : <%=session.getId()%></li>
		<li>최초 요청 시각 : <%= creationTimeStr %></li>
		<li>마지막 요청 시간 : <%=lastTimeStr%>
		</li>
	</ul>
	
</body>
</html>

 

클라이언트 → 서버 → DTO → DAO → DB

클라이언트 ← 서버 ← DTO ← DAO ← DB

 

DTO, DAO 만들어서 아이디와 패스워드 비교

 

DTO를 만드는 기준 : DTO = 빈

빈을 만드는 기준과 같음.

 

* 패키지는 무조건 소문자로 만들기

* 프로젝트 만들때는 테이블 우선 만들기

* 테이블단위로 DAO, DTO가 만들어진다.

 

 

LoginForm.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>
<script>
	function validateForm(form) {
		if (!form.user_id.value) {
			alert("아이디를 입력하세요.");
			return false;
		}
		if (form.user_pw.value == "") {
			alert("패스워드를 입력하세요.");
			return false;
		}
	}
</script>
</head>
<body>
	<h2>로그인 페이지</h2>
	<%=request.getAttribute("LoginErrMsg") == null ? "" : request.getAttribute("LoginErrMsg")%>

	<%
	if (session.getAttribute("UserId") == null) {
	%>
	<form action="LoginProcess.jsp" method="post" name="LoginFrm"
		onsubmit="return validateForm(this)">
		아이디 : <input type="text" name="user_id" /><br /> 
		패스워드 : <input type="password" name="user_pw" /><br /> 
		<input type="submit" value="로그인하기" />
	</form>

	<%
	} else {
	%>
	<%=session.getAttribute("UserName")%>
	회원님, 로그인하셨습니다.
	<br>
	<a href="Logout.jsp"> [로그아웃] </a>
	<%
	}
	%>
</body>
</html>

 

MemberDTO.java

package membership;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter

//SQL의 테이블명과 일치하게 클래스를 만든다.
public class MemberDTO {
	private String id;
	private String pass;
	private String name;
	private String regidate;
	
}

 

MemberDAO.java

package membership;

import common.JDBConnect;

//DB에 접속해서 쿼리문 처리하는 역할
public class MemberDAO extends JDBConnect {

	public MemberDAO(String driver, String url, String id, String pwd) {
		super(driver, url, id, pwd);
	}
	// 여기까지 DB 접속

	// 명시한 아이디/패스워드와 일치하는 회원 정보 반환
	public MemberDTO getMemberDTO(String uid, String upass) {

		MemberDTO dto = new MemberDTO();
		String query = " select * from member where id = ? and pass = ? ";

		// 쿼리문은 예외처리가 항상 필요하다
		try {
			psmt = con.prepareStatement(query);
			psmt.setString(1, uid);
			psmt.setString(2, upass);
			rs = psmt.executeQuery();

			if (rs.next()) {
				dto.setId(rs.getString("id")); // 컬럼명 또는 숫자(1부터 시작)
				dto.setPass(rs.getString("pass")); // 가능하면 컬럼 이름으로 쓰는 것이 좋음, 그룹은 숫자로
				dto.setName(rs.getString(3));
				dto.setRegidate(rs.getString(4));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return dto;
	}

}

 

LoginProcess.jsp

<%@page import="membership.MemberDTO"%>
<%@page import="membership.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@page import="membership.MemberDAO"%>
<!-- 로그인 아이디 패스워드 판단 -->
<%
String userId = request.getParameter("user_id");
String userPwd = request.getParameter("user_pw");

String oracleDriver = application.getInitParameter("OracleDriver");
String oracleURL = application.getInitParameter("OracleURL");
String oracleId = application.getInitParameter("OracleId");
String oraclePwd = application.getInitParameter("OraclePwd");

MemberDAO dao = new MemberDAO(oracleDriver,oracleURL,oracleId,oraclePwd);
MemberDTO memberDTO = dao.getMemberDTO(userId, userPwd);

dao.close();

if (memberDTO.getId() != null){
	// 아이디 체크 성공
	session.setAttribute("UserId", memberDTO.getId());
	session.setAttribute("UserName", memberDTO.getName());
	response.sendRedirect("LoginForm.jsp");
}else{
	// 실패
	request.setAttribute("LoginErrMsg", "로그인 실패");
	request.getRequestDispatcher("LoginForm.jsp").forward(request, response);
}

%>

 

DB에 있는 정보를 읽어와 아이디와 일치하는지 확인한 후 이름(별칭) 정보로 회원 로그인 성공 유무를 알려준다.

 

 

Logout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
session.removeAttribute("UserId");
session.removeAttribute("UserName");

// session.invalidate(); 모든 값을 삭제

response.sendRedirect("LoginForm.jsp");
%>

 

Link.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<table border="1" width="90%">
	<tr>
		<td align = "center">
		<%if (session.getAttribute("UserId") == null) { %>
		<a href = "../Session/LoginForm.jsp">로그인</a>
		<% }else{ %>
		<a href = "../Session/Logout.jsp">로그아웃</a>
		<% } %>
		
		&nbsp; &nbsp; &nbsp;
		<a href = "">게시판(페이징 x)</a>
		&nbsp; &nbsp; &nbsp;
		<a href = "">게시판(페이징 o)</a>
		</td>
	</tr>
</table>

 

헤더와 연결해 현재 로그인, 로그아웃 상태를 알 수 있게 해준다.

 

 

 

🍀 액션태그

 

3가지.

  1. 페이지 이동기능
  2. 페이지 읽고 쓰기
  3. 페이지 포함

 

include, forward, bean

 

✔︎ include → 페이지 포함

지시자 include 액션 include
페이지가 복사되어 하나의 파일로 포함된다 필요할 때 페이지를 포함해 처리
종속되어 움직인다 처리 후에는 연결이 끊긴다.

 

✔︎ forward → 페이지 이동

주소값이 머물러 있다.

 

 

✔︎ bean == 자바에서는 DTO , vo라고 부른다.

파라메터를 효율적으로 받기 위해서

// 빈(Bean) 객체 : DTO클래스
// 반드시 기본형 생성자가 정의되어 있어야 한다.
// 멤버는 private 해야한다.
// getter / setter를 정의한다.

// import 를 한번에 사용할 수 있다.



<jsp:useBean id="" class=""></jsp:useBean> 

<jsp:setProperty property="" name=""/> // 값 보내기
<jsp:getProperty property="" name=""/> // 값 읽기
name에는 id 값 입력 

위 세개는 한 세트처럼 쓰여진다.

 

UseBeanForm.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>
    <h2>액션 태그로 폼값 한 번에 받기</h2> 
    <form method="post" action="UseBeanAction.jsp"> 
        이름 : <input type="text" name="name" /> <br /> 
        나이 : <input type="text" name="age" /> <br /> 
        <input type="submit" value="폼값 전송" />
    </form>
</body>

 

UseBeanAction.jsp

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

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

<%-- <jsp:useBean id="person" class="common.Person"></jsp:useBean>

<jsp:setProperty property="name" name="person" value="hong"/>

<!-- 파라매터를 직접 받을 때 -->
<jsp:setProperty property="name" name="person" param="hong"/>  
이름 : <jsp:getProperty property="name" name="person"/>

<jsp:setProperty property="age" name="person" value="10"/>

<!-- 파라매터를 직접 받을 때 -->
<jsp:setProperty property="age" name="person" param="10"/>
나이 : <jsp:getProperty property="age" name="person"/> --%>


<!-- 파라매터를 한번에 넣을 때 -->
<jsp:useBean id="person" class="common.Person"></jsp:useBean>
<!-- 파라매터 이름과 setter 메소드 이름이 같고, 개수가 같을 때 * 로 한번에 읽어올 수 있다. -->
<jsp:setProperty property= "*" name="person" />

<!-- 넘어온 데이터를 get메소드로 읽는다. -->
이름 : <jsp:getProperty property="name" name="person"/>
<br>
나이 : <jsp:getProperty property="age" name="person"/>

</body>
</html>

 

Person.java

package common;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Person {
	
	
	// 빈(Bean) 객체 : DTO클래스
	// 반드시 기본형 생성자가 정의되어 있어야 한다.
	// 멤버는 private 해야한다.
	// getter / setter를 정의한다.
	
	private String name;
	private int age;
	public String getName() {
		return name;
	}

}

 

+web.xml 인코딩 처리로 한글 깨짐현상을 방지할 수 있다.

<filter>
    <filter-name>SetCharEncoding</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
      <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
      </init-param>
  </filter>
  <filter-mapping>
    <filter-name>SetCharEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 

 

 

 

🎉 게시판 만들기

이 코드는 통으로 그냥 외워라.

 

프로그램 만드는 두가지 방식 : 모델 1방식, 모델 2방식

모델 1방식 → 코드 다 한 곳에

모델 2방식 → 코드를 여러 곳에 분산, 로직 분리 (유지보수에 유리)

 

게시판 만들기는 모델 1방식으로 코딩 후 모델 2방식으로 바꿔본다.

오늘까지 만들었던 순서)

  1. SQL 디벨로퍼에서 테이블 만들고 데이터넣기, 커밋
  2. 그 다음으로 자바파일로 DTO, DAO 만들기
  3. 목록보기 화면 List.jsp
  4. 로그인 기능을 구현하며 만들었던 폼에 링크걸기

 

SQL

create table board (
num number primary key,
title varchar2(200) not null,
content varchar2(2000) not null,
id varchar2(10) not null,
postdate date DEFAULT sysdate not null,
visitcount number(6)
);

alter table board
add constraint board_mem_fk foreign key (id)
REFERENCES member(id);

-- 시퀀스 객체
create sequence seq_board_num
increment by 1
start with 1
minvalue 1;

insert into board (num, title, content, id, postdate, visitcount) 
   values (seq_board_num.nextval, '제목1입니다', '내용1입니다', 'musthave', sysdate, 0);

commit;

insert into board
   values (seq_board_num.nextval, '지금은 봄입니다', '봄의왈츠', 'musthave', sysdate, 0);
insert into board
   values (seq_board_num.nextval, '지금은 여름입니다', '여름향기', 'musthave', sysdate, 0);
insert into board
   values (seq_board_num.nextval, '지금은 가을입니다', '가을동화', 'musthave', sysdate, 0);
insert into board
   values (seq_board_num.nextval, '지금은 겨울입니다', '겨울연가', 'musthave', sysdate, 0);      

commit;

 

BoardDTO.java

package model1.board;


import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class BoardDTO {
private String num;
private String title;
private String content;
private String id;
private java.sql.Date postDate;
private String visitcount;
private String name; // 로그인했을 떄 필요한 이름
}

 

BoardDAO.java

package model1.board;

import common.JDBConnect;
import jakarta.servlet.ServletContext;

public class BoardDAO extends JDBConnect{

	public BoardDAO(ServletContext application) {
		super(application);
	}
	
	// 검색 조건에 맞는 게시물의 개수를 반환합니다.
	   
	// 검색 조건에 맞는 게시물 목록을 반환합니다.
	   
	// 검색 조건에 맞는 게시물 목록을 반환합니다(페이징 기능 지원).
	   
	// 게시글 데이터를 받아 DB에 추가합니다.
	   
	// 지정한 게시물을 찾아 내용을 반환합니다.
	   
	// 지정한 게시물의 조회수를 1 증가시킵니다.
	   
	// 지정한 게시물을 수정합니다.
	   
	// 지정한 게시물을 삭제합니다.

	

}

 

목록보기 화면 List.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>
	<jsp:include page="../Common/Link.jsp" />
	<form method="get">
		<table border="1" width="90%">
			<tr>
				<td align="center"><select name="searchField">
						<option value="title">제목</option>
						<option value="content">내용</option>
				</select> 
				<input type="text" name="searchWord" /> 
				<input type="submit" name="검색하기" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

로그인 기능을 구현하며 만들었던 폼에 링크걸기 Link.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>
	<jsp:include page="../Common/Link.jsp" />
	<form method="get">
		<table border="1" width="90%">
			<tr>
				<td align="center"><select name="searchField">
						<option value="title">제목</option>
						<option value="content">내용</option>
				</select> 
				<input type="text" name="searchWord" /> 
				<input type="submit" name="검색하기" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

+ Recent posts