열심히 끝까지

디바이스 융합 자바(Java) day69(2) - ModelAndView, ViewResolver 연결 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day69(2) - ModelAndView, ViewResolver 연결

노유림 2022. 9. 20. 15:59

디바이스 융합 자바 day69(1) 내용 중...

 

1. 사용자가 *.do 요청을 하면
2. web.xml을 읽어들이는 서블릿 컨테이너에서 서블릿 객체를 생성함
3. web.xml에 등록되어있던 "내가 만든 DS"을 "Spring에서 제공하는 DS"로 교체

4. FileNotFound 뜨게 됨

     java.io.FileNotFoundException: 
             Could not open ServletContext resource [/WEB-INF/DispatcherServlet-servlet.xml]
    >> 자동으로 new를 해주고 난 후의 에러
    >> 서블릿 컨테이너는 Spring에서 제공하는 DS 객체를 생성해줄 때에 init()을 자동 실행
                   => init()이 자동실행되게끔 설계된 이유?
                   => 스프링 컨테이너가 [/WEB-INF/DispatcherServlet-servlet.xml]을 참고해서
                        POJO인 HM, C, VR의 객체 생성을 위해서 
                  >> DispatcherServlet-servlet.xml이름의 파일을 WEB-INF 하위에 만들 것

                       (Spring Bean File 만들 것)

5. 등록한 서블릿의 이름-servlet.xml로 파일을 생성하면 더 이상 파일 NOTFOUND가 발생하지 않음
    + 필터 : servlet의 일종 
          == 필터 클래스 만들어보자!!
              > 서블릿 종류이기 때문에 , web.xml에 설정해야 함

   >> 콘솔창에 아무것도 안 뜨는 이유는?
            .do의 요청이 없기 때문!

6. 기존에 작성한 Controller류의 클래스들은 "내가 만든 Controller"를 implements한 것들!
7. "Spring에서 제공하는 Controller로 교체!!

8. output이
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 

    throws Exception 로 오버라이딩 강제
       변환을 mav 객체로 해줘야함
       mav 객체는 멤버변수로 viewName을 가짐

9. Handler Mapping 등록 : Handler에서 꺼내 쓰기 때문에 등록해주어야 함
    >> DispatcherServlet-servlet.xml에서 진행
    - 기존에는 "내가 만든 DS"의 init() 메서드에서 생성
    -> 앞으로는 스프링 컨테이너가 [/WEB-INF/DispatcherServlet-servlet.xml] 참고해서 HM을 생성
        =>"내가 만든 HM"을 사용하지 않고, 
            "Spring에서 제공하는 HM"으로 등록했기 때문에 기존의 클래스 파일을 제거해도 무방!
         >> 이제 다음 파일은 필요가 없음...(구조를 위해 작성을 함)
10. HM을 제대로 사용하려면?
        >> 멤버변수가 존재하기 때문에, == 의존관계가 존재하기 때문에,
              DI(의존성 주입)를 반드시 해줘야 함!!!


 

[오전내용]
.do 요청을 했을 때, Spring에서 제공하는 DS을 사용해보자!
 + filter도 적용
>> 요청 하게 되면 init 자동 호출!
      >> 일반 pojo 객체를 new 해야하는데 
              + spring container 작동해야 하고 xml파일 필요!
                >> dpservlet

>> mainController에 다른 점 존재 = session
     + LoginController과 비교할 것


- ModelAndView
 >> java 객체라서 같은 객체를 쓰고 있다면 정보가 유지되더라!
    >> 스프링컨테이너가 유지시켜주더라!!! 

 

 

11. board.jsp, main.jsp등은 데이터 출력을 필요로 하는 페이지
          -> 브라우저에서 절대 접근할 수 없도록 WEB-INF 하위에 관리

                    >> view를 만들어서 그 하위에 놔두기(그냥 놔둬도 되지만 관리를 위해)

        >>>> 가지고 있는 페이지가 5개
                : board랑 main은 반드시 데이터가 필요한 것


12. ViewResolver를 등록하여 VR을 통해서 화면을 제공할 예정
          -> redirect : 

<!-- ViewResolver 등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/view/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

 

 

>> 오후 수업으로 바뀐 것들

 

LoginController.java---------------------

package com.ryo.biz.controller;

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

/*import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;*/
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

//import com.ryo.biz.member.MemberService;
import com.ryo.biz.member.MemberVO;
import com.ryo.biz.member.impl.MemberDAO;

public class LoginController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

		System.out.println("로그 : 로그인컨트롤러 들어옴");

		MemberDAO mDAO = new MemberDAO(); 
		MemberVO mVO = new MemberVO();
		String mid=request.getParameter("mid");
		String mpw=request.getParameter("mpw");
		mVO.setMid(mid);
		mVO.setMpw(mpw);
		mVO = mDAO.selectOneMember(mVO);
		
		ModelAndView mav = new ModelAndView();
		if(mVO==null) {
			mav.setViewName("login.jsp");
			//return "login";
			// ViewResolver가 .jsp를 추가하기 때문에 생략해서 반환
		}
		else {
			// 브라우저단위로 유지해야하기 때문에 session 놔두어도 됨
			HttpSession session = request.getSession();
			session.setAttribute("member", mVO);

			mav.setViewName("redirect:main.do");
			// redirect를 하면 보내짐
			//return "main.do";
		}
		return mav;
	}
}

 

