Yuni Devlog
Published 2022. 6. 16. 10:00
[JSP]MVC Pattern 정리(2) JSP

Jsp MVC패턴을 공부하면서 전체적인 흐름에 대해 공부한 것을 정리해보았다 !

http://localhost:8282/MVC1/menu.html

1. doGet메서드 호출

Cotroller controller=simpleUrlHandlerMapping.getController(applicationContext);
//simpleUrlHandlerMapping에서 getController데리고와서 내부적으로 
//applicationContext주소값을 요구 --> bean객체 가지고옴
ModelAndView mav= controller.handleRequest();
//컨트롤러 얻어와서 추상메서드handleRequest 호출, 받아오는 것은 ModelAndView

💫ServiceFacade : 업무와 관련된 일만 전담하는 클래스, 모델단의 입구

⚡Jsp가 view를 담당

⚡MVC패턴에서 Front역할을 하는 것, 사용자가 요청한 모든 요청이 가는 곳 => DispatcherServlet

⚡Servlet이 Controller 역할(doGet, doPost로 모든 요청을 받음)

⚡DAO를 바로 부르지 않고 Model가기 전에 ServiceFacade 거쳐야한다

  • MemberSF : 업무 친화적인 메서드명을 가지고 있다
    ex)addMember
  • MemberDAO : 쿼리문과 근접한 메서드명
    ex)insertMember

💡ID 없거나 PW 틀리면 다른 페이지에 가야하거나, 정상처리 였을 때 다른 페이지에 가야하는 경우 있기 때문에 ⇒ ModelAndView에 가야하고 ServiceFacade가 있는 것 !

 

⚡internalResourceViewResolver 화면만 보여줄 때 사용, resolveView()가지고 있다.(화면해결)

http://localhost:8282/MVC1/member/list.do 요청했을 때 !
# InternalResourceViewResolver.java로 가서

