• Form Submit in Spring MVC Portlet

    Posted on February 24, 2015 by Hamidul Islam in Liferay.

    form-submit-in-spring-mvc-portlet


    Today by this article "Form Submit in Spring MVC Portlet" I am going to explain how to submit form in your Spring MVC Portlet. This example is very very basic in Spring MVC. If your basics are strong then you are ready to go for the complex stuffs. By the end of this article you will learn

    i) Spring form:form tag

    ii) Binding UI data to POJO class

    iii) Use of  @ModelAttribute

    iv) Retrieve UI data from POJO in the Controller

    For the demonstration of Form Submit in Spring MVC portlet a I have created a new portlet. The various navigation is explained as below

    1. The first View (view.jsp)

    When the portlet is added to the portal page it looks like

    spring-form-submission-first-view

    Below is the source code of the above page. 

    <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
    
    <portlet:defineObjects />
    
    <portlet:renderURL var="renderURL">
    	<portlet:param name="action" value="showForm"/>
    </portlet:renderURL>
    
    <h3> Spring Form Submission Demo</h3>
    
    <br/><br/>
    
    <a href="<%=renderURL.toString()%>">Go to Form Page</a>
    

    On clicking Go to Form Page it will call below method in the controller

    	@RenderMapping(params = "action=showForm")
    	public String viewByParameter(Map<String, Object> map) {
    		log.info("##############Calling viewByParameter###########");
    
    		Customer customer = new Customer();
    
    		/**
    		 * Keep the object customer in the map this object will be used in the
    		 * JSP as modelAttribute
    		 */
    		map.put("customer", customer);
    
    		/**
    		 * Returning a String "form"
    		 *  This means that form.jsp is the view
    		 */
    		return "form";
    
    	}
    

    Explanation

    i) A controller can have multiple render method.

    ii) The render method is mapped by the parameter action=showForm

    iii) Before displaying the form we are creating Object of Customer class and putting in map. This will be used as model attribute in the form.jsp

    iv) We can give any name of render method with any parameters. Spring gives this flexibility.

    2. The second View (form.jsp)  

    After clicking the Go to Form Page link it will display form.jsp. Below is the code 

    <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
    <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
    <portlet:defineObjects />
    <portlet:actionURL var="submitFormURL" name="handleCustomer"/>
    <form:form name="customer" method="post" modelAttribute="customer" action="<%=submitFormURL.toString() %>">
    <br/>
    	<table style="margin-left:80px">
    		<tbody>
    			<tr>
    				<td><form:label path="firstName">First Name</form:label></td>
    				<td><form:input path="firstName"></form:input></td>
    			</tr>
    			<tr>
    				<td><form:label path="middleName">Middle Name</form:label></td>
    				<td><form:input path="middleName"></form:input></td>
    			</tr>
    			<tr>
    				<td><form:label path="lastName">Last Name</form:label></td>
    				<td><form:input path="lastName"></form:input></td>
    			</tr>
    			<tr>
    				<td><form:label path="age">Age</form:label></td>
    				<td><form:input path="age"></form:input></td>
    			</tr>
    			<tr>
    				<td><form:label path="address">Address</form:label></td>
    				<td><form:input path="address"></form:input></td>
    			</tr>
    
    			<tr>
    				<td colspan="2"><input type="submit" value="Submit Form">
    				</td>
    			</tr>
    		</tbody>
    	</table>
    </form:form>
    

    Explanation:

    use-of-model-attribute

     

    i) We are using here <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>. Its from Spring

    ii) The path attribute of form:label is to bind data to the POJO class.


     

    Data Binding

    spring-form-submission-data-binding


     The source code of the POJO Class Customer.java

    package com.proliferay.demo.model;
    
    import java.io.Serializable;
    
    /**
     *
     * @author Hamidul Islam
     *
     */
    
    public class Customer implements Serializable{
    
    	private static final long serialVersionUID = 1L;
    	private String firstName;
    	private String middleName;
    	private String lastName;
    	private int age;
    	private String address;
    
    	public String getFirstName() {
    		return firstName;
    	}
    
    	public void setFirstName(String firstName) {
    		this.firstName = firstName;
    	}
    
    	public String getMiddleName() {
    		return middleName;
    	}
    
    	public void setMiddleName(String middleName) {
    		this.middleName = middleName;
    	}
    
    	public String getLastName() {
    		return lastName;
    	}
    
    	public void setLastName(String lastName) {
    		this.lastName = lastName;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public String getAddress() {
    		return address;
    	}
    
    	public void setAddress(String address) {
    		this.address = address;
    	}
    }
    
    

    3. After Submitting the form
    When the form is submitted it call the below method of the controller

    @ActionMapping(value = "handleCustomer")
    	public void getCustomerData(
    			@ModelAttribute("customer") Customer customer,
    			ActionRequest actionRequest, ActionResponse actionResponse,
    			Model model) {
    
    		log.info("#############Calling getCustomerData##########");
    
    		actionResponse.setRenderParameter("action", "success");
    
    		model.addAttribute("successModel", customer);
    	}
    

    After execution of the action method it invokes the below render method

    	@RenderMapping(params = "action=success")
    	public String viewSuccess() {
    
    		log.info("#############Calling viewSuccess###########");
    		/**
    		 * Display success.jsp
    		 */
    		return "success";
    
    	}
    

    Explanation
    i) In the action method the parameter @ModelAttribute("customer") Customer customer retrieve the submitted form data. 

    ii) actionResponse.setRenderParameter("action", "success") is used to map render method to be called after execution of the action method. 

    iii) model.addAttribute("successModel", customer) prepares model data. The object successModel model will be available in the next view i.e, sucess.jsp 

    4. Final view success.jsp 

    <div>
    	<h3>Form submitted successfully</h3>
    </div>
    
    <div>First Name: ${successModel.firstName}</div>
    
    <div>Middle Name: ${successModel.middleName}</div>
    
    <div>Last Name: ${successModel.lastName}</div>
    
    <div>Age: ${successModel.age}</div>
    
    <div>Address: ${successModel.address}</div>
    

    5. Full Controller Code CustomerController.java

    package com.proliferay.demo.controller;
    
    import java.util.Map;
    
    import javax.portlet.ActionRequest;
    import javax.portlet.ActionResponse;
    import javax.portlet.RenderRequest;
    import javax.portlet.RenderResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.portlet.bind.annotation.ActionMapping;
    import org.springframework.web.portlet.bind.annotation.RenderMapping;
    
    import com.liferay.portal.kernel.log.Log;
    import com.liferay.portal.kernel.log.LogFactoryUtil;
    import com.proliferay.demo.model.Customer;
    
    /**
     *
     * @author Hamidul Islam
     *
     */
    @Controller("helloWorldController")
    @RequestMapping(value = "VIEW")
    public class CustomerController {
    
    	private Log log = LogFactoryUtil.getLog(CustomerController.class.getName());
    
    	/**
    	 *
    	 * When the portlet is added to the portal page this method will be called.
    	 * So this is the default render method
    	 */
    	@RenderMapping
    	public String viewHomePage(RenderRequest request, RenderResponse response) {
    
    		log.info("#################Calling viewHomePage############");
    
    		return "view";
    
    	}
    
    	@RenderMapping(params = "action=showForm")
    	public String viewByParameter(Map<String, Object> map) {
    		log.info("##############Calling viewByParameter###########");
    
    		Customer customer = new Customer();
    
    		/**
    		 * Keep the object customer in the map this object will be used in the
    		 * JSP as modelAttribute
    		 */
    		map.put("customer", customer);
    
    		/**
    		 * Returning a String "form"
    		 *  This means that form.jsp is the view
    		 */
    		return "form";
    
    	}
    
    	@RenderMapping(params = "action=success")
    	public String viewSuccess() {
    
    		log.info("#############Calling viewSuccess###########");
    		/**
    		 * Display success.jsp
    		 */
    		return "success";
    
    	}
    
    	@ActionMapping(value = "handleCustomer")
    	public void getCustomerData(
    			@ModelAttribute("customer") Customer customer,
    			ActionRequest actionRequest, ActionResponse actionResponse,
    			Model model) {
    
    		log.info("#############Calling getCustomerData##########");
    
    		actionResponse.setRenderParameter("action", "success");
    
    		model.addAttribute("successModel", customer);
    	}
    
    }
    
    

     Download Source Code 

     Related Article 

    http://proliferay.com/hello-world-spring-mvc-portlet-annotations/

4 Responses so far.

  1. Miha says:

    In order for the model binding in

    @ActionMapping(value = "handleCustomer")
    public void getCustomerData(
    @ModelAttribute("customer") Customer customer,
    ActionRequest actionRequest, ActionResponse actionResponse,
    Model model) {
    to work, you need to add false setting to your liferay-portlet.xml.

  2. marchsun says:

    Thanks! This article helps me a lot.

Leave a Reply

Your email address will not be published. Required fields are marked *

Are you human? * Time limit is exhausted. Please reload CAPTCHA.

Top
%d bloggers like this:

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close