목차 >> Web 화면 개발 +- Spring Web MVC ----+- HandlerMapping --------+- Interceptor ----+- ViewResolver +- GlueAbstractController ----+- GlueSimpleController ----+- GlueJsonController |
Glue Framework에서는 Web 화면 개발은 기본적으로 Spring Web MVC framework을 바탕으로 합니다.
Spring Web MVC framework 은 request를 handler에게 전달하는 DispatcherServlet을 중심으로 설계되었습니다.
DispatcherServlet은 HttpServlet을 상속한 클래스 이므로 web.xml에 선언되어야 합니다. DispatcherServlet이 초기화되면, WEB-INF 디렉토리에서 [servlet-name]-servlet.xml 파일을 찾습니다.
다음과 같이 web.xml에 DispatcherServlet이 정의 되어 있다면, 파일명이 dispatcher-servlet.xml 인 파일이 필요합니다. (DispatcherServlet 의 'init-param' 을 통해 파일이름 변경 가능함)
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
DispatcherServlet은 [servlet-name]-servlet.xml에 근거해 자신만의 WebApplicationContext을 갖게 됩니다. [servlet-name]-servlet.xml 에는 controller, view resolver, locale resolver 등의 bean이 선언되어 있습니다.
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /*.mvc=controller </value> </property> </bean> <bean name="controller" class="com.poscoict.glueframework.web.control.spring.GlueSimpleController" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/springmvc/" /> <property name="suffix" value=".jsp" /> </bean>
HandlerMapping 은 WebApplicationContext의 정의된 특별한 bean 중의 하나로 다음 클래스를 사용할 수 있습니다.
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /content/*.mvc=controller /**/help.mvc=helpController </value> </property> </bean> <bean name="controller" class="com.poscoict.glueframework.web.control.spring.GlueSimpleController" /> <bean name="helpController" class=". . ." />
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <bean name="/hello.mvc" class="com.poscoict.glueframework.web.control.spring.GlueSimpleController" /> <bean name="/help.mvc" class=". . ." />
그외 HandlerMapping 관련 클래스는 spring documentation 을 참고하도록 합니다.
Spring의 HandlerMapping 매커니즘에는 Interceptor를 포함합니다. 아래 예제와 같이 handlerMapping bean에 interceptor를 포함시키는 것입니다.
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="sessionChecker"/> </list> </property> <property name="mappings"> <props> /*.mvc=controller </props> </property> </bean> <bean id="sessionChecker" class="sample.CheckSessionInterceptor"/> <bean id="controller" class=". . ."/>
Interceptor는 org.springframework.web.servlet 패키지의 HanderIntercepor 인터페이스를 구현해야 합니다. 해당 인터페이스에는 3개의 메소드가 정의되어 있으며, 다음과 같습니다.
예제의 sessionChecker 가 사용자정보 유무에 따라 request를 처리할지 판단한다면, 다음과 같이 구현할 수 있습니다. 예제에 사용된 HandlerInterceptorAdapter은 HanderIntercepor를 구현한 추상 클래스 입니다.
package sample; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class CheckSessionInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception { if(request.getSession().getAttribute("userId") != null) { return true; } else { response.sendRedirect("login.jsp"); return false; } } }
ViewResolver 도 WebApplicationContext의 정의된 특별한 bean 중의 하나로 다음 클래스를 사용할 수 있습니다.
그외 ViewResolver 관련 클래스는 spring documentation 을 참고하도록 합니다.
Spring Web MVC framework 에서는 Controller를 통해 application 동작에 대한 액세스를 제공합니다. 그래서 Glue Framework에서는 Controller를 통해 GlueService를 실행하는 할 수 있도록 추상클래스인 GlueAbstractController가 있습니다. GlueAbstractController 에서 제공하는 메소드는 Java Doc을 참고합니다. (GlueAPI)
그림 : GlueAbstractController |
GlueAbstractController는 GlueService 실행을 위한 기본 로직이 구현되어 있는 추상 Class로써, 다음 3개 메소드를 구현해야 합니다.
GlueSimpleController는 GlueAbstractController을 상속받아서 구현된 Controller 입니다. GlueService 실행 전후 특별히 추가해야 할 로직이 없다면 GlueSimpleController를 사용하면 됩니다. GlueService 실행 후 view page가 설정되어 있지 않으면 Url을 기초로 view page를 설정합니다.
아래와 같이 controller가 매핑되어 있다면, url이 dept.mvc 의 경우의 view page는 dept로 설정됩니다. 그리고 viewResolver에 따라 /jsp 위치의 dept.jsp 파일이 최종 view가 됩니다.
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /*.mvc=controller </value> </property> </bean> <bean id="controller" class="com.poscoict.glueframework.web.control.spring.GlueSimpleController" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
에러가 발생될 경우의 view page를 변경하고 싶다면 errorPage property를 설정하면 됩니다. 에러가 발생하지 않을 경우의 view page를 url과 관계없이 설정하고자 할 경우에는 viewPage property를 이용할 수 있습니다. 다음은 GlueSimpleController 의 property를 설정한 예입니다.
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /biz.mvc=controller </value> </property> </bean> <bean name="controller" class="com.poscoict.glueframework.web.control.spring.GlueSimpleController"> <property name="viewPage" value="view" /> <property name="errorPage" value="error" /> </bean>
제공되는 예제 'sample-hello-springmvc' 에서 dispatcher-servlet.xml 을 통해 응용해 보시기 바랍니다.
GlueJsonController는 GlueAbstractController을 상속받아서 구현된 Controller 입니다. GlueService 실행 전후 특별히 추가해야 할 로직이 없다면 GlueJsonController를 사용하면 됩니다. GlueService 실행 결과는 json data가 되며, GlueJsonController의 기본 view page는 jsonView 입니다.
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /*.json=controller </value> </property> </bean> <bean id="controller" class="com.poscoict.glueframework.web.control.spring.GlueJsonController" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/> <bean name="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
GlueJsonController의 기본 view page는 다음과 같이 변경할 수 있습니다.
<bean name="controller" class="com.poscoict.glueframework.web.control.spring.GlueSimpleController"> <property name="viewPage" value="view" /> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/> <bean name="view" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
GlueJsonController는 GlueService 실행 후 GlueContext에 담긴 data의 일부를 json으로 변환합니다. json 변환이 되는 대상은 GlueResultKeyList activity를 통해 지정합니다.
<?xml version="1.0" encoding="UTF-8"?> <service name="hello-json-service" initial="HelloActivity" xmlns="http://www.poscoict.com/glueframework/service"> <activity name="HelloActivity" class="sample.activity.SampleData"> <transition name="success" value="ResultKey List"/> </activity> <activity name="ResultKey List" class="com.poscoict.glueframework.biz.activity.GlueResultKeyList"> <transition name="success" value="end"/> <property name="ctx-keys" value="flower|fruits|vegatable"/> </activity> </service>
제공되는 예제 'sample-hello-springmvc' 에서 dispatcher-json-servlet.xml 을 통해 응용해 보시기 바랍니다.