在portlet中在action方法中读取命名空间参数的最佳方法是什么。 我的表单包含
<input id="<portlet:namespace/>param1" name="<portlet:namespace/>param1" value='hello'/>
选项1:
request.getParameter(response.getNamespace() + "param1");
选项2:
request.getParameter("param1");
option1在liferay中不起作用,但似乎在websphere中起作用。 option2在liferay 6.2中运行良好。 option1似乎在6.1之前工作。
任何人都可以告诉我什么是符合jsr 286的方式?
答案 0 :(得分:4)
正如我在回答这个问题的评论中提到的那样,问题在于Liferay 6.2,因为IBM WebSphere和以前版本的Liferay正在按预期工作。
为了解决这个问题,我将元素<requires-namespaced-parameters>false</requires-namespaced-parameters>
添加到了portlet的liferay-portlet.xml
目录的/WEB-INF
。通过这样做,HTML表单的参数不是“命名空间”。
/WEB-INF/liferay-portlet.xml
的示例:
<?xml version="1.0" encoding="UTF-8"?>
<liferay-portlet-app>
<portlet>
<portlet-name>Portlet name</portlet-name>
<requires-namespaced-parameters>false</requires-namespaced-parameters>
<instanceable>true</instanceable>
<ajaxable>false</ajaxable>
</portlet>
</liferay-portlet-app>
如果将此元素添加到liferay-portlet.xml
,则portlet仍可在以前版本的Liferay中正常工作(我使用版本5.5和6.1进行了测试)。它也可以与其他portlet一起使用,因为它们忽略了这个文件。
我声称Liferay的行为不正确,因为JSR-286规范说明如下(在规范的第76页上面):
如果portlet命名空间或编码URL参数或表单参数,则它们还负责删除命名空间。 portlet容器不会删除portlet对这些参数所做的任何命名空间。“
答案 1 :(得分:0)
没有“符合jsr 286标准的方式”您可以使用这两种方法。当在同一门户网站页面上有多个portlet实例时,usage标记的主要用途是将精确参数传递给精确的porlet。在这种情况下,不同portlet的相同html输入具有不同的名称,每个portlet将获得自己的页面值。
答案 2 :(得分:0)
最后的日志语句来自运行webphere中的代码
<%@ taglib uri='http://java.sun.com/portlet' prefix='portlet'%>
<form name="<portlet:namespace />"
action="<portlet:actionURL windowState='normal'> <portlet:param name='action' value='processAction' /></portlet:actionURL>"
method="post"><br />
<input id="<portlet:namespace/>renderPage"
name="<portlet:namespace/>renderPage"
value='<%=request.getAttribute(Constants.RENDER_PAGE)%>'><br />
</form>
@Override
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException
{
if (mLogger.isDebugEnabled())
{
mLogger.debug("processAction:: Request Parameter Map:" + request.getParameterMap());
}
// Make all ActionRequest Parameter for RenderRequest
response.setRenderParameters(request.getParameterMap());
if (mLogger.isDebugEnabled())
{
mLogger.debug("processAction:: Latest changes are there");
mLogger.debug(Constants.RENDER_PAGE + "==Namespace=>"+request.getParameter(response.getNamespace()+Constants.RENDER_PAGE));
mLogger.debug(Constants.RENDER_PAGE + "==withoutnamespace=>"+request.getParameter(Constants.RENDER_PAGE));
}
2014-02-12 19:35:23,877 DEBUG ..... renderPage == Namespace =&gt; sites / Component Guide / Home.page 2014-02-12 19:35:23,877 DEBUG ..... renderPage == withoutnamespace =&gt; null