스프링 2.5 부터는 클래스 패스에 위치한 클래스를 검색하여 특정한 어노테이션이 붙은 클래스를 자동으로 빈으로 등록하는 
기능을 제공하고 있다.



스프링 2.0 에서는 @Repository ,  2.5 에서는 @Component , @Service , @Controller 가 추가되었다.



@Component 어노테이션을 해당 클래스에 적용하면?
<context:component-scan> 태그를 이용해서 검색할 패키지를 지정하면 된다.

그러면 지정한 패키지에서 찾아서 빈으로 등록한다. 

<context:component-scan base-package="xxx.xxxx.xxx.home" />

 
자동 검색된 빈의 이름은 클래스의 이름을 빈의 이름으로 사용한다. (첫글자는 소문자로 바꾼뒤)

HomeController 라는 클래스였다면 빈 이름은 homeController 이다.
물론 이름을 지정할 수 도 있다. ("homeController")라고 어노테이션 옆에 적어주면된다.

해당 어노테이션을 설정할때 생성될 빈의 범위를 지정할 수 도 있다. @Scope("prototype") 이런식으로...


스캔 대상 클래스범위를 지정할 수 있는데...
<context:include-filter> 와 <context:exclude-filter> 를 이용하면 포함과 비포함 대상을 명시할 수 있다.

e.g

<context:component-scan baase-package="xxxx.xxx.xxxx.xxx">
  <context:include-filter type="regex" expression=".*HibernateRepository"/>
  <context:exclude-filter type="aspectj" expression="..*IBatisRepository"/>
</context:component-scan>

위의 필터 타입의 속성은
regex : 정규식 매칭 대상
aspectj : AspectJ 표현식으로 ...
annotation : 특정 어노테이션이 적용된...
assignable : 지정한 타입으로 할당되는...

e.g)
 
<context:component-scan base-package="com.sib" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
<context:include-filter type="annotation" expression="com.sib.xxx.model.annotation.Model" />
</context:component-scan>
-------------------------

위의것은 자동스캔이고.. 즉, 자동으로 빈등록하는거고

그냥 xml 로 빈등록하는 행위를 자바코드로도 할 수 있다.

그것이  Spring JavaConfig 프로젝트, @Configuration , @Bean 을 이용한 코드기반 설정이다.




착각하지 말아야 할것은 기본적으로.. 빈을 등록하는거랑 어노테이션은 ,  Configuration  어노테이션을 쓸때가 제외하면 별개의 내용이다.

즉 빈을 등록하는건 등록하는거고 (scan 등으로) 그걸 쓸때 어노테이션으로 자원을 가져와서 쓰는거다.

단  Configuration    는 빈을 등록하는것으로 이것을 제외하고 말이겠지?




@Repository ?? 
2.1에서 추가되었다나?  xml 에 선언하지 않고 빈을 등록하는 방법이 @Component만 있는게 아니다.
바로 @Repository 있다.

Component와 마찬가지로 스캔의 대상이 된다. 차이점은..

@Repository 는 DAO 기능을 수행하는 빈이 대상이라는데.. 뭐 -ㅅ-; 
그러면 @Component는? 서비스 레벨이라더라... 모호하면 Component과 DAO류면 @Repository ?? 

좀 그렇긴한데 우선 이렇게 이해해두자; 


 





BeanFactory 와 ApplicationContext .. 2가 인터페이스가 존재한다.



201207 참고로 XmlBeanFactory 는 deprecated 되었다. 모르겠으면 ApplicationContext를 쓰도록


BeanFactory
: BeanFactory 를 구현한 XmlBeanFactory가 존재한다. 
 외부 자원으로부터 설정 정보를 읽어 와 빈 객체를 생성한다.

