Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Probably can't access application classes from bundles, including Spring classes

Simple Usage

If your actions do not extend ActionSupport, and you are not using Spring then convert your jar that contains Actions, Velocity files, and a struts.xml file into a bundle, add a few lines in the jar's manifest.mfAdd these lines to MANIFEST.MF:

No Format
Bundle-Activator: org.apache.struts2.osgi.StrutsActivator
Export-Package: com.mycompany.myapp.actions
Bundle-Version: 1.0.0
Bundle-SymbolicName: foo.actions
Import-Package: com.opensymphony.xwork2

Now the jar is ready to be deployed. Drop the jar into the /WEB-INF/classes/bundles directory and it will automatically be installed when the application starts up.

Advanced Usage

If your actions extend ActionSupport, or use other classes distributed with Struts, you will have to list their package names in the jar's manifest.mf:

No Format

Import-Package: com.opensymphony.xwork2

Using Spring

If you want to use the Spring as the object factory for your actions, then follow these steps:

  1. Place your Spring xml files under /META-INF/spring in the bundle jar file
  2. Copy all the bundle jar files into /WEB-INF/classes/bundles in your application
  3. Make sure that the following properties are set in struts.xml or struts.properties in your application:
    Code Block
    XML
    XML
    
    <constant name="struts.objectFactory" value="osgi" />
    <constant name="struts.objectFactory.delegate" value="springspringOsgi" />
    <constant name="struts.freemarker.manager.classname" value="org.apache.struts2.osgi.BundleFreemarkerManager" />
    
  4. Install the Struts 2 Spring plugin in your applicationAdd , like in normal Struts 2 applications.
  5. Configure your web.xml like:
    Code Block
    XML
    XML
    
    <listener>
        <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <display-name>Struts Blank</display-name>
    
        <filter>
            <filter-name>struts2-execute</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
        </filter>
    
        <filter>
            <filter-name>struts2-prepare</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>struts2-prepare</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
        <filter-mapping>
            <filter-name>struts2-execute</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        <listener>
            <listener-class>org.apache.struts2.dispatcher.ng.listener.StrutsListener</listener-class>
        </listener>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
    to web.xml and an empty applicationContext.xml: Code BlockXMLXML
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC 
    	"-//SPRING//DTD BEAN//EN" 
    	"http://www.springframework.org/dtd/spring-beans.dtd">
    <beans></beans>
    
    under /WEB-INF/ in your application. This is a hack, but the Spring support doesn't work otherwise. TODO: find a way around this dirty hack
    
        <context-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
        </context-param>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>osgibundle:/META-INF/spring/*.xml</param-value>
        </context-param>
    </web-app>
    </listener>
    # Add the Spring OSGi dependency to your web app, if you are using maven:
    {code:xml}
    <dependency>
         <groupId>org.springframework.osgi</groupId>
         <artifactId>spring-osgi-web</artifactId>
         <version>1.1.2</version>
    </dependency>
    
  6. Download Spring OSGi and copy all the required bundles under /classes/bundles/other. For Struts OSGi 1.1.2, these are the required bundles:
    No Format
    
    com.springsource.org.aopalliance-1.0.0.jar
    com.springsource.org.apache.commons.logging-1.1.1.jar
    org.springframework.aop-2.5.5.A.jar
    org.springframework.beans-2.5.5.A.jar
    org.springframework.context-2.5.5.A.jar
    org.springframework.core-2.5.5.A.jar
    org.springframework.osgi.core-1.1.2.A.jar
    org.springframework.osgi.extender-1.1.2.A.jar
    org.springframework.osgi.io-1.1.2.A.jar
    org.springframework.osgi.web-1.1.2.A.jar
    org.springframework.web-2.5.5.A.jar
    

Using Velocity

If you are going to use Velocity results, then add Velocity and Common Digester jars to your application. Using maven:

Code Block
XML
XML
<dependency>
    <groupId>velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.5</version>
</dependency>

<dependency>
    <groupId>velocity-tools</groupId>
    <artifactId>velocity-tools</artifactId>
    <version>1.3</version>
</dependency>
        
<dependency>
    <groupId>commons-digester</groupId>
    <artifactId>commons-digester</artifactId>
    <version>1.8</version>
</dependency>

...

Code Block
@ResultPath("/content")
public class HelloWorldAction extends ActionSupport
...
}

Example

Here is how an example architecture would look:

Gallery

Settings

The following settings can be customized. See the developer guide.

Setting

Description

Default

Possible Values

struts.objectFactory.delegate

The alias of the ObjectFactory to wrap

struts

Any configured alias

Installation

Follow these steps to use this plugin:

...

struts.osgi.clearBundleCache

Delete all installed bundles when the container starts

true or false

struts.osgi.clearBundleCache

Rul level to start the container

>=3

...

langxml

...

Building bundles with Maven

...