EDITAR: Der Titel wurde geändert, um neuen Erkenntnissen Rechnung zu tragen. Es spielt keine Rolle, welche Art von Portlet das zweite Portlet ist. Siehe allgemeines Verhalten unten:
- Ich habe ein Struts2-Portlet A auf der Seite, seine Standard-"Index"-Aktion ist pageA1.
- Ich klicke auf einen Link auf A1 und gehe auf SeiteA2.
- Ich aktualisiere die Seite und das Portlet A zeigt immer noch SeiteA2.
- Es gibt noch weitere Portlets auf der Seite. Ich wähle ein beliebiges Portlet B und klicke auf einen Link auf B1.
- Portlet B navigiert zu B2. Währenddessen aktualisiert Liferay die anderen Portlets auf der Seite, einschließlich Struts2-Portlet A.
- Das erwartete Ergebnis nach der Aktualisierung von Portlet A ist SeiteA2, Die angezeigte Seite ist jedoch SeiteA1!
Die Symptome:
Ich habe der Struts-Aktion eine Protokollierung hinzugefügt, um die übergebenen Parameter anzuzeigen. Während der normalen Navigation (d.h. ich verwende nur das struts2 portlet A selbst), werden die Parameter struts.portlet.action und struts.portlet.mode angezeigt. Wenn jedoch eine automatische Aktualisierung des struts2-Portlets A aufgrund der Rendering-/Aktionsphase eines anderen Portlets B erfolgt, scheinen diese Parameter nicht an struts2 übergeben zu werden, so dass das Portlet A zu seiner IndexseiteA1 zurückkehrt, anstatt zu der vor der Aktualisierung angezeigten Seite (pageA2).
Bedeutet dies, dass, da es keine struts.portlet.action-Parameter von struts2 erkannt wird, es die Standard-Aktion aufrufen wird (in diesem Fall habe ich es auf "index"->pageA1)?
Alte Details
Ich habe ein Projekt eingerichtet, das zwei Portlets enthält, die beide das Struts2-Framework verwenden. Beide Portlets sind sich eigentlich recht ähnlich, aber ihr Code befindet sich in verschiedenen Paketen und in struts.xml sind ihre Aktionen in separaten Modulen mit eigenen Namespaces definiert. Sie sind jedoch immer noch Teil eines Projekts und werden zusammen in einer einzigen WAR-Datei verpackt.
Ich stelle die WAR in Liferay bereit und füge beide Portlets zu einer einzigen Seite hinzu. Das folgende Verhalten tritt auf, wenn ich die beiden Portlets verwende:
- Klicken Sie auf einen Link auf Portlet A.
- Portlet A wird in Bildschirm A2 geladen.
- Klicken Sie auf einen Link auf Portlet B.
- Portlet B wird in Bildschirm B2 geladen.
- Als Nebeneffekt wird jedoch Portlet A aktualisiert, und der angezeigte Bildschirm ist seine "Index"-Seite (anstelle von Bildschirm A2).
Ist dies das erwartete Verhalten, oder gibt es etwas anderes, was ich tun sollte, damit diese spezielle Einrichtung auf einer einzelnen Portalseite funktioniert?
EDITAR: Die Links, auf die ich klicke, sind renderURLs (erzeugt mit dem s:url-Tag). Die zweite Seite der beiden Portlets enthält Formulare, von denen ich nicht sicher bin, ob sie von Bedeutung sind.
Ich habe einige einfache Protokollierung hinzugefügt, und auf der Grundlage davon, ich habe entdeckt, dass bei jeder Seite aktualisieren, beide Portlets werden zweimal gerendert. Ich glaube nicht, dass das ein natürliches Verhalten ist.
Hier ist meine struts.xml, wenn es von Nutzen ist:
<package name="portletA" extends="struts-portlet-default" namespace="/portletA">
<action name="index" class="my.a.DisplayFirstPageAction">
<result name="success">/pageA1.jsp</result>
</action>
<action name="displayForm" class="my.a.DisplaySecondPageAction">
<result name="input">/pageA2.jsp</result>
</action>
</package>
<package name="portletB" extends="struts-portlet-default" namespace="/portletB">
<action name="index" class="my.b.DisplayFirstPageAction">
<result name="success">/pageB1.jsp</result>
</action>
<action name="displayForm" class="my.b.DisplaySecondPageAction">
<result name="input">/pageB2.jsp</result>
</action>
</package>
In beiden Portlets hat pageA1.jsp einen Link, der die Struts-Aktion "displayForm" aufruft. Die Ausführungsmethode der FirstPageAction gibt SUCCESS zurück, während die Ausführungsmethode der SecondPageAction INPUT zurückgibt.
Ich dachte, es könnte daran liegen, dass ich kein "erfolgreiches" Ergebnis in meiner zweiten Aktion habe (meine execute()-Methode gibt "input" zurück, da ich ein Formular auf der Seite habe). Das Hinzufügen eines result=success-Tags hilft allerdings nicht.
Wenn ich laut nachdenke, sollte, wenn ich auf den Link von A1 klicke, während B2 gerendert wird, die Render/Execute-Aktion von B2 aufgerufen werden, aber es scheint, dass stattdessen die Render/Execute-Aktion von B1 aufgerufen wird.