🍀 세션의 역할
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>
<% } %>
<a href = "">게시판(페이징 x)</a>
<a href = "">게시판(페이징 o)</a>
</td>
</tr>
</table>
헤더와 연결해 현재 로그인, 로그아웃 상태를 알 수 있게 해준다.
🍀 액션태그
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방식으로 바꿔본다.
오늘까지 만들었던 순서)
- SQL 디벨로퍼에서 테이블 만들고 데이터넣기, 커밋
- 그 다음으로 자바파일로 DTO, DAO 만들기
- 목록보기 화면 List.jsp
- 로그인 기능을 구현하며 만들었던 폼에 링크걸기
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>
'2024_UIUX 국비 TIL' 카테고리의 다른 글
UIUX _국비과정 0628 [게시판_페이징] (0) | 2024.07.10 |
---|---|
UIUX _국비과정 0625 ~ 27 [게시판] (0) | 2024.07.10 |
UIUX _국비과정 0621 [커넥션풀 방식, 회원가입 폼] (0) | 2024.07.09 |
UIUX _국비과정 0620 [JSP 쿠키, 오라클DB 연결] (0) | 2024.07.08 |
UIUX _국비과정 0619 [JSP 문법] (0) | 2024.07.08 |