请求actionUrl为空

时间:2017-10-23 09:04:16

标签: liferay liferay-6

我试图在Liferay 6.0.6中读取POST数据,但我总是收到一个空的ActionRequest(在数据不存在的意义上为空):

<portlet:actionURL var="prc">
<portlet:param name="view" value="prc"></portlet:param>

<form method="POST" action="${prc}" id="of2017" name="of2017" class="datos" enctype="multipart/form-data">

然后在ViewController中:

@RequestMapping(params="view=prc")
public void prc(ActionRequest request, ActionResponse response) {

此时, request.getAttributeNames(),request.getParameterNames()和request.getPortletSession()。getAttributeNames()始终为空。我错过了什么?

2 个答案:

答案 0 :(得分:2)

会话属性和命名空间

虽然你已经对你的问题有部分答案,但我认为解释这个答案是有益的。

首先,如果您可以发布更多代码,那将是有益的。具体来说,我有兴趣看到您的liferay-portlet.xml文件以及更多form元素。

命名空间

portlet命名空间是与portlet关联的唯一值。命名空间可防止出现问在同一页面上的两个单独的portlet中的两个相同的表单意外地在POST上将数据发送到错误的portlet。

您的帖子中不清楚这是否是问题,但它仍然是JSR-168和286 portlet中非常重要的主题。在Java portlet开发中,所有html表单元素都有一个portlet命名空间。示例JSP页面应如下所示

<!-- This is necessary on all JSP pages -->
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<portlet:defineObjects />

<form id="<portlet:namespace />fm" name="<portlet:namespace />fm" action="${whereever}">
   <input type="text" id="<portlet:namespace />input" name="<portlet:namespace />input" />
   <input type="submit" id="<portlet:namespace />button" name="<portlet:namespace />button">
</form>

您将在上面的示例中看到<portlet:namespace />标记。构建和部署portlet后,可以检查html元素。您将看到<portlet:namespace />标记已转换为portlet的命名空间(通常为 _YourPortletName _ )。这就是Liferay如何处理独特性,这绝对是必不可少的。您可以选择使用自动注入它的Alloy UI表单,而不是在html表单中显式使用namespace标签。

<!-- This is necessary on all JSP pages -->
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui"%>
<portlet:defineObjects />

<aui:form name="fm" action="${whereever}">
   <input type="text" name="input" />
   <input type="submit" name="button">
</form>

如果在部署portlet后检查此标记,您会注意到两件事。您会注意到name属性会自动注入命名空间(它将与前一个示例具有相同的名称)。您还会注意到AUI会自动创建一个具有相同名称的id标记(不要创建自己的标记)。

如果您尝试使用没有命名空间表单的ParamUtil.getString实用程序,它将无效。您可以通过添加

来禁用命名空间要求
<requires-namespaced-parameters>false</requires-namespaced-parameters>

到您的liferay-portlet.xml文件,但强烈不鼓励。

会话属性

您应该注意术语“会话属性”。在JSR-168和JSR-286 portlet中,您拥有正常的HTTP会话属性,这些属性由应用程序容器(Tomcat等)管理。

Liferay还有一个portlet会话,其决策类似,但出于不同的原因使用。 Portlet会话由Liferay管理,而不是由容器管理。 Liferay有一个单独的portlet会话,用于加载到页面上的portlet。在Liferay中,您可以修改liferay-portlet.xml文件以更改您的portlet是否具有私有或公共会话(控制它们是否访问门户会话和其他portlet会话)。

通常,您对portlet的简单POST请求根本不关心“会话属性”。通过使用命名空间ActionRequests将数据发送到后端Portlet类。如果您在JSP页面中使用上述任一示例,并且使用ParamUtil.getString(actionRequest, "input")获得输入框(名为 input )的值,则应该没有问题。在这种情况下,MVCPortlet或Spring MVC Portlet中的ActionRequests不需要@SessionAttributes({})

答案 1 :(得分:0)

噢,我可以用

读取数据
ParamUtil.getString(request, name-of-data)

并且错过了

@SessionAttributes({})

在ViewController的开头,虽然我不知道为什么,因为我已经没有使用它们的工作样本。