내려간다~
xxxx.gd3 요청
ActionServlet -> HandlerMapping
메소드를 호출하는데, request, response가 포함되어있다.
이전까진, doGet(req,res) : void로 되어 있었지만, 결합도를 낮추기 위해 설정했다.
HandlerMapping -> Board2Controller
Board2Controller -> Board2Logic
Board2Logic -> Board2Dao
Board2Dao -> DB
올라간다~
DB -> Board2Dao
Board2Dao -> Board2Logic
Board2Logic-> Board2Controller
Board2Controller ->ActionSuppoer로 넘어가는데,
이 때, 리턴하는 방법이 중요하다.
이전까진, ActionForward -> String로 했지만, Object
로 설정했다.
특이한 점은 ModelAndView라는건데, 이 부분으로 SELECT
문을 처리하기 위해 클래스를 하나 설계했다.(여기서 경로를 잡아줌)
ViewResolver
를 호출해서 /WEB-INF/jsp/XXX.jsp
를 설정한다. 이 값을 다시 ActionSupport
에 전송한다(응답URL) 그리고 나서 url에 뿌려준다.obj 경우의 수
obj
= controller.boardListobj(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이 됐을 떄
obj(int)
= controller.boardInsert(req,res) / update / Delete
select (List<Map>)
-> jsp -> 유지 -> request -> 서블릿과 의존관계가있다.
1-1) List : Row
1-2) Map : Colum
서블릿으로부터 완전한 독립이 안 된다. -> 불만 -> Spring 2.0
request, response가 없이는 나는 웹 서비스를 구현할 수 없어요
전체조회를 하고 싶음 n건을 보여줘야함
ModelAndView에 List<Map>
이 필요한 이유
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();
Controller3 controller = null;
if("board".equals(upmu[0]))
{ // 인터페이스 - 구현체
controller = new Board2Controller();
}
public static Object getController(String[] upmu,HttpServletRequest req, HttpServletResponse res)
여기 안에서 Controller3 controller = null;로 받는 이유는 무엇일까?
if("board".equals(upmu[0]))
이전에는 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에서 실행
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;
}
}
(logic/dao 처리 아직 안함)
ActionSupport에서 (*.gd3) 이므로 해당 url를 가로챈다.
1-1. 배열에 담기고
obj = HandlerMapping.getController(upmu, req, res);
이 부분에서
배열이 함께 넘어감 (req,res)를 같이넘겨준다. -> HandlerMapping에
HandlerMapping
3-1. boardList에 걸려서 이 떄, obj = controller.boardList(req, res);
를 통해서 req,res를 넘겨준다.(원본)
3-2. Controller는 인터페이스이다. 구현체는 board2Controller이다.
board2Controller로 넘어간 다음에 public Object boardList
메소드 호출하고 -->logger.info를 출력한다.
그 응답값으로 obj로 받는데, obj로 조건문 분기를 시작한다. 근데 여기선 Controller처리를 따로 하지 않았기 떄문에,
HandlerMapping 타는지 보자.
이렇게 컨트롤러(board2Controller)를 수정하고 다시시도해보자.
이렇게 나온다.
3-2
에서 응답값을 받아온 다음에 obj를 리턴한다. (obj ="안녕하세요")
그러면 다시 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);
}
Object obj = null;
try {
// 이 요청을 어떤 컨트롤러 클래스가 담당하나요?
/*
* 달라진점 request를 사용하는게 아니라,
* req.setAttribute("upmu",upmu);
*/
obj = HandlerMapping.getController(upmu, req, res);
}
catch(Exception e)
{
e.printStackTrace();
}
req.setAttribute("upmu",upmu);
를 사용했지만, 파라미터 인자로 보낸다.
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
ModelAndView란?
간단히 설명하면, SELECT 처리 시 ViewResolver를 거쳐서 /WEB-INF/jsp/XXX.jsp 를 설정해서 이 값을 다시 ActionSupport에 전송한다.(응답URL을 준다)
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)))
만약에 타입이 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
라면?
만약에 타입이 byte[]
인 경우
else if(obj instanceof byte[]) {//응답이 png일때 - Quill Editor
res.setContentType("image/png;utf-8");
PrintWriter out = res.getWriter();
out.print(obj);
return;
}
이젠 , 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개일때를 나눠서 처리한다. 이 부분은 이전 페이지에서 리뷰했으므로 생략하겠다.