[Spring] MVC

김장환·2022년 8월 24일

Spring

목록 보기
8/17

Spring에서의 MVC기법을 순서대로 정리해보고자 한다.

라이브러리 넣기

spring mvc기법을 하기 전에 가장먼저 해야될 부분은 프로젝트 파일의 WEB-INF의 lib안에 spring에 관련된 라이브러리를 넣어줘야한다.
이 MVC파트에서 앞으로 나오는 모든 프로젝트는 라이브러리가 넣어져있다고 가정하고 할 것이다.


web.xml에서 컨트롤러를 지정

  • web.xml에 내용수정 및 추가한다.
  • servlet-name은 test로 하고자 한다.

<?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">
  <display-name>SpringMVC</display-name>
  
  <!-- 
  	요청을 받아서 처리해주는 컨트롤러역할 클래스를 등록(환경설정파일생성)
  	서블릿별칭명(test)-servlet.xml
   -->
   <servlet>
   		<servlet-name>test</servlet-name>
   		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   </servlet>
  
   <servlet-mapping>
   		<servlet-name>test</servlet-name>
		<url-pattern>*.do</url-pattern>   	
   </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

여기까지 하면 [Dispatcher Servlet]까지 완료


이어서 [viewResolver]부분을 정리하고자 한다.

viewResolver

  • spring파일로 test-servlet.xml을 WEB-INF안에 생성한다.
    =>위의 web.xml와 같은위치에 넣어야됨
  • 내용을 작성하는데 2,3번은 나중에 생략가능하다 따라서 2,3은 밑에 정리한다.
<?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-2.5.xsd">


<!-- (4)viewResolver(위치(prefix)),이동할 페이지의 확장자(suffix)지정 -->
<bean id="viewResolver"
		   class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
		 <property name="prefix" value="/" />
		 <property name="suffix" value=".jsp" />
</bean>

<!-- (2) 요청명령어에 따른 처리해주는 컨트롤러를 문의? -->
<bean id="defaultHandlerMapping" 
			class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

<!-- (3) 요청명령어에 해당하는 컨트롤러를 이용 
	형식) <bean name="/요청명령어.do" class="패키지명..처리할 컨트롤러클래스명" />
			/index.do->/list.jsp이동
			setViewName("list")
-->	
<bean name="/index.do" 
			class="org.springframework.web.servlet.mvc.ParameterizableViewController">
	<property name="viewName" value="list" />
</bean>

<bean name="/good/index.do" 
			class="org.springframework.web.servlet.mvc.ParameterizableViewController">
	<property name="viewName" value="list2" />
</bean>

<!-- 요청명령어에 따른 컨트롤러 클래스를 작성(모델2의 액션클래스) -->
<bean name="/index2.do" class="Kim.TestActionController" />
</beans>


view

1. index.html만들기 (SpringMVC/src/main/webapp에 만들기)

  • index.do, good/index.do, index2.do로 이동되는 링크 문자열들 만들기
  • 링크를 통해 test-servlet.xml에서 환경설정 한대로 .jsp로 이동되도록 하려한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring의 MVC구조에 따른 요청흐름이해하기</title>
</head>
<body><!-- /good/index.do   /는 맨앞에꺼만 생략가능 -->
	<a href="index.do">출발</a><br>
	<a href="good/index.do">출발2</a><br>
	<a href="index2.do">컨트롤러 호출</a><br>
</body>
</html>

2. list.jsp, list2.jsp, list3.jsp 만들기

  • 이동된 페이지
list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>요청받아 처리해주는 페이지</title>
</head>
<body>
<h1>이 화면을 보시게된다면 spring환경설정이 잘된겁니다.!!</h1>
</body>
</html>

-----------------------------------------------------------------

list2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>요청받아 처리해주는 페이지</title>
</head>
<body>
<h1>환영합니다. 스프링!!!</h1>
</body>
</html>

-----------------------------------------------------------

list3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>요청받아 처리해주는 페이지</title>
</head>
<body>
<h1>모델2와 동일:<%=request.getAttribute("greeting") %></h1>
<p> 		<!-- 위아래 두개는 같다 -->
<h1>환영합니다.${greeting}</h1> 
</body>
</html>

test-servlet.xml에 내용추가

  • index.do이랑 good/index.do부분 각각 list.jsp list2.jsp로 이동되게 내용추가

이미 위에 미리 작성되있지만 다시한번 정리

~생략~
<bean name="/index.do" 
			class="org.springframework.web.servlet.mvc.ParameterizableViewController">
	<property name="viewName" value="list" />
</bean>

<bean name="/good/index.do" 
			class="org.springframework.web.servlet.mvc.ParameterizableViewController">
	<property name="viewName" value="list2" />
</bean>
~생략~

모델2처럼 컨트롤러 만들어서 실행

  • index2.do로 list3로 이동시키는것은 위에 2개처럼 test-servlet.xml에 설정이 아니라 모델2처럼 컨트롤러를 만들어서한다.

test-servlet.xml에 요청명령어에 따른 컨트롤러 클래스를 작성(모델2의 액션클래스)

