Spring에서의 MVC기법을 순서대로 정리해보고자 한다.
라이브러리 넣기
spring mvc기법을 하기 전에 가장먼저 해야될 부분은 프로젝트 파일의 WEB-INF의 lib안에 spring에 관련된 라이브러리를 넣어줘야한다.
이 MVC파트에서 앞으로 나오는 모든 프로젝트는 라이브러리가 넣어져있다고 가정하고 할 것이다.
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
-->
<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
<?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에 만들기)
<!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에 내용추가
이미 위에 미리 작성되있지만 다시한번 정리
~생략~
<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처럼 컨트롤러 만들어서 실행
test-servlet.xml에 요청명령어에 따른 컨트롤러 클래스를 작성(모델2의 액션클래스)
이것도 위에 미리 작성했지만 다시한번 정리한다
~생략~
<!-- 요청명령어에 따른 컨트롤러 클래스를 작성(모델2의 액션클래스) -->
<bean name="/index2.do" class="Kim.TestActionController" />
</beans>
Controller 생성
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 환경설정파일이 복수일때
이것도 순서대로 정리하고자 한다.
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 만들기
~생략~
<!-- 요청명령어에 따른 컨트롤러 클래스를 작성(=모델2의 액션클래스) -->
<bean name="/hello.do" class="lee.HelloActionController" />
~생략~
world-servlet.xml 만들기
~생략~
<!-- 요청명령어에 따른 컨트롤러 클래스를 작성(=모델2의 액션클래스) -->
<bean name="/world.do" class="lee.WorldActionController" />
~생략~
HelloActionController 만들기 (컨트롤러)
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 만들기 (컨트롤러)
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 만들기
<%@ 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 만들기
<%@ 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