[SpringMVC] 20240117 [프로그램 소스]
SpringMVCStudy
Mvc04
EmployeeList.jsp [관리자 직원 관리 페이지]
▶ 오늘까지 작성한 EmployeeList.jsp 최종 소스
EmployeeList.jsp `<script>` 단 - delete 처리
// 삭제 버튼 클릭 시 액션 처리
$(".deleteBtn").click(function()
{
// 테스트
//alert("삭제 버튼 클릭");
//alert($(this).val());
if (confirm("현재 선택한 데이터를 정말 삭제하시겠습니까?"))
{
// 테스트
//alert("삭제 처리");
$(location).attr("href", "employeedelete.action?employeeId=" + $(this).val());
}
});
dispatcher-servlet.xml - delete 처리
<!-- DataSource 등록 → SimpleDriverDataSource -->
<bean id="localDataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@211.238.142.170:1521:xe"></property>
<property name="username" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>
<!-- 직원 -->
<bean id="employeeDAO" class="com.test.mvc.EmployeeDAO">
<property name="dataSource" ref="localDataSource"></property>
</bean>
<!-- 직원 삭제 처리 -->
<bean name="/employeedelete.action" class="com.test.mvc.EmployeeDeleteController">
<property name="dao" ref="employeeDAO"></property>
</bean>
EmployeeList.jsp 페이지에서 삭제 버튼 클릭으로 `employeedelete.action` URL 로 접근하면, 직원 삭제 컨트롤러 EmployeeDeleteController.java 실행.
EmployeeDeleteController.java
/*=================================
EmployeeDeleteController.java
- 사용자 정의 컨트롤러 클래스
===================================*/
package com.test.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
public class EmployeeDeleteController implements Controller
{
private IEmployeeDAO dao;
public void setDao(IEmployeeDAO dao)
{
this.dao = dao;
}
// 요청을 핸들링 하겠다는 메소드.
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 액션 코드
ModelAndView mav = new ModelAndView();
String employeeId = request.getParameter("employeeId");
try
{
dao.remove(employeeId);
mav.setViewName("redirect:employeelist.action");
} catch (Exception e)
{
System.out.println(e.toString());
}
return mav;
}
}
로그인
#33. LoginForm.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>LoginForm.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
$("#submitBtn").click(function()
{
// 테스트
//alert("확인");
if ($("#id").val()=="" || $("#pw").val()=="")
{
$("#err").html("항목을 모두 입력해야 합니다.").css("display", "inline");
return;
}
$("#loginForm").submit();
});
});
</script>
</head>
<body>
<!------------------------------------------------
#33. LoginForm.jsp
- 관리자 및 일반사원 로그인 폼 페이지
- ID(employeeId), PW(ssn2) 입력 폼 구성.
-------------------------------------------------->
<div>
<div>
<h1>로그인</h1>
<hr>
</div>
<!-- 콘텐츠 영역 -->
<div id="content">
<form action="login.action" method="post" id="loginForm">
<table>
<tr>
<th>
<label for="id">ID</label>
</th>
<td>
<input type="text" id="id" name="id" placeholder="아이디" required="required">
<input type="checkbox" id="admin" name="admin" value="0">
<label for="admin">admin</label>
</td>
</tr>
<tr>
<th>
<label for="pw">PW</label>
</th>
<td>
<input type="password" id="pw" name="pw" placeholder="패스워드" required="required">
</td>
</tr>
<tr style="height: 5px;">
<!-- 공간을 두기 위해 비어있는 tr -->
</tr>
<tr>
<th colspan="2">
<input type="button" value="로그인" id="submitBtn" class="btn"
style="width: 48%;">
<input type="reset" value="취소" id="resetBtn" class="btn"
style="width: 48%;">
<br /><br />
<span id="err" style="color: red; display: none;"></span>
</th>
</tr>
</table>
</form>
</div>
</div>
</body>
</html>
dispatcher-servlet [로그인 폼 접근]
<!-- Login 및 Logout 관련 Controller 등록 -->
<bean name="/loginform.action" class="com.test.mvc.LoginFormController" />
#34. LoginFormController.java
/*===================================================================
#34. LoginFormController.java
- 사용자 정의 컨트롤러 클래스
- 로그인 폼 요청에 대한 액션 수행
- 아마도... 사용자의 최초 요청 페이지이거나...
로그인을 거치지 않고 다른 페이지를 요청한 사용자가
안내받아 이동하게 되는 페이지
- 단순히 로그인 폼이 구성되어 있는 페이지를 뷰(View)로 제시
=====================================================================*/
package com.test.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
public class LoginFormController implements Controller
{
// 요청을 핸들링 하겠다는 메소드.
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 액션 코드
ModelAndView mav = new ModelAndView();
mav.setViewName("/WEB-INF/view/LoginForm.jsp");
return mav;
}
}
#35. LoginController.java
/*=================================================================================
#35. LoginController.java
- 사용자 정의 컨트롤러 클래스
- 로그인 액션 처리 전용 객체.
- DAO 에 대한 의존성 주입(DI)을 위한 준비
→ 인터페이스 형태의 자료형을 속성으로 구성
→ setter 메소드 구성
- 로그인 액션 처리 이후
├ 로그인 성공 → 세션 구성
│ ├ 관리자 로그인 성공 → employeelist.action 페이지를 다시 요청할 수 있도록 안내
│ └ 일반직원 로그인 성공 → emplist.action 페이지를 다시 요청할 수 있도록 안내
└로그인 실패 → loginform.action 페이지를 다시 요청할 수 있도록 안내.
===================================================================================*/
package com.test.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
public class LoginController implements Controller
{
//======================================
// 관리자 (ID / PW)
//======================================
// 강혜성 [id : 1, pw : 1234567(SSN2)]
//======================================
private IEmployeeDAO dao;
public void setDao(IEmployeeDAO dao)
{
this.dao = dao;
}
// 요청을 핸들링 하겠다는 메소드.
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 액션 코드
ModelAndView mav = new ModelAndView();
// 이전 페이지(LoginForm.jsp)로부터 넘어온 데이터 수신
//-- id, pw, admin
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String admin = request.getParameter("admin");
// 로그인 실패시, null 값을 반환하도록 처리해야 하므로
// 빈 문자열 "" 을 초기화 값으로 구성하지 말자.
//String name = null; --(Ⅹ)
String name = null;
try
{
// 로그인 처리 → 처리 대상에 대한 로그인 처리 방식 분기 / 구분
if (admin==null)
{
// 일반 직원 로그인
name = dao.login(id, pw);
} else
{
// 관리자 로그인
name = dao.loginAdmin(id, pw);
}
} catch (Exception e)
{
System.out.println(e.toString());
}
// 로그인 수행에 따른 성공 여부 확인 및 분기 / 구분
// [ 뷰 페이지 분기 ]===================================
// 로그인 성공 - 관리자
// mav.ViewName("redirect: employeelist.action");
// 로그인 성공 - 일반직원
// mav.ViewName("redirect: emplist.action");
// 로그인 실패 : mav.ViewName("redirect: loginform.action");
// ==============================================================
if (name==null)
{
// 로그인 실패 → 로그인 폼을 다시 요청할 수 있도록 안내
mav.setViewName("redirect:loginform.action");
}
else
{
// 로그인 성공 → 세션 구성 → 리스트 페이지를 다시 요청할 수 있도록 안내
HttpSession session = request.getSession();
session.setAttribute("name", name);
// 관리자로 로그인 성공한 것인지, 일반직원으로 로그인 성공한 것인지의 여부 확인.
if (admin==null) //-- 일반 직원으로 로그인을 성공한 상황
{
mav.setViewName("redirect:emplist.action");
}
else //-- 관리자로 로그인을 성공한 상황
{
session.setAttribute("admin", "");
mav.setViewName("redirect:employeelist.action");
}
}
return mav;
}
}
#36. LogoutController.java
/*===================================================================
#36. LogoutController.java
- 사용자 정의 컨트롤러 클래스
- 로그아웃 액션 처리 전용 객체.
- 세션에 구성된 속성값들 제거.
- 액션 처리 이후
다시 로그인 폼(loginform.action)을 요청할 수 있도록 안내.
=====================================================================*/
package com.test.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
public class LogoutController implements Controller
{
// 요청을 핸들링 하겠다는 메소드.
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 액션 코드
ModelAndView mav = new ModelAndView();
// 세션에 구성된 속성값들 제거
HttpSession session = request.getSession();
// ※ session.invalidate(); → 세션에 저장된 모든 속성 삭제
session.removeAttribute("name");
session.removeAttribute("admin");
// 로그아웃 뷰 페이지(→ 안전하게 로그아웃 처리되었음
// → 로그인 페이지로 돌아가기)
// 없이...
// 바로 로그인 페이지를 다시 요청할 수 있도록 안내
mav.setViewName("redirect:loginform.action");
return mav;
}
}
[로그인이 되어있지 않은 상황에서 관리자 전용 직원 관리 리스트 페이지 URL 요청 방지]
로그인 과정을 거치지 않았는데도,
`/employeelist.action` url을 주소창에 직접 작성하여 접근하는 것을 막기 위해 처리가 필요하다.
따라서, 로그인이 완료 되었을 때만 보내도록 구성해 놓도록 하자.
`request.getSession()`을 통해 세션이 존재하는지 확인하여
세션 안에 로그인 정보가 담겨져 있을 때만 EmployeeList.jsp 페이지를
열람할 수 있도록 구성한다.
[일반직원 로그인한 상태에서 관리자 전용 직원 관리 리스트 페이지 URL 요청 방지]
Session 에서 가져온 admin 속성이 `admin == null` 일 경우, 일반직원 로그인 이므로
관리자 전용
#37. EmpList.jsp [일반직원 전용 직원 목록 리스트]
일반 직원 조회 가능 항목 : 번호, 이름, 지역, 부서, 직위, 등급
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EmployeeList.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
</head>
<body>
<!--===========================================================
#37. EmpList.jsp
- 직원 리스트 출력 페이지
- 일반 직원이 접근하는 직원 데이터 출력 페이지
(관리자가 접근하는 직원 데이터 출력 페이지는
EmployeeList.jsp 로 구성)
- 제한된 항목
- 입력 / 수정 / 삭제 기능 없음
============================================================-->
<div>
<!-- 메뉴 영역 -->
<div>
<c:import url="EmployeeMenu.jsp"></c:import>
</div>
<!-- 콘텐츠 영역 -->
<div id="content">
<h1>[ 직원 목록 (일반직원 전용) ]</h1>
<hr />
<!-- 직원 추가 div 제거~!!! -->
<br /><br />
<!------------------------------------------------------------
EMPLOYEEID NAME DEPARTMENTNAME POSITIONNAME REGIONNAME GRADE
------------------------------------------------------------->
<table id="customers" class="table">
<tr>
<!-- 항목 15 EA -->
<th>번호</th>
<th>이름</th>
<th>지역</th>
<th>부서</th>
<th>직위</th>
<th>등급</th>
</tr>
<!--
<tr>
<td>1</td>
<td>고길동</td>
<td>서울</td>
<td>개발부</td>
<td>사원</td>
<td>관리자</td>
</tr>
<tr>
<td>2</td>
<td>도우너</td>
<td>서울</td>
<td>개발부</td>
<td>사원</td>
<td>일반사원</td>
</tr>
-->
<c:forEach var="employee" items="${employeeList }">
<tr>
<td>${employee.employeeId }</td>
<td>${employee.name }</td>
<td>${employee.regionName }</td>
<td>${employee.departmentName }</td>
<td>${employee.positionName }</td>
<%-- <td>${employee.grade }</td> --%>
<td>
${employee.grade == 0 ? "관리자" : "일반사원"}
</td>
</tr>
</c:forEach>
</table>
</div>
<!-- 회사 소개 및 어플리케이션 소개 영역 -->
<div id="footer">
</div>
</div>
</body>
</html>
dispatcher-servlet.xml
<!-- [일반직원 전용 직원 명단 페이지 접근] -->
<bean name="/emplist.action" class="com.test.mvc.EmpListController">
<property name="dao" ref="employeeDAO"></property>
</bean>
#38. EmpListController.java
/*===================================================================
#38. EmpListController.java
- 사용자 정의 컨트롤러 클래스
- 회원 리스트 페잊 요청에 대한 액션 처리
(일반 직원 전용)
- DAO 객체에 대한 의존성 주입(DI)를 위한 준비
→ 인터페이스 형태의 자료형을 속성으로 구성
→ setter 메소드 준비
=====================================================================*/
package com.test.mvc;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
// ※ Spring 의 『Controller』 인터페이스를 구현하는 방법을 통해
// 사용자 정의 컨트롤러 클래스를 구성한다.
// cf. Controller Annotation 활용
public class EmpListController implements Controller
{
private IEmployeeDAO dao;
public void setDao(IEmployeeDAO dao)
{
this.dao = dao;
}
// 요청을 핸들링 하겠다는 메소드.
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
// 액션 코드
ModelAndView mav = new ModelAndView();
// 로그인 여부만 확인 → 관리자인지 일반 직원인지 확인할 필요 없음.
// 세션 처리과정 추가 ---------------------------------------------
HttpSession session = request.getSession();
// 일반 직원 로그인 정보 없음.
if (session.getAttribute("name")==null) //-- 로그인이 되어 있지 않은 상황
{
mav.setViewName("redirect:loginform.action");
return mav;
}
// --------------------------------------------- 세션 처리과정 추가
ArrayList<Employee> employeeList = new ArrayList<Employee>();
try
{
employeeList = dao.list();
mav.addObject("employeeList", employeeList);
// 관리자일때, 로그인 정보 있을 때는 바로 이동.
mav.setViewName("/WEB-INF/view/EmpList.jsp");
} catch (Exception e)
{
System.out.println(e.toString());
}
return mav;
}
}
일반직원 전용 직원 명단 조회 페이지에서
메뉴바 구성 또한 변경해야 한다.
세션에 EL을 통해 접근할 때는, `sessionScope` 로 접근한다.
admin이
ⓐ `null` 이면서, name이 존재하면 일반 직원 `normar` 이고
ⓑ `null` 이 아니면 관리자 admin 이다.
그런데, insertForm 이나, updateForm 모두 관리자 권한으로 로그인 정보가 session 에 저장되어 있을 때만
페이지 접근이 가능해야 한다.
// EmployeeInsertFormController 수정.
HttpSession session = request.getSession();
if (session.getAttribute("admin")==null)
{
mav.setViewName("redirect:loginform.action");
return mav;
}
get 방식으로 url에 파라미터 값을 직접 넘겨서 직원 수정이 가능하기 때문에
formController 외에, 액션을 처리하는 Controller 도 관리자만 접근이 가능하도록 구성해야 한다.
ㅇ다른 Department, Region, Position 관리, 정보 조회 페이지를 직접 만들어서
내일 오전시간까지 완성하여 제출하도록 하자.
프로젝트 우클릭 export → WAR file
프로젝트 뒤에 언더바 자기 이름으로...
Mvc04_김지민.war