我按照了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。
答案 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中减去一个点。
要亲眼目睹冲突,您可以进行以下示例。
<强> 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拖到同一页面上。开始提交......