Java 使用SpringMVC表单提交portlet
我正在尝试使用SpringMVC实现提交表单的Liferay 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() {
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”模型属性。但是,您以前没有设置该模型属性。因此,首先在likehandleRenderRequest
方法中设置您的人物模型属性:
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>