Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences

Edit this page


Referenced by
InstallJetspeed
JSFPortlet




JSPWiki v2.2.33

[RSS]


Hide Menu

StrutsPortlet


This page documents the steps necessary to migrate an existing Struts application for use as a Jetspeed portlet. See the installing Jetspeed page if you don't have Jetspeed installed.

The application used for testing and figuring out these steps was the Struts version of Equinox. The struts-demo app that's included in Jetspeed-2 was used as a reference. For this tutorial, Equinox 1.2 was used - and this change was made to build.xml. To begin, I created an equinox-struts project by downloading/extracting Equinox and then cd-ing into its extras/struts folder and running "ant test". Make sure Tomcat is stopped when you run this command since this command will actually start Tomcat and run some tests in it.

Table of Contents

  • [1] Add the portals-bridges-struts-0.1.jar to your project
  • [2] Modify web.xml to use PortletServlet instead of ActionServlet
  • [3] Modify struts-config.xml to override the default RequestProcessor
  • [4] Create a portlet.xml file in the WEB-INF directory
  • [5] Deploy the WAR to Jetspeed
  • [6] Create a .psml file so the portlet will show up in Jetspeed
  • [7] Known Issues

Add the portals-bridges-struts-0.1.jar to your project [#1]

Once you have equinox-struts and jetspeed setup, copy the portals-bridges-struts-0.1.jar from your local Maven repository into the web/WEB-INF/lib directory.

cp ~/.maven/repository/portals-bridges/jars/portals-bridges-struts-0.1.jar web/WEB-INF/lib

Modify web.xml to use PortletServlet instead of ActionServlet [#2]

Change the "action" servlet in web/WEB-INF/web.xml to use the PortletServlet from the bridge JAR.

    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.portals.bridges.struts.PortletServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

Modify struts-config.xml to override the default RequestProcessor [#3]

In web/WEB-INF/struts-config.xml add a <controller> element just above the <message-resources> element to override the RequestProcessor.

    <!-- ========== Controller Configuration ================================ -->

    <controller pagePattern="$M$P" inputForward="true" 
        processorClass="org.apache.portals.bridges.struts.PortletRequestProcessor"/>

Create a portlet.xml file in the WEB-INF directory [#4]

Copy and paste the following XML into a portlet.xml file in the web/WEB-INF directory.

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app id="equinox-struts" version="1.0">
    <portlet id="Equinox-Struts">
        <init-param>
            <name>ServletContextProvider</name>
            <value>org.apache.jetspeed.portlet.ServletContextProviderImpl</value>
        </init-param>
        <init-param>
            <name>ViewPage</name>
            <value>/user.html</value>
        </init-param>
        <portlet-name>Equinox-Struts</portlet-name>
        <display-name>Equinox</display-name>
        <description>This is a simple portlet</description>
        <portlet-class>org.apache.portals.bridges.struts.StrutsPortlet</portlet-class>
        <expiration-cache>-1</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
            <portlet-mode>VIEW</portlet-mode>
            <portlet-mode>HELP</portlet-mode>
        </supports>
        <portlet-info>
            <title>User List</title>
            <short-title>This is the short title</short-title>
            <keywords>Spring</keywords>
        </portlet-info>
    </portlet>
</portlet-app>

Deploy the WAR to Jetspeed [#5]

In build.properties, add a "deploy.dir" property so you can deploy to Jetspeed's deployer.

deploy.dir=/opt/dev/tools/tomcat/webapps/jetspeed/WEB-INF/deploy

Edit web/WEB-INF/classes/jdbc.properties and change the "jdbc.url" to use an absolute path. This is necessary so you can populate the HSQL database from the equinox-struts directory.

jdbc.url=jdbc:hsqldb:/Users/mraible/dev/equinox-struts/db/equinox

Start Tomcat and run "ant deploywar" to deploy your portlet. If you're watching Tomcat's log files ($CATALINA_HOME/logs/catalina.out) - and you don't see your WAR getting deployed, make sure the portlet.xml is in your web/WEB-INF directory.

To update the WAR in Jetspeed, just run "ant deploywar" after you've modified files. To undeploy the WAR, delete the equinox-struts.war file from $CATALINA_HOME/webapps/jetspeed/WEB-INF/deploy.

NOTE: These deployment instructions are based on this wiki page.

Create a .psml file so the portlet will show up in Jetspeed [#6]

Create a equinox-struts.psml file in $CATALINA_HOME/webapps/jetspeed/WEB-INF/pages with the following contents. The fragment id's must be unique among all .psml files, and the name of the portlet is read from the portlet.xml file.
<?xml version="1.0" encoding="UTF-8"?>
<page id="equinox-struts">
  <defaults
     skin="orange"
     layout-decorator="tigris"
     portlet-decorator="tigris"/>

  <title>Equinox-Struts</title>
  <fragment id="equinox-struts-layout" type="layout" name="jetspeed::VelocityTwoColumns">
    <fragment id="equinox-struts-portlet" type="portlet" name="equinox-struts::Equinox-Struts">
      <property layout="TwoColumns" name="row" value="0"/>
      <property layout="TwoColumns" name="column" value="0"/>
    </fragment>
  </fragment>
</page>

Open http://localhost:8080/jetspeed. You should see a "Equinox-Struts" tab on the opening screen. To populate the values in the HSQL database, run "ant populate" and you should see a list of users when you click on the tab.

Known Issues [#7]

  • The equinox-struts app is a Struts application that is not modified at all to be used as a portlet. Because of this, most of the app's functionality does not work. This document details what you need to do to modify your Struts apps so they can be used as portlets.
  • Once you've modified web.xml to use the PortletServlet, it breaks the Action tests that use MockStrutsTestCase. This remains an open issue that we're trying to solve.


Go to top   Edit this page   More info...   Attach file...
This page last changed on 06-Nov-2006 13:52:59 MST by MattRaible.