2 Stimmen

Das Struts2-Portlet führt bei der Aktualisierung von Liferay eine Standardaktion aus (anstelle der aktuellen Aktion)

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:

  1. Ich habe ein Struts2-Portlet A auf der Seite, seine Standard-"Index"-Aktion ist pageA1.
  2. Ich klicke auf einen Link auf A1 und gehe auf SeiteA2.
  3. Ich aktualisiere die Seite und das Portlet A zeigt immer noch SeiteA2.
  4. Es gibt noch weitere Portlets auf der Seite. Ich wähle ein beliebiges Portlet B und klicke auf einen Link auf B1.
  5. Portlet B navigiert zu B2. Währenddessen aktualisiert Liferay die anderen Portlets auf der Seite, einschließlich Struts2-Portlet A.
  6. 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:

  1. Klicken Sie auf einen Link auf Portlet A.
  2. Portlet A wird in Bildschirm A2 geladen.
  3. Klicken Sie auf einen Link auf Portlet B.
  4. Portlet B wird in Bildschirm B2 geladen.
  5. 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.

1voto

jalopaba Punkte 7829

Siehe http://www.liferay.com/documentation/liferay-portal/6.0/development/-/ai/understanding-the-two-phases-of-portlet-execution insbesondere die nachstehenden Absätze:

Die Portlet-Spezifikation definiert zwei Phasen für jede Anfrage eines Portlets, damit das Portal unterscheiden kann, wann eine Aktion ausgeführt wird (und nicht wiederholt werden sollte) und wann der Inhalt produziert (gerendert) wird:

  • Aktionsphase : Die Aktionsphase kann jeweils nur für ein Portlet aufgerufen werden und ist in der Regel das Ergebnis einer Benutzerinteraktion mit dem Portlet. In dieser Phase kann das Portlet seinen Status ändern, zum Beispiel zum Beispiel die Benutzereinstellungen des Portlets ändern. Es wird außerdem empfohlen, dass alle Einfügungen und Änderungen in der Datenbank oder Operationen, die nicht wiederholt werden sollen, in dieser Phase durchgeführt werden.
  • Rendering-Phase : Die Rendering-Phase wird immer für alle Portlets in der Seite nach der Aktionsphase (die existieren kann oder nicht) aufgerufen. Diese schließt das Portlet ein, das auch seine Aktionsphase ausgeführt hat. Es ist wichtig zu beachten, dass die Reihenfolge, in der die Renderphase der Portlets auf einer Seite ausgeführt wird, nicht durch die Portlet Spezifikation garantiert wird. Liferay hat eine Erweiterung der Spezifikation durch das Element render-weight in liferay-portlet.xml. Portlets mit einem höherem Render-Gewicht werden vor denen mit einem niedrigeren Wert.

[...]

Es gibt drei Arten von URLs, die von einem Portlet erzeugt werden können:

  • renderURL : Dies ist die Art von URL, die wir bisher verwendet haben. Sie ruft ein Portlet nur über seine Rendering-Phase auf.
  • actionURL Diese Art von URL teilt dem Portlet mit, dass es seine Aktionsphase ausführen soll, bevor alle Portlets auf der Seite gerendert werden.
  • ressourceURL Diese Art von URL kann verwendet werden, um Bilder, XML, JSON oder jede andere Art von Ressource abzurufen. Er wird häufig verwendet, um Bilder oder andere Medientypen dynamisch zu generieren. Er ist auch sehr nützlich, um AJAX-Anfragen an den Server zu stellen. Der Hauptunterschied dieses URL-Typs im Vergleich zu den beiden anderen besteht darin, dass das Portlet die volle Kontrolle über die Daten hat, die als Antwort gesendet werden.

Ich nehme an, Sie verwenden eine actionURL um auf die Seite A2 zu gelangen, anstatt eine renderURL .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X