Hello all -

We've had some trouble using Struts 2 portlets (2.0.14) with Oracle Portal, and I wondered if anyone else had used this combination successfully.

The problems occur with portlets that have a form and submit buttons, and the issue seems to be that Struts uses render parameters to pass information (like action name) from the event phase to the render phase. Oracle Portal keeps these values in the generated URL for the form action, and so they persist for longer than Struts is expecting them to.

An aside - this is also an issue with straight JSR 168 portlets in the Oracle portal, but we can work around this by using session attributes to pass data from event to render, rather than render params. However, as Struts uses render params internally to figure out which action to invoke, there's no similar workaround for Struts. I suspect the problem is in the Oracle portal - the JSR 168 spec seems to indicate that render params are for passing data from event phase to render phase, but I wanted to see if anyone was aware of the issue and if there is a workaround. This all works perfectly when running in Pluto.

Here's an illustration of the problem - we are using a "redirectAction" to get from event to render.

I have a simple Struts action class "StrutsTest" which has these methods:

        public String execute();   // implements event phase processing
        public String doView();    // implements render phase processing

These methods do nothing except logging.

My form has a single text input field called "pie" and a single submit. Here's the relevant part of the struts config:

  <action name="init">
     <result name="success">/WEB-INF/view/index.jsp</result>
  </action>

  <action name="StrutsTestAction" class="struts2hello.StrutsTest">
   <result name="input">/WEB-INF/view/index.jsp</result>
   <result name="success" type="redirectAction" >
     <param name="actionName">StrutsTestRender</param>
     <param name="portletMode">view</param>
     <param name="pie">${pie}</param>
   </result>
  </action>

<action name="StrutsTestRender" class="struts2hello.StrutsTest" method="doView">
   <result name="success">/WEB-INF/view/index.jsp</result>
  </action>

Here's what happens, step by step:

*** 1. First display. "init" action is invoked, which simply forwards to the jsp. The form action url has this in it:
    
struts.portlet.action%3D%252Fview%252FStrutsTestAction%26struts.portlet.mode%3Dview

*** 2. I enter "apple" in the pie field and submit. The event phase mthod (execute) receives the value correctly and form is redisplayed .

Logging shows this:

2009-04-16 09:32:31,581 INFO struts2hello.StrutsTest.execute - Begin execute
2009-04-16 09:32:31,583 INFO struts2hello.StrutsTest.execute - End execute
2009-04-16 09:32:31,765 INFO struts2hello.StrutsTest.doView - Begin doView A. Pie = apple 2009-04-16 09:32:31,767 INFO struts2hello.StrutsTest.doView - doView B. Phase: RENDER
2009-04-16 09:32:31,768 INFO struts2hello.StrutsTest.doView - End doView

This is all correct - the event phase action is invoked, and then the render phase action (doView method) is invoked and the phase (from PortletActionContext) is RENDER.

But, on redisplay, the form action URL now has this embedded:

pie%3Dapple%26struts.portlet.action%3D%252Fview%252FStrutsTestRender%26struts.portlet.mode%3Dview%26struts.portlet.eventAction%3Dtrue

AND

struts.portlet.action%3D%252Fview%252FStrutsTestAction%26struts.portlet.mode%3Dview

I believe this is where things start to go wrong - Oracle has put the render parameters (action name of "StrutsTestRender" and pie of "apple") into the generated action url, and subsequent submits will see these parameters.

*** 3. Entering "cherry" into the pie field and submitting again shows this in the log:

2009-04-16 09:33:40,502 INFO struts2hello.StrutsTest.doView - Begin doView A. Pie = apple, cherry 2009-04-16 09:33:40,505 INFO struts2hello.StrutsTest.doView - doView B. Phase: EVENT
2009-04-16 09:33:40,508 INFO struts2hello.StrutsTest.doView - End doView

So we've now gone directly into the render method, but we're in the event phase. Presumably because of struts.portlet.action value of "StrutsTestRender" in the form's action URL.

Also we now have both "apple" and "cherry" in the "pie" parameter values: "apple" from being embedded in the URL, "cherry" from being entered in the form.



--
Stephen Turner
Senior Programmer/Analyst - SAIS
MIT IS&T

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to