Resource resource = new FileSystemResource("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(resource);
factoru.getBean("xxxx");

이런식으로 가능하다. 

참고로  FileSystemResource  는 org.springframework.core.io 에 있는 대상으로 찾아보면 다른 타입도 존재한다.
혹은 org.springframework.web.context.support.ServiceContextResource도 있다.



ApplicationContext
: 이게.. 무려 BeanFactory 인터페이스를 상속받은 하위 인터페이스이다. (즉 BeanFactory가 조상??)
기본기능외에 빈 객체 라이프 사이클, 파일과 같은 자원처리 추상화, 이벤트 등 추가적인 기능을 제공한다.해서
이 인터페이스를 구현한 클래스가 주로 쓰인다.


WebApplicationContext 인터페이스는 웹 어플리케이션을 위한 ApplicationContext 이다.

ApplicationContext 및 WebApplicationContext를 구현한 중요클래스는...
org.sp...work.context.support.ClassPathXmlApplicationContext : 클래스패스 위치로부터...
org.sp...work.context.support.FileSystemXmlApplicationContext : 파일시스템 위치로부터
org.sp...work.web.context.support.XmlWebApplicationContext : 웹어플리케이션 위치에서부터

예로 클래스패스에 위차한 /config/applicationContext.xml 파일로부터 설정정보를 읽어와 사용하고 싶다면?
String configLocation = "config/applicationContext.xml";
ApplicationContext context = new  ClassPathXmlApplicationContext(configLocation);
context.getBean("xxxx");


웹 어플리케이션에서 사용가능한 .. 걸 사용하는 경우는 web.xml에 
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>WEB-INF/applicationContext.xml</param-value>
</context_param>

어쩌구 저쩌구 하는데..  WebApplicationContextUtils 클래스를 직접적으로 사용하는 경우가 거의 없으므로 잊어라;

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

빈 정의시에 하나의 빈을 만들어두고 그걸 확장해서 쓰는 형태로 하고 싶다면
<bean id="doorMonitor" parent="commonMonitor"/>

이런식으로 해도된다. (commonMonitor가 정의되어있어야겠지)
<bean id="commonMonitor" class="xxx.xxx.xxx.Monitor" abstract = "true">
  <property name="a" value="1"/>
</bean>

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

스프링에선 기본적으로 <bean> 을 선언하면 싱글톤이다. 하나의 객체만 생성되지.
다만 <bean ... 에 scope="xxx" 옵션으로 그 빈의 범위를 조정할 순 있다.

이때 주의할점은... scope가 prototye (사용할때마다 매전 생성되는 옵션) 인 빈을 
일반선언한 (객체가 하나로 시작과 끝까지.. 하나의 객체라면,생명이 긴?)  빈에서 참조 (의존) 객체로 사용하는 경우
생명주기가 짧은(prototype) 빈의 설정에 <aop:scoped-proxy/> 선언을 해야 제대로 매번 생성된 객체를 사용하게 된다.

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

외부의 프로퍼티 파일을 스프링 설정 파일로 사용하고 싶다면?

PropertyPlaceholderConfigurer을 찾아봐라







 




'IT > 스프링' 카테고리의 다른 글

Autowired / Resource 차이... !!!!!  (0) 2012.03.15
Bean .. 빈 객체 스캔하여 빈 등록  (0) 2012.02.29
뷰 영역???  (0) 2012.01.26
@RequestBody , @ResponseBody  (0) 2012.01.20
WebApplicationContext 직접접근?  (0) 2012.01.19
예 .. 가능합니다.

전 안될줄 알았는데 되더군요. 원래 비디오 메모리로 얼마의 해상도가 표현가능한지 계산할 수 있는데 안해보고 그냥 안될려나 햇네요.
비디오 메모리는 8 메가 이고 vga 는 ATI radeon mobility 입니다. 

vga 드라이버는 omega driver 를 깔면됩니다. (  http://www.omegadrivers.net/  )

단.. 컬러는 16비트로 하셔야합니다. 그러면 아나로그 vga 의 최고 한도인 2048 이 됩니다.

근데... 실제 vga 가능 표에보면.. 무려 2560 해상도 있습니다; 다만 컬러는 256;

뭐 될지 안될지는 모르지만 그렇다는겁니다. (위의 2560 해상도는 듀얼링크 가 필요하거든요; )

 




흐음.. 뭐 중요하다면 중요한데.. .우선 .. 적당히 하고 넘어가고 필요할때 보자

알다시피 DispatcherServlet 이 HandlerMapping을 통해서 어떤 컨트롤러를 쓸지 알아내고
그 컨트롤러가 ModelAndView(물론 다른게 될 수 도 있고) 를 돌려주면 어떤 뷰를 써야하는지 알려주는 대상이 있다.

바로 ViewResolver 인데, 스프링이 제공하는 ViewResolver에 대해서 살펴보고 뷰구현기술에 대해서도.... 책봐라 -ㅅ-

ViewResolver는 응답 결과를 생성할 뷰 객체를 리턴한다.
모든 View 클래스는 View 인터페이스를 구현한다.




1. InternalResourceViewResolver
jsp, html 파일과 같이 웹 어플리케이션의 내부자원을 이용하여 부를 생성하는 경우?
AbstractUrlBasedView타입의 객체이고, 기본적으로 View 클래스는 InternalResourceView 클래스임

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/viewjsp/" />
<property name="suffix" value=".jsp" />
</bean>


2. BeanNameViewResolver 설정
뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용하는경우.

public ModelAndView download() throws Exception {
File downloadFile = getFile();
return new ModelAndView("download", "downloadFile", downloadFile);  // download 빈 으로 처리하도록 설정
}
        
        // 빈 등록하고
<bean id="viewResolver"
class="org.springframework.web.servlet.view.BeanNameViewResolver" />

        // download 빈 등록
<bean id="download" class="madvirus.spring.chap07.view.DownloadView" />

3. XmlViewResolver
뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용.
2번과 큰 차이는 없는데, 차이가 있다면 별도의 xml 설정 파일로 부터 빈 객체를 검색한다는것임

  <bean id="viewResolver"
class="org.springframework.web.servlet.view.XmlViewResolver"
                p:location="/WEB-INF/nonHtml-view.xml"/>


 4. ResourceBundleViewResolver 
리소스 번들(프로퍼티파일)로 부터 View 이름과 매핑 View 클래스를 구한다. 
책봐라..

그리고 DI,AOP 기능이 필요하다면 BeanNameViewResolver 나 XmlViewResolver 클래스를 사용한다.

 

다수의ViewResolver 설정하기
하나의 DispatcherServlet은 한 개 이상의 ViewResolver를 설정할 수 있도록 하고 있다.
order 를 두고 우선순위를 정할 수 있지. 순서대로 찾아가는 꼴이라고 보면 된다.

주의할 점은 InternalResourceViewResolver는 마지막 순위가 되도록 해야하는데, 왜냐면 해당 Resolver는 무조건 뷰 이름에 매핑되는 뷰 객체를 리턴하기 때문이다. (null을 리턴하지 않음)
Velocity도 마창가지로 주의해야하는데, VelocityViewResolver / VelocityLayoutViewResolver 는 뷰 이름에 매핑되는 Velocity 템플릿 파일이 존재하지 않을경우 예외를 발생시켜버린다.



스프링 커스텀 태그...
1. 메시지 

<spring:message> 커스텀태그를 이용해서 MessageSource 로 부터 메시지를 가져와 출력할 수 있다. (즉... 프로퍼티 같이 설정되어있는 값을 가져와 대치하는거지)

2. 폼관련
뭐.. 이제는 당연한거지만, 입력 폼(form)안의 데이터를 커맨드객체에 저장해서 넘겨받아 처리하는 형태이다. 
또한 반대로 커맨드 객체으 기밧을 입력폼에 출력해주는 기능도 있다. 
스프링은 많은 커스텀태그를 제공하고 있다.

<form:form commandName="login">
<form:errors />
<p>
<label for="loginType"><spring:message code="login.form.type" /></label>
<form:select path="loginType" items="${loginTypes}" />
</p>
<p>
<label for="id"><spring:message code="login.form.id" /></label>
<form:input id="id" path="id"/>
<form:errors path="id" />
</p>
<p>
<label for="password"><spring:message code="login.form.password" /></label>
<form:password id="password" path="password"/>
<form:errors path="password" />
</p>
<p>
<input type="submit" value="<spring:message code="login.form.submit" />">
</p>
</form:form>

흐음...  

<form:input>
<form:password>
<form:hidden>
위의 셋은  path 속성에 바인딩 될 커맨드객체의 프로퍼티를 지정함. 즉 이 값이 input 의 name 과 id 값이 된다.

<form:select>
: option 태그를 생성하는데 필요한 콜렉션을 전달받을 수 있음
<form:options>
:지정한 콜렉션 객체를 이용해서 option 태그를 생성할 수 있음
<form:option>
: 한개의 option...

컨틀롤러에서 생성해 뷰에 넘겨줄때 @ModelAttribute 어노테이션을 이용해서 넘겨준다.

@ModelAttribute("loginTypes")
protected List<String> referenceData() throws Exception {
List<String> loginTypes = new ArrayList<String>();
loginTypes.add("일반회원");
loginTypes.add("기업회원");
loginTypes.add("헤드헌터회원");
return loginTypes;
}
위처럼하고..
위의 html 을 보면

<p>
...
<form:select path="loginType" items="${loginTypes}" />
</p>

부분처럼 쓰인다.

그러면 생성되는 내용은
<select id='loginType' name='loginType'>
    <option value='일반기업'>일반회원</option>
    <option value='기업회원'>기업회원</option>
    <option value='헤드헌터회원'>헤드헌터회원</option>
</select>

 위의 방법 말고 <form:options> 도 있다.

<form:select path='loginType'>
    <option value="">---------- select --------------</option>
    <form:options items="${loginType}"/>
    <form:option value="TEST"/>
    <form:option value="TEST2">TEST2</form:option>
</form:select>
 

<form:checkboxes>
<form:checkbox> 

위의 둘도 select와 별 반 다를게 없다.

Map<String, String> favoritesOsNames = new LinkedHashMap<String, String>();
favoritesOsNames.put("윈도우XP", "윈도우XP");
favoritesOsNames.put("비스타", "비스타");
favoritesOsNames.put("윈도우7", "윈도우7");
favoritesOsNames.put("우분투", "우분투");
favoritesOsNames.put("맥", "맥");

                model.addAttribute("favoritesOsNames", favoritesOsNames); // 넣고...

jsp 에서 
 
<form:checkboxes items="${favoritesOsNames}" path="favorites" />
위와같이 하면

<input id='favorites1' name='favorites' value='윈도우XP'/><label for='favorites1'>윈도우XP</label>
<input id='favorites2' name='favorites' value='비스타'/><label for='favorites2'>비스타</label>

그 외 내용은 책에서;;


<form:radiobuttons>
<form:radiobutton>
: 흐음.. 역시나 select 나 checkbox와 비슷한다. 


Map<String, String> tools = new LinkedHashMap<String, String>();
tools.put("Eclipse", "Eclipse");
tools.put("IntelliJ", "IntelliJ");
tools.put("NetBeans", "NetBeans");

                model.addAttribute("tools", tools); 
이렇게 해두고...

 
<form:radiobuttons items="${tools}" path="tool" />
-->

<input id='tool1' name='tool' type='radio' value='Eclipse'/><label for='tool1'>Eclipse</label>
<input id='tool2' name='tool' type='radio' value='intelliJ'/><label for='tool2'>intelliJ</label>


<form:textarea>
뭐.. 별다를게 있겠느냐 아래를 봐라
<form:textarea path="etc" cols="20" rows="3"/>
-->
html로.. 변환하면
<textarea id="etc" name="etc" cols="20" rows="3"></textarea>


스프링이 제공하는 에러관련 커스텀 태그


뭐... Validator 를 이용해서 각종 에러 설정한것을 jsp에서 쓸 수 있는데..
Errors 나 BindingResult를 이용해서 에러 정보를 추가한 경우 <form:errors> 를 통해서 에러 메시지를 출력할 수 있다.

<p>
<form:label path="userId">회원 ID</form:label>
<form:input path="userId" />
<form:errors path="userId" />
</p>

이런경우... 실제 화면에서 아이디를 안넣고 submit을 한다든지 하면 form:errors 에서 에러메시지르 화면에 보여주게 된다.
(예로 필수항목입니다.. 등의 메시지가 옆에 표시됨)

그런용도로 쓸 수 있지...



 












'IT > 스프링' 카테고리의 다른 글

Bean .. 빈 객체 스캔하여 빈 등록  (0) 2012.02.29
스프링이 객체를 생성하는 형태?  (0) 2012.02.22
@RequestBody , @ResponseBody  (0) 2012.01.20
WebApplicationContext 직접접근?  (0) 2012.01.19
캐시옵션 설정  (0) 2012.01.19

흐음... 요즘은.. 서비스가 하나의 형태로 나타나지 않는다. 똑같은 데이터를 가지고 이런서비스 저런 서비스에서 똑같이 사용할 수 있단 말이지.
방법이야 게이트단에서 각 단에 맞게 보내주면되긴하다. 

스프링에서도 제공하는기술이 데이터 를 XML이나 JSON 형태로 주고 받을 수 있다. 그거지. 많은 추가 작업없이 가능하다.
예로 .htm 으로 호출하면 html이 오고 .json 으로 호출하면 그 결과가 json으로 오면된다. 주로 키맵의 리턴이 되는 형태 (여러 서비스들간의 통신에서?)
로 주고 받을 수 있다는거다.

@RequestBody 와 @ResponseBody 어노테이션은 각각 HTTP 요청 몸체를 자바 객체로 변환하고 자바 객체를 HTTP 응답 몸체로 변환해주는데 사용된다. 

@RequestBody 어노테이션을 이용하면 HTTP 요청 몸체를 자바 객체로 전달받을 수 있다.
@ResponseBody 어노테이션을 이용하면 자바 객체를 HTTP 응답 몸체로 전송할 수 있다. 

@RequestMapping( method = RequestMethod.POST)
@ResponseBody
public String simpleTest(@RequestBody String body) {
return body;
}

@RequestBody 어노테이션은 @RequestMapping에 의해 POST 방식으로 전송된 HTTP 요청 데이터를 String 타입의 body 파라미터로 전달한다.
@ResponseBody 어노테이션은 @RequestMapping 메서드에 적용되면 해당 메소드의 리턴값을 HTTP 응답데이터로 사용한다.

위의 경우 리턴값이 String 이므로 String 데이터를 HTTP 응답 데이터로 전송한다.

응답데이터.. 결과는 아래처럼 간다...
만약 폼에 값들이 들어있었다면

name=John&age=22

위의 경우 요청 몸체 데이터를 body 파라미터에 전달받고 있으며, body 파라미터를 그대로 결과값으로 리턴한다.
그런데 @ResponseBody 어노테이션이 적용되어 있어서 .. HTTP 요청데이터가 그대로 응답데이터로 간다.

해서 html... 웹브라우저 뷰에 

name=John&age=22

나올것이다.

이런것을.. 스프링MVC는 HttpMessageConverter를 이용해서 자바객체와 HTTP 요청/응답 몸체 사이의 변환을 처리한다.



HttpMessageConverter를 이용한 처리

AnnotationMethodHandlerAdapter 클래스는 @RequestBody 어노테이션이 적용된 파라미터나 @ResponseBody 어노테이션이 적용된 메소드에 대해 HttpMessageConverter 를 사용해서 변환처리한다. (정확히는 HttpMessageConveter의 구현클래스를 사용)

이 HttpMessageConverter를 구현한 몇가지 클래스들이 있다.
ByteArrayHttpMessageConveter 등.. 찾아봐라

만약 다른 messageConverter를 사용하겠다면 명시적 정의 가가능하다. (아래처럼...)
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="cacheSeconds" value="0" />
<property name="alwaysUseFullPath" value="true" />
<property name="webBindingInitializer">
<bean class="madvirus.spring.chap06.binder.CustomWebBindingInitializer" />
</property>
<property name="messageConverters">
<list>
<ref bean="byteArrayHttpMessageConverter" />
<ref bean="stringHttpMessageConverter" />
<ref bean="formHttpMessageConverter" />
<ref bean="sourceHttpMessageConverter" />
<ref bean="marshallingHttpMessageConverter" />
<ref bean="jsonHttpMessageConverter" />
</list>
</property>
</bean>
























 



'IT > 스프링' 카테고리의 다른 글

스프링이 객체를 생성하는 형태?  (0) 2012.02.22
뷰 영역???  (0) 2012.01.26
WebApplicationContext 직접접근?  (0) 2012.01.19
캐시옵션 설정  (0) 2012.01.19
HandlerInterceptor  (0) 2012.01.19
흐음... 스프링 컨텐이너에서 관리되지 않는 객체에서 스프링 빈을 사용하고 싶을때가 있다고 치고...
이런 경우 스프링이 제공하는 WebApplicationContextUtils 클래스를 이용해서 WebApplicationContext에 접근할 수 있다.

WebApplicationContextUtils 클래스는 DispatcherServlet이나 ContextLoaderListener가 생성한 WebApplicationContext에 접근할 수 있는
static 메소드를 제공한다.

ㄱ. WebApplicationContext getWebApplicationContext(ServletContext sc)
ContextLoaderListener가 생성한 루트 WebApplicationContext를 구한다.
ㄴ. WebApplicationContext getWebApplicationContext(ServletContext sc, String attrName)
지정한 속성이름 (attrName)으로 저장된 WebApplicationContext를 구한다.
주로 DispatcherServlet이 생성한 WebApplicationContext에 접근할 때 사용된다.

WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
Object commonLogger = rootContext.getbean("commonLogger");

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

의 경우

org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher 이다.

실제 접근시에

WebApplicationContext dispatcherContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext(), "org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher");

Object helloController = dispatcherContext.getBean("helloController");






 

 

'IT > 스프링' 카테고리의 다른 글

뷰 영역???  (0) 2012.01.26
@RequestBody , @ResponseBody  (0) 2012.01.20
캐시옵션 설정  (0) 2012.01.19
HandlerInterceptor  (0) 2012.01.19
파일 업로드 in spring... 3  (1) 2012.01.18
AnnotationMethodHandlerAdapter는 캐시 헤더를 설정하는 기능을 제공하고 있다.
따라서, 모든 컨트롤러에 동일한 캐시 옵션을 설정해야 할 경우, 중복없이 AnnotationMethodHandlerAdapter의 캐시 관련 프로퍼티를 이용해서 동일한 캐시 헤더를 설정할 수 있다.

  <bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="cacheSeconds" value="0" />
<property name="alwaysUseFullPath" value="true" />
<property name="webBindingInitializer">
<bean class="madvirus.spring.chap06.binder.CustomWebBindingInitializer" />
</property>
<property name="messageConverters">
<list>
<ref bean="byteArrayHttpMessageConverter" />
<ref bean="stringHttpMessageConverter" />
<ref bean="formHttpMessageConverter" />
<ref bean="sourceHttpMessageConverter" />
<ref bean="marshallingHttpMessageConverter" />
<ref bean="jsonHttpMessageConverter" />
</list>
</property>
</bean>

cacheSeconds 값이 0 : 캐시를 하지 않도록 헤더를 생성 / -1 : 캐시관련 헤더를 생성하지 않음 / 1 이상: 해당 시간만큼 캐시하도록 헤더설정







 

'IT > 스프링' 카테고리의 다른 글

@RequestBody , @ResponseBody  (0) 2012.01.20
WebApplicationContext 직접접근?  (0) 2012.01.19
HandlerInterceptor  (0) 2012.01.19
파일 업로드 in spring... 3  (1) 2012.01.18
Validator / Error interface .... in Spring  (0) 2012.01.16
스프링이 기본적으로 제공하는 HandlerMappingHandlerInterceptor를 이용해서 컨트롤러가 요청을 처리하기 전과 처리한 후에 알맞은 기능을 수핼할 수 있도록 하고 있다.

조건에 다라 컨트롤러에 요청을 전달하고 싶지 않거나, 컨트롤러가 요청을 처리한후에 ModelAndView 객체를 조작하고 싶은 경우에 사용된다.

HandlerInterceptor 인터페이스는 
요청처리전(preHandle), 요청처리후(postHandle), 요청처리하고 클라이언트에 응답전송한 뒤( afterCompletion ) .. 3군데이다.
순서대로...

ㄱ. boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)
handler 에는 컨트롤러 객체가 전달됨
한개 이상의 HandlerInterceptor가 체인을 형성하는데 preHandle 에서 false 를 리턴하면 다음 HandlerInterceptor또는 컨트롤러를 실행하지 않고,
요청 처리를 종료한다.

