[JSP] login2-1


index.jsp
index.jsp 를 실행하면 바로 login.do 로 이동하게 됨. (1에서는 a 태그를 사용해서 버튼을 눌러야만 했었음)
get방식으로 서블릿 요청하기.
<%@ 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>
<%
response.sendRedirect("login.do");
%>
</body>
</html>
header.jsp
바뀌지 않고 계속 보이는 haeder 파일 만들기.
manager, member, non-member 이렇게 세개의 상황에 따라 다른 메뉴들과, 선택 가능한 항목만 (링크 연결되어있는 항목) 배경 색이 바뀌도록 하기. (javascript if를 쓸지, jstl 태그를 쓸지)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
a{
text-decoration : none;
}
td {
border : 1px solid #444444;
width : 200px;
text-align : center;
}
.login:hover{
background-color : #AFC7F9;
}
</style>
</head>
<body>
<table align="center">
<tr>
<!-- non-member page -->
<c:if test="${empty loginUser}">
<td></td>
<td></td>
<td><a href="login.do">log-in</a></td>
<td style="width:300px;">
member registration <br> <span style="color:red">(can use only manager)</span>
</td>
<td>
member's page <br> <span style="color:red">(can use only member)</span>
</td>
</c:if>
<!-- member / manager page -->
<c:if test="${!empty loginUser}">
<td>${loginUser.name}, hello!</td>
<td>level : ${loginUser.lev}</td>
<td class="login"><a href="logout.do">log-out</a></td>
<c:choose>
<c:when test="${result==2}">
<td class="login" style="width:300px;"><a href="custom.do">member registration </a></td>
</c:when>
<c:when test="${result==3}">
<td style="width:300px;">
member registration <br> <span style = "color:red">(can use only manager)</span>
</td>
</c:when>
</c:choose>
<td class="login">
<a href="mypage.do">member's page</a>
</td>
</c:if>
</tr>
</table>
</body>
</html>
login.jsp
로그인 입력 폼
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
td{
text-align ="center";
}
</style>
</head>
<body>
<form action="login.do" method="post">
<table>
<tr>
<td colspan="2">LOG-IN</td>
</tr>
<tr>
<td>ID</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>PASSWORD</td>
<td><input type="password" name="pwd"></td>
</tr>
<tr>
<td>LEVEL</td>
<td>
<select name = "lev">
<option value="A">manager</option>
<option value="B">user</option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="LOG-IN">
<input type="reset" value="reset">
</td>
</tr>
</table>
<div style="color:red; text-align: center;"> ${message} </div>
</form>
</body>
</html>
com.magic.dto - EmployeesVO.java
회원 테이블 정보를 저장할 VO클래스 만들기
package com.magic.dto;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class EmployeesVO {
private String id,pass,name,lev,phone;
private Date enter;
private Integer getnder;
@Override
public String toString() {
return "EmployeesVO [id=" + id + ", pass=" + pass + ", name=" + name + ", lev=" + lev + ", phone=" + phone
+ ", enter=" + enter + ", getnder=" + getnder + "]";
}
}
com.magic.dao - EmployeeDAO
쿼리문 처리하는 DAO 만들기
db 접속 세팅
메소드 단위 를 db랑 붙어서
싱글톤 패턴으로 만들기 (외부에서 생성이 안되고, 내부에서 한번만 생성된다)
package com.magic.dao;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class EmployeesDAO {
private static EmployeesDAO instance = new EmployeesDAO();
public EmployeesDAO() {
}
public static EmployeesDAO getInstance() {
return instance;
}
public Connection getConnection() throws Exception{
Connection conn = null;
Context initContext = null;
try {
initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/OracleDB");
conn = ds.getConnection();
}catch(NamingException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
}
com.magic.controller - LoginServlet.java (@WebServlet/login.do)
로그인 처리하기 위한 get메소드 post메소드
db연결해서 값 처리하기 위해 값을 입력해서 서브릿 요청이 들어올 떄 post와
index.jsp 에서 get 방식(링크에 의한 요청)으로 요청했으니 여기서도 doGet() 메소드를 이용하여 login.jsp 로 포워딩 하도록 한다.
컨트롤러 만들기(서블릿)
package com.magic.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;
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher rd = request.getRequestDispatcher("login.jsp"); //이동할 페이지
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
이제 여기까지가 index .jsp 를 실행했을 때 로그인 폼으로 바로 보이게끔 하는 작업을 했다.
doPost
유저 체크를 매개변수 세개를 이용해서 한다.
package com.magic.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 com.magic.dao.EmployeesDAO;
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher rd = request.getRequestDispatcher("login.jsp"); //이동할 페이지
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//한글처리
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String lev = request.getParameter("lev");
//파라미터 받아오기
String url = null; //페이지 이동시 사용할 변수 만들기
EmployeesDAO empDAO = EmployeesDAO.getInstance();
//DAO에서 userCheck() 만들기!
}
}
employeesDAO
이제 DAO에다가 다음에 사용할 userCheck() 를 만들어야한다.
package com.magic.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class EmployeesDAO {
private static EmployeesDAO instance = new EmployeesDAO();
public EmployeesDAO() {
// TODO Auto-generated constructor stub
}
public static EmployeesDAO getInstance() {
return instance;
}
public Connection getConnection() throws Exception{
Connection conn = null;
Context initContext = null;
try {
initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/OracleDB");
conn = ds.getConnection();
}catch(NamingException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
public int userCheck(String userid, String pwd, String lev) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from employees where id=?";
int result = 1;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userid);
rs = pstmt.executeQuery();
if(rs.next()) {
if(pwd.equals(rs.getString("psss"))) { //비밀번호 일치
if(lev.equals(rs.getString("lev"))) { //회원등급 일치
result = 2; //관리자로 로그인 성공
if(lev.equals("B")) {
result = 3; //일반회원 로그인 성공
}
}else { //level 불일치
result = 1;
}
}else { //비밀번호 불일지
result = 0;
}
}else { //아이디 불일치
result = -1;
}
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) rs.close();
if(conn!=null) rs.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
}
dao에서 로그인이 정상적으로 되었으면 2 또는 3이 return된다.
com.magic.controller - LoginServlet.java (@WebServlet/login.do)
dao에서 -1 0 1 2 3 중 하나를 받아서 각자에 맞는 페이지로 넘겨야한다.
회원 전용 페이지 (이름과 레벨 넣어야함)
개인정보가 넘어가야함
실행 결과를 VO 객체에 넣어서 사용할 수 있도록 한다. 받아온 값의 최종 목적은 db에서 활용하게 하는 것이다.
회원이 있다고 가정하고, 로그인을 위해 입력한 정보가 실제 db내용과 일치한지 확인한다.
조회된 정보를 VO 에 담아서 받아올 것이고, getMember() 를 만들어야한다.
package com.magic.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 com.magic.dao.EmployeesDAO;
import com.magic.dto.EmployeesVO;
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String lev = request.getParameter("lev");
String url = null;
EmployeesDAO empDAO = EmployeesDAO.getInstance();
int result = empDAO.userCheck(id,pwd,lev);
if(result == 2 || result ==3) {
EmployeesVO emp = new EmployeesVO();
}else {
}
}
employeesDAO
getMember 메소드 만들기
package com.magic.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import com.magic.dto.EmployeesVO;
public class EmployeesDAO {
private static EmployeesDAO instance = new EmployeesDAO();
public EmployeesDAO() {
}
public static EmployeesDAO getInstance() {
return instance;
}
public Connection getConnection() throws Exception{
Connection conn = null;
Context initContext = null;
try {
initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/OracleDB");
conn = ds.getConnection();
}catch(NamingException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
public int userCheck(String userid, String pwd, String lev) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from employees where id=?";
int result = 1;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,userid);
rs = pstmt.executeQuery();
if(rs.next()) {
if(pwd.equals(rs.getString("pass"))) { //비밀번호 일치
if(lev.equals(rs.getString("lev"))) { //회원등급 일치
result = 2; //관리자로 로그인 성공
if(lev.equals("B")) {
result = 3; //일반회원 로그인 성공
}
}else { //level 불일치
result = 1;
}
}else { //비밀번호 불일지
result = 0;
}
}else { //아이디 불일치
result = -1;
}
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) rs.close();
if(conn!=null) rs.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
public EmployeesVO getMember(String id) {
EmployeesVO member = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from employees where id=?";
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,id);
rs=pstmt.executeQuery();
if(rs.next()) {
member = new EmployeesVO();
member.setName(rs.getString(3));
member.setPass(rs.getString(2));
member.setPhone(rs.getString(7));
member.setId(rs.getString(1));
member.setLev(rs.getString(4));
member.setGender(rs.getInt(6));
member.setEnter(rs.getDate(5));
}
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) rs.close();
if(conn!=null) rs.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return member;
}
}
LoginServlet.java
getMember 메소드를 사용해서 받아온 id를 보낸 후, 해당 id의 EmployeesVO 7개를 emp 변수에 넣는다.
userCheck메소드를 사용해서 받아온 id, pwd, lev 를 보낸 후 member 나 manager 면 2 와 3을, 로그인에 성공하지 못하면 -1 , 0 , 1 를 받아와 result 변수에 넣는다.
session을 사용하여 emp 와 result 를 처리한다.
member나 manager면 main.jsp
member가 아니면 login.jsp 로 이동하게 하자.
package com.magic.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 com.magic.dao.EmployeesDAO;
import com.magic.dto.EmployeesVO;
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String lev = request.getParameter("lev");
String url = null;
EmployeesDAO empDAO = EmployeesDAO.getInstance();
int result = empDAO.userCheck(id,pwd,lev);
if(result == 2 || result ==3) {
EmployeesVO emp = new EmployeesVO();
emp = empDAO.getMember(id);
HttpSession session = request.getSession();
session.setAttribute("loginUser", emp);
session.setAttribute("result", result);
url="main.jsp";
}else {
if(result == 1) {
request.setAttribute("message", "don't match level");
}else if(result == 0 ){
request.setAttribute("message", "don't match password");
}else {
request.setAttribute("message", "don't match id");
}
url = "login.jsp";
}
RequestDispatcher rd = request.getRequestDispatcher(url);
rd.forward(request, response);
}
}