...
- 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:
- Place your Spring xml files under
/META-INF/spring
in the bundle jar file - Copy all the bundle jar files into
/WEB-INF/classes/bundles
in your application - 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" />
- Install the Struts 2 Spring plugin in your applicationAdd , like in normal Struts 2 applications.
- Configure your web.xml like:
to web.xml and an empty applicationContext.xml: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>
Code Block XML XML under<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans></beans>
/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>
- 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 | ||||
---|---|---|---|---|
| ||||
<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 |
---|---|---|---|
| The alias of the ObjectFactory to wrap |
| Any configured alias |
Installation
Follow these steps to use this plugin:
...
| Delete all installed bundles when the container starts | true or false |
---|---|---|
| Rul level to start the container | >=3 |
...
lang | xml |
---|
...
Building bundles with Maven
...