티스토리 뷰

728x90
@Autowired 사용해서 자동주입하던걸 Spring MVC로 한 번 해보자

XML ver

 

 

 

 

 

 

 

 

 

프로젝트 생성

Project Explorer에서 빈공간에 우클릭하면 Dynamic Web Project 만들 수 있다!
여기까진 할 수 있잖아

 

방금 만든 그 프로젝트를 Maven Project로 만들어주자!

혹시 다시 Maven 제거하고 싶다면, 위의 그림처럼 Disabled Maven Nature 해주믄 되니꽈

아! 메이븐 설정하고 프로젝트에 오류뜨면 그냥 alt+F5로 마무리해주십시다

 

Maven 기본설정 해보자!

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <!-- pom모델버전 -->
  <modelVersion>4.0.0</modelVersion>
  <!-- 프로젝트 생성하는 조직의 고유 아이디 like 도메인 이름 -->
  <groupId>Ex01JavaSetting</groupId>
  <!-- Maven 프로젝트 식별하는 아이디 like 프로젝트명 -->
  <artifactId>Ex01JavaSetting</artifactId>
  <!-- 프로젝트 현재 버전 -->
  <version>0.0.1-SNAPSHOT</version>
  <!-- 어떤 형태로 프로젝트를 패키징할 지 결정 -->
  <packaging>war</packaging>
  
  <!-- 소스의 디렉토리 구조, 빌드 산출물 디렉토리 구조, 빌드시 사용할 플러긴 정보 관리 -->
  <build>
  	<!-- sourceDirectory : 자바 소스 코드를 관리하는 디렉토리 -->
  	<sourceDirectory>src/main/java</sourceDirectory>
  
	<!-- Maven제공 기능은 플러긴 기반으로 작동 따라서 설정 필요 -->  
    <plugins>
    
	  <!-- 컴파일 플러그인 설정 -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
        	<!-- 16>14변경 -->
          <release>14</release>
        </configuration>
      </plugin>
      
      <!-- 배포 패키징 플러긴 설정 -->
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
        <!-- configuration 추가 -->
        <configuration>
        	<!-- 배포할 위치 directory -->
        	<warSourceDirectory>src</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
  
  <!-- 라이브러리 버전관리 : properties -->
  <properties>
  	<javax.servlet-version>4.0.1</javax.servlet-version>
  	<javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
  	<javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
  	<org.springframework>5.2.2.RELEASE</org.springframework>
  </properties>
  
  <!-- 라이브러리 셋팅 : dependencies 프로그램과 의존관계인 라이브러리 관리 -->
  <dependencies>
  
  	<!-- servlet-api 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${javax.servlet-version}</version>
	    <scope>provided</scope>
	</dependency>
	
  	<!-- javax.servlet.jsp-api 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>javax.servlet.jsp</groupId>
	    <artifactId>javax.servlet.jsp-api</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${javax.servlet.jsp-version}</version>
	    <scope>provided</scope>
	</dependency>

	<!-- javax.servlet/jstl 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>jstl</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${javax.servlet.jsp.jstl-version}</version>
	</dependency>
	
	<!-- spring-webmvc 라이브러리 적용 위한 설정 -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <!-- 버전관리는 properties에서 하기 때문에 변수처럼 사용하기 -->
	    <version>${org.springframework}</version>
	</dependency>
	
	
  </dependencies>
</project>

 

 

 

Spring MVC XML 기본설정

일단 Spring MVC를 어떻게 구현할지 구조부터 대충 살펴보면,
전에 JSP MVC 패턴때 bean.xml 만들어서 bean을 정의해주었지
그 역할을 이젠 web.xml 이용해서 XML버전으로 만들어보자

아까 Java버전으로 치자면 ServletConfigClass의 역할을 얘가 하는거여

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
 	<!-- 현재 웹 애플리케이션에러 받아들이는 모든 요청에 대해 appServlet이란 이름으로 정의된 서블릿 사용 -->
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 설정 정보를 분석해 controller 선택하는 서블릿 지정 -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<!-- Spring MVC에서 저공하는 기본 서블릿 지정 -->
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- Spring MVC 설정을 위한 XML파일 지정 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/config/servlet-context.xml</param-value>
		</init-param>
		<!-- 로드는 딱 한 번만 시키기 : 서버 꺼질 때까지 한 번만 실행 -->
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Bean정의할 XML 파일 지정 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/root-context.xml</param-value>
	</context-param>

	<!-- 리스너 설정 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 파라미터 인코딩 필터 설정 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

 

 

