Jsp & Servlet : Pojo3-1

지환·2023년 12월 15일
0

Jsp & Servlet

목록 보기
20/21
post-thumbnail

Pojo3 클래스설계

내려간다~

  1. xxxx.gd3 요청

  2. ActionServlet -> HandlerMapping

    • 메소드를 호출하는데, request, response가 포함되어있다.

    • 이전까진, doGet(req,res) : void로 되어 있었지만, 결합도를 낮추기 위해 설정했다.

  3. HandlerMapping -> Board2Controller

  4. Board2Controller -> Board2Logic

  5. Board2Logic -> Board2Dao

  6. Board2Dao -> DB

올라간다~

  1. DB -> Board2Dao

  2. Board2Dao -> Board2Logic

  3. Board2Logic-> Board2Controller

  4. Board2Controller ->ActionSuppoer로 넘어가는데,

    • 이 때, 리턴하는 방법이 중요하다.

    • 이전까진, ActionForward -> String로 했지만, Object로 설정했다.

    • 특이한 점은 ModelAndView라는건데, 이 부분으로 SELECT문을 처리하기 위해 클래스를 하나 설계했다.(여기서 경로를 잡아줌)

      • ModelAndView인 경우 : ViewResolver를 호출해서 /WEB-INF/jsp/XXX.jsp를 설정한다. 이 값을 다시 ActionSupport에 전송한다(응답URL) 그리고 나서 url에 뿌려준다.

obj 경우의 수

obj = controller.boardList

obj(List<Map>) = controller.boardDetail(req,res)

  • 1건만 가져옴

  • if(list.size() ==1) list는 row를 의미한다. list.size() ==1은 하나를 찾았다는 얘기다.

  • List<Map>인가? -> 마이바티스에서 받아오는 타입 객체 자체가 List<Map>이다.

		if("boardList".equals(upmu[1])) {//select - 1-3버전에서는 이 장면을 메소드 단위로 변경하고 싶다(req, res)넘겨 받을 수 있어야 한다. -문제 해결못하니까
			logger.info("boardList");
			List<Map<String ,Object>> bList = null;//nList.size()가 n개 
			// NoticeLogic의 메소드 호출 - 객체주입 - 내가(책임) 아님 스프링(제어역전)
			hmb.bind(pMap);  
			bList = bLogic.boardList(pMap);      
			//원본에다가 담아 두자
			req.setAttribute("bList", bList);
			//pageMove[0]=forward, pageMove[1]=/board/boardList.jsp
			path = "forward:board/boardList"; 
		}//end of 목록조회
		//상세조회일때 - select - 1건 - Map or VO괜찮아 - read.jsp
		else if("boardDetail".equals(upmu[1])) {
			logger.info("boardDetail");
			List<Map<String ,Object>> bList = null;//nList.size()=1
			// NoticeLogic의 메소드 호출 - 객체주입 - 내가(책임) 아님 스프링(제어역전)
			//select * from notice where n_no=5;
			hmb.bind(pMap);
			bList = bLogic.boardList(pMap);
			//원본에다가 담아 두자
			req.setAttribute("bList", bList);
			path="forward:/board/boardDetail.jsp";
		}

둘 다 bList = bLogic.boardList(pMap); 하는 것을 볼 수 있다.

두 개는 페이지처리가 달리된다. SelectList가 됐을 떄랑, SelectDetail이 됐을 떄

  • pk로 조건만 주면 된다.

obj(int) = controller.boardInsert(req,res) / update / Delete

ModelAndView

  1. select (List<Map>) -> jsp -> 유지 -> request -> 서블릿과 의존관계가있다.
    1-1) List : Row

    1-2) Map : Colum

  2. 서블릿으로부터 완전한 독립이 안 된다. -> 불만 -> Spring 2.0

  3. request, response가 없이는 나는 웹 서비스를 구현할 수 없어요

  4. 전체조회를 하고 싶음 n건을 보여줘야함

    1. ModelAndView에 List<Map>이 필요한 이유

    2. HttpServletRequest --> 나는 왜 주입을 받을까?? (req,res)를 사용하기 위해서

      • req.setAttribute("list", new ArrayList<>());

        • 이렇게 넘겨주면 빈깡통이 넘어가는게 아닌가?
      • SELECT일떈, Object 타입이 필요하다 유지되어야한다.

      • 자바와 jsp 사이에서 유지에 대해서 문제를 해결해야한다.

      • ModelAndView는 어디서 사용하는가? -> 컨트롤러(ActionSupport)에서 사용된다. --> 응답페이지에 대한 책임(관심사)는 MVC패턴 통해서 컨트롤 계층에 있다.

      • 어디서 주입받죠? (ActionSupport) 주입받는다.(여기가 원천이다.) 얘가 진또배기

      • xxxController는 서블릿이 아니다. Controller 인터페이스의 추상메소드로 구현 된 것 뿐이다. --> 실질적인 주인은 (ActionSupport)

