You are on page 1of 24

Spring MVC

September 2007

Wednesday, November 25, 2009 CONFIDENTIAL
© Kanbay Incorporated - All Rights Reserved
Contents
»DispatcherServlet
»Request flow in application
»Meaning of Important terms
»HandlerMapping
 Commonly Used handlerMappings
 Configuration
 Registering more than one handlerMapping
 Best Practices for designing handlerMapping
»Interceptors
 Purpose
 Use cases
 Example
 Registering interceptor with URLHandlerMapping

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
2
Contents continue
»Controllers
 Classification of spring controllers
 SimpleFormController
»Spring tag library
 <spring-bind> tag
 BindStatus object
»ViewResolver
»Spring I18n

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
3
DispatcherServlet
It is Front controller for Spring web mvc
Configuration in web.xml

<servlet>
<servlet-name>springWebMvcPract</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>namespace</param-name>
<param-value>XmlWebBeanFactory</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>springWebMvcPract</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
4
Request flow in application

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
5
Meaning of Important terms
DispatherServlet
first component which receive request is DispathcerServlet
Handler Mapping
Holds Mapping between URL and controller objects in application
Default Handler Mapping is BeanNameUrlHandlerMapping
Controller
org.springframework.web.servlet.mvc.Controller is basic controller available and all spring’s controllers
implements this interface
ModelAndView
Spring controller can return instance of ModelAndView Default Handler.
This object act as helper for DispatcherServlet in getting view

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
6
Meaning of Important terms continue
ViewResolver
ViewResolver helps DispatcherServlet for getting instance of View that will render view
Main Purpose of ViewResolver is to map logical view name with view
Default ViewResolver for DispatcherServlet is InternalResourceViewResolver

View
This object is responsible for rendering view
org.springframework.web.servlet.View is basic interface available
commonly used View implementation for JSP
org.springframework.web.servlet.view.JstlView

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
7
HandlerMapping :- Commonly Used HandlerMappings
Commonly used HandlerMappings

Name Details Imp note
BeanNameUrlHandlerMapping Maps controller to URL based on By default DispatcherServlet use
bean name this implementation

SimpleUrlHandlerMapping Maps Controller to URL based on
Property

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
8
HandlerMapping :- Configuration
For BeanNameUrlHandlerMapping <bean name="/security/login.htm"
class="com.gp.common.security.web.con
When client send request to application as
troller.LoginController">
http://www.localhost.com:8080/spring_mvc/s <property name="formView"
ecurity/login.htm value="login" />
Dispatcher servlet will dispatch request to <property name="successView"
LoginController value="home" />
<property name="validator"
Imp note ref="loginValidator" />
Since BeanNameUrlHandlerMapping is </bean>
default in spring application it is not
necessary to define in XML bean factory
When it is only URLHandlerMapper in
application

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
9
HandlerMapping :- Configuration
For SimpleUrlHandlerMapping URL HandlerMapping
<bean id="restrictedUrlMapping"
This handler mapping maps URL to
controller based on Property class="org.springframework.web.servlet.handler.Sim
pleUrlHandlerMapping">
<property name="mappings">
URL is act as a key while bean id act a
<props>
Value
<prop
key="/logout.htm">logoutController</prop>
Here /logout.htm (i.e. Key) is mapped to </props>
bean with id logoutController (i.e. value)
</property>
</bean>

Controller definition
<bean id="logoutController"
class="com.gp.common.security.web.controller.Logo
utController">
<property name="logoutView"
value="security/login.htm" />
</bean>

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
10
HandlerMapping :- Registering More than one HandlerMapping
<bean id="publicUrlMapping"
Need
class="org.springframework.web.servlet.handler.BeanNa
For large applications which need modular meUrlHandlerMapping">
division of code <property name="order">
<value>0</value>
Here we defined 2 handler mappings
</property>
With property order is initialized </bean>

<bean id="restrictedUrlMapping"
Value of order property ↓ priority ↑
class="org.springframework.web.servlet.handler.SimpleU
rlHandlerMapping">
<property name="mappings">
here bean defined with id publicUrlMapping <props>
has highest priority <prop key="/logout.htm">logoutController</prop>
</props>
</property>
<property name="order">
<value>1</value>
</property>
</bean>

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
11
HandlerMapping :- Best Practices
1] For large application divide application in small modules and for each
module define one handler mapping if possible

2] Try to avoid using BeanNameUrlHanlderMappings since this scatters
our URL mappings across multiple xml files

