Liferay的<form>名称冲突风险是否真实?

时间:2017-04-06 14:11:57

标签: forms liferay

我按照了liferay helloword教程: https://dev.liferay.com/develop/tutorials/-/knowledge_base/6-2/writing-your-first-liferay-application#creating-a-form

它表示liferay应用程序表单中的表单应始终包含portlet基名作为名称,而不是与另一个portlet的表单名称冲突。

<aui:form action="<%= addEntryURL %>" name="<portlet:namespace />fm">
</aui:form>

为什么使用未命名按钮行的按钮不需要这种预防措施?

<aui:button-row cssClass="guestbook-buttons">
    <portlet:renderURL var="addEntryURL">
        <portlet:param name="mvcPath" value="/html/guestbook/edit_entry.jsp"></portlet:param>
    </portlet:renderURL>
    <aui:button onClick="<%= addEntryURL.toString() %>" value="Add Entry">
    </aui:button>
</aui:button-row>

我的意思是,任何一个portlet都可能有一个页面nammed&#34; /html/guestbook/edit_entry.jsp" ;,对吧?

另外,我尝试删除表单的此预防措施并复制我的portlet,并且没有任何名称冲突问题。那么它有用吗?

使用Liferay 6.2。

2 个答案:

答案 0 :(得分:1)

一种可能的可能是在同一页面中有两个相同portlet的实例。如果你使用id来解决Javascript中的元素,名称空间前缀将避免名称冲突。

或者它可能只是两个portlet的表单元素具有相同的id。在任何情况下,使用此练习避免的名称冲突都在Javascript中。

答案 1 :(得分:1)

关于命名空间

您的portlet的命名空间会自动添加到我的6.2门户中的AUI标记名称前面。这两个在名称上是等价的

<form name="<portlet:namespace />fm"</form>
<aui:form name="fm"></aui:form>

作为一方而言,他们也都拥有一个id属性,它只是name属性的一个副本。如果您查看Liferay源代码,您会看到几乎所有表单都被命名为“fm”。此约定用于方便,并且由于名称空间前缀不会发生冲突。

你的例子

我认为你的例子有点过时了。对于未命名的按钮行,除非另有说明,否则它将始终转到当前的portlet edit_entry.jsp,因为您的路径规范。但是,即使您在同一页面上实例化了两次相同的portlet,实际上也不会有所不同。我没有看到未命名的按钮行的问题。

可能发生冲突

如果您在同一页面上实例化了两次相同的portlet,那将会产生什么影响。让我们假设你有一个“pitch”portlet和一个“catch”portlet。它们都有一个扩展MVCPortlet的类“Portlet”。它们都有没有命名空间的fm表单。发布时,表单将触发一个动作URL,该动作URL将转到portlet并减去一个点。在这种情况下,可能存在冲突并从错误的portlet中减去一个点。

测试

要亲眼目睹冲突,您可以进行以下示例。

  1. 使用不同的名称创建两个Liferay插件Portlet。
  2. 在两个portlet中创建一个扩展MVCPortlet的Portlet.java文件(见下文)。确保完全限定的类名只是 Portlet (IE:不创建任何包)
  3. 在view.jsp文件中创建表单和操作网址(见下文)。
  4. 在Liferay-portlet.xml文件中添加以下代码。
  5. <强> Portlet.java

    public class DashboardRequestPortlet extends MVCPortlet {
        public void testAction(ActionRequest actionRequest, ActionRequest actionResponse) {
        System.out.println("test");
        }
    }
    

    <强> view.jsp的

    <portlet:actionURL name="testAction" var="testActionURL" />
    <form id="fm" name="fm" action="<%= testActionURL.toString() %>" method="post"></form>
    

    <强>的liferay-portlet.xml中

    <requires-namespaced-parameters>false</requires-namespaced-parameters>
    

    在两个portlet上的testAction方法中放置断点。将两个portlet拖到同一页面上。开始提交......