xxx Controller에서 if문으로 분기하고 있는데, 이 부분을 해결하기 위해서 HandlerMapping을 구현했다.

  	if("boardList".equals(upmu[1])) {//select - 1-3버전에서는 이 장면을 메소드 단위로 변경하고 싶다(req, res)넘겨 받을 수 있어야 한다. -문제 해결못하니까
			logger.info("boardList");
			List<Map<String ,Object>> bList = null;//nList.size()가 n개 
			// NoticeLogic의 메소드 호출 - 객체주입 - 내가(책임) 아님 스프링(제어역전)
			hmb.bind(pMap);  
			bList = bLogic.boardList(pMap);      
			//원본에다가 담아 두자
			req.setAttribute("bList", bList);
			//pageMove[0]=forward, pageMove[1]=/board/boardList.jsp
			path = "forward:board/boardList"; 
		}
  

[내가생각한리뷰]

Controller3은 인터페이스로 정의했음. execute메소드를 갖고있고, 중요한 부분은 리턴타입이 Object이다. Controller3인터페이스를
구현하는 구현체는 Board2Controller이다. 이 부분은 클래스별로 구현예정
Controller3 controller = new Board2Controller();
Controller3 controller = new Notice2Controller();
Controller3 controller = new MemberController();

  1. 이 부분을 깔뗴기로 사용하는건데, 실질적인 구현체(Board2Controller)는 xxxHandlerMapping에서 사용함
		Controller3 controller = null;
		if("board".equals(upmu[0]))
		{ // 인터페이스 - 구현체
			controller = new Board2Controller();
		}

HandlerMapping

  • public static Object getController(String[] upmu,HttpServletRequest req, HttpServletResponse res)

    • 파라미터로 upmu, req, res를 받는다. -> 어디에서 (upmu,req,res)를 주입는가? -> (ActionSupport)
    • 그러면 실질적으로 이 HandlerMapping을 사용하는 곳에서 xxx = HandlerMapping.getController(upmu,req,res)를 주입 할 수 있다.
      • static 타입이므로 ==> 클래스명.getController(upmu,req,res)
  • 여기 안에서 Controller3 controller = null;로 받는 이유는 무엇일까?

    • Controller3는 인터페이스이다. if문으로 분기하여 클래스를 인스턴스화해야되기 떄문에 인터페이스 클래스가 전역변수에 선언되어야한다.
  • if("board".equals(upmu[0]))

    • upmu배열이 필요한 이유다. 이 부분을 통해서 경로를 정한다
    • upmu[0] : board upmu[1] : boardList가 들어있다고 가정해보자.
      • board[workName] 이므로, WorkName으로 조건을 분기하여 클래스를 생성한다.
  • 이전에는 ActionServelt if문으로 분기하여

[ActionServelt]

if("board".equals(upmu[0])) {
			logger.info("workname - board - execute호출");
			req.setAttribute("upmu",upmu);
			result = controller.execute(req, res);
		}

이렇게 진행했지만, 핸들러매핑클래스를 통해서 분기를 나눠 처리한다.

[HandelrMapping]

if("board".equals(upmu[0]))
		{ // 인터페이스 - 구현체
			controller = new Board2Controller();
		}
		
		else if("notice".equals(upmu[0]))
		{
			
		}
		
		else if("board2".equals(upmu[0]))
		{
			
		}

이렇게 처리했다.

근데 HandlerMapping 어떤식으로 사용할까? (의문)

  • 그러면 실질적으로 이 HandlerMapping을 사용하는 곳에서 xxx = HandlerMapping.getController(upmu,req,res)를 주입 할 수 있다.

  • ActionServlet에서 실행


Controller3

  1. 1,2와는 다르게 컨트롤 클래스부터 메소드를 쪼갠다.
  2. 메소드마다 req,res를 주입받을 수 있어야한다.
  package com.example.demo.pojo3;

