2015-06-22 111 views
3

我正在嘗試使用spring MVC實現提交表單的Liferay portlet。表單使用Spring MVC提交portlet

模型:

package com.model; 

public class Person { 
    String firstName; 
    String middleName; 

    public String getFirstName() 
    { 
     return this.firstName; 
    } 

    public String getMiddleName() 
    { 
     return this.middleName; 
    } 

    public void setFirstName(String firstName) 
    { 
     this.firstName=firstName; 
    } 

    public void setMiddleName(String middleName) 
    { 
     this.middleName=middleName; 
    } 
} 

控制器:

package com.controller; 

import com.model.Person; 

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.bind.annotation.RequestMethod; 
import org.springframework.web.portlet.ModelAndView; 
import org.springframework.web.portlet.bind.annotation.ActionMapping; 
import org.springframework.web.portlet.bind.annotation.RenderMapping; 

@Controller(value = "MyFirstSpringMVCPortlet") 
@RequestMapping("VIEW") 
public class MyFirstSpringMVCPortlet { 

    @RenderMapping 
    public ModelAndView handleRenderRequest() { 
     ModelAndView modelAndView = new ModelAndView("welcome"); 
     modelAndView.addObject("person", new Person()); 
     modelAndView.addObject("msg", "Hello Spring MVC"); 
     return modelAndView; 
    } 


    @ActionMapping(value = "handleSubmitPerson") 
    public void submitPerson(
      @ModelAttribute("person") Person person, 
      ActionRequest actionRequest, ActionResponse actionResponse, 
      Model model) { 
      System.out.println("FirstName= "+person.getFirstName()); 
      System.out.println("MiddleName= "+person.getMiddleName()); 
    } 


} 

視圖(的welcome.jsp)

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> 
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %> 
<h1>${msg}</h1> 
<portlet:defineObjects /> 
<portlet:actionURL var="submitFormURL" name="handleSubmitPerson"/> 
<form:form name="person" method="post" modelAttribute="person" 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 colspan="2"><input type="submit" value="Submit Form"> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</form:form> 

我用maven構建了這場戰爭,然後我在Liferay門戶的Apache Tomcat下部署了這場戰爭。直到這一點,一切工作正常,沒有問題。 但是,當我試圖運行portlet時,我在控制檯中出現了一個錯誤。下面的堆棧跟蹤描述它:

11:37:15,586 ERROR [RuntimePageImpl-26][render_portlet_jsp:132] null 
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'person' available as request attribute 
    at org.apache.jsp.WEB_002dINF.jsp.welcome_jsp._jspx_meth_form_005flabel_005f0(welcome_jsp.java:238) 
    at org.apache.jsp.WEB_002dINF.jsp.welcome_jsp._jspService(welcome_jsp.java:173) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:96) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749) 
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:605) 
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:544) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 

看來我的控制器有問題。 有人可以幫我解決問題嗎?

回答

4

你正在使用哪個版本的Liferay?

如果是> 6.2 GA1

然後在你的Liferay的portlet。xml文件,請添加此屬性並重新編譯並再次測試。

<requires-namespaced-parameters>false</requires-namespaced-parameters> 

Liferay默認爲請求參數添加命名空間。你需要禁用它。

+1

謝謝Sharana它工作正常! –

0

您正試圖獲得submitPerson方法中的「人物」模型屬性,並且您正試圖在JSP中使用「人物」模型屬性。但是,您之前未設置該模型屬性。所以設置你的人模型第一屬性像handleRenderRequest方法:

ModelAndView modelAndView = new ModelAndView("welcome"); 
modelAndView.addObject("person", new Person()); 
+0

你的意思是我應該創建一個帶註釋@RenderMapping的方法,併爲它編寫代碼。然後它會返回modelAndView變量? –

1

表單標籤引發異常,因爲有在模型中沒有「人」的屬性。您必須在模型中包含Person類的實例。如何實現它有幾種方法。用@ModelAttribute進行註釋的方法可能是最方便的。

我建議以下方法添加到控制器:

@ModelAttribute("person") 
public Person getPerson() { 
    return new Person(); 
} 

或者你可以修改渲染方法(我也刪除從簽名未使用的參數):

@RenderMapping 
public ModelAndView handleRenderRequest() { 
    ModelAndView modelAndView = new ModelAndView("welcome"); 
    modelAndView.addObject("person", new Person()); 
    modelAndView.addObject("msg", "Hello Spring MVC"); 
    return modelAndView; 
} 
+0

我得到了同樣的異常 –

+0

你的建議合乎邏輯,我們創建了一個對象,jsp隨後可以使用它。但我認爲我應該修改welcome.jsp中的某些內容。例如,jsp以這種方式讀取消息$ {msg}。 但是這個標籤:足以讀取人的初始值嗎?> –

+0

渲染JSP時是否會出現完全相同的異常?還是一個新的?或者在發佈表單時渲染成功並引發另一個異常? –

0

這是因爲你在jsp中綁定了「person」對象,但是你沒有爲控制器中的變量「person」傳遞任何東西。這就是爲什麼渲染無法在範圍內找到該對象並拋出異常。

在你的控制器方法中添加下面的代碼行,它會工作。

mv.addObject("person", new Person()) // Note : you must use same name in jsp page as defined in first argument 
+0

我試過了,它不起作用 –

+0

你做了什麼改變?你能用這些改變更新問題嗎? –

+0

我剛剛更新了問題 –