public void resolveView(ModelAndView modelAndView,
HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        // TODO Auto-generated method stub
        String viewName=modelAndView.getViewName();

        if(viewName.indexOf("redirect:")==-1){
            HashMap<String,Object> modelObject=modelAndView.getModelObject();
            if(modelObject!=null){
                for(String key:modelObject.keySet())
                        request.setAttribute(key, modelObject.get(key));
}
            RequestDispatcher rd=request.getRequestDispatcher(prefix+viewName+postfix);
            rd.forward(request, response);
		}else{
			int index=viewName.indexOf(":");
			String path=viewName.substring(index+1);
			response.sendRedirect(path);
		}
//viewName은 ? member/list

//찍어보면 Sys( viewName.indexOf("redirect:") ); //-1
//redirect: 없으면 -1나옴 즉, -1과 같으면 forward하는 것
//forward => url안바뀜,request주소값 넘어감,request setAttribute한다는 것
//redirect: 있으면 sendRedirect => url 정확하게바뀜

//세팅하는 것? modelObject는 mav에서 가져오는 것
//MemberListController를 보면 sf에서 들고온 list를 memberlist이름으로 세팅해놓음

//접두어+화면이름+접미어 -> 다음화면 -> /WEB-INF/jsp/member/list가 응답

#list.jsp
List<MemberDTO> list=mav.getModelObject();
    request.setAttribute("memberlist",list);
//request.setAttribute 이 문장은 xxx.jsp에 있음

💡DB연동 하지 않는다면 화면 이동만 한다. 이것을 전담하는 Controller는 urlFileNameViewController

  1. 명령어 urlmapping.properties에 설정하기
  2. bean이름 카테고리.properties에 설정하기
1. 각각의 properties파일의 내용이 메모리에 로드된다
#web.xml
-->urlmapping.properties  --> SimpleUrlHandlerMapping : 이미 여기서 map으로 member/list.do 등록
-->member.properties      --> ApplicationContext : 등록한 이유? bean객체 들고오는 작업을 함
-->main.properties        --> ApplicationContext
-->path.properties        --> InternalResourceViewResolver

2. 아래와 같이 사용자가 요청한다
http://localhost:8282/MVC1/member/list.do 
*DistpatcherServlet의 doGet이 호출된다

#DistpatcherServlet
doGet(){
            Controller controller=SimpleUrlHandlerMapping.getController(ApplicationContext,request,response);
            controller.handleRequest(request,response);
            ModelAndView mav=controller.handleRequest( request,response );
            internalResourceViewResolver.resolveView( mav,request,response ); //화면해결자
}
//1번줄이 SimpleUrlHandlerMapping에서 controller얻겠다
//bean이름 얻어서 getController메서드안에서 인수로 ApplicationContext주소도 넘어옴
//request,response주소도 넘어옴

//bean객체 얻었으니까 요청처리한다
//요청을 처리할 때 request,response가 넘어감

*.do니까 db가야함
3. #MebmerListController
ModelAndView handleRequest( request,response ){ //메서드 선언문장
        List<MemberDto> list=sf.getMemberList(); // DB에서 데이터얻기
        Map<String,Object> map=... //이름은 string, 어떤 데이터를 넣을지 모르니까 object
        map.put("mList", list);
        ModelAndView mav=new ModelAndView(map, "member/list"); 
//mav에 설정하기
//map전달, 화면이름
        returnn mav;
}
*컨트롤러의 역할 
db에 간다 -> 가지고 온다 -> mav에 설정한다 -> 화면이름 구한다

4. #InternalResourceViewResolver
void resolveView( mav,request,response ){
    String viewname=mav.getViewname(); //문자열로 뷰네임 얻어오기
        if( viewname.indexOf("redirect:")==-1 ){ //리다이렉트안하겠다
        Map<String,Object> map=mav.getModelObject();
            if(map!=null){ //nullpointexception 발생할 수 있기때문에 null과 같지 않으면 해라~
                for(String key : map.keySet() )
                request.setAttribute( key, map.getValue(key) ); 
//forward니까 request.setAttribute있는 것
}
                rd=new RequestDispatcher( prefix+viewname+postfix ); //다음화면
                rd.forward( request,response );
        }else{
                response.sendRedirect();
    }
}

5. /WEB-INF/jsp/list.jsp //다음화면

List<MemberDto> list = (List<MemberDto>)request.getAttribute("mList");
for(MemberDto dto : list)
                            out.println(dto.getId()+"<br/>");
//오브젝트 넣어놔서 형변환 해야함

💡공백때문에 오류날 수 있어서 이렇게 세팅해두기 map.put(key.trim(),value.trim());

#회원가입(DB연동X)

http://localhost:8282/MVC1/joinForm.html

#urlmapping.properties
/joinForm.html=urlFilenameViewController

#menu.jsp
<a href="<%=request.getContextPath()%>/joinForm.html">회원가입하기</a><br/>
#DB연동O

# 요청
http://localhost:8282/MVC1/member/list.do

# /WEB-INF/jsp/member/list.jsp
<a href="/MVC1/member/detail.do?id=aa">aa</a><br/>
<a href="/MVC1/member/detail.do?id=bb">bb</a><br/>
<a href="/MVC1/member/detail.do?id=cc">cc</a><br/>

# urlmapping.properties
/member/detail.do=memberDetailController

# member.properties
memberDetailController=kr.co.seoul.member.controller.MemberDetailController

# MemberDetailController 생성하기

ModelAndView handleRequest(){
    String id=request.getParameter("id");
    MemberBean bean=sf.getMember(id);
    Map<String,Object> map=new HashMap<>();
    map.put("member",bean);
    ModelAndView mav=new ModelAndView(map, "member/detail");
    return mav;
}

# /WEB-INF/jsp/member/detail.jsp 작성하기
-----------------------------------------------------------------
#detail.jsp

<body>
<h1>회원정보</h1>
<%
MemberBean dto=(MemberBean)request.getAttribute("memberInfo");
%>
<%=dto.getId()%><br/>
<%=dto.getPw()%><br/>
<%=dto.getAddr()%><br/>
<%=dto.getTel()%><br/>
</body>

# 요청
http://localhost:8282/MVC1/member/list.do

# /WEB-INF/jsp/member/list.jsp
<a href="<%=request.getContextPath()%>/menu.html">메뉴</a><br/>
<%
List<MemberBean> list=(List<MemberBean>)request.getAttribute("memberlist");
for(MemberBean bean:list){
    String id=bean.getId();
out.print("<a href='"+request.getContextPath()+"/member/");
//  /MVC1 대신 사용
out.print("detail.do?id="+id+"'>");
//하나의 값인데 길어서 끊음
out.print(id);
out.print("</a><br/>");
}
%>

# urlmapping.properties
/member/detail.do=memberDetailController

# member.properties
memberDetailController=kr.co.seoulit.member.controller.MemberDetailController

# MemberDetailController 생성하기
package kr.co.seoulit.member.controller;

import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.co.seoulit.common.servlet.ModelAndView;
import kr.co.seoulit.common.servlet.mvc.Controller;
import kr.co.seoulit.member.sf.MemberServiceFacade;
import kr.co.seoulit.member.sf.MemberServiceFacadeImpl;
import kr.co.seoulit.member.to.MemberBean;

public class MemberDetailController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response){
        // TODO Auto-generated method stub
         String uri=request.getRequestURI();
         String contextPath=request.getContextPath();
         String viewName=uri.split("[.]")[0].substring(contextPath.length());
         HashMap<String,Object> map=new HashMap<String,Object>();
        ModelAndView mav=null;
         try {        
             String id=request.getParameter("id");
            MemberServiceFacade sf=MemberServiceFacadeImpl.getInstance();
            MemberBean bean=sf.getMember(id);
            map.put("memberInfo",bean);
              mav=new ModelAndView(viewName,map);
              map.put("errorCode", 0);
             map.put("errorMsg", "success");
        } catch (Exception e) {
            // TODO Auto-generated catch block
              map.put("errorCode", -1);
              map.put("errorMsg", e.getMessage());
              mav=new ModelAndView("error",map);
        }    
        return mav;
    }
}

