list1.do ➡ ListAction1.java(ShareClass 포함) ➡ listview1.jsp
list2.do ➡ ListAction2.java(ShareClass 포함) ➡ listview2.jsp
기본적인 설정(스프링 라이브러리나 톰캣 등) 이 되었다는 가정하에 아래 내용을 시작한다
web.xml
에 공유 데이터 설정을 한다.
스프링에게 객체 생성을 맡겨주는 것이다.
코드의 난잡함을 방지하기 위해 외부파일을 사용하기로 한다.
이를 위해 root-context.xml 설정파일을 생성하고 외부파일로 참조하여 사용한다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
web.xml
에 listener 클래스 생성org.springframework.web.context.ContextLoaderListener
listener
Spring 공식문서
공식문서의 1.7번 항목을 확인하자.
이벤트 리스너에 대해 설명하고 있다.
스프링 MVC 동작 원리(4) : 서블릿 리스너와 필터
서블릿 리스너
웹 애플리케이션에서 발생하는 주요 이벤트를 감지하고 각 이벤트에 특별한 작업이 필요한 경우에 사용할 수 있다.
- 서블릿 컨텍스트 수준의 이벤트
1. 컨텍스트 라이프사이클 이벤트
2. 컨텍스트 애트리뷰트 변경 이벤트
- 세션 수준의 이벤트
1. 세션 라이프사이클 이벤트
2. 세션 애트리뷰트 변경 이벤트
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
root-context.xml
(1번의 xml 설정파일)에 공유할 자료 클래스 bean을 추가한다.<?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-4.3.xsd">
<bean id="shareClass" class="share.ShareClass">
<property name="shareData1" value="난 공유자료임"></property>
</bean>
</beans>
web.xml
에 DispatcherServlet 클래스를 추가해주어야 한다.Dispatcher Servlet
- Dispatch의 의미는 급파하다, 파견 등의 뜻을 가지고 있다.
- 해석해보면 받은 요청을 어딘가로 빨리빨리 보내는 서블릿이라는 뜻.
- 프론트 컨트롤러라고 불리기도 한다.
- param-value 태그 내에 xml을 여러 줄 입력하여 다수의 xml 설정파일을 참조할 수 있다.
<!-- DispatcherServlet(Front Controller) -->
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/dispatcher-servlet.xml
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
web.xml
에서 인코딩 전처리를 해주려고 한다.javax.servlet.http.HttpServletRequest.setCharacterEncoding("UTF-8")
을 하는것보다 필터로 걸어주면 일일이 걸 필요가 없어진다.<!-- 다국어 필터 적용! -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
dispatcher-servlet.xml
에 model2 패키지의 ListAction1 과 ListAction2 를 실행시킬 bean을 추가한다.name
은 공유 데이터임을 인지할 수 있는 것으로 정해주는 것이 좋다.ref
는 참조인데, 3번의 bean id를 입력해주면 된다.dispatcher-servlet.xml
에 클래스를 추가한다.prefix
: ModelAndView 객체가 리턴한 값의 앞부분에 매번 입력된 문자열을 추가한다.suffix
: ModelAndView 객체가 리턴한 값의 뒷부분에 매번 입력된 문자열을 추가한다.<?xml version="1.0" encoding= "UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean name="/list1.do" class="model2.ListAction1">
<property name="shareClass" ref="shareClass"></property>
</bean>
<bean name="/list2.do" class="model2.ListAction2">
<property name="shareClass" ref="shareClass"></property>
</bean>
<!-- 통합해서 사용하기 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
ShareClass.java
를 생성한다.package share;
public class ShareClass {
private String shareData1;
public ShareClass() {
// TODO Auto-generated constructor stub
System.out.println("ShareClass() 실행");
}
public String getShareData1() {
return shareData1;
}
public void setShareData1(String shareData1) {
this.shareData1 = shareData1;
}
}
package model2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import share.ShareClass;
public class ListAction1 implements Controller {
private ShareClass shareClass;
public void setShareClass(ShareClass shareClass) {
this.shareClass = shareClass;
}
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub
System.out.println("shareData1 : " + shareClass.getShareData1());
return new ModelAndView("listview1");
}
}
<%@ 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>
listview1.jsp
</body>
</html>
참고 블로그 : MicroService Architecture란?
Spring MVC Model 2를 사용하기
Spring MVC Model 2를 사용하기