我在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!它会导致问题吗?
答案 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
类附带了许多其他有用的方法,例如getLong
,getLongValues
(返回Longs数组)而不是使用request.getParameterValues
然后转换为Long
),getInteger
,getIntegerValues
,...等。
在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" />