이제 web.xml에서 context-param을 보면 bean을 정의할 xml파일을 지정해두었잖아?
root-context.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">


	<!-- XML방식으로 Bean등록하기 -->
	<bean class="kr.co.goodee39.vo.DataVO1" scope="request"/>
	<bean class="kr.co.goodee39.vo.DataVO2" id="requestVO2" scope="request"/>


</beans>

간단하지? bean을 설정할 수 있는 xmlns, xmls:xsi, xsi:schemaLocation을 삽입해준게 전부야

가 아니라!
이제는 Bean을 주입해야하므로 Java에서 그랬듯, bean을 정의해준다
XML방식으로 정의하자면 bean태그로 class속성에 path 적어주고, scope는 @RequestSope대신 scope속성 이용해 request를 명시해준다!
DataVO2는 Java방식으로 할 때 bean주입시 Controller에서 @Qualifier또는 @Resource로 주입할 수 있도록
이름을 설정해줘본다.

 

이번엔 web.xml에서 servlet을 보면 설정 정보 분석해서 controller를 선택해주는 서블릿 경로를 만들어뒀어
servlet-context.xml이건데, 그걸 한 번 해보자고

<?xml version="1.0" encoding="UTF-8"?>
<!-- mvc는 beans:beans로 태그 변경해야 인식함 -->
<beans:beans
	xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc
						http://www.springframework.org/schema/mvc/spring-mvc.xsd
						http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context.xsd">


	<!-- 스캔한 패키지 내부 클래스 중 @Controller 있는 클래스 controller로써 로딩하도록 설정 -->
	<annotation-driven />

	<!-- 스캔할 bean들이 모여있는 패키지 지정 -->
	<context:component-scan base-package="kr.co.goodee39.controller" />
	<context:component-scan base-package="kr.co.goodee39.vo" />

	<!-- Controller의 메서드에서 반환하는 문자열 앞, 뒤에 붙일 경로 정보 셋팅 -->
	<beans:bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>


	<!-- 정적파일(img, video, audio) 로드 설정 -->
	<resources mapping="/**" location="/resources/" />
</beans:beans>

Java때랑 내용이 같은데, 표현법이 다른거야
annotaion-driven은 클래스에 @Controller달린걸 찾을 수 있게 도와주는 아이야
context:component-scan으로 controller 찾아낼 경로 설정해주고, 


이따가 VO 4개를 만들어서 주입해볼건데, component로 controller패키지 말고, vo패키지도 추가할 예정이므로
미리 component-scan에 base-package로 vo패키지도 추가해줬음!

beans:bean에서는 아까 Java에서 경로 자동으로 /WEB-INF/views/파일명.jsp 완성되도록 설정했어
prefix, suffix가 위치에 따른 설정인거쥐

마찬가지로 정적파일 즉 오디오, 사진, 비디오를 위한 파일을 불러오기 위한 폴더를 설정해주는데
resources로 할 수 있다.
mapping="/**"라는건 어떤 위치이든 뭐 그런 뜻일까...?ㅎㅎㅎㅎ

 

 

 

 

Controller 클래스 만들기

아까 위에서 web.xml보면 servlet에서 appServlet이란 이름으로 설정한 controller 선택 서블릿이 있는데,
servlet-context.xml라고 파일 하나 만들었좌나,
그리고 @Controller로 지정한 파일 알 수 있도록 annotaion-driven 태그 달아줬고,
context:component-scan으로 controller 찾아낼 경로 설정까지 했으니 이제 @Controller단 클래스를 하나 만들기야

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
	
	//ServletAppContext에서 설정한 configureViewResolvers()메소드 통해서 
	///WEB-INF/views/index.jsp로 변환됨
	@RequestMapping(value="/", method=RequestMethod.GET)
	public String home() {
		return "index";
		
	}
}

별건 없어
그냥 무슨 역할하는지 보자고!