이것도 위에 미리 작성했지만 다시한번 정리한다

~생략~
<!-- 요청명령어에 따른 컨트롤러 클래스를 작성(모델2의 액션클래스) -->
<bean name="/index2.do" class="Kim.TestActionController" />
</beans>

Controller 생성

  • -Controller를 상속받는 TestActionController.java생성
  • src/main/java에 만들기
  • .do를 받아서 .jsp로 key:value값 전달해준다
package Kim;

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

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

//public class ListAction implements CommandAction  <=모델2
public class TestActionController implements Controller {

	//public String requestPro(~
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse arg1) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("TestActionController의 handleRequest call");
		ModelAndView mav=new ModelAndView();
		mav.setViewName("list3"); //이동할 페이지명만 지정
		//어떤 경로? 어떤확장자?->ViewResolver
		//모델2->request.setAttribute("키명",저장할값) =>request.setAttribute("greeting",스프링세상) 이걸 스프링으로 하면
		mav.addObject("greeting","스프링세상!!!");
		//<->request.getAttribute(키명)
		return mav; //return "/list.jsp"
	}
}


SpringMVC 환경설정파일이 복수일때

  • Spring MVC에서 SpringMVC에서 환경설정파일이 꼭 하나만 존재하지 않을수있다
  • 복수라면 복수개의 환경설정파일을 작업 가능하다

이것도 순서대로 정리하고자 한다.


web.xml 내용추가

  • 이전 예제의 web.xml과 달리 추가되고 변동된 내용이 있어 추가하고 수정한다.
<?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">
  <display-name>SpringMVC</display-name>
  
  <!-- 요청을 받아서 처리해주는 컨트롤러 클래스를 등록
        환경설정(test-servlet.xml)로 지정 
        
        DispatcherServlet 2개=>1.누가 메모리에 올릴것인가?
        									 2.요청명령어를 처리해줄것인가를 지정
        	1.각각 요청에 따른 요청환경설정파일을 따로 작성
        	2.DB에 관련된 환경설정								 
        -->
  <servlet>
  	<servlet-name>hello</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>
  			/WEB-INF/hello-servlet.xml
  			/WEB-INF/world-servlet.xml
  		</param-value>
  	</init-param>
  	<load-on-startup>2</load-on-startup>
  </servlet>
  
  <servlet>
  	<servlet-name>world</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

hello-servlet.xml 만들기

  • hello요청명령어 등록

~생략~
  <!-- 요청명령어에 따른 컨트롤러 클래스를 작성(=모델2의 액션클래스) -->
 <bean name="/hello.do"   class="lee.HelloActionController" />
  
~생략~

world-servlet.xml 만들기

  • world요청명령어 등록

~생략~
  <!-- 요청명령어에 따른 컨트롤러 클래스를 작성(=모델2의 액션클래스) -->
 <bean name="/world.do"   class="lee.WorldActionController" />
  
~생략~

HelloActionController 만들기 (컨트롤러)

  • (.do를 받아서 hello.jsp로 key:value값 전달해줌)
package lee;

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

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

public class HelloActionController implements Controller {

	//요청받아서 처리해주는 메서드(request,response객체)
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, 
			                                              HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("HelloActionController의 handleRequest()호출됨");
		ModelAndView mav=new ModelAndView();
		mav.setViewName("hello");
		mav.addObject("message","클릭하나!!!");
		
		return mav;
	}
}

WorldActionController 만들기 (컨트롤러)

  • (.do를 받아서 world.jsp로 key:value값 전달해줌)
package lee;

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

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

public class WorldActionController implements Controller {

	//요청받아서 처리해주는 메서드(request,response객체)
	@Override
	public ModelAndView handleRequest(HttpServletRequest request, 
			                                              HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("WorldActionController의 handleRequest()호출됨");
		ModelAndView mav=new ModelAndView();
		mav.setViewName("world");
		mav.addObject("message2","클릭둘!!!");
		
		return mav;
	}
}


hello.jsp 만들기

  • 컨트롤러의 key:value값 받음
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hello.jsp</title>
</head>
<body>
<h1>${message} 실행완료!!!</h1>
</body>
</html>

world.jsp 만들기

  • 컨트롤러의 key:value값 받음
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>world.jsp</title>
</head>
<body>
<h1>${message2} 실행완료!!!</h1>
</body>
</html>

index.jsp 만들기

  • 실행시키기 위한 파일이다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring의 MVC구조에 따른 요청흐름 이해예제</title>
</head>
<body>
	
	<a href="hello.do">hello.do요청시 컨트롤러 호출</a><br>
	<a href="world.do">world.do요청시 컨트롤러 호출</a><br>
</body>
</html>


과정을 간단히 정리하자면
=> index에서 링트를 통해 .do를 servlet.xml을 거처서 controller로 요청하고 controller에서 요청받아서 .do를 .jsp로 key:value와 같이 전달하고 .jsp에서 받아서 실행한다.


2022-08-24

0개의 댓글