스프링프레임워크 & 마이바티스
(Spring Framework, MyBatis)
6-19. Spring Web MVC 뷰(ViewResolver)
6-19-1. 뷰리졸버(ViewResolver) – UrlBasedViewResolver
 View이름과 실제 View의 이름이 같을 때 사용때 사용하는데 prefix, suffix, viewClass를 지정할
수 있고 단순 JSP만 사용할 때 용이하다.
[자바 설정 파일]
@Configuration
@ComponentScan(“config”)
public class AppConfig {
@Bean
public UrlBasedViewResolver urlBasedViewResolver() {
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setCache(false);
resolver.setViewClass(JstlView.class);
return resolver;
}
}
[컨트롤러]
@Controller
public class WelcomeController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "UrlBasedViewResolver Demo");
return "success"; //뷰 이름
}
}
[success.jsp]
<html><head><title>Spring MVC View Test</title>
</head><body>
<h1>${msg}</h1>
</body></html>
6-19-2. 뷰리졸버(ViewResolver) – InternalResourceViewResolver
 UrlBasedViewResolver 를 상속하며 JstlView 와 TilesView 와 같은 서브클래스들과
InterResourceView (서블릿, JSP)를 지원한다. 이 리졸버에 의해 생성되어지는 모든 뷰들을 위
한 뷰 클래스는 viewClass 속성을 통해 지정하면 된다.
 Spring DispatcherServlet의 디폴트 뷰 리졸버는 InternalResourceViewResolver 이다. 즉 XML
설정 안에 뷰 리졸버를 설정하지 않으면InternalResourceViewResolver가 ViewResolver가 된다.
접두어/접미어를 사용하여 뷰를 설정할 수 있으며 클래스패스 (Classpath) 내에 JSTL 라이브
러리가 있으면 JstlView를 없으면 InternalResourceView를 사용한다.
[XML 설정]
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
[or 자바 설정]
@Configuration
@ComponentScan("config")
public class AppConfig {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
[컨트롤러]
@Controller
public class WelcomeController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "InternalResourceViewResolver Demo");
return "success"; //뷰 이름
}
}
[success.jsp]
<html><head><title>Spring MVC View Test</title>
</head><body>
<h1>${msg}</h1>
</body>
</html>
6-19-3. 뷰리졸버(ViewResolver) – BeanNameViewResolver
 뷰 이름과 동일한 이름을 갖는 빈 책체를 View 객체로 사용하는 뷰 리졸버 인데 주로 커스
텀 View 클래스를 뷰로 사용해야 하는 경우에 사용한다. AbstractView, AbstractExcelView,
AbstractPdfView 등을 상속받아 커스텀 뷰를 만들어 사용한다.
 뷰를 엑셀이나 PDF로 구성할 때 사용하거나 파일 다운로드를 위한 정보를 읽어와 뷰에 젂달
하는 컨트롤러는 다운로드 관련 정보를 뷰에 젂달한다.
[PDF를 뷰로 사용하는 예문]
[View 클래스]
package com.ojc;
public class MyPdfGenerator extends AbstractPdfView { ... }
[컨트롤러]
return ModelAndView('pdf')
[설정파일]
<bean class=“org.springframework.web.servlet.view.BeanNameViewResolver”/>
<bean id = “pdf” class =“com.ojc.MyPdfGenerator”/>
[엑셀을 뷰로 사용하는 예문]
[View 클래스]
package com.ojc;
public class MyExcelView extends AbstractExcelView { ... }
[컨트롤러]
return ModelAndView(“myExcelView”)
[설정파일]
<bean id = "myExcelView" class = "com.ojc.MyExcelView" />
<!– BeanNameViewResolver는 가끔 다른 뷰와 같이 사용되기도 한다. --
<bean class=“org.springframework.web.servlet.view.BeanNameViewResolver”/>
<property name = "order" value = "0" />
</bean>
<bean class = “org.springframework.web.servlet.view.InternalResourceViewResolver ">
<property name = "order" value = "1" />
</bean>
6-19-4. 뷰리졸버(ViewResolver) – ResourceBundleViewResolver
 뷰 이름과 뷰 객체갂의 매핑 정보를 저장하기 위해 자원 파일을 사용한다.
 리소스번들 파일(클래스패스 아래의 프로퍼티 파일)로부터 뷰 이름과 매핑되는 뷰 클래스를
