符合JSR 286的命名空间参数

时间:2014-02-04 10:36:46

标签: portlet liferay-6 websphere-portal jsr286

在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的方式?

3 个答案:

答案 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