보라코딩

Day76_230414_ JSP, MyBatis (MVC패턴) 뒤에 중요한 내용! 본문

코딩/Servlet, JSP, MyBatis

Day76_230414_ JSP, MyBatis (MVC패턴) 뒤에 중요한 내용!

new 보라 2023. 4. 14. 17:35
동적검색결과

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시간(main)</title>
<script>
function all_search(frm){
//alert(frm);
//location.href="list.jsp"; //모델1방식
//location.href="list"; //컨트롤러 요청방 처리(GET)
frm.action = "list"; //컨트롤러 요청
frm.submit();
}

function dept_search(frm){
frm.action = "dept"
frm.submit();
}

function fullname_search(frm){
frm.action = "fullname";
frm.submit();
}

function search_go(frm){
frm.action = "search"; //검색페이지로 이동
frm.submit();
}
</script>
</head>
<body>
<h1>작업선택 [index.jsp]</h1>
<form method="post" name="testForm">
<!-- <button onclick="all_search(this.form)">전체보기</button> -->
<input type="button" value="전체보기" onclick="all_search(this.form)">
<input type="button" value="부서코드검색" onclick="dept_search(this.form)">
<input type="button" value="이름검색" onclick="fullname_search(this.form)">

<input type="button" value="동적검색" onclick="search_go(this.form)">

</form>

</body>
</html>

 

 

 

search.jsp

<%@ 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>
<h1>동적검색 [search.jsp]</h1>
<form action="search" method="get"> <!-- 검색(결과)목록 보기-->
<select name="idx">
<option value="0">사번</option>
<option value="1">이름</option>
<option value="2">직종</option>
<option value="3">부서</option>
</select>
<input type="text" name="keyword">
<input type="submit" name="동적검색">
</form>
</body>
</html>

 

 

 

SearchController.java

package com.mystudy.controller;

import java.io.IOException;
import java.util.List;

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.mystudy.model.dao.EmployeeDAO;
import com.mystudy.model.vo.EmployeeVO;