import java.io.IOException;

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

public interface Controller3 {
	
	public Object execute(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException;
	
	public Object boardList(HttpServletRequest req, HttpServletResponse res);
	public Object jsonboardList(HttpServletRequest req, HttpServletResponse res);
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res);
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res);
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res);
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res);
	public Object imageDownload(HttpServletRequest req, HttpServletResponse res);
	public Object imageUpload(HttpServletRequest req, HttpServletResponse res);
	public Object imageGet(HttpServletRequest req, HttpServletResponse res);
	
	

}

  

[Board2Controller]- 이것도 타입에 맞게 변경하면된다.

package com.example.demo.pojo3;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.example.demo.pojo2.BoardController;

public class Board2Controller implements Controller3 {
	Logger logger = Logger.getLogger(Board2Controller.class);
	@Override
	public Object execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		return null;
	}

	@Override
	public Object boardList(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object jsonboardList(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object imageDownload(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object imageUpload(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object imageGet(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

}

  

TestCase1) localhost:8000/board2/boardList.gd3

(logic/dao 처리 아직 안함)

  1. ActionSupport에서 (*.gd3) 이므로 해당 url를 가로챈다.

    1-1. 배열에 담기고

    • upmu[0] : board2
    • upmu[1] : boardList
  2. obj = HandlerMapping.getController(upmu, req, res); 이 부분에서

    배열이 함께 넘어감 (req,res)를 같이넘겨준다. -> HandlerMapping에

  3. HandlerMapping

    3-1. boardList에 걸려서 이 떄, obj = controller.boardList(req, res);를 통해서 req,res를 넘겨준다.(원본)

    3-2. Controller는 인터페이스이다. 구현체는 board2Controller이다.

    • obj = controller.boardList(req, res); 이부분은 응답값을 받기 전까지 멈춰있다.
  4. board2Controller로 넘어간 다음에 public Object boardList메소드 호출하고 -->logger.info를 출력한다.

  5. 그 응답값으로 obj로 받는데, obj로 조건문 분기를 시작한다. 근데 여기선 Controller처리를 따로 하지 않았기 떄문에,

  • null값이 리턴된다.

HandlerMapping 타는지 보자.

이렇게 컨트롤러(board2Controller)를 수정하고 다시시도해보자.

이렇게 나온다.

  1. 3-2에서 응답값을 받아온 다음에 obj를 리턴한다. (obj ="안녕하세요")

  2. 그러면 다시 ActionSupport로 돌아와서

    이 부분 수행을 끝내고

    obj에 대한 if문 분기를 시작한다. 하지만 path에 대한 정보가 없기 떄문에 아무것도 해당되는 사항이 없기 떄문에 끝난다.

  package com.example.demo.pojo3;

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

// if문을 클래스로 설계하자.



/*
 * Why Object ? --> 모든 리턴타입에 대한 처리를 받아야 되기 때문에,
 */
public class HandlerMapping {
	// 개발자가 정의한 사용자 정의 메소드 (req,res)를 메소드의 파라미터로 받아야 하니깐 서블릿과 의존관계가 있다.
	public static Object getController(String[] upmu,HttpServletRequest req, HttpServletResponse res) {
		Controller3 controller = null;
		Object obj = null; 
		ModelAndView mav = null; //ModelAndView
		
		if("board2".equals(upmu[0]))
		{ // 인터페이스 - 구현체
			controller = new Board2Controller();
			if("boardList".equals(upmu[1]))
			{
				obj = controller.boardList(req, res);
				if(obj instanceof ModelAndView) // obj가 ModelAndView타입이야?
				{
					return (ModelAndView)obj;
				}
				
				
				else if(obj instanceof String)
				{
					return (String)obj;
				}
				
			}/////////end of boardList			
			
			else if("boardDetail".equals(upmu[1]))
			{
				obj = controller.boardDetail(req, res);
				if(obj instanceof ModelAndView) // obj가 ModelAndView타입이야?
				{
					return (ModelAndView)obj;
				}
				else if(obj instanceof String)
				{
					return (String)obj;
				}
				
			}/////////end of boardDetail		
			
			
			else if("jsonboardList".equals(upmu[1]))
			{
				obj = controller.jsonboardList(req, res);
				if(obj instanceof ModelAndView) // obj가 ModelAndView타입이야?
				{
					return (ModelAndView)obj;
				}
				else if(obj instanceof String)
				{
					return (String)obj;
				}
				
			}/////////end of jsonboardList		
			
			
			else if("boardInsert".equals(upmu[1]))
			{
				obj = controller.boardInsert(req, res);
// ModelAndView가 필요없다. ModelAndView는 select일떄만 사용
				if(obj instanceof String)
				{
					return (String)obj;
				}
				
			}/////////end of boardInsert	
			
			else if("boardUpdate".equals(upmu[1]))
			{
				obj = controller.boardUpdate(req, res);
// ModelAndView가 필요없다. ModelAndView는 select일떄만 사용
				if(obj instanceof String)
				{
					return (String)obj;
				}
				
			}/////////end of boardUpdate
			
			
			else if("boardDelete".equals(upmu[1]))
			{
				obj = controller.boardDelete(req, res);
// ModelAndView가 필요없다. ModelAndView는 select일떄만 사용
				if(obj instanceof String)
				{
					return (String)obj;
				}
				
			}/////////end of boardDelete
			
			
		}///////////////////////////////end of Board2
		
		

		
		
		
		
		else if("notice".equals(upmu[0]))
		{
			
		}
		
		else if("board2".equals(upmu[0]))
		{
			
		}
		
		
		return null;
	}

}

  

ActionSupport

  package com.example.demo.pojo3;

import java.io.IOException;
import java.io.PrintWriter;

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 org.apache.log4j.Logger;

//Dispatcher Servlet이라는 얘기
@WebServlet("*.gd3")
public class ActionSupport extends HttpServlet {
	Logger logger = Logger.getLogger(Board2Controller.class);
	
	protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		String  uri = req.getRequestURI(); // => /notice/noticeInsert.gd?n_title=a&n_content=b
		logger.info(uri);
		String context = req.getContextPath();// /
		logger.info(context);
		String command = uri.substring(context.length()+1);//-> notice/noticeInsert.gd
		logger.info(command);
		//뒤에 의미없는 확장자 gd를 잘라내기
		int end = command.lastIndexOf(".");//점이 있는 위치정보를 가져온다
		logger.info(""+end);
		command =  command.substring(0,end);//-> notice/noticeInsert까지만 가져온다. .gd는 빼고서....
		logger.info(command);//-> notice/noticeList or notice/noticeInsert or notice/noticeUpdate or notice/noticeDelete
		String upmu[] = null;
		String result = null;//-> redirect:/board/boardList.jsp,  forward:/board/boardList.jsp
		upmu = command.split("/");
		
		//여기서 getController() 호출할거야.
		Object obj = null;
		try {
			// 이 요청을 어떤 컨트롤러 클래스가 담당하나요?
			/*
			 * 달라진점 request를 사용하는게 아니라, 
			 * req.setAttribute("upmu",upmu);
			 */
			obj = HandlerMapping.getController(upmu, req, res);
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		//viewResolver와 관련된 코드 시작함
		//getController가 호출된 다음에 반드시 --> 리턴타입을 받아서 처리해야함
		//NullPointerException 처리
		if(obj == null)
			//obj는 result와 같은역할 url를 가지고있다.
		{
			String pageMove[] = null;
			ModelAndView mav = null; // 화면처리를 위해서
			//너 String 타입이니? -- 경우는 2가지 (json, path)
			// path 안에 ":" 이 포함되어 있어? -> redirect or forward
			if(obj instanceof String) {
				if(((String)obj).contains(":")) {
					pageMove = obj.toString().split(":");
				}
				else if(((String)obj).contains("/"))
				{
					pageMove = obj.toString().split("/");
				}
				else { // " : " 도 없고 " / " 도 없는 경우라면 else로 넘어옴
					// 단순한 문자열을 반환하는 경우
					// String path = "avatar.png"
					
					pageMove =  new String[1];//"avatar.png ==> 하나만생성
					pageMove[0] = obj.toString(); // 파일이름인 경우
					
					
				}
				
			}
			
			else if (obj instanceof ModelAndView)
			{
				mav = (ModelAndView)obj;
				pageMove = new String[2];
				pageMove[0] = "forward";
				pageMove[1] = mav.getViewName(); //화면의 이름을 가져온다.
				logger.info("pageMove ==>" + pageMove[0]+","+pageMove[1]);
			}
			
			
			else if (obj instanceof byte[]) //응답이 png일때, Quill Editor일때,
			{
				res.setContentType("image/png:utf-8");
				PrintWriter out = res.getWriter();
				out.print(obj);
				
			}
			
			if(pageMove != null && pageMove.length == 2)
			{
				logger.info("pageMove 원소의 개수가 2개일 떄,");
				String path = pageMove[1];
				if("redirect".equals(pageMove[0]))
				{
					res.sendRedirect(path);
				}
				else if("forward".equals(pageMove[0]))
				{
						RequestDispatcher view = req.getRequestDispatcher(path);
						view.forward(req, res);
						
				}
				else {
					path = pageMove[0] +"/"+pageMove[1];//board/boardList
					// /WEB-INF/jsp/board/boardList.jsp -> spring ViewResolver
					RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/jsp/"+path+".jsp");
					view.forward(req, res);					
				}
			}////////////////////////////end of if 
			
			
			else if(pageMove != null && pageMove.length == 1)
			{// 이미지를 선택했을 떄, 디비에 넣었을 떄, 파일에 넣었을때, 파일이름을 반환해주는 컨셉이존재
				res.setContentType("text/plain;charset=utf-8"); // 문자열로 취급
				PrintWriter out = res.getWriter();
				out.print(obj);
				return;
			}
			// Json포맷으로 빈환되는 값 출력하기 (@ResponseBody, @RestController 역할 재현
			else {
				res.setContentType("application/json"); // 문자열로 취급
				PrintWriter out = res.getWriter();
				out.print(obj);
				return;
			}
			
		}
		
	}
	
	
	@Override
	protected void doDelete(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doService(req,res);
	}
	//쿼리스트링, ?, 링크, header, 제한적임
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doService(req,res);
	}
	//body, 서버인터셉트 안당함,무조건서버전달, 제한이없음 - 바이너리타입(첨부파일) 
	//post방식 - enctype="multipart/form-data" - 바이너리 전달 - 문자+숫자 - 이미지 포함
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doService(req,res);
	}

	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doService(req,res);
	}
	
	
	
}