정보를 얻으며, 기본적으로 views.properties 파일에서 뷰가 되는 빈 정보를 로드하지만
basename으로 재정의 가능하다.
[자바 설정 파일]
@Configuration
@ComponentScan("config")
public class ResolverConfig {
@Bean
public ResourceBundleViewResolver resourceBundleViewResolver() {
ResourceBundleViewResolver resolver = new ResourceBundleViewResolver();
resolver.setBasename("resourcebundle");
return resolver;
}
}
[컨트롤러]
@Controller
public class HelloController {
@RequestMapping("/info")
public String home(Model model) {
model.addAttribute("msg", "ResourceBundleViewResolver Demo");
return “home"; //리소스 번들(프로퍼티) 파일에 뷰 클래스를 지정한다.
}
@RequestMapping("/home")
public String getInfo() {
return "refer";
}
}
[resourcebunble.properties]
home.(class)=org.springframework.web.servlet.view.JstlView
home.url=/WEB-INF/views/success.jsp
refer.(class)=org.springframework.web.servlet.view.RedirectView
refer.url=http://ojc.asia
[success.jsp]
<html>
<head>
<title> Spring MVC ResourceBundleViewResolver Test</title>
</head>
<body>
<h1>Message : ${msg}</h1>
</body>
</html>
6-19-5. 뷰리졸버(ViewResolver) – XmlViewResolver
BeanNameViewResolver와 마찬가지로 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용하며
별도 XML 설정 파일로부터 뷰가되는 빈을 검색한다.
JstlView : JSP standard tag library(JSTL)을 사용하는 뷰
RedirectView : 젃대경로 또는 컨텍스트 상대경로로 리다이렉트 하는 뷰
[user-view.xml]
<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.2.xsd">
<bean id="success" class="org.springframework.web.servlet.view.JstlView">
<property name="url" value="/WEB-INF/views/success.jsp" />
</bean>
<bean id="home" class="org.springframework.web.servlet.view.RedirectView">
<property name="url" value="http://ojc.asia" />
</bean>
</beans>
[컨트롤러]
@Controller
public class WelcomeController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "Hello~");
return "success";
}
@RequestMapping("/home")
public String getInfo() {
return "home";
}
}
[success.jsp]
<html><head><title>Spring MVC XmlViewResolver</title></head> <body>
<h1>${msg}</h1>
</body>
</html>
6-20. 인터셉터(Spring4 MVC Interceptor)
 Spring MVC는 서블릿 필터와 유사하게 HTTP Request(요청)를 앞단/뒤단에서 가로챌 수 있는
메커니즘을 제공한다.(org.springframework.web.servlet.HandlerInterceptor)
 인터셉터가 되기 위해서는 HandlerInterceptor를 구현해야 하는데 preHandle(), postHandle(),
afterCompletion() 세개의 메소드를 구현해야 한다.
 preHandle() : 컨트롤러가 실행되기 젂에 실행되며 bool형 리턴 한다. 실행체인에서 계속 실행
할지 중단할지를 true, false로 젂달한다. false가 리턴되면 디스패처 서블릿은 핸들러가 직접
요청을 처리하여, 뷰를 직접 다룬다고 생각하고 다른 인터셉터나 핸들러의 실행을 중단한다.
preHandle() : 컨트롤러 메소드 실행젂에 실행된다.
postHandle() : 컨트롤러 메소드 실행 후 실행된다.
afterCompletion() : 모든 요청 처리 후에 실행된다.
[HelloInterceptor.java]
package interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class HelloInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object
handler) {
System.out.println("preHandle~~~");
return true;
}
public void postHandle(HttpServletRequest req,HttpServletResponse res, Object
handler,ModelAndView mv) {
System.out.println("postHAndle~~~");
}
public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler,
Exception ex) {
System.out.println("afterCompletion~~~");
}
}
/WEB-INF/spring/appServlet/servlet-context.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
……
<mvc:interceptors>
<bean class="interceptor.HelloInterceptor" />
</mvc:interceptors>
……
</beans>

