로그인 클릭하면
아래와같은 화면나오도록 jsp작성
로그인 버튼누르면 /login 으로 값보내도록설정하고
스크립트이용해 아이디와 비밀번호 칸이 입력되어있을때만 submit 작동하도록 하였다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
<link href="<%=request.getContextPath() %>/resources/css/loginpage-style.css" rel="stylesheet">
</head>
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<div class="wrapper">
<div class="outer">
<form class="loginArea" action="<%=request.getContextPath() %>/login" method="post" onsubmit="return validate();">
<h1>로그인</h1>
<h4>아이디</h4>
<span class="input_area">
<input type="text" name="userId" id="userId" placeholder="아이디를 입력하세요">
</span>
<h4>비밀번호</h4>
<span class="input_area">
<input type="password" name="userPwd" id="userPwd" placeholder="비밀번호를 입력하세요">
</span>
<h5>
<input type="checkbox" name="remember" id="remember"><label for="remember">아이디 기억하기</label>
</h5>
<span class="input_area">
<input type="submit" value="로그인">
</span>
</form>
</div>
</div>
<script>
function validate(){
let userId = document.getElementById('userId');
let userPwd = document.getElementById('userPwd');
if(userId.value.length <= 0){
alert("아이디를 입력해주세요!");
userId.select();
return false;
}
if(userPwd.value.length <= 0){
alert("비밀번호를 입력해주세요!");
userPwd.select();
return false;
}
return true;
}
</script>
</body>
</html>
전송버튼을 누르게되면 /login 으로 요청이되는데
비즈니스로직은 서블릿을통해 처리를하게된다.
a 태그로 이동하거나 주소표시줄에 직접타이핑해 접근하면
get방식으로 접근이되어서 doGet 메소드가 호출된다.
package member.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import member.model.vo.Member;
import member.service.MemberService;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/member/loginpage.jsp");
view.forward(request, response);
}
}
로그인창으로 이동이될것이다.
아이디 비밀번호 입력후 로그인버튼을누르면 post방식으로 db까지확인하는방식으로 이동한다
login.jsp => login.servlet => MemberService => MemberDAO
LoginServlet.java
아이디와 비밀번호 request.getParameter로 값받아서
MemberService 클래스로 전달해준다.
그리고 로그인에 성공하게되면
유저정보를 session에 저장하게된다.
session은 브라우저 에 저장되는 객체이므로
브라우저를 닫거나, 서버가 재가동되면 삭제된다.
package member.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import member.model.vo.Member;
import member.service.MemberService;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/member/loginpage.jsp");
view.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String userId = request.getParameter("userId");
String userPwd = request.getParameter("userPwd");
Member userLogin = new MemberService().loginMember(userId, userPwd);
String view = "";
if(userLogin == null) {
request.setAttribute("msg", "로그인에 실패하였습니다.");
view = "/WEB-INF/views/common/errorpage.jsp";
request.getRequestDispatcher(view).forward(request, response);
}else {
HttpSession session = request.getSession();
session.setAttribute("userLogin", userLogin);
response.sendRedirect(request.getContextPath());
}
}
}
MemberService.java
서비스에서는 커넥션연결과 DAO에 값을보내 값을받는방식을 이용한다.
package member.service;
import static common.JDBCTemplate.*;
import java.sql.Connection;
import member.model.dao.MemberDAO;
import member.model.vo.Member;
public class MemberService {
// 1. 로그인
public Member loginMember(String id, String pwd) {
Connection conn = getConnection();
Member loginUser = new MemberDAO().loginMember(conn, id, pwd);
return loginUser;
}
}
우선 JDBCTemplate
getConnection() 커넥션연결하는방식사용한다 .
연결 값은 properties 파일이용한다.
close() 메소드는 DAO에서 JDBC이용후 객체 닫을 때 이용한다.
commit/rollback은 db에서 insert, update, delete이용후 commit을 해줘야 반영이된다.
package common;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCTemplate {
// getConnection 연결
public static Connection getConnection() {
Connection conn = null;
Properties proper = new Properties();
String fileName = JDBCTemplate.class.getResource("/sql/driver.properties").getPath();
try {
proper.load(new FileReader(fileName));
Class.forName(proper.getProperty("dirver"));
conn = DriverManager.getConnection(proper.getProperty("url"), proper.getProperty("id"), proper.getProperty("pw"));
conn.setAutoCommit(false);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 닫기
public static void close(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement stmt) {
try {
if(stmt != null && !stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs) {
try {
if(rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// commit
public static void commit(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.commit();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// rollback
public static void rollback(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.rollback();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
MemberDAO
sql쿼리문도 직접작성하지않고
xml파일에 미리작성해두고 사용하는 방식을사용하였다.
만약 아이디와 비밀번호가일치하면 사용자의 정보를 Member객체로 반환한다.
만약 일치하지않을시 null이 반환될것이다.
package member.model.dao;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import member.model.vo.Member;
import static common.JDBCTemplate.close;
public class MemberDAO {
Properties prop = new Properties();
public MemberDAO() {
String fileName = MemberDAO.class.getResource("/sql/member/member-query.xml").getPath();
try {
prop.loadFromXML(new FileInputStream(fileName));
} catch (IOException e) {
e.printStackTrace();
}
}
// 1. 로그인 기능
public Member loginMember(Connection conn, String id, String pwd) {
PreparedStatement pstmt = null;
ResultSet rs = null;
Member member = null;
String sql = prop.getProperty("loginMember");
// System.out.println(sql);
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
if(rs.next()) {
member = new Member(
rs.getInt("USER_NO"),
rs.getString("USER_ID"),
rs.getString("USER_PWD"),
rs.getString("USER_NAME"),
rs.getString("PHONE"),
rs.getString("EMAIL"),
rs.getString("ADDRESS"),
rs.getString("INTEREST"),
rs.getDate("ENROLL_DATE"),
rs.getDate("MODIFY_DATE"),
rs.getString("STATUS")
);
// System.out.println(member);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs);
close(pstmt);
}
return member;
}
}
로그인 안했을시 화면
로그인 했을시 화면
만약 로그인을 했는데도 정보수정 로그아웃 이라는 버튼이안나오게되면 session쪽을 확인해보면 될것이다.
'프로그래밍 > JSP' 카테고리의 다른 글
JSP - 미니 프로젝트(4. 회원가입) (1) | 2021.08.23 |
---|---|
JSP - 미니 프로젝트(3. 로그아웃) (0) | 2021.08.23 |
JSP - 미니 프로젝트(1.메인페이지) (1) | 2021.08.23 |
JSP - 미니 프로젝트 INTRO (0) | 2021.08.23 |
JSP (0) | 2021.08.18 |