ModelAndView

  package com.example.demo.pojo3;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
 * select -> 유지 -> forward -> 유효범위:request
 * 
 * 1. select (List<Map>) -> jsp -> 유지 -> request -> 서블릿과 의존관계가있다.
 * 		1-1) List : Row
 * 		1-2) Map : Colum 
 * 
 * 2. 서블릿으로부터 완전한 독립이 안 된다. -> 불만 -> Spring 2.0
 * 
 * 3. request, response가 없이는 나는 웹 서비스를 구현할 수 없어요
 * 
 * 
 * 4. 전체조회를 하고 싶음 n건을 보여줘야함 
 * 	 	1. ModelAndView에 List<Map>이 필요한 이유
 * 		2. HttpServletRequest --> 나는 왜 주입을 받나요? (req,res)를 사용하기 위해서 
 * 				- req.setAttribute("list", new ArrayList<>());
 * 				- SELECT일떈, Object 타입이 필요하다 유지되어야한다.
 * 				- 자바와 jsp 사이에서 유지에 대해서 문제를 해결해야한다.
 * 				- ModelAndView는 어디서 사용하는가? -> 컨트롤러 에서 사용된다. --> 응답페이지에 대한 책임(관심사)는  MVC패턴 통해서 컨트롤 계층에 있다.
 * 				- 어디서 주입받죠? ActionServlet에서 주입받는다.(여기가 원천이다.) 얘가 진또배기
 * 
 * 				- xxxController는 서블릿이 아니다. Controller 인터페이스의 추상메소드로 구현 된 것 뿐이다. --> 실질적인 주인은 ActionServelt
 * 
 * 				- xxx Controller에서 if문으로 분기하고 있는데, 이 부분을 해결하기 위해서 HandlerMapping을 구현했다.
 * 
 */

