2015-06-22 123 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

我刚刚更新了问题 –