3

我在 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 调用,而在远程服务器上,有一个 302 临时移动的 POST 和一个具有相同 URL 的 GET 200!它会导致问题吗?

4

5 回答 5

6

您应该name像这样为您的值添加名称空间前缀:

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

或者您可以requires-namespaced-parametersliferay-portlet.xml.

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

于 2014-01-08T07:17:20.983 回答
1

好的,我终于自己找到了解决方案。在某个时候,我将 portlet 添加到另一个页面,令人惊讶的是,它起作用了!于是我把原来的页面删掉了,一步一步重新生成,设置权限等,才发现问题出在页面的名字(友好的URL)上!它被设置为似乎导致问题的成员。我现在把它改成校友会员了。

于 2013-09-27T11:31:01.097 回答
1

尽可能使用 liferay 的实用方法总是更好,例如:

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

这样您就不必担心在命名空间前面ParamUtil加上一些其他有用的方法,例如getLonggetLongValues(返回 Longs 数组而不是使用request.getParameterValues然后转换为LonggetInteger、、、getIntegerValues...等。

<aui:input />像 liferay 那样在 JSP 中使用标签也会很有帮助:

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

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

但是,如果您不想使用上述任何一种方法,那么@NickRoth 提供的解决方案应该可以正常工作:

String industryFilter = actionRequest.getParameter(actionResponse.getNamespace()+"industry");
于 2013-09-26T05:21:21.363 回答
1

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

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

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

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

此外,请考虑您在浏览器和您的 portlet 之间是否有任何过滤器,这些过滤器可能正在操纵请求。对我来说,我们必须实现一个 portlet 过滤器,该过滤器去除与 SQL 注入攻击的正则表达式匹配的任何参数,这会导致我们后来出现一些问题,但调试起来并不麻烦。

于 2013-09-25T20:22:05.877 回答
0

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

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

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

于 2015-01-10T05:36:30.717 回答