위에서 계속 언급했듯 이 클래스는 controller의 역할을 할 클래스이므로 어노테이션으로 이름표 달아주고,
메소드를 하나 만드는데, 이 메소드는 무어냐
첫 페이지 역할, 그러니까 home 역할을 할 페이지를 설정하는 메서드야
그래서 이름도 home이야 후후
value는 우리 JSP MVC 패턴에서 servlet만들면 맨 상단에 

@WebServlet("/블라블라")하는 공간이 있어 (ㄴㅇㄹ는 무시혀~ 걍 쓴거임)
저 블라블라는 보통 servlet이름이 들어가는데, 파일을 실행시켜서 이동한다거나 하면
url에 저기 작성된 이름이 뒤에 뜨더라고?
근데 이걸 /만 남기고 지워주면?!
그냥 RequestDispatcher rdp = request.getRequestDispatcher("");에서 설정한 jsp파일이 home으로 떠부러
servlet이라는 위치가 jsp파일 앞전에 안붙기 때문이지!
그거랑 같은 이치야 value = "/"는

아무턴, return "문자열";은 이따가 만들 home이 될 jsp파일 이름을 넣어준거야
이 controller가 실행되면 index라는 홈이름이 아까 위에서 servlet-context.xml로 설정한 beans를 통해
prefix="/WEB-INF/views/"와 suffix=".jsp"를 만나 /WEB-INF/views/문자열.jsp가 되는거지

그리고 index.jsp에 이미지가 있다면 resources태그 통해서
src 앞에 /resources/가 콱 붙어주겠지~ 

 

이 아래부터는 Java버전이랑 동일합니다!

 

 

 

 

 

 

 

주입할 객체 만들기!

 

public class DataVO1 {
	
	private String data1;
	private String data2;
	
	public DataVO1() {
		// TODO Auto-generated constructor stub
	}

	public String getData1() {
		return data1;
	}

	public void setData1(String data1) {
		this.data1 = data1;
	}

	public String getData2() {
		return data2;
	}

	public void setData2(String data2) {
		this.data2 = data2;
	}
	
	
	
}

평범쓰~ 게다가 RootAppContext통해 해당 객체를 미리 정의해뒀기 때문에
실제 객체에서는 따로 설정할 것이 없음

public class DataVO2 {
	
	private String data3;
	private String data4;
	
	public DataVO2() {
		// TODO Auto-generated constructor stub
	}

	public String getData3() {
		return data3;
	}

	public void setData3(String data3) {
		this.data3 = data3;
	}

	public String getData4() {
		return data4;
	}

	public void setData4(String data4) {
		this.data4 = data4;
	}
	
	
}

평범쓰~ 게다가 RootAppContext통해 해당 객체를 미리 정의해뒀기 때문에
실제 객체에서는 따로 설정할 것이 없음

import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;

//어노테이션 이용해 bean 자동주입하기

//ServletAppContext에서 읽을 수 있도록 component설정
@Component
//request영역으로 보낼 수 있도록
@RequestScope
public class DataVO3 {
	
	private String data5;
	private String data6;
	
	public DataVO3() {
		// TODO Auto-generated constructor stub
	}

	public String getData5() {
		return data5;
	}

	public void setData5(String data5) {
		this.data5 = data5;
	}

	public String getData6() {
		return data6;
	}

	public void setData6(String data6) {
		this.data6 = data6;
	}
	
	
	
}

얘는 RootAppContext에서 정의하지 않은 객체인데,
@Component 어노테이션으로 ServletAppContext에서 @ComponentScan통해 읽힐 수 있도록 해주고,
@RequestScope 설정으로 컨테이너로 들여보내준다
나머지 동일!

import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;

//component 설정 후 controller에서 부를 이름까지 설정
@Component(value = "requestBean4")
//requestScope에서 현재 component를 컨테이너 영역으로 추가하기 위한 설정
@RequestScope
public class DataVO4 {

	private String data7;
	private String data8;
	
	public DataVO4() {
		// TODO Auto-generated constructor stub
	}

	public String getData7() {
		return data7;
	}

	public void setData7(String data7) {
		this.data7 = data7;
	}

	public String getData8() {
		return data8;
	}

	public void setData8(String data8) {
		this.data8 = data8;
	}
	
	
	
	
}

바로 위의 DataVO3와 동일하게 설정하되, Component의 이름을 붙여줘서
Resource나 Qualifier로 받을 수 있도록 설정한다

 

 

 

 

 

 

 

 

