2022.09.27

Jimin·2022년 9월 27일
0

비트캠프

목록 보기
47/60
post-thumbnail
  • 서블릿 프로그래밍
    • JSTL(JSP Standard Tag Library) 사용법
  • board-app 프로젝트 수행
      1. OGNL 표기법으로 객체 프로퍼티를 좀 더 쉽게 다루기: EL 문법 사용(계속)
      1. JSP에서 자바 코드를 제거하기: JSTL 사용

063. OGNL 표기법으로 객체 프로퍼티를 좀 더 쉽게 다루기: EL 문법 사용

EL(Expression Language)
OGNL 표기법을 사용하여 객체의 프로퍼티 값을 조회

${board.title}에서 title은 필드명이 아니라 프로퍼티, (setTitle, getTitle)의 title을 가르킨다.


064. JSP에서 자바 코드를 제거하기: JSTL 사용

  • JSTL 사용법

1단계 - JSTL 라이브러리를 프로젝트에 포함한다.

  • search.maven.org에서 "JSTL"로 검색한다.
  • 빌드 스크리브 파일(build.gradle)에 라이브러리 등록한다.
implementation 'javax.servlet:jstl:1.2'
  • gradle eclipse 실행한다.
  • eclipseIDE에서 프로젝트를 갱신한다.

2단계 - JSP 페이지에 JSTL 태그를 사용한다.

  • JSP 페이지에 태그 라이브러리를 선언한다.

  • 필요한 JSTL 태그를 사용한다.

  • list.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:forEach items="${members}" var="member">
    <tr>
      <td>${member.no}</td>
      <td><a href='detail?no=${member.no}'>${member.name}</a></td>
      <td>${member.email}</td>
    </tr>
</c:forEach>

065. 로그인, 로그아웃 처리하기:
HTTPSession, cookie 사용

  • HTTPSession을 사용하여 로그인, 로그아웃을 처리하는 방법
  • 클라이언트 별로 세션을 구분하는 원리

1단계 - 로그인 폼을 만든다.

  • /webapp/auth/form.jsp 생성

  • form.jsp

<%@ page language="java" 
contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>JWS</title>
    </head>
    <body>
    <h1>로그인</h1>

    <form action='login'>

    <table border = '1'>

       <tr>
           <th>이메일</th><td><input name='email' type='email'  size='30'></td>
       </tr>

       <tr>
           <th>암호</th><td><input name='password' type='password'  size='20'></td>
       </tr>

    </table>
    <p>
    <button type='submit'>로그인</button>
    <a href='../'>취소</a>
    </p>
    </form>

    </body>
    </html>

2단계 - 로그인 서블릿을 만든다. (로그인 처리)

  • com.bitcamp.board.controller.LoginController 클래스 생성
    • 로그인 사용자 정보를 HttpSession 보관소에 저장한다.
  • /webapp/auth/loginResult.jsp 파일 생성
    • 로그인 결과에 따라 리프레시 경로를 지정한다.
  • loginResult.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>JWS</title>
<meta http-equiv='Refresh' content='1; url=${empty member ? "form.jsp" : "../"}'>
</head>
<body>
<h1>로그인</h1>
<c:choose>
  <c:when test="${not empty member}" >
    <p>로그인 성공입니다!</p>
  </c:when>
  <c:otherwise>
    <p>회원이 존재하지 않습니다!</p>
  </c:otherwise>
</c:choose>
</body>
</html>
  • loginController.java
@WebServlet("/auth/login")
public class LoginController extends HttpServlet{

  private static final long serialVersionUID = 1L;

  MemberDao memberDao;

  @Override
  public void init() {
    memberDao = (MemberDao) this.getServletContext().getAttribute("memberDao");
  }

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    try {
      String email = request.getParameter("email");
      String password = request.getParameter("password");
      Member member = memberDao.findByEmailPassword(email, password);
      request.setAttribute("member", member);
      // Refresh
      response.setContentType("text/html;charset=UTF-8"); 
      request.getRequestDispatcher("/auth/loginResult.jsp").include(request, response); 
    } catch(Exception e) {
      request.setAttribute("exception", e);
      request.getRequestDispatcher("/error.jsp").forward(request, response);
    }
  }
}
  • findByEmailPassword() method in MemberDaoMariaDB class
public Member findByEmailPassword(String email, String password) throws Exception{
    try (PreparedStatement pstmt = con.prepareStatement(
        "select mno,name,email,cdt from app_member where email=? and pwd=sha2(?, 256)" );
        ) {

      pstmt.setString(1, email);
      pstmt.setString(2, password);

      try(ResultSet rs = pstmt.executeQuery())
      {
        if (!rs.next()) {
          return null;
        }

        Member member = new Member();
        member.no = rs.getInt("mno");
        member.name = rs.getString("name");
        member.email = rs.getString("email");
        member.createdDate = rs.getDate("cdt");
        return member;
      }
    }
  }

3단계 - 로그아웃 서블릿을 만든다. (로그아웃 처리)

-com.bitcamp.board.controller.LogoutController 클래스 생성

  • LogoutController class
@WebServlet("/auth/logout")
public class LogoutController extends HttpServlet{

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    try {
      HttpSession session = request.getSession();
      session.invalidate(); // 현재 세션을 무효화시킨다.

      response.sendRedirect("../"); // 로그아웃 한 후 메인 페이지를 요청하라고 명령한다.

    } catch(Exception e) {
      request.setAttribute("exception", e);
      request.getRequestDispatcher("/error.jsp").forward(request, response);
    }
  }
}

4단계 - 로그인할 때 입력한 사용자 이메일을 기억한다.

-com.bitcamp.board.controller.LoginController 클래스 변경

  • 로그인 이메일을 쿠키로 바꾸어 웹브라우저에게 보낸다.
  • /webapp/auth/form.jsp 변경
    • 쿠키 테이블에 보관된 이메일 정보를 꺼내 이메일 입력란에 출력한다.
profile
https://github.com/Dingadung

0개의 댓글