Wednesday, September 16, 2015

Spring MVC



Spring MVC has below major components :

DispacherServlet : it is a common entry point of all http request . It forwards the request to the controller .Spring MVC follows front controller design pattern in which there is one controller which responds to all the requests.

HandlerMapping : it determines the controller to be called from request url .

Controller : it services the request and sets up data to the model and pass it to View.

ViewResolver : it determines the view to which request is to be transferred.

Lets see how can make use for the above Spring components in a web application.

In web.xml file  make an entry for dispatcher servlet.
<servlet-name>spring-web</servlet-name>
<servlet-class>
                    org.springframework.web.servlet.DispatcherServlet
                </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

Then map your application URL to the disptcher servlet.

<servlet-mapping>
<servlet-name>spring-web</servlet-name>
<url-pattern>/urlOfApp</url-pattern>
</servlet-mapping>



Create a file spring-web-servlet.xml and place it in WEB-INF with the following content.

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">



<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<mvc:resources mapping="/resources/**" location="/resources/" />

<mvc:annotation-driven />

</beans>


The naming convention of this file is [servlet name]-servlet.xml  , if we need to put a custom name or place it in custom path you need to configure the  listener class .We can also specify multiple application context xml  using the attribute. This is usually done to separate the web application context with the spring root application context. The web application context can be placed in WEB-INF folder which will be created when dispatcher servlet is loaded . The root application context can be created when the Context Loader Listener is loaded .



<listener>
<listener-class>org.spring.framework.web.context.ContextLoaderListener</listener-class>

</listener>
context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/common-config.xml</param-value>
</context-param>

If we need to have multiple web application configuration in different XML files we can also configure that.



<servlet>
    <servlet-name>spring-web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/main-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>spring-web2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/sub.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>


To use annotations to configure beans instead of xml configuration we need to add the following line of code in Spring configuration xml.

<context:component-scan base-package="org.myProject.question" />

To create a controller class use annotation @Controller:
Controller :

@Controller
public class SampleController
{
@RequestMapping(value = "/controllerUrl")
public String performAction(ModelMap requestResponse)
{
String viewName =" home";
requestResponse.put("message","Welcome to Home page");
return viewName;
}
}


Controller returns the view name , View page is a jsp. Which has to be placed in the path specified for the ViewResolver bean , if you look into the spring-web-servlet.xml we have specified the path as WEB-INF/views/jsp using prefix and suffix attributes .


<%@ page contentType = "text/html; charset = UTF-8" %>
<html>
   <head>
      <title>Home Page</title>
   </head>

   <body>
      <h2>${message}</h2>
   </body>
</html>


So let's try to build a web application with a home page .




<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <display-name>My App </display-name>
<servlet>
<servlet-name>spring-web</servlet-name>
<servlet-class>
                    org.springframework.web.servlet.DispatcherServlet
                </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-web</servlet-name>
<url-pattern>/home</url-pattern>
</servlet-mapping>
</web-app>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd">



<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<mvc:resources mapping="/resources/**" location="/resources/" />

<mvc:annotation-driven />

</beans>
@Controller
public class SampleController
{
@RequestMapping(value = "/home")
public String performAction(ModelMap requestResponse)
{
String viewName =" home";
requestResponse.put("message","Welcome to Home page");
return viewName;
}
}
<%@ page contentType = "text/html; charset = UTF-8" %>
<html>
   <head>
      <title>Hello World</title>
   </head>
 
   <body>
      <h2>${message}</h2>
   </body>
</html>

Let's try to build a restful web service using Spring MVC framework .
The following example will create a web service and list all the products .

Rest Controller :


@Controller
public class ProductController
{
@RequestMapping(value = "/products")
public @ResponseBody ProductListVO getAllProducts()
{
ProductListVO products = new ProductListVO();
//service call to get the products
return products;
}


End




No comments:

Post a Comment

ec2-user@ec2 Permission denied