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
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:
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
 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); } }
 Related ArticleÂ
https://proliferay.com/hello-world-spring-mvc-portlet-annotations/
Pingback: Spring MVC Portlet : form not saving data correctly - BlogoSfera
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.Do you mean this false ???
Thanks! This article helps me a lot.