1) 메인 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="/resources/css/main-style.css">
<!-- fontaswesom 아이콘 사용할 수 있는 스크립트 연결-->
<script src="https://kit.fontawesome.com/ac58eafae7.js"
crossorigin="anonymous"></script>
</head>
<body>
<%-- 시멘틱태그 html 가져옴 --%>
<main>
<%-- hedaer.jsp추가 --%>
<%-- <jsp:include page = "jsp파일경로" />
- jsp 파일 경로는 webapp 폴더 기준으로 작성
- JSP 액션 태그(jsp에 기본 내장됨)
- 다른 jsp 파일의 코드를 현재 위치에 추가
--%>
<jsp:include page="/WEB-INF/views/common/header.jsp" />
<section class="content">
<section class="content-1">
<h3>로그인된 회원 정보</h3>
</section>
<!-- 아이디/비밀번호/로그인 버튼 영역 -->
<section class="content-2">
<c:choose>
<%--로그인이 안되었을 때 --%>
<%-- EL empty : 비어있거나 null이면 true --%>
<c:when test="${empty sessionScope.loginMember}">
<form action="/member/login" method = "post" name="login-form" id="loginFrm">
<fieldset class="id-pw-area">
<section>
<input type="text" name="inputEmail" placeholder="이메일">
<input type="password" name="inputPw" placeholder="비밀번호">
</section>
<section>
<button>로그인</button>
</section>
</fieldset>
<label>
<input type="checkbox" name="saveId"> 아이디 저장
</label>
<!-- 회원가입 / Id / Pw 찾기 영역 -->
<section class="signup-find-area">
<a href="#">회원가입</a> <span>|</span> <a href="#">ID/PW 찾기</a>
</section>
</form>
</c:when>
<%--로그인이 되었을 때 --%>
<c:otherwise>
<artice class="login-area">
<a href ="#">
<img src="/resources/images/user.png" id = "memberProfile">
</a>
<div class="my-info">
<div>
<a href="#" id="nickname">${sessionScope.loginMember.memberNickName}</a>
<a href="/member/logout" id="logoutBtn">로그아웃</a>
</div>
<p></p>
</div>
</artice>
</c:otherwise>
</c:choose>
</section>
</section>
</main>
<jsp:include page="/WEB-INF/views/common/footer.jsp" />
</body>
</html>
=> 로그인 시, action = "/member/login" method = "post" name="login-form" 으로 받으므로
=> member/login을 가진 웹 시작
1) Controller
@WebServlet("/member/login")
public class LoginController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
// 인코딩 처리
req.setCharacterEncoding("UTF-8");
// 파라미터 얻어오기
String inputEmail = req.getParameter("inputEmail");
String inputPw = req.getParameter("inputPw");
//서비스 객체 생성
MemberService service = new MemberService();
//로그인 서비스 호출 후 결과 반환받기
Member loginMember = service.login(inputEmail,inputPw);
//Session 객체 생성
HttpSession session = req.getSession();
if(loginMember!= null) { // 로그인 성공
// session에 로그인한 회원 정보를 추가
session.setAttribute("loginMember", loginMember);
// session 만료 시간 지정 (초단위 지정)
session.setMaxInactiveInterval(60*60);
resp.sendRedirect("/"); // 메인 페이지 재요청 ( 이거때문에 메인페이지로 다시 돌아옴 원래는 버튼 누르면 /member/login으로 이동했어야 함
}else { // 실패
// 로그인 실패 메시지를 session에 추가
session.setAttribute("message", "아이디 또는 비밀번호가 일치하지 않습니다.");
// 현재 요청 이전 페이지로 redirect
String referer = req.getHeader("referer");
System.out.println(referer);
resp.sendRedirect(referer);
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
=> session에 저장
=> 로그인이 진행되지 않는 경우엔 뒤로 돌리기(referer)이용!
=> 로그아웃 시, "/member/logout"으로 받는 웹 페이지를 새로 시작해야하지만,
=> 로그아웃 시, 새로 출력 할 창은 필요하지 않으므로
=> resp.senRedirect("/")를 이용하여 메인페이지로 다시 이동할 수 있게 함.
1) Controller
@WebServlet("/member/logout")
public class LogoutController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// HttpSession을 얻어와
HttpSession session = req.getSession();
// Session을 무효화 하고
session.invalidate();
// 메인페이지를 재요청(redirect)
resp.sendRedirect("/");
}
}
=> 메인 jsp의 header에서 검색창의 정보는 id = "query" name = "query" 이고
제출할 곳은 action = "/search" method="get" 임
=> /search 을 가진 웹 시작
1) Controller
@WebServlet("/search")
public class SearchController extends HttpServlet{
SearchMemberService service = new SearchMemberService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("서비스 확인");
try {
String nickName = req.getParameter("query");
List<Member> mem = service.searchmem(nickName);
req.setAttribute("mem", mem);
req.setAttribute("query", nickName);
}catch(Exception e){
e.printStackTrace();
}
req.getRequestDispatcher("/WEB-INF/views/new/search.jsp").forward(req, resp);
}
}
2) Service
public class SearchMemberService {
private SearchMemberDAO dao = new SearchMemberDAO();
public List<Member> searchmem(String nickName) throws Exception{
Connection conn = getConnection();
List<Member> listMem = dao.searchMem(conn,nickName );
System.out.println("서비스 완료?");
close(conn);
return listMem;
}
}
3) DAO
public class SearchMemberDAO {
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
private Properties prop;
public SearchMemberDAO() {
try {
String filePath = MemberDAO.class.getResource("/edu/kh/project/sql/member-sql.xml").getPath();
prop = new Properties();
prop.loadFromXML(new FileInputStream(filePath));
}catch(Exception e){
e.printStackTrace();
}
}
public List<Member> searchMem(Connection conn, String nickName) throws Exception{
List<Member>memList = new ArrayList<Member>();
try {
String sql = prop.getProperty("searchMem");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, nickName);
rs = pstmt.executeQuery();
while(rs.next()) {
//몇 개만 받아오는 경우 이렇게 작성할 것!!
Member member = new Member();
member.setMemberNo(rs.getInt("MEMBER_NO"));
member.setMemberEmail(rs.getString("MEMBER_EMAIL"));
member.setMemberNickName(rs.getString("MEMBER_NICKNAME"));
member.setMemberTel(rs.getString("MEMBER_TEL"));
memList.add(member);
System.out.println("여기까지 완료?");
}
}finally {
close(rs);
close(pstmt);
}
return memList;
}
}
<entry key = "searchMem">
SELECT MEMBER_NO, MEMBER_EMAIL, MEMBER_NICKNAME, MEMBER_TEL
FROM "MEMBER"
WHERE MEMBER_DEL_FL ='N'
AND MEMBER_NICKNAME LIKE '%'||?||'%'
</entry>
1) 검색 결과 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 검색 결과 </title>
<link rel="stylesheet" href="/resources/css/main-style.css">
<script src="https://kit.fontawesome.com/ac58eafae7.js" crossorigin="anonymous"></script>
</head>
<body>
<main>
<jsp:include page="/WEB-INF/views/common/header.jsp" />
<section class = "search-page">
<h1>'${query}'로 검색한결과</h1>
<c:choose>
<%-- ★★★★★★★memberList가 비어있을 때 (근데, ''값 오면 빈값으로 들어옴?? --%>
<%--<c:when test = "${empty requestScope.mem}"> --%>
<c:when test = "${query == '' || empty requestScope.mem }">
<p>검색된 회원이 없습니다.</p>
</c:when>
<c:otherwise>
<c:forEach var = "member" items = "${mem}">
<div class = "search-div">
닉네임 : ${member.memberNickName} <br>
<%-- var.필드명 --%>
이메일 : ${member.memberEmail} <br>
전화번호 : ${member.memberTel}<br>
</div>
</c:forEach>
</c:otherwise>
</c:choose>
</section>
</main>
<jsp:include page="/WEB-INF/views/common/footer.jsp" />
</body>
</html>
<c:when test = "${query == '' || empty requestScope.mem }">
로 조건 잡기!
query 즉, 검색 창에 빈값이 있는 경우 혹은
mem 값에 검색결과를 가져오지 못한경우를 파악
이전 페이지 이동
=> referer => 각 페이지 방문 시 남는 흔적
즉, reequest.getHeader(): 안에 파라미터로 referer 전달 시 이전페이지 주소값 반환
리스트 값 얻어오기
=> jsp의 forEach값 이용해서 객체에 접근하기.