MainController.java---------------------------------

package com.ryo.biz.controller;

import java.util.List;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.ryo.biz.board.BoardVO;
import com.ryo.biz.board.impl.BoardDAO;

public class MainController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println("로그 : 메인 컨트롤러 들어옴");
		BoardVO bVO = new BoardVO();
		BoardDAO bDAO = new BoardDAO();
		List<BoardVO> datas = bDAO.selectAllBoard(bVO);
		
		ModelAndView mav = new ModelAndView();
		
		// mav.addObject(속성 이름, mav) 속성 대신 사용
		/*
		HttpSession session = request.getSession();
		session.setAttribute("datas", datas);
		와 동일 다음 페이지까지 전달
		다음 ModelAndView
		*/
		mav.addObject("datas", datas);
		// mav 내부에 view이름을 세팅
		mav.setViewName("main");
		
		return mav;
	}

}

 

DispatcherServlet-servlet.xml---------------------

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 싱글톤 패턴!! -->
	<!-- HM 등록 + DI를 해야 함 -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<!-- SimpleUrlHandlerMapping의 설정 -->
		<property name="mappings">
			<props>
				<!-- <prop key="string">Controller 객체를 넣을 때,</prop> -->
				<prop key="/login.do">login</prop>
				<prop key="/main.do">main</prop>
				<prop key="/board.do">board</prop>
				<prop key="/signin.do">signin</prop>
				<prop key="/logout.do">logout</prop>
				<prop key="/mypage.do">mypage</prop>
				<prop key="/mdelete.do">mdelete</prop>
			</props>
		</property>
	</bean>
	
	<!-- Controller 객체 등록 -->
	<!-- 위치는 어디에 있던 상관 없음 -->
	<bean id="login" class="com.ryo.biz.controller.LoginController"/>
	<bean id="main" class="com.ryo.biz.controller.MainController"/>
	<bean id="board" class="com.ryo.biz.controller.BoardController"/>
	<bean id="signin" class="com.ryo.biz.controller.SigninController"/>
	<bean id="logout" class="com.ryo.biz.controller.LogoutController"/>
	<bean id="mypage" class="com.ryo.biz.controller.MypageController"/>
	<bean id="mdelete" class="com.ryo.biz.controller.MdeleteController"/>
	
	<!-- ViewResolver 등록 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
</beans>

 

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>순서 총정리<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1. 사용자가 *.do 요청을 하면
2. web.xml을 읽어들이는 서블릿 컨테이너에서 서블릿 객체를 생성함
3. web.xml에 등록되어있던 "내가 만든 DS"을 "Spring에서 제공하는 DS"로 교체

4. FileNotFound 뜨게 됨
     java.io.FileNotFoundException: 
             Could not open ServletContext resource [/WEB-INF/DispatcherServlet-servlet.xml]
    >> 자동으로 new를 해주고 난 후의 에러
    >> 서블릿 컨테이너는 Spring에서 제공하는 DS 객체를 생성해줄 때에 init()을 자동 실행
                   => init()이 자동실행되게끔 설계된 이유?
                   => 스프링 컨테이너가 [/WEB-INF/DispatcherServlet-servlet.xml]을 참고해서
                        POJO인 HM, C, VR의 객체 생성을 위해서 
                  >> DispatcherServlet-servlet.xml이름의 파일을 WEB-INF 하위에 만들 것

                      (Spring Bean File 만들 것)
5. 등록한 서블릿의 이름-servlet.xml로 파일을 생성하면 더 이상 파일 NOTFOUND가 발생하지 않음
    + 필터 : servlet의 일종 
          == 필터 클래스 만들어보자!!
              > 서블릿 종류이기 때문에 , web.xml에 설정해야 함

6. 기존에 작성한 Controller류의 클래스들은 "내가 만든 Controller"를 implements한 것들!
7. "Spring에서 제공하는 Controller로 교체!!

8. output이
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 

    throws Exception 로 오버라이딩 강제
     변환을 mav 객체로 해줘야함
     mav 객체는 멤버변수로 viewName을 가짐
     mav.setViewName("사용자에게 제공할 경로명");

9. Handler Mapping 등록 : Handler에서 꺼내 쓰기 때문에 등록해주어야 함
    >> DispatcherServlet-servlet.xml에서 진행
    - 기존에는 "내가 만든 DS"의 init() 메서드에서 생성
    -> 앞으로는 스프링 컨테이너가 [/WEB-INF/DispatcherServlet-servlet.xml] 참고해서 HM을 생성
        =>"내가 만든 HM"을 사용하지 않고, 
            "Spring에서 제공하는 HM"으로 등록했기 때문에 기존의 클래스 파일을 제거해도 무방!
         >> 이제 다음 파일은 필요가 없음...(구조를 위해 작성을 함)

10. HM을 제대로 사용하려면?
        >> 멤버변수가 존재하기 때문에, == 의존관계가 존재하기 때문에,
              DI(의존성 주입)를 반드시 해줘야 함!!!

11. board.jsp, main.jsp등은 데이터 출력을 필요로 하는 페이지
          -> 브라우저에서 절대 접근할 수 없도록 WEB-INF 하위에 관리

12. ViewResolver를 등록하여 VR을 통해서 화면을 제공할 예정
          -> redirect :