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
- 명령어 urlmapping.properties에 설정하기
- 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
'JSP' 카테고리의 다른 글
[JSP]Client에서 JSON형태의 Parameter보내기 (0) | 2022.07.07 |
---|---|
[JSP]HttpServletRequest (0) | 2022.06.24 |
[JSP]MVC Pattern : 톰캣 켰을 때 초기화 하는 작업, 사용자가 요청했을 때 일어나는 과정 (0) | 2022.06.20 |
[JSP]MVC Pattern 정리(1) (0) | 2022.06.16 |
[JSP]Servlet(서블릿) 정리 (0) | 2022.06.15 |