3] Define all handler mappings for whole application at one location

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
12
Interceptors :- Purpose

Spring Provides extremely useful functionality when we want
to apply some specific functionalities to client requests
Handler Interceptor process request before or after
appropriate controller process request

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
13
Interceptors :- Use cases

1] Our URLs can be classified on Macro level in 2 parts
Public URL e.g. login page, forgot password page etc
Restricted URL which need user’s authentication
e.g.. Logout
In this use case we need to check if user is having credentials to access
this pages
2] We need to capture some important information related to client when
client send request to server
e.g.. Client’s IP address, his/her Locale, accessed Pages etc
This information can be logged either in file or persisted in database
3] Increasing user experience
This kind of use case can play important role when application
moved to production mode and we need to check frequent visited pages
by client

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
14
Interceptors :- Example
If you want to create your own interceptor
you can choose to extend your class public boolean preHandle(HttpServletRequest request,
HandlerInterceptorAdapter or implement HttpServletResponse
response, Object handler) throws Exception {
HandlerInterceptor
HttpSession session =
When Interceptor handle request? request.getSession(false);
if (session == null) {
It provides us functionality to process request
before or after appropriate controller has response.sendRedirect(request.getContextPath() + "/"
processed it
+ this.viewLocationForInvalidUrlAccess);
return false;
} else {
// user is having
preExisting session then
return true;
}
}

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
15
Interceptors :- Registering Interceptor with URLHandlerMapping

<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
</bean>
<bean id="publicUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor" />
</list>
</property>
<property name="order">
<value>0</value>
</property>
</bean>

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
16
Controllers :- classification

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
17
SimpleFormController
When to use SimpleFormController
When we need to process simple forms

Mandatory attributes SimpleFormController
commadClass :- class to be bind as a command object
formView :- logical name of form view

Some other Imp attributes
successView:- logical name of view after form submission
validator :- bean to validate form fields

Features
Provide Separation of Validation logic from controller
Binding of value objects struts lacks in it

Limitations
Controller chaining is difficult or not possible to implement.
Struts Provide Action Chaining

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
18
Spring tag library <spring-bind> tag
Purpose
Used to access command object and error associated with command object
Attributes
It has only one attribute named path indicates bean or bean property being used e.g. in following listing we are accessing username
attribute in comand object

<spring: bind path="command. username">
<input type="text" name="userName" size="20"
value="<%=status.getDisplayValue()%>">
<FONT color="red"> <B><%=status.getErrorMessage()%>
</B> </FONT>
</spring:bind>

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
19
Spring tag library :- BindStatus Object
Spring provides
org.springframework.web.servlet.support.BindStatus
object available in page scope with name status

Imp methods in BindStatus object available
getDisplayValue()
This method gives actual value of command attribute
getErrorMessage()
This method gives error associated with command attribute if any

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
20
ViewResolver :- ResourceBundleViewResolver
First Listing shows bean definition <bean name="/security/login.htm"
For LoginController this is nothing but child of class="com.gp.common.security.web.controller.Login
SimpleFormController Controller">
<property name="formView" value="login" />
While second listing shows definition of <property name="successView" value="home" />
ViewResolver in XML bean factory <property name="validator" ref="loginValidator" />
When any client want to see Login page </bean>
It will send request as
http://localhost:8080/spring_mvc/security/login.htm <bean id="viewResolver"
class="org.springframework.web.servlet.view.Resour
3rd Listing shows definition View object and ceBundleViewResolver">
corresponding view location <!-- this will going to fetch views.properties from
classpath -->
<property name="basename" value="views" />
</bean>

login.class=org.springframework.web.servlet.view.Jst
lView
login.url=/WEB-INF/views/jsp/common/login.jsp

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
21
Spring I18n
Spring provides CookieLocaleResolver which allow
user to change application language on the fly
Configuration
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />

<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
</bean>

<bean id="publicUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor" />
</list>
</property>
</bean>

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
22
Reference

»Pro Spring
By Rob Harrop
Apress publications
»Spring In Action
By Craig Walls
Manning Publications

Wednesday, November 25, 2009 | © Kanbay Incorporated. All Rights Reserved CONFIDENTIAL
23
Kanbay
WORLDWIDE HEADQUARTERS 6400 SHAFER COURT ROSEMONT, ILLINOIS USA 60018
Tel. 847.384.6100 Fax 847.384.0500 WWW.KANBAY.COM

Wednesday, November 25, 2009 CONFIDENTIAL
© Kanbay Incorporated - All Rights Reserved