[Spring MVC]/Program source (Spring MVC)

[SpringMVC] 20240117 [프로그램 소스]

Jelly-fish 2024. 1. 17. 15:27

SpringMVCStudy

 

 

Mvc04


EmployeeList.jsp [관리자 직원 관리 페이지]

 

▶ 오늘까지 작성한 EmployeeList.jsp 최종 소스

 

 


EmployeeList.jsp (삭제 확인 confirm)


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