HomeController에서 설정한 첫 페이지가 되어줄 index.jsp를 만들자
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="test1">Test1</a>
</body>
</html>

그저 이동하기 위한 첫 페이지일 뿐...

 

 

 

 

 

 

 

Controller 만들기
import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import kr.co.goodee39.vo.DataVO1;
import kr.co.goodee39.vo.DataVO2;
import kr.co.goodee39.vo.DataVO3;
import kr.co.goodee39.vo.DataVO4;

@Controller
public class TestController {

	//XML은 Lazy 어노테이션을 주어야함
	
	//DataVO1이라는 이름의 객체 자동주입
	//최상단에서 딱 한 번 선언하면 각 메서드에서 반복 사용이 가능함!
	@Autowired
	@Lazy
	private DataVO1 requestVO1;
	
	//Root-context에서 설정한 id와 Resource의 name과 필드명이 같을 때만 주입됨
	@Resource(name = "requestVO2")
	@Lazy
	private DataVO2 requestVO2;
	
	//componentScan 어노테이션으로 인식한 component bean을 자동주입하기
	//결론은 자동 주입이 안됨
	@Autowired
	@Lazy
	private DataVO3 requestVO3;
	
	//componentScan 어노테이션으로 인식한 component bean을 Resource 통해 자동주입하기
	//결론은 자동 주입이 안됨
	@Resource(name = "requestVO4")
	@Lazy
	private DataVO4 requestVO4;
	
	
	
	@GetMapping("/test1")
	public String test1() {
		
		//필드에 값 설정
		//컨테이너 영역에 전달됨
		requestVO1.setData1("문자열1");
		requestVO1.setData2("문자열2");
		
		requestVO2.setData3("문자열3");
		requestVO2.setData4("문자열4");
		
		requestVO3.setData5("문자열5");
		requestVO3.setData6("문자열6");
		
		requestVO4.setData7("문자열7");
		requestVO4.setData8("문자열8");
		
		
		return "forward:/result1";
	}
	
	@GetMapping("/result1")
	public String result1(Model model) {
	
		//컨테이너 영역에 저장되기 때문에 출력 잘 됨
		
		//DataVO1에 대한 결과
		System.out.println("requestVO1.data1 : "+requestVO1.getData1());
		//requestVO1.data1 : 문자열1
		System.out.println("requestVO1.data2 : "+requestVO1.getData2());
		//requestVO1.data2 : 문자열2
		
		//DataVO2에 대한 결과
		System.out.println("requestVO2.data3 : "+requestVO2.getData3());
		//requestVO2.data3 : 문자열3
		System.out.println("requestVO2.data4 : "+requestVO2.getData4());
		//requestVO2.data4 : 문자열4
		
		//DataVO3에 대한 결과
		System.out.println("requestVO3.data5 : "+requestVO3.getData5());
		//requestVO3.data5 : 문자열5
		System.out.println("requestVO3.data6 : "+requestVO3.getData6());
		//requestVO3.data6 : 문자열6
		
		//DataVO4에 대한 결과
		System.out.println("requestVO4.data7 : "+requestVO4.getData7());
		//requestVO4.data7 : 문자열7
		System.out.println("requestVO4.data8 : "+requestVO4.getData8());
		//requestVO4.data8 : 문자열8
		
		
		//다만, RequestScope에 전달된 것이 아니기 때문에 result1페이지에서는 등장하지 않음
		//결과 페이지에는 DataVO3만 출력됨
		
		 model.addAttribute("requestVO1", requestVO1);
		 //@Resource(name = "requestVO2")의 requestVO2인지, private DataVO2 requestVO2의 requestVO2인지 몰라서 중복오류 발생
		 //model.addAttribute("requestVO2", requestVO2);
		 model.addAttribute("requestVO3", requestVO3);
		 model.addAttribute("requestVO4", requestVO4);
		 
		
		return "result1";
	}
	
}


@Autowired
private 객체명 변수명으로 객체를 자동주입 합니다~
객체명에 적은 객체가 @Autowired타고 자동주입 됩니더~

물론 DataVO2는 아까 RootAppContext에서 bean정의할 때
@Bean("주입시 부를 이름")을 적용했기 때문에
@Resource(name="이름")나 @Autowired+@Qualifier("이름")으로 넣어주어야 헙니더

