Liferay portlet不接收表单数据

时间:2013-09-25 19:25:27

标签: jsp liferay portlet

我在Liferay中制作了一个显示表单的portlet。我想在提交后处理表单数据,但数据在某处“消失”。

这是我在jsp中的表单代码:

<portlet:actionURL windowState="normal" var="filterURL">
</portlet:actionURL>
    <form action="<portlet:actionURL />" method="post">
    Industry: <input type="text" name="<portlet:namespace />industry" value="<%= industryFilter %>"/>
    <input type="submit" value="Filter" />
</form>

数据应该传递给我的portlet类,但不会。这是我的班级代码:

public void processAction(
        ActionRequest actionRequest, ActionResponse actionResponse)
    throws IOException, PortletException {

    String industryFilter = actionRequest.getParameter("industry");
    if(industryFilter == null) {
        industryFilter = "no-param";
    }
    actionResponse.setRenderParameter("industry", industryFilter);

    super.processAction(actionRequest, actionResponse);
}

此类旨在将数据传递回jsp。 setRenderParameter()方法工作正常,因为在jsp中我可以使用request.getParameter("industry");读取值但是,它总是返回“no-param”,这意味着actionRequest.getParameter()返回null。

因此,似乎我的processAction方法被正确调用,但它没有收到表单数据。错误在哪里,我错了什么?

更新

我将portlet下载到我的本地计算机,部署到本地演示Liferay安装,它工作正常!所以代码应该没问题,它必须是一些服务器设置/问题。我发现在Chrome开发人员工具的网络选项卡中,本地服务器只有一个状态为200的POST调用,而在远程服务器上有一个POST,其中302暂时移动,GET 200具有相同的URL!它会导致问题吗?

5 个答案:

答案 0 :(得分:5)

您应该为您的name值添加名称空间前缀,如下所示:

<input type="text" name="<portlet:namespace />inputTextName" />

或者您可以在requires-namespaced-parameters中将liferay-portlet.xml设置为false。

这是Liferay 6.2以来的变化:https://github.com/liferay/liferay-aui-upgrade-tool/issues/30

答案 1 :(得分:1)

表单元素的名称是"<portlet:namespace />industry",而不仅仅是“行业”。请尝试使用这一行代码。

String industryFilter = 
    actionRequest.getParameter(actionResponse.getNamespace()+"industry");

编辑: 我不知道portlet名称空间是从参数中删除的。我认为这必须是Liferay的东西。在这种情况下,我会提供一些其他选择。

如果您仍然无法从请求中获取参数,则可能需要进行一些调试。您可以使用actionRequest.getParameterMap()获取所有参数,看看是否发生了一些奇怪的命名。

另外,请考虑浏览器和可能正在操作请求的portlet之间是否有任何过滤器。对我来说,我们必须实现一个portlet过滤器,它剥离了与SQL注入攻击的正则表达式相匹配的任何参数,这导致我们以后遇到一些问题,这些问题对于调试来说并不是一点麻烦。

答案 2 :(得分:1)

最好尽可能使用liferay的实用方法,例如:

String industryFilter = ParamUtil.getString(actionRequest, "industry");

通过这种方式,您不必担心预先添加名称空间,而且ParamUtil类附带了许多其他有用的方法,例如getLonggetLongValues(返回Longs数组)而不是使用request.getParameterValues然后转换为Long),getIntegergetIntegerValues,...等。

在JSP中使用<aui:input />标签也很有帮助:

<aui:input type="text" name="industry" value="<%= industryFilter %>" />

因为这会处理生成的html name标记的<input />属性中的命名空间。

但如果你不想使用上述任何一种,那么@NickRoth提供的解决方案应该没有任何问题:

String industryFilter = actionRequest.getParameter(actionResponse.getNamespace()+"industry");

答案 3 :(得分:1)

好的,我终于找到了自己的解决方案。在某些时候,我将portlet添加到另一个页面,令人惊讶的是,它工作了!所以我删除了原始页面并逐步重新生成,设置权限等。我意识到问题是页面的名称(友好URL)!它设置为成员,这似乎导致了问题。我把它改为校友会员现在就可以了。

答案 4 :(得分:0)

这将为您提供参数<input type="text" name="<portlet:namespace />inputTextName" />

这不会是<aui:input type="text" name="<portlet:namespace />inputTextName" />

这将是<aui:input type="text" name="inputTextName" />