# /WEB-INF/jsp/member/detail.jsp 작성하기

<h1>회원정보</h1>
<%
MemberBean dto=(MemberBean)request.getAttribute("memberInfo");
%>
<%=dto.getId()%><br/>
<%=dto.getPw()%><br/>
<%=dto.getAddr()%><br/>
<%=dto.getTel()%><br/>
# /WEB-INF/jsp/joinForm.jsp

<h1>회원가입폼</h1>
<form action="<%=request.getContextPath()%>/join.do">
ID : <input type="text" name="id" /><br/>
PW : <input type="text" name="pw" /><br/>
ADDR : <input type="text" name="addr" /><br/>
TEL : <input type="text" name="tel" /><br/>
<input type="reset" value="취소" /> 
<input type="submit" value="가입" />
</form>

# http://localhost:8282/MVC1/join.do?id=xx&pw=xx&addr=xx&tel=xx

# urlmapping.properties
/join.do=joinController

# main.properties
joinController=kr.co.seoulit.common.controller.JoinController

# JoinController

package kr.co.seoulit.common.controller;

import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.co.seoulit.common.servlet.ModelAndView;
import kr.co.seoulit.common.servlet.mvc.Controller;
import kr.co.seoulit.member.sf.MemberServiceFacade;
import kr.co.seoulit.member.sf.MemberServiceFacadeImpl;
import kr.co.seoulit.member.to.MemberBean;

public class JoinController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response){
        // TODO Auto-generated method stub

         HashMap<String,Object> map=new HashMap<String,Object>();
        ModelAndView mav=null;
         try {        
            MemberServiceFacade sf=MemberServiceFacadeImpl.getInstance();
            MemberBean bean=new MemberBean();
            bean.setId(request.getParameter("id"));
            bean.setPw(request.getParameter("pw"));
            bean.setAddr(request.getParameter("addr"));
            bean.setTel(request.getParameter("tel"));
            sf.addMember(bean);

              mav=new ModelAndView("redirect:member/list.do",null); //가입하고 회원리스트 보기
              map.put("errorCode", 0);
             map.put("errorMsg", "success");
        } catch (Exception e) {
            // TODO Auto-generated catch block
              map.put("errorCode", -1);
              map.put("errorMsg", e.getMessage());
              mav=new ModelAndView("error",map);
        }    
        return mav;
    }
}

# InternalResourceViewResolver
void resolveView(){
    if( viewname.indexOf("redirect:")==-1 ){
        rd.forward();
    }else{
        String str=mav.getViewname();
        response.sendRedirect(str.split(":")[1]); // member/list.do
        
        //response.sendRedirect(request.getContextPath()+"/"+str.split(":")[1]);
        // http://localhost:8282/MVC1/member/list.do
    }
}

# /WEB-INF/jsp/member/list.jsp
profile

Yuni Devlog

@siyuning

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그