@WebServlet("/search")
public class SearchController extends HttpServlet{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("SearchController의 doGet() 실행~");
// 검색페이지로 또는 검색결과 페이지로 이동
//1. 파라미터값 확인(추출)
String idx = req.getParameter("idx");
String keyword = req.getParameter("keyword");
System.out.println("idx :" + idx + ", keyword : " + keyword);

// 단순 페이지 전환인지 검색결과 페이지로 이동인지 결정
// 단순 페이지 전환 : search.jsp 이동
// 검색 결과페이지 이동 : searchList.jsp 이동
if (keyword == null) {
req.getRequestDispatcher("search.jsp").forward(req, resp);
return;



// DB 데이터 조회
List<EmployeeVO> list = EmployeeDAO.getSearch(idx, keyword);

req.setAttribute("list", list);

//검색요청에 대한 처리
req.getRequestDispatcher("searchList.jsp").forward(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("SearchController의 doPost() 실행~");
req.setCharacterEncoding("UTF-8");
doGet(req, resp);
}
}

 

 

mapper

<!-- 동적검색 idx가 0:사번 1:이름 2:직종 3:부서-->
<select id="search" parameterType="map" resultType="employeeVO">
SELECT * FROM EMPLOYEES
where 1 = 1
<if test="idx == 0">
and EMPLOYEE_ID =#{keyword}
</if>
<if test="idx == 1">
and (FIRST_NAME = INITCAP(#{keyword}) OR LAST_NAME = INITCAP(#{keyword}))
</if>
<if test='idx.equals("2")'>
and JOB_ID = #{keyword}
</if>
<if test='idx.equals("3")'>
and DEPARTMENT_ID = #{keyword}
</if>
ORDER BY EMPLOYEE_ID
</select>

 

 

dao

public static List<EmployeeVO> getSearch(String idx, String keyword) {
Map<String, String> map = new HashMap<String, String>();
map.put("idx",idx);
map.put("keyword",keyword);

SqlSession ss = DBService.getFactory().openSession();
List<EmployeeVO> list = ss.selectList("hr.search",map);
ss.close();

return list;
}

 

 

12_MVC_HR.zip
7.20MB

 

 


FrontController

 

 

index를 FrontController 하나로 가게 다 바꿔 놓고

대신 type으로 파라미터를 하나씩 주었다.

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시간(main)</title>
<script>
function all_search(frm){
//alert(frm);
//location.href="list.jsp"; //모델1방식
//location.href="list"; //컨트롤러 요청방 처리(GET)
frm.action = "controller?type=list"; //컨트롤러 요청
frm.submit();
}

function dept_search(frm){
frm.action = "controller?type=dept"
frm.submit();
}

function fullname_search(frm){
frm.action = "controller?type=fullname";
frm.submit();
}

function search_go(frm){
frm.action = "controller?type=search"; //검색페이지로 이동
frm.submit();
}
</script>
</head>
<body>
<h1>작업선택 [index.jsp]</h1>
<form method="post" name="testForm">
<!-- <button onclick="all_search(this.form)">전체보기</button> -->
<input type="button" value="전체보기" onclick="all_search(this.form)">
<input type="button" value="부서코드검색" onclick="dept_search(this.form)">
<input type="button" value="이름검색" onclick="fullname_search(this.form)">

<input type="button" value="동적검색" onclick="search_go(this.form)">

</form>

</body>
</html>

 

 

 

FrontController.java

package com.mystudy.front_controller;

import java.io.IOException;
import java.util.List;

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.mystudy.model.dao.EmployeeDAO;
import com.mystudy.model.vo.EmployeeVO;

@WebServlet("/controller")
public class FrontController extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(">> FrontController doGet() 실행 ===========");
String type = req.getParameter("type");
System.out.println("type : "+ type);
if(type.equals("list")) {
System.out.println("* list 요청에 대한 처리");
// DB 데이터 조회 후 list.jsp페이지로 전달
//1. DB 연동작업
List<EmployeeVO> list = EmployeeDAO.getList();
System.out.println("list : "+ list);

//2. 응답페이지(list.jsp)에 전달(request 객체에 저장해서 전달)
//forwarding처리 scope상에 저장(page는 못써)
req.setAttribute("list", list);

//3. 페이지전환 - 응답할 페이지(list.jsp)로 포워딩
req.getRequestDispatcher("list.jsp").forward(req, resp);
}

if(type.equals("dept")) {
req.getRequestDispatcher("dept.jsp").forward(req, resp);
} else if(type.equals("deptList")) {
// 전달받은 부서코드로 DB데이터 조회 후 deptList.jsp 응답처리(위임처리)
//1. 전달받은 파라미터값(부서코드:deptno) 추출(확인)
int deptno = Integer.parseInt(req.getParameter("deptno"));
System.out.println(deptno);

//2. DB 연동작업 : 해당부서(deptno와 일치)에 있는 직원조회(DAO사용)
List<EmployeeVO> list = EmployeeDAO.getDept(deptno);

//3. 조회된 데이터를 응답페이지(deptList.jsp)에서 사용하도록 scope 상에 저장
req.setAttribute("list", list);

//4. 응답페이지(deptList.jsp)로 이동(응답 위임 처리)
req.getRequestDispatcher("deptList.jsp").forward(req, resp);
}

if(type.equals("fullname")) {
req.getRequestDispatcher("fullname.jsp").forward(req, resp);
} else if(type.equals("fullnameList")) {
String fullname = req.getParameter("fullname");
System.out.println(fullname);

List<EmployeeVO> list = EmployeeDAO.getFullnameList(fullname);

req.setAttribute("list", list);

req.getRequestDispatcher("fullnameList.jsp").forward(req, resp);
}

if(type.equals("search")) {
String idx = req.getParameter("idx");
String keyword = req.getParameter("keyword");
System.out.println("idx :" + idx + ", keyword : " + keyword);

if (keyword == null) {
req.getRequestDispatcher("search.jsp").forward(req, resp);
return;


List<EmployeeVO> list = EmployeeDAO.getSearch(idx, keyword);

String title = "";
switch (idx) {
case "0": title = "사번";  break;
case "1": title = "이름";  break;
case "2": title = "직종";  break;
case "3": title = "부서";  break;
}

req.setAttribute("list", list);
req.setAttribute("title", title);
req.getRequestDispatcher("searchList.jsp").forward(req, resp);
}

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(">> FrontController doPost() 실행 ===========");
req.setCharacterEncoding("UTF-8");
doGet(req, resp);
}

}

 


이후

FrontController 보기 편하게 모두 class로 만들었다.

 

SearchCommand.java

package com.mystudy.model.command;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.mystudy.model.dao.EmployeeDAO;
import com.mystudy.model.vo.EmployeeVO;

public class SearchCommand implements Command{

@Override
public String exec(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String idx = req.getParameter("idx");
String keyword = req.getParameter("keyword");
System.out.println("idx :" + idx + ", keyword : " + keyword);

if (keyword == null) {
return "search.jsp";


List<EmployeeVO> list = EmployeeDAO.getSearch(idx, keyword);

String title = "";
switch (idx) {
case "0": title = "사번";  break;
case "1": title = "이름";  break;
case "2": title = "직종";  break;
case "3": title = "부서";  break;
}

req.setAttribute("list", list);
req.setAttribute("title", title);
//req.getRequestDispatcher("searchList.jsp").forward(req, resp);

return "searchList.jsp";
}

}

 

리턴타입 String으로 해서 가야할 위치를 리턴했다. (.jsp)

 

 

FrontController.java

package com.mystudy.front_controller;

import java.io.IOException;
import java.util.List;

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.mystudy.model.command.DeptCommand;
import com.mystudy.model.command.DeptListCommand;
import com.mystudy.model.command.ListCommand;
import com.mystudy.model.command.SearchCommand;
import com.mystudy.model.command.FullnameCommand;
import com.mystudy.model.command.FullnameListCommand;
import com.mystudy.model.dao.EmployeeDAO;
import com.mystudy.model.vo.EmployeeVO;

@WebServlet("/controller")
public class FrontControllerCommand extends HttpServlet {

private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(">> FrontController doGet() 실행 ===========");
String type = req.getParameter("type");
System.out.println("type : "+ type);

if(type.equals("list")) {
ListCommand command = new ListCommand();
String path = command.exec(req, resp);
req.getRequestDispatcher(path).forward(req, resp);
}

if(type.equals("dept")) {
DeptCommand command = new DeptCommand();
String path = command.exec(req, resp);
req.getRequestDispatcher(path).forward(req, resp);


if(type.equals("deptList")) {
DeptListCommand command = new DeptListCommand();
String path = command.exec(req, resp);
req.getRequestDispatcher(path).forward(req, resp);
}

if(type.equals("fullname")) {
FullnameCommand command = new FullnameCommand();
String path = command.exec(req, resp);
req.getRequestDispatcher(path).forward(req, resp);
}

if(type.equals("fullnameList")) {
FullnameListCommand command = new FullnameListCommand();
String path = command.exec(req, resp);
req.getRequestDispatcher(path).forward(req, resp);
}

if(type.equals("search")) {
SearchCommand command = new SearchCommand();
String path = command.exec(req, resp);
req.getRequestDispatcher(path).forward(req, resp);
}
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(">> FrontController doPost() 실행 ===========");
req.setCharacterEncoding("UTF-8");
doGet(req, resp);
}

}

 

깔끔해졌다

 


 

여기서 더 간단하게!!!

Command 인터페이스로 변경하였고

반복되는 코드를 if 문 밖으로 빼냈다.

 

 

 

 


 

여기에 더 !!!
init과 Map을 사용했다!!!

(매번 객체생성하지 않게)

 

 

 


 

index는 webContent 밑에 넣었고

나머지는 employees 안에 넣었다

그럼 변경해주어야 할 것이

 

 

인덱스 화면에서

employees/를 추가했고

 

 

 

컨트롤러에서도 잘 받을 수 있게

@WebServlet("/employees/controller")

이렇게 바꾸어주었다.

 

 

 

13_MVC_HR_FrontController.zip
7.18MB