ㄴ. void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView)
컨트롤러가 요청을 처리한 뒤에 호출된다.
HandlerInterceptor체인에서 postHandle() 메소드는 preHandle 메소드의 살향순서를 반대로 해서 실행된다.
컨트롤러 실행 도중에 예외가 발생할 경우 실행되지 않는다.

 
ㄷ. afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler,Exception ex)
클라이언트의 요청을 처리한뒤, 즉, 뷰를 통해서 클라이언트에 응답을 전송한 뒤에 실행된다.
만약 컨트롤러가 처리중... 뷰처리중.. 에러가 나면..예외가 생기더라도 실행된다!!!
실행순서는 preHandle() 메소드의 실행순서와 반대이다.


HandlerInterceptor 인터페이스를 직접 구현하여 클래스를 작성할수도 있다. 다만 그렇게 되면 모두 구현해야한다;
해서 그냥 HandlerInterceptorAdaptor 클래스를 상속받아 필요한것만 구현한다.


HandlerInterceptor 의 실행순서
뭐 예측대로 움직이는데...  설정은 제대로..


<bean 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
    <list>
             <ref bean="interceptor1"/> 
             <ref bean="interceptor2"/> 
             <ref bean="interceptor3"/> 
    </list>
</property>

 위의 경우 클라이언트 요청을 처리할때 실행되는 메소드의 실행순서는
preHandle() : 1,2,3
postHandle() : 3,2,1
afterHandle() :3,2,1


HandlerExceptionResolver 를 이용하면 서블리 컨텐이너가 생성한 에러페이지가 아닌 예외타입에 맞는 , 스프링 MVC와
연동된 뷰를 이용해서 에러페이지를 출력할 수 있게 된다.

.. 찾아봐라 ~_~

SimpleMappingExceptionResolver
예외 타입이름과 특정 뷰 이름을 매핑할때 사용된다.

<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArithmeticException">
error/mathException
</prop>
<prop key="java.lang.Exception">
error/exception
</prop>
</props>
</property>
</bean>

java.lang.ArithmeticException 익셉션이면 뷰로 error/mathException 뷰를 사용하게 된다.
 











 





 

'IT > 스프링' 카테고리의 다른 글

WebApplicationContext 직접접근?  (0) 2012.01.19
캐시옵션 설정  (0) 2012.01.19
파일 업로드 in spring... 3  (1) 2012.01.18
Validator / Error interface .... in Spring  (0) 2012.01.16
Ant 경로 패턴 in @RequestMapping  (0) 2012.01.16

+ Recent posts