DataVO3, 4는 객체 자체에 Component와 RequestScope를 주었으니까
RootAppContext정의 필요없이 바로 Controller에서 주입해보는데,
DataVO4의 경우는 Component의 이름을 설정했으므로
@Resource(name="이름")나 @Autowired+@Qualifier("이름")으로 넣어주어야 헙니더

그리고 여기서 자바버전과는 달리 @Lazy를 추가해줬는데,
아무래도 자바랑 xml이 주입하는 과정이 좀 다른 것 같아
뭔가 시간적인 문제가 발생한다는데, 모르겄어
전에 AOP 배울때도 보니까 advice로 기능 나눠서 실행시키는데
XML버전에서는 xml파일에서 After, After-throwing, After-Returning를 정의한 순서에 따라서 기능이 실행되더라구
java는 after를 맨 마지막에 정의해도 advice 따라서 잘 출력되는데

후움...

 

이제 데이터 이동, 페이지 이동 시킬 메서드를 만들어 보자

 

1) test1()메서드
a태그로 index.jsp에서 설정했으므로 getMapping으로 받아주고,
내부에 객체 타입으로 선언해 bean을 삽입했던 변수명이 있다 
그 변수명을 이용해 setter메서드로 객체 내 선언했던 필드들에 값을 추가해준다
이 setter메서드를 통해 컨테이너 영역으로 각 설정 데이터를 보내줄 수 있다.
requestVO1 ~ VO4까지 동일!

return은 forward:/result1로 동일하다

2) result1()메서드
이제 페이지를 이동할건데, 그 전에 출력이 잘 되는지 한 번 보자규
RequestScope 어노테이션을 달아줬다고 자동으로 viewResolver에서 HttpServletRequest객체의 request로 한 큐에 넣어주는 것이 아니라
RequestScope에 넣을 수 있도록 허용한다! 라는 뜻이기 때문에 직접 추가해줘야함
WebRequest, Model, HttpServletRequest 등을 이용해 주입해줘야함!

return은 result1페이지~
자바와의 또 다른 차이점은 DataVO2 객체 타입의 requestVO2를 보면
root-context에서 정의한 id와 @Resource에서 명시한 이름 requestVO2가 동일해
아까 자바 버전에서는 객체 타입 변수명은 requestVO2지만
RootAppContext에서는 requestBean2라는 이름으로 정의해줬었거든..
Model객체 주입하지 않고 실행해보면 조금 다른 결과가 나와!
원래는 Model, WebRequest 등 이용해서 RequestScope에 확실히 집어넣어줘야 나오는건데,
DataVO2는 그거 없어도 덩그러니 혼자 등장 하더라고...
거기다가 model까지 집어넣으면 중복으로 집어넣게 되는거라 StackOverFlow 오류까지 발생해...

그래서 지금 model.addAttribute("requestVO2", requestVO2)에는 주석처리를 해둔거야



 

 

 

 

결과페이지를 만들자~
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Result1</h1>
	<h3>requestVO1.data1 : ${requestScope.requestVO1.data1}</h3>
	<h3>requestVO1.data2 : ${requestScope.requestVO1.data2}</h3>
	
	<h3>requestVO2.data3 : ${requestScope.requestVO2.data3}</h3>
	<h3>requestVO2.data4 : ${requestScope.requestVO2.data4}</h3>
	
	<h3>requestVO3.data5 : ${requestScope.requestVO3.data5}</h3>
	<h3>requestVO3.data6 : ${requestScope.requestVO3.data6}</h3>
	
	<h3>requestVO4.data7 : ${requestScope.requestVO4.data7}</h3>
	<h3>requestVO4.data8 : ${requestScope.requestVO4.data8}</h3>
</body>
</html>

requestScope는 생략도 가능한데, 이 챕터가 requestScope이기도 하고, 붙이면 더 빠른 검색이 가능하므로
생략을 생략한다 후후

이제 각각 출력해볼까?

 

 

 

 

 

home으로 만들었던 index페이지에서 진짜 이동 되는지 한 번 해보자!

Run on Server를 클릭해주쟈

 

결과

 

 

Model객체 이용해 requestScope로 주입해주지 않고 사용했을 때
model.addAttribute("requestVO2", requestVO2)를 주석처리한 상태

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함