Java 使用SpringMVC表单提交portlet

Java 使用SpringMVC表单提交portlet,java,jsp,spring-mvc,liferay,portlet,Java,Jsp,Spring Mvc,Liferay,Portlet,我正在尝试使用SpringMVC实现提交表单的Liferay portlet 模型: package com.model; public class Person { String firstName; String middleName; public String getFirstName() { return this.firstName; } public String getMiddleName() {

我正在尝试使用SpringMVC实现提交表单的Liferay 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());
    }


}
控制器:

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)

我的控制器好像出了点问题。 有人能帮我纠正这个问题吗?

您正试图在
submitPerson
方法中获取“person”模型属性,并且您正试图在
JSP
中使用“person”模型属性。但是,您以前没有设置该模型属性。因此,首先在like
handleRenderRequest
方法中设置您的人物模型属性:

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

看看这个例子,也许对你有帮助

您必须正确使用ModelAndView


JSP中的表单标记引发异常,因为模型中没有“person”属性。您必须在模型中包含
Person
类的实例。有几种方法可以实现它。使用
@modeldattribute
注释注释的方法可能是最方便的方法

我建议在控制器中添加以下方法:

@ModelAttribute("person")
public Person getPerson() {
    return new Person();
}
或者您可以修改render方法(我还从签名中删除了未使用的参数):


这是因为您正在jsp中绑定“person”对象,但并没有从控制器中为变量“person”传递任何内容。这就是为什么render无法在作用域中找到该对象并引发异常的原因

在控制器方法中添加下面的代码行,它就会工作

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

您正在使用哪个版本的Liferay

如果大于6.2 GA1

然后在您的liferay-portlet.xml文件中,请添加此属性并重新编译和测试

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

默认情况下,Liferay将命名空间添加到请求参数中。你需要禁用它

你的意思是我应该创建一个带有注释@RenderMapping的方法,并将此代码添加到其中。然后它将返回modelAndView变量?我得到了相同的例外情况您的建议是合乎逻辑的,我们创建一个对象,jsp将能够使用它。但是我认为我应该修改welcome.jsp中的一些内容。例如,jsp以这种方式读取消息${msg}。但是这个标记:是否足以读取person的初始值?在呈现JSP时是否会得到完全相同的异常?还是新的?或者在发布表单时,呈现是否成功并引发另一个异常?您做了哪些更改?你能用这些变化更新这个问题吗?
<requires-namespaced-parameters>false</requires-namespaced-parameters>