#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원교육, 국비지원교육, 구로IT교육학원, IT실무교육, 오라클자바커뮤니티

  • 1.
    스프링프레임워크 & 마이바티스 (SpringFramework, MyBatis) 6-19. Spring Web MVC 뷰(ViewResolver) 6-19-1. 뷰리졸버(ViewResolver) – UrlBasedViewResolver  View이름과 실제 View의 이름이 같을 때 사용때 사용하는데 prefix, suffix, viewClass를 지정할 수 있고 단순 JSP만 사용할 때 용이하다. [자바 설정 파일] @Configuration @ComponentScan(“config”) public class AppConfig { @Bean public UrlBasedViewResolver urlBasedViewResolver() { UrlBasedViewResolver resolver = new UrlBasedViewResolver();
  • 2.
    resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); resolver.setCache(false); resolver.setViewClass(JstlView.class); return resolver; } } [컨트롤러] @Controller public classWelcomeController { @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("msg", "UrlBasedViewResolver Demo"); return "success"; //뷰 이름 } } [success.jsp] <html><head><title>Spring MVC View Test</title> </head><body> <h1>${msg}</h1> </body></html> 6-19-2. 뷰리졸버(ViewResolver) – InternalResourceViewResolver  UrlBasedViewResolver 를 상속하며 JstlView 와 TilesView 와 같은 서브클래스들과 InterResourceView (서블릿, JSP)를 지원한다. 이 리졸버에 의해 생성되어지는 모든 뷰들을 위 한 뷰 클래스는 viewClass 속성을 통해 지정하면 된다.  Spring DispatcherServlet의 디폴트 뷰 리졸버는 InternalResourceViewResolver 이다. 즉 XML 설정 안에 뷰 리졸버를 설정하지 않으면InternalResourceViewResolver가 ViewResolver가 된다. 접두어/접미어를 사용하여 뷰를 설정할 수 있으며 클래스패스 (Classpath) 내에 JSTL 라이브 러리가 있으면 JstlView를 없으면 InternalResourceView를 사용한다.
  • 3.
    [XML 설정] <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> [or 자바 설정] @Configuration @ComponentScan("config") public class AppConfig { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } } [컨트롤러] @Controller public class WelcomeController { @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("msg", "InternalResourceViewResolver Demo"); return "success"; //뷰 이름 } } [success.jsp]
  • 4.
    <html><head><title>Spring MVC ViewTest</title> </head><body> <h1>${msg}</h1> </body> </html> 6-19-3. 뷰리졸버(ViewResolver) – BeanNameViewResolver  뷰 이름과 동일한 이름을 갖는 빈 책체를 View 객체로 사용하는 뷰 리졸버 인데 주로 커스 텀 View 클래스를 뷰로 사용해야 하는 경우에 사용한다. AbstractView, AbstractExcelView, AbstractPdfView 등을 상속받아 커스텀 뷰를 만들어 사용한다.  뷰를 엑셀이나 PDF로 구성할 때 사용하거나 파일 다운로드를 위한 정보를 읽어와 뷰에 젂달 하는 컨트롤러는 다운로드 관련 정보를 뷰에 젂달한다. [PDF를 뷰로 사용하는 예문] [View 클래스] package com.ojc; public class MyPdfGenerator extends AbstractPdfView { ... } [컨트롤러] return ModelAndView('pdf') [설정파일] <bean class=“org.springframework.web.servlet.view.BeanNameViewResolver”/> <bean id = “pdf” class =“com.ojc.MyPdfGenerator”/> [엑셀을 뷰로 사용하는 예문] [View 클래스] package com.ojc; public class MyExcelView extends AbstractExcelView { ... } [컨트롤러] return ModelAndView(“myExcelView”) [설정파일]
  • 5.
    <bean id ="myExcelView" class = "com.ojc.MyExcelView" /> <!– BeanNameViewResolver는 가끔 다른 뷰와 같이 사용되기도 한다. -- <bean class=“org.springframework.web.servlet.view.BeanNameViewResolver”/> <property name = "order" value = "0" /> </bean> <bean class = “org.springframework.web.servlet.view.InternalResourceViewResolver "> <property name = "order" value = "1" /> </bean> 6-19-4. 뷰리졸버(ViewResolver) – ResourceBundleViewResolver  뷰 이름과 뷰 객체갂의 매핑 정보를 저장하기 위해 자원 파일을 사용한다.  리소스번들 파일(클래스패스 아래의 프로퍼티 파일)로부터 뷰 이름과 매핑되는 뷰 클래스를 정보를 얻으며, 기본적으로 views.properties 파일에서 뷰가 되는 빈 정보를 로드하지만 basename으로 재정의 가능하다. [자바 설정 파일] @Configuration @ComponentScan("config") public class ResolverConfig { @Bean public ResourceBundleViewResolver resourceBundleViewResolver() { ResourceBundleViewResolver resolver = new ResourceBundleViewResolver(); resolver.setBasename("resourcebundle"); return resolver; } } [컨트롤러] @Controller public class HelloController { @RequestMapping("/info") public String home(Model model) { model.addAttribute("msg", "ResourceBundleViewResolver Demo"); return “home"; //리소스 번들(프로퍼티) 파일에 뷰 클래스를 지정한다.
  • 6.
    } @RequestMapping("/home") public String getInfo(){ return "refer"; } } [resourcebunble.properties] home.(class)=org.springframework.web.servlet.view.JstlView home.url=/WEB-INF/views/success.jsp refer.(class)=org.springframework.web.servlet.view.RedirectView refer.url=http://ojc.asia [success.jsp] <html> <head> <title> Spring MVC ResourceBundleViewResolver Test</title> </head> <body> <h1>Message : ${msg}</h1> </body> </html> 6-19-5. 뷰리졸버(ViewResolver) – XmlViewResolver BeanNameViewResolver와 마찬가지로 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용하며 별도 XML 설정 파일로부터 뷰가되는 빈을 검색한다. JstlView : JSP standard tag library(JSTL)을 사용하는 뷰 RedirectView : 젃대경로 또는 컨텍스트 상대경로로 리다이렉트 하는 뷰 [user-view.xml] <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
  • 7.
    http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <bean id="success" class="org.springframework.web.servlet.view.JstlView"> <propertyname="url" value="/WEB-INF/views/success.jsp" /> </bean> <bean id="home" class="org.springframework.web.servlet.view.RedirectView"> <property name="url" value="http://ojc.asia" /> </bean> </beans> [컨트롤러] @Controller public class WelcomeController { @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("msg", "Hello~"); return "success"; } @RequestMapping("/home") public String getInfo() { return "home"; } } [success.jsp] <html><head><title>Spring MVC XmlViewResolver</title></head> <body> <h1>${msg}</h1> </body> </html> 6-20. 인터셉터(Spring4 MVC Interceptor)  Spring MVC는 서블릿 필터와 유사하게 HTTP Request(요청)를 앞단/뒤단에서 가로챌 수 있는 메커니즘을 제공한다.(org.springframework.web.servlet.HandlerInterceptor)  인터셉터가 되기 위해서는 HandlerInterceptor를 구현해야 하는데 preHandle(), postHandle(), afterCompletion() 세개의 메소드를 구현해야 한다.
  • 8.
     preHandle() :컨트롤러가 실행되기 젂에 실행되며 bool형 리턴 한다. 실행체인에서 계속 실행 할지 중단할지를 true, false로 젂달한다. false가 리턴되면 디스패처 서블릿은 핸들러가 직접 요청을 처리하여, 뷰를 직접 다룬다고 생각하고 다른 인터셉터나 핸들러의 실행을 중단한다. preHandle() : 컨트롤러 메소드 실행젂에 실행된다. postHandle() : 컨트롤러 메소드 실행 후 실행된다. afterCompletion() : 모든 요청 처리 후에 실행된다. [HelloInterceptor.java] package interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class HelloInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) { System.out.println("preHandle~~~"); return true; } public void postHandle(HttpServletRequest req,HttpServletResponse res, Object handler,ModelAndView mv) { System.out.println("postHAndle~~~"); } public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) { System.out.println("afterCompletion~~~"); } } /WEB-INF/spring/appServlet/servlet-context.xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • 9.