public class ModelAndView {
	HttpServletRequest req = null;
	List<Map<String,Object>> list = new ArrayList<>();
	//컨트롤 클래스에서 결정된 화면의 이름을 담을 변수 선언
	 String viewName = null;
	public ModelAndView(HttpServletRequest req)
	{
		this.req = req;
	}
	
	
	//컨트롤 클래스에서 "화면이름"이 결정되면 그 값을 읽고 쓸 수 있는 메소드 설계
	public void setViewName(String viewName)
	{
		this.viewName  = viewName;
	}
	
	public String getViewName()
	{
		return viewName;
	}
	
	//어떤타입이던지 담을 수 있게 설계하자.
	
	public void addObject(String name, Object obj)
	{
		Map<String,Object> pmap = new HashMap<>();
		pmap.put(name, obj);
		req.setAttribute(name, obj); // 이렇게 되면 jsp에 뿌려짐
		list.add(pmap);
		
	}

}
/**
 * 모델andview는 생성자를 통해서 요청객체를 받아온다.
 * 어디서? 서블릿에서 받아온다.
 * 모델andview는 select시 에만 사용한다.
*/



Board2Controller

package com.example.demo.pojo3;

import java.io.IOException;

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

import org.apache.log4j.Logger;

import com.example.demo.pojo2.BoardController;

public class Board2Controller implements Controller3 {
	Logger logger = Logger.getLogger(Board2Controller.class);
	@Override
	public Object execute(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		return null;
	}

	@Override
	public Object boardList(HttpServletRequest req, HttpServletResponse res) {
		logger.info("Board2Controller에 boardList가 호출되었습니다.");
		logger.info("boardList : "+req+res);
		//Test 시나리오
		//localhost:8000/board2/boardList.gd3
		return null;
	}

	@Override
	public Object jsonboardList(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object imageDownload(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object imageUpload(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object imageGet(HttpServletRequest req, HttpServletResponse res) {
		// TODO Auto-generated method stub
		return null;
	}

}

Controller3

package com.example.demo.pojo3;

import java.io.IOException;

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

public interface Controller3 {
	
	public Object execute(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException;
	
	public Object boardList(HttpServletRequest req, HttpServletResponse res);
	public Object jsonboardList(HttpServletRequest req, HttpServletResponse res);
	public Object boardDetail(HttpServletRequest req, HttpServletResponse res);
	public Object boardInsert(HttpServletRequest req, HttpServletResponse res);
	public Object boardUpdate(HttpServletRequest req, HttpServletResponse res);
	public Object boardDelete(HttpServletRequest req, HttpServletResponse res);
	public Object imageDownload(HttpServletRequest req, HttpServletResponse res);
	public Object imageUpload(HttpServletRequest req, HttpServletResponse res);
	public Object imageGet(HttpServletRequest req, HttpServletResponse res);
	
	

}
  

소스리뷰

ActionSupport

  	Object obj = null;
		try {
			// 이 요청을 어떤 컨트롤러 클래스가 담당하나요?
			/*
			 * 달라진점 request를 사용하는게 아니라, 
			 * req.setAttribute("upmu",upmu);
			 */
			obj = HandlerMapping.getController(upmu, req, res);
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
  
  • getController는 Static타입이고, HttpServlet을 상속받은 req,res객체를 HandlerMapping.getController로 받아온다. -> 이 때, upmu배열이 내려간다.
    기존에 req.setAttribute("upmu",upmu);를 사용했지만, 파라미터 인자로 보낸다.


  • 이 떄, obj가 받아오는 것은, 경로이다.

  
  		if(obj == null)
			//obj는 result와 같은역할 url를 가지고있다.
		{
			logger.info("여기타니?");
			String pageMove[] = null;
			ModelAndView mav = null; // 화면처리를 위해서
			//너 String 타입이니? -- 경우는 2가지 (json, path)
			// path 안에 ":" 이 포함되어 있어? -> redirect or forward
			if(obj instanceof String) {
				logger.info("여기타니?");
				if(((String)obj).contains(":")) {
					pageMove = obj.toString().split(":");
				}
				else if(((String)obj).contains("/"))
				{
					pageMove = obj.toString().split("/");
				}
				else { // " : " 도 없고 " / " 도 없는 경우라면 else로 넘어옴
					// 단순한 문자열을 반환하는 경우
					// String path = "avatar.png"
					
					pageMove =  new String[1];//"avatar.png ==> 하나만생성
					pageMove[0] = obj.toString(); // 파일이름인 경우
					
					
				}
				
			}////////////////////////////////1/2
  
  • pageMove[] 배열은 기존에 했던 Pojo2와 동일하다. 새로 추가된 부분은 ModelAndView이다.

ModelAndView란?

간단히 설명하면, SELECT 처리 시 ViewResolver를 거쳐서 /WEB-INF/jsp/XXX.jsp 를 설정해서 이 값을 다시 ActionSupport에 전송한다.(응답URL을 준다)

  • 그리고 나서 jsp에 뿌려준다.

obj는 무슨 값을 쥐고 있을까? board2Controller에 대한 리턴값을 의미한다.

  if(obj instanceof String) {
				logger.info("여기타니?");
				if(((String)obj).contains(":")) {
					pageMove = obj.toString().split(":");
				}
				else if(((String)obj).contains("/"))
				{
					pageMove = obj.toString().split("/");
				}
				else { // " : " 도 없고 " / " 도 없는 경우라면 else로 넘어옴
					// 단순한 문자열을 반환하는 경우
					// String path = "avatar.png"
					
					pageMove =  new String[1];//"avatar.png ==> 하나만생성
					pageMove[0] = obj.toString(); // 파일이름인 경우
					
					
				}
				
			}////////////////////////////////1/2
  
  • board2Controller로부터 받은 obj에대한 타입을 분기하여 작성해야된다.

    • 리턴타입을 받아서 타입체크를 하고 String일때 ModelAndView일때를 나누어 처리해야된다.

    • String : json 이거나 path

  jsonBoardList : String(data-Gson g = new Gson() String temp =g.toJson(list)))
  • ModelAndView : Select - UI를 위한 클래스를 설계한다.
    - boardDetail(ModelAndView) + 조회수 (1건) cnt+1 ==> update로처리
    - if(result == 1) update할것. 조건처리

만약에 타입이 String이라면,

  • (:)이 존재한다면, pageMove 배열에 담고 (redirect or forward)

    • if(((String)obj).contains(":"))
  • (/)가 존재한다면, pageMove 배열에 담는다. (WEB-INF)

    • else if(((String)obj).contains("/"))
  • else 단순한 문자열인 경우, 배열의 방을 하나 생성해서 String path = "avatar.png"값을 넣는다. + Json인 경우

그렇다면 여기서 페이지 처리를 하는가? => pageMove에 담는 역할(슬라이싱)만한다. (경로처리x) 타입검사만함


           else if(obj instanceof ModelAndView) {
				mav = (ModelAndView)obj;
				pageMove = new String[2];
				pageMove[0] = "";
				pageMove[1] = mav.getViewName();
				logger.info("pageMove ==> "+pageMove[0] +", "+pageMove[1]);
			}

만약에 타입이 ModelAndView 라면?

  1. mav = (ModelAndView)obj; : 컨트롤러로부터 받아온 obj를 mav에 담는다.
    • viewName
    • list
    • req
      정보가 저장되어 있는 것을 받아온다.
  2. PageMove[0] = ""빈 문자열로주고
    PageMove[1] = 경로가 들어간다. ex ) board/boardListDetail (mav.setViewName("board2/boardDetail");)

만약에 타입이 byte[]인 경우


			else if(obj instanceof byte[]) {//응답이 png일때 - Quill Editor
				res.setContentType("image/png;utf-8");
				PrintWriter out = res.getWriter();
				out.print(obj);
				return;
			}
  1. Quill Editor & 응답이 png일 떄, 마임타입으로 응답한다.

이젠 , pageMove에 담은 배열로 페이징 처리를 시작한다.

if(pageMove !=null && pageMove.length == 2) {
				logger.info("pageMove 원소의 갯수가 2개 일 때");
				String path = pageMove[1];
				if("redirect".equals(pageMove[0])) {
					res.sendRedirect(path);
				}else if("forward".equals(pageMove[0])) {
					RequestDispatcher view = req.getRequestDispatcher(path);
					view.forward(req, res);
				}else {
					// /WEB-INF/jsp/board/boardList.jsp -> spring ViewResolver
					RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/jsp/"+path+".jsp");
					view.forward(req, res);										
				}
			}///////////////////end of if
			else if(pageMove !=null && pageMove.length == 1) {//quill editor 이미지 선택시 파일이릌반환
				res.setContentType("text/plain;charset=utf-8");
				PrintWriter out = res.getWriter();
				out.print(obj);
				return;
			}
			//JSON포맷으로 반환되는 값을 출력하기 - @ResponseBody, @RestController역할 재현
			else {
				res.setContentType("text/plain;charset=utf-8");
				PrintWriter out = res.getWriter();
				out.print(obj);
				return;				
			}
			
		}

크게 2가지로 나뉘는데, pageMove.length==2로 경우를 나눠서 처리한다.
배열방 개수가 2개일 떄와 1개일때를 나눠서 처리한다. 이 부분은 이전 페이지에서 리뷰했으므로 생략하겠다.

profile
아는만큼보인다.

0개의 댓글