You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@portals.apache.org by at...@apache.org on 2012/12/16 19:11:09 UTC
svn commit: r1422646 [3/6] - in /portals/site-live/bridges: ./
bridges-common/ bridges-frameworks/ bridges-groovy/ bridges-jsf/
bridges-perl/ bridges-php/ bridges-portletfilter/ bridges-script/
bridges-struts/ bridges-velocity/ css/ images/ images/logos/
Added: portals/site-live/bridges/bridges-struts/features.html
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/bridges-struts/features.html?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/bridges-struts/features.html (added)
+++ portals/site-live/bridges/bridges-struts/features.html Sun Dec 16 18:11:05 2012
@@ -0,0 +1,690 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+
+
+
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Apache Portals Bridges - Struts Bridge Features</title>
+ <style type="text/css" media="all">
+ @import url("../css/maven-base.css");
+ @import url("../css/maven-theme.css");
+ @import url("../css/site.css");
+ </style>
+ <link rel="stylesheet" href="../css/print.css" type="text/css" media="print" />
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ </head>
+ <body class="composite">
+ <div id="banner">
+ <a href="http://portals.apache.org/" id="bannerLeft">
+
+ <img src="../images/apache-portals.gif" alt="" />
+
+ </a>
+ <a href="http://portals.apache.org/bridges/" id="bannerRight">
+
+ Apache Portals Bridges
+
+ </a>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="breadcrumbs">
+
+
+
+
+
+
+
+
+ <div class="xleft">
+ Last Published: 29 September 2011
+ </div>
+ <div class="xright"> <a href="http://portals.apache.org/" class="externalLink">Portals</a>
+ |
+ <a href="http://portals.apache.org/applications" class="externalLink">Applications</a>
+ |
+ <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=168" class="externalLink">JSR-168</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=286" class="externalLink">JSR-286</a>
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="leftColumn">
+ <div id="navcolumn">
+
+
+
+
+
+
+
+
+ <h5>Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../index.html">Overview</a>
+ </li>
+
+ <li class="none">
+ <a href="../news.html">News and Status</a>
+ </li>
+ </ul>
+ <h5>Current Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../bridges-common/index.html">Common Utilities and Interfaces</a>
+ </li>
+
+
+
+
+
+ <li class="expanded">
+ <a href="../bridges-struts/index.html">Struts Bridge</a>
+ <ul>
+
+ <li class="none">
+ <strong>Features</strong>
+ </li>
+ </ul>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-velocity/index.html">Velocity Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-script/index.html">Script Bridge</a>
+ </li>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-groovy/index.html">Groovy Bridge</a>
+ </li>
+ </ul>
+ <h5>Archived Portals Bridges</h5>
+ <ul>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-jsf/index.html">JSF Bridge</a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-php/index.html">PHP Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-perl/index.html">Perl Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-portletfilter/index.html">Portlet Filter</a>
+ </li>
+ </ul>
+ <h5>Get Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../download.html">Download</a>
+ </li>
+
+ <li class="none">
+ <a href="../release-notes.html">Release Notes</a>
+ </li>
+ </ul>
+ <h5>Support</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../team-list.html">Project Team</a>
+ </li>
+
+ <li class="none">
+ <a href="../license.html">Project License</a>
+ </li>
+
+ <li class="none">
+ <a href="../mail-lists.html">Mailing List</a>
+ </li>
+
+ <li class="none">
+ <a href="../issue-tracking.html">Issue Tracking</a>
+ </li>
+ </ul>
+ <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
+ <img alt="Built by Maven" src="../images/logos/maven-feather.png"></img>
+ </a>
+
+
+
+
+
+
+
+
+ </div>
+ </div>
+ <div id="bodyColumn">
+ <div id="contentBox">
+ <subtitle></subtitle><authors><person name="Ate Douma" email="ate@douma.nu"></authors><div class="section"><h2><a name="Features"></a>Features</h2>
+<p>
+ The Struts Bridge provides the following features for developing and running Struts Applications as Portlets:
+ <ul><li><a href="#Struts Page URL">
+ Provides a "virtual" page context and a "normal" page url to the Struts Application
+ </a></li>
+<li><a href="#The ServletContextProvider interface">
+ Allows Servlet invocation from an ActionRequest using an separate lightweight interface to the Portal
+ </a></li>
+<li><a href="#Portals requiring a more complex interface">
+ Provides extension points if a more complex interface to the Portal is required
+ </a></li>
+<li><a href="#Handling ActionRequests">
+ Automatically separates Struts Action Processing and View Rendering when accessed from an ActionRequest
+ </a></li>
+<li><a href="#RenderContextAttributes to the rescue">
+ Transparent communication of request attributes between ActionRequest and RenderRequests
+ </a></li>
+<li><a href="#Rendering valid Portlet urls with the Struts JSP Tags">
+ Transparent translation of "normal" Web application resource and action link urls to valid Portlet urls
+ </a></li>
+<li><a href="#PortletRequestProcessor and PortletTilesRequestProcessor">
+ Tiles support and automatic configuration of the correct (Portlet)RequestProcessor (enhanced for 1.0.1)
+ </a></li>
+<li><a href="#Running your application as Portlet and Web Application at the same time">
+ Deploy and run Struts Applications as Portlet and as Web Application at the same time
+ </a></li>
+<li><a href="#1.0.1: Multiple StrutsPortlet instances PORTLET_SCOPE isolated StrutsServlet sessions">
+ 1.0.1: Multiple StrutsPortlet instances with the StrutsServlet session isolated to PORTLET_SCOPE
+ </a></li>
+<li>
+ Supports Struts release 1.2.7
+ </li>
+</ul>
+</p>
+<div class="section"><h3><a name="Struts_Page_URL"></a>Struts Page URL</h3>
+<p>
+ Struts determines the Actions to perform on the request url. A Portlet on the other hand doesn't
+ have or receive an url, only request parameters.
+ </p>
+<p>
+ To be able to use Struts within a Portlet, a current Page context is maintained by the Struts Bridge
+ which is used to provide Struts with a "virtual" request context just as if it were accessed from a Web
+ Application.
+ </p>
+<p>
+ The Struts Page URL is maintained as a Portlet <code>RenderParameter</code> and included in all Portlet URLs
+ generated for the Portlet. When the <code>StrutsPortlet</code> receives a request it uses the Struts Page URL
+ to create a new <code>HttpServletRequest</code> with a redefined request url before invoking the Struts
+ <code>PortletServlet</code> (extending the Struts <code>ActionServlet</code>).
+ </p>
+<p>
+ None of the Action Mappings for an existing Struts Application have to be changed (in this respect at least)
+ to allow it to run in a Portlet context.
+ </p>
+</div>
+<div class="section"><h3><a name="The_ServletContextProvider_interface"></a>The ServletContextProvider interface</h3>
+<p>
+ Processing <code>ActionRequest</code> and <code>RenderRequest</code> events from a Servlet application is a
+ problem with the current Portlet Specification. Although Servlets (and JSPs) can be invoked from a Portlet,
+ the Portlet Specification only supports this from the <code>RenderRequest</code>.
+ </p>
+<p>
+ As request parameters are only available during the <code>ActionRequest</code>, not being able to use a Struts
+ for processing these is a serious limitation. Together with no clear inter-portlet application communication
+ support, this is probably one of the biggest omissions from the Portlet Specification.
+ </p>
+<p>
+ But, because the Portlet Specification is build upon the Servlet Specification (2.3), the Portlet Container
+ implementation (like <a href="http://portals.apache.org/pluto" class="externalLink">Pluto</a>) and/or the Portal itself, usually
+ has direct access to, and also uses the <code>ServletContext</code>, even during the
+ <code>ActionRequest</code> event.
+ </p>
+<p>
+ It is therefore usually quite easy to provide access to the <code>ServletContext</code>, although it will
+ require some knowledge of the Portal and/or the Portlet Container implementation.
+ </p>
+<p>
+ The Struts Bridge uses the <code>ServletContextProvider</code> interface from the
+ portals-bridges-common library to get access to the required <code>ServletContext</code>.
+ </p>
+<p>
+ To be able to use the Struts Bridge, a <code>StrutsPortlet</code> must therefore be provided with a concrete
+ implementation of the <code>ServletContextProvider</code> interface (through its initialization parameters).
+ This implementation class can be supplied together with the Portlet or be provided natively by the Portal as
+ the <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a> Portal does.
+ </p>
+</div>
+<div class="section"><h3><a name="Portals_requiring_a_more_complex_interface"></a>Portals requiring a more complex interface</h3>
+<p>
+ Although the <code>ServletContextProvider</code> interface has been defined to be easily implemented for a
+ specific Portal, it might not be generic enough for all.
+ </p>
+<p>
+ To support those kind of Portals, the <code>StrutsPortlet</code> doesn't uses the interface directly, but only
+ through protected methods of its own which can be extended if needed.
+ </p>
+</div>
+<div class="section"><h3><a name="Handling_ActionRequests"></a>Handling ActionRequests</h3>
+<p>
+ During an <code>ActionRequest</code> a Portlet (or invoked Servlet) is not allowed to write content to the
+ response. This is only allowed during the <code>RenderRequest</code> event but then a Portlet doesn't have
+ access anymore to the (input) request parameters which makes the RenderRequest generally useless (and bad
+ practice anyway) for (Struts) Action processing.
+ </p>
+<p>
+ Struts on the other hand only knows one request event and is largely build upon server-side forwarding to a
+ JSP (or other View rendering technology) after an Action has been processed.
+ </p>
+<p>
+ The Struts Bridge solves this problem by allowing Struts Action processing to occur during the ActionRequest.
+ But, as soon as Struts forwards (or includes) to another handler (JSP, Velocity script, <em>or even another
+ Action: ActionChaining</em>) it will intercept and freeze the processing.<br />
+
+ The Struts Bridge will then save the current processing context (like the path to include or forward to) in a
+ separate object: the <code>StrutsRenderContext</code>, and end the ActionRequest.<br />
+
+ Once the RenderRequest is invoked, the Struts Bridge will use the <code>StrutsRenderContext</code> to restore
+ the state Struts (and/or an included or forwarded JSP) will expect and continues the processing where it left
+ off.
+ </p>
+<p>
+ Also saved in the StrutsRenderContext are the current <code>ActionForm</code> (if it isn't already session
+ bounded), the <code>ActionMessages</code> and/or <code>ActionErrors</code> (if not already session bounded
+ which is possible since Struts 1.2.1).
+ </p>
+<p><b><em>Important:</em></b> the StrutsRenderContext is restored only once!
+ </p>
+<p>
+ The Portlet Specification expects Portlets to use a true MVC architecture: changing the state of a Portlet is
+ expected to be done during ActionRequest only. The RenderRequest, which may occur many times, is expected to
+ only render the current state of the Portlet.
+ </p>
+<p>
+ For a proper usage of the Struts Bridge and to conform to the Portlet Specification requirements, the Struts
+ application too really should be configured to use separate Action processing and View rendering Actions.<br />
+</p>
+<p>
+ The dependency on the StrutsRenderContext restoring the state during the (next) RenderRequest should be
+ limited to one situation only: input error processing.
+ </p>
+<p>
+ When Struts encounters input validation errors, it forwards (back) to the page specified as input for the
+ Action. The Struts Bridge handles this situation likewise. When it detects ActionErrors are defined after the
+ ActionRequest event, it will reset the Struts Page URL to the one from which the ActionRequest was initiated
+ so subsequent (multiple) RenderRequest events will always render that original page.
+ </p>
+<p>
+ Note: this will only result the same behavior as when the Struts Application is accessed as Web Application if
+ the Action Mapping input attribute indeed points to the originating input page, which normally will be the
+ case. <em>The Struts Bridge will not (re)set the Struts Page URL to the Action input attribute value (Struts
+ itself will forward to that url) but to the page from which the ActionRequest was initiated!</em></p>
+<p>
+ As said, for a proper usage of the Struts Bridge the Struts application should be configured to use separate
+ Action processing and View processing Actions. The Struts Bridge intercepts the first include or forward
+ initiated from a Struts Action during the ActionRequest. During only the first following RenderRequest it will
+ invoke Struts with <em>the same Struts Page URL</em> as for the ActionRequest but intercept before the actual
+ execution of the mapped Action and then include (never forward) the intercepted target url of the ActionRequest
+ (normally a JSP).
+ </p>
+<p>
+ A properly MVC configured Struts application though can (and should) make use of a (client-side) redirect
+ after the Action processing Action by using an ActionForward with redirect="true". The behavior of such a
+ Struts Application then truly complies to the requirements for a Portlet. In fact, the reference
+ implementation of the Portlet Specification, <a href="http://portals.apache.org/pluto" class="externalLink">Pluto</a>, actually
+ sends a redirect to the client (browser) after an ActionRequest.
+ </p>
+<p>
+ The Struts Bridge supports this behavior as it will intercept a client-side redirect during an ActionRequest
+ by changing the Portlet Page URL to be used by subsequent RenderRequests to the targeted redirect url.
+ </p>
+<p>
+ A Struts Application not complying to the above "rules" might not behave as expected in a Portlet context:<br />
+
+ without this configuration a second RenderRequest event will not get the previously saved StrutsRenderContext
+ restored and the invoked Struts Action will be executed again (this time without any parameters).
+ </p>
+<p>
+ Migrating an existing Struts Application to a Struts Portlet with doesn't comply to these "rules" might seem
+ problematic without major changes to the code, but it doesn't have to be.
+ </p>
+</div>
+<div class="section"><h3><a name="RenderContextAttributes_to_the_rescue"></a>RenderContextAttributes to the rescue</h3>
+<p>
+ Although a StrutsRenderContext can only be used once to communicate request parameters from the ActionRequest
+ to the next RenderRequest (stored in the ActionForm), the Struts Bridge provides another, completely
+ transparent, solution which can be used without any required changes to the Struts Application.
+ </p>
+<p>
+ The Struts Bridge can be configured, using a simple xml definition, to always save specific named request
+ attributes during an ActionRequest and restore these only during the next RenderRequest or optionally every
+ RenderRequest until the next ActionRequest or a RenderRequest for a different Struts Page URL is invoked.
+ </p>
+<p>
+ The request attribute values will be saved in the web session which requires them to implement the
+ <code>Serializable</code> interface.
+ </p>
+<p>
+ An example struts-portlet-config.xml (the name of this file is configurable) definition might look like:
+ <div class="source"><pre>
+ <?xml version="1.0" encoding="UTF-8"?>
+ <config>
+ <render-context>
+ <attribute name="errors"/>
+ <attribute name="message" keep="true"/>
+ <attribute prefix="com.foo.bar" keep="true"/>
+ </render-context>
+ </config></pre>
+</div>
+<em>(This (adapted) example is taken from the JPetstore Portlet example provided with the
+ <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a> Portal.)</em></p>
+<p>
+ With the above example configuration, all request attributes named <em>errors</em> and <em>message</em> are
+ saved after the ActionRequest. The <em>errors</em> object is restored only once, the <em>message</em> object
+ will be restored until the next ActionRequest or when the Struts Page URL is changed.
+ </p>
+<p>
+ Furthermore, every request attribute which name start with <em>com.foo.bar</em> is also saved after the ActionRequest.
+ With the "prefix" attribute type definition, a whole range of attributes can be configured at once.
+ </p>
+<p>
+ Using the RenderContextAttributes configuration, a Struts Action can still forward (without redirecting) to a
+ JSP in a Portlet while passing its required data through the request attributes. Request scoped ActionForms
+ can also safely be used for this as the Struts Bridge will automatically remove them from the session again
+ when they go out of scope!
+ </p>
+<p>
+ Using the "single use only" configuration (meaning: without the keep="true" attribute) allows one to pass on rather large
+ objects to the RenderRequest because, even if they are stored in the Session, this will only be for a very
+ short period (milliseconds). Of course, with a subsequent RenderRequest these objects won't be available
+ anymore and the specific View Renderer must be able to handle that situation properly.<br />
+
+ Error objects or error messages (other than ActionMessages and ActionErrors which are already automatically
+ saved in the StrutsRenderContext) are also reasonable candidates to use like this.
+ </p>
+</div>
+<div class="section"><h3><a name="Rendering_valid_Portlet_urls_with_the_Struts_JSP_Tags"></a>Rendering valid Portlet urls with the Struts JSP Tags</h3>
+<p>
+ Another problem with using Struts for Portlet Development is rendering valid urls.
+ </p>
+<p>
+ There are actually two different type of problems: urls for resources likes images, Javascript or CSS
+ stylesheets which needs to be loaded by the client (browser), and urls for interacting with the Portlet
+ itself.
+ </p>
+<p>
+ The problem with resource urls is that the content of a Portlet is only included by the Portal,
+ together with possible content of other Portlets shown on the same page. Although the Portlet runs within
+ its own context (the same as the web application it is based on), the client (browser) sees only the context
+ of the Portal page it is currently pointed at.
+ </p>
+<p>
+ A Portlet therefore cannot make use of relative src locations for a resource url while this is perfectly valid
+ (and usually preferred) in a Web Application. For a client to be able to retrieve a resource, its url
+ really must include the full context path of the Web Application.
+ </p>
+<p>
+ For interacting with the Portlet special PortletURLs must be used which can only be generated using the
+ Portlet API or through the Portlet JSP Tags. The Struts JSP Tags only generate urls valid for a Web
+ Application and also doesn't provide some kind of URLProvider interface like JSF.
+ </p>
+<p>
+ Furthermore there are two different PortletURL types: ActionURLs and RenderURLs.
+ It is very important to generate the correct type of url for a certain interaction. Forms must *always* use
+ a POST to an ActionURL, but for generated links it will have to be determined which type of url actually
+ is needed.
+ </p>
+<p>
+ To solve these problems, the Struts Bridge provides enhanced versions of the Struts HTML JSP Tags (including
+ EL variants), which take the Portlet environment into account. Furthermore, using a separate element in
+ the struts-portlet-config.xml definition, specific url paths can be configured to be of a certain type
+ (Resource, ActionURL, RenderURL) only.
+ </p>
+<p>
+ For the enhanced Struts HTML JSP Tags (html:form, html:link, html:rewrite, html:image and html:img), four
+ different TLDs are provided: an EL and non-EL variant, and for both a full replacement of the Struts
+ supplied struts-html.tld as well as a separate struts-portlet.tld containing only the enhanced Tags definitions.
+ </p>
+<p>
+ The full replacement TLDs makes it very easy for migrating a Struts Application to a Portlet context: simply
+ map the new TLD in web.xml or redefine the taglib uri in the JSP using:
+ <div class="source"><pre>
+ <%@ taglib uri="http://portals.apache.org/bridges/struts/tags-portlet-html" prefix="html" %></pre>
+</div>
+
+ or
+ <div class="source"><pre>
+ <%@ taglib uri="http://portals.apache.org/bridges/struts/tags-portlet-html-el" prefix="html-el" %></pre>
+</div>
+<em>(Note: the Struts Bridge library contains all the TLDs so you don't need to add them yourself
+ somewhere under WEB-INF/.)</em></p>
+<p>
+ For the enhanced html:link and html:rewrite Tags, three additional boolean attributes are defined: actionURL,
+ renderURL and resourceURL. Using these attributes one can specify which type of url must be generated (only
+ value "true" is supported).
+ </p>
+<p>
+ If none of these attributes is specified (with value "true") these Tags will by default generate a RenderURL.
+ </p>
+<p>
+ But, the default can be changed (only between renderURL and actionURL) using a struts-portlet-config.xml
+ definition. Furthermore, for specific url path (prefixes) you can specify which type of url must be generated
+ (but with one of the three additional boolean url type attributes this can always be overriden).
+ </p>
+<p>
+ An example struts-portlet-config.xml with portlet url type definitions might look like:
+ <div class="source"><pre>
+ <?xml version="1.0" encoding="UTF-8"?>
+ <config>
+ <render-context>
+ <attribute name="errors"/>
+ <attribute name="message" keep="true"/>
+ </render-context>
+ <portlet-url-type>
+ <action path="/shop/add"/>
+ <action path="/shop/switch"/>
+ <action path="/shop/remove"/>
+ <action path="/shop/signoff"/>
+ <action path="/shop/viewCategory"/>
+ <action path="/shop/viewItem"/>
+ <action path="/shop/viewProduct"/>
+ <action path="/shop/viewCart"/>
+ <action path="/shop/newOrder"/>
+ <render path="/shop/newOrderForm"/>
+ <action path="/shop/listOrders"/>
+ <resource path="/images/"/>
+ </portlet-url-type>
+ </config></pre>
+</div>
+<em>(This is the full configuration used for the JPetstore Portlet example provided with the
+ <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a> Portal.)</em></p>
+<p>
+ In the above example the portlet-url-type element contains three different sub elements: action, render and
+ resource. Their path attribute specifies the prefix to which specific urls are matched. This matching will be
+ done using best match. Internally, the paths will be ordered on longest definition first.
+ </p>
+<p>
+ Not shown in the above example is the optional default="render"|"action" attribute for the portlet-url-type
+ element. With it, the default type of portlet-url can be changed from "render" to "action" as is used in the
+ Struts Mailreader Demo Portlet (also provided by the <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a>
+ Portal):
+ <div class="source"><pre>
+ <?xml version="1.0" encoding="UTF-8"?>
+ <config>
+ <portlet-url-type default="action"/>
+ </config></pre>
+</div>
+
+ This feature is especially useful for Struts Applications who were configured using an earlier version of
+ the Struts Bridge (0.1) which used an ActionURL as default, like the above Struts Mailreader Demo Portlet.
+ </p>
+<p>
+ The enhanced html:img and html:image Tags, as well as the html:link and html:rewrite Tags, can be used to
+ generate resource urls using relative (not prefixed with a '/') src references. The Tags will then
+ automatically determine the correct url to generate using the current Struts Page URL as defined for this
+ RenderRequest.
+ </p>
+<p>
+ This allows one to replace hard coded resource urls like
+ <div class="source"><pre><img src="../images/struts-bridge.gif"/></pre>
+</div>
+
+ with
+ <div class="source"><pre><html:image src="../images/struts-bridge.gif"/></pre>
+</div>
+
+ A simple change with no technical impact, but it will allow the same JSP to be used for both a Web Application
+ and a Portlet. The JPetstore Portlet example as provided by <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a>
+ makes full use of this feature.
+ </p>
+</div>
+<div class="section"><h3><a name="PortletRequestProcessor_and_PortletTilesRequestProcessor"></a>PortletRequestProcessor and PortletTilesRequestProcessor</h3>
+<p>
+ The Struts Bridge requires a different RequestProcessor to be used for the Struts Application: a <code>
+ PortletRequestProcessor</code>. If a Struts config doesn't define one, or defines one which isn't based on the
+ PortletRequestProcessor, it will be replaced automatically by the Struts Bridge.
+ </p>
+<p>
+ The Struts Bridge also supports Tiles to be used with the <code>PortletTilesRequestProcessor</code>. If the
+ TilesPlugin is defined (as required to be able to use Tiles in Struts) it will be recognized by the Struts
+ Bridge and then the PortletTilesRequestProcessor will be used instead (if not configured already).
+ </p>
+<p>
+ Tiles can be used without problem within a Portlet context, even for Action Mapping or ActionForward paths,
+ although the same considerations and restrictions must be taken into account as described above.
+ </p>
+<p>
+ 1.0.1: For proper handling of the Tiles Context, with version 1.0 the Tiles ComponentConstants.COMPONENT_CONTEXT had to be
+ set as RenderContextAttribute like this:
+ <div class="source"><pre>
+ <?xml version="1.0" encoding="UTF-8"?>
+ <config>
+ <render-context>
+ <attribute name="org.apache.struts.taglib.tiles.CompContext"/>
+ ...
+ </render-context>
+ ...
+ </config></pre>
+</div>
+
+ With the 1.0.1 release, this isn't necessary anymore as the Struts Bridge will register this special attribute
+ itself automatically if it hasn't been defined in the struts-portlet-config.xml already.
+ </p>
+</div>
+<div class="section"><h3><a name="Running_your_application_as_Portlet_and_Web_Application_at_the_same_time"></a>Running your application as Portlet and Web Application at the same time</h3>
+<p>
+ Although the Struts Bridge is created to allow Struts Applications to run in a Portlet context, it also allows
+ the same application to be run in a Servlet context too.
+ </p>
+<p>
+ If the Struts Bridge PortletServlet (which extends ActionServlet) detects it is not accessed from a Portlet
+ context is simply delegates back to the underlying Struts Framework.
+ </p>
+<p>
+ Provided the Struts Application doesn't use any Portlet specific features and the Action Mapping configuration
+ is also (still) valid for a Web Application, the same application war can be deployed as Web application and
+ as Portlet Application. When deployed in a Portal, the application can even be accessed as Portlet or as
+ Web Application at the same time!
+ </p>
+<p>
+ The JPetstore Portlet example provided by <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a> is one
+ example of such a "dual" mode Struts Application.
+ </p>
+<p>
+ Another benefit of such a "dual" mode Struts Application is that it can be tested as Web Application
+ which <em>is</em> somewhat easier than testing it as a Portlet.
+ </p>
+</div>
+<div class="section"><h3><a name="a1.0.1:_Multiple_StrutsPortlet_instances_PORTLET_SCOPE_isolated_StrutsServlet_sessions"></a>1.0.1: Multiple StrutsPortlet instances PORTLET_SCOPE isolated StrutsServlet sessions</h3>
+<p>
+ The Struts framework itself, as well as many Struts applications make have use of the (Servlet) Session for storing user state.
+ When you want to use multiple StrutsPortlets from the same web application this can cause conflicts and session state corruption.
+ With Struts Bridge release 1.0.1, this now has been solved by (optionally, and not by default) isolating the Session scope
+ seen by the StrutsServlet to PortletSession.PORTLET_SCOPE.
+ </p>
+<p>
+ If the optional StrutsPortlet init parameter <code>PortletScopeStrutsSession</code> is set to true, the Session object provided to the
+ StrutsServlet will be a Proxy for the PortletSession and will provide only access to the PortletSession.PORTLET_SCOPE attributes.
+ </p>
+<p>
+ One caveat though: If you also need to use direct Servlet access to the Struts application (meaning: the browser is invoking the
+ Servlet directly, not through the Portlet), this Servlet won't "see" the previously APPLICATION_SCOPE Session attributes anymore.<br />
+
+ This can be an issue for features like binary file (pdf) rendering through a servlet which needs to use the Session to access its data.
+ To solve this, the utility
+ <a href="../portals-bridges-common/apidocs/org/apache/portals/bridges/util/PortletWindowUtils.html">PortletWindowUtils</a> class can
+ be used which provides methods to access a specific Portlet instance its PORTLET_SCOPE session attributes based on its PortletWindowId.<br />
+
+ That PortletWindowId (which a Portlet can retrieve itself using the PortletWindowUtils) needs to be passed on to the Servlet first
+ (for example as query-string parameter on a link send to the browser) for it to be able to make use of it.
+ </p>
+</div>
+</div>
+
+ </div>
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ <div id="footer">
+ <div class="xright">©
+ 2004-2011
+
+ Apache Software Foundation
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ </body>
+</html>
Propchange: portals/site-live/bridges/bridges-struts/features.html
------------------------------------------------------------------------------
svn:executable = *
Added: portals/site-live/bridges/bridges-struts/index.html
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/bridges-struts/index.html?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/bridges-struts/index.html (added)
+++ portals/site-live/bridges/bridges-struts/index.html Sun Dec 16 18:11:05 2012
@@ -0,0 +1,270 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+
+
+
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Apache Portals Bridges - Struts Bridge Summary</title>
+ <style type="text/css" media="all">
+ @import url("../css/maven-base.css");
+ @import url("../css/maven-theme.css");
+ @import url("../css/site.css");
+ </style>
+ <link rel="stylesheet" href="../css/print.css" type="text/css" media="print" />
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ </head>
+ <body class="composite">
+ <div id="banner">
+ <a href="http://portals.apache.org/" id="bannerLeft">
+
+ <img src="../images/apache-portals.gif" alt="" />
+
+ </a>
+ <a href="http://portals.apache.org/bridges/" id="bannerRight">
+
+ Apache Portals Bridges
+
+ </a>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="breadcrumbs">
+
+
+
+
+
+
+
+
+ <div class="xleft">
+ Last Published: 29 September 2011
+ </div>
+ <div class="xright"> <a href="http://portals.apache.org/" class="externalLink">Portals</a>
+ |
+ <a href="http://portals.apache.org/applications" class="externalLink">Applications</a>
+ |
+ <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=168" class="externalLink">JSR-168</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=286" class="externalLink">JSR-286</a>
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="leftColumn">
+ <div id="navcolumn">
+
+
+
+
+
+
+
+
+ <h5>Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../index.html">Overview</a>
+ </li>
+
+ <li class="none">
+ <a href="../news.html">News and Status</a>
+ </li>
+ </ul>
+ <h5>Current Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../bridges-common/index.html">Common Utilities and Interfaces</a>
+ </li>
+
+
+
+
+
+ <li class="expanded">
+ <strong>Struts Bridge</strong>
+ <ul>
+
+ <li class="none">
+ <a href="../bridges-struts/features.html">Features</a>
+ </li>
+ </ul>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-velocity/index.html">Velocity Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-script/index.html">Script Bridge</a>
+ </li>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-groovy/index.html">Groovy Bridge</a>
+ </li>
+ </ul>
+ <h5>Archived Portals Bridges</h5>
+ <ul>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-jsf/index.html">JSF Bridge</a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-php/index.html">PHP Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-perl/index.html">Perl Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-portletfilter/index.html">Portlet Filter</a>
+ </li>
+ </ul>
+ <h5>Get Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../download.html">Download</a>
+ </li>
+
+ <li class="none">
+ <a href="../release-notes.html">Release Notes</a>
+ </li>
+ </ul>
+ <h5>Support</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../team-list.html">Project Team</a>
+ </li>
+
+ <li class="none">
+ <a href="../license.html">Project License</a>
+ </li>
+
+ <li class="none">
+ <a href="../mail-lists.html">Mailing List</a>
+ </li>
+
+ <li class="none">
+ <a href="../issue-tracking.html">Issue Tracking</a>
+ </li>
+ </ul>
+ <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
+ <img alt="Built by Maven" src="../images/logos/maven-feather.png"></img>
+ </a>
+
+
+
+
+
+
+
+
+ </div>
+ </div>
+ <div id="bodyColumn">
+ <div id="contentBox">
+ <authors><person name="Ate Douma" email="ate@douma.nu"></authors><div class="section"><h2><a name="Summary"></a>Summary</h2>
+<p>
+ The Struts Bridge allows <a href="http://struts.apache.org" class="externalLink">Struts</a> and Struts Tiles applications to be run
+ as <a href="http://www.jcp.org/en/jsr/detail?id=168" class="externalLink">JSR-168</a> compliant Portlets.
+ </p>
+<p>
+ Existing or new Struts Applications can be transparently deployed as Portlet Application or
+ Web Application.<br />
+
+ The Bridge wraps and enhances the native Struts Framework to overcome its limitations and
+ incompatibilities with the Java Portlet Standard requirements.
+ </p>
+<p>
+ An existing Struts Application can be used as a Portlet <em>without</em> changes to the code or JSP files if:
+ <ul><li>a few common sense rules, based on a proper MVC architecture, are followed for the Struts Action configurations</li>
+<li>Struts Tags are used for rendering all resource paths (like images) and action links</li>
+</ul>
+</p>
+<p>
+ If a Struts Portlet doesn't use Portlet specific features, it can also be accessed and used as Web Application at
+ the same time. Even testing the Struts Application can then be done completely independent of a Portal.
+ </p>
+<p>
+ The Struts Bridge is developed to be independent from specific Portals and uses only a very small interface to
+ the Portal to be able to get access to the Servlet environment at runtime. As all JSR-168 Portlet Containers are
+ required to build upon the Servlet specification, providing this interface for a specific Portal is usually very
+ easy to do, if not done already.
+ </p>
+<p>
+ The Apache Portals <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2 Portal</a> provides this interface
+ natively, as well as example Struts Portlet Applications using the Struts Bridge like a JPetstore Portlet.
+ </p>
+</div>
+
+ </div>
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ <div id="footer">
+ <div class="xright">©
+ 2004-2011
+
+ Apache Software Foundation
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ </body>
+</html>
Propchange: portals/site-live/bridges/bridges-struts/index.html
------------------------------------------------------------------------------
svn:executable = *
Added: portals/site-live/bridges/bridges-velocity/index.html
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/bridges-velocity/index.html?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/bridges-velocity/index.html (added)
+++ portals/site-live/bridges/bridges-velocity/index.html Sun Dec 16 18:11:05 2012
@@ -0,0 +1,384 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+
+
+
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Apache Portals Bridges - Jetspeed Simple Velocity Portlet Guide</title>
+ <style type="text/css" media="all">
+ @import url("../css/maven-base.css");
+ @import url("../css/maven-theme.css");
+ @import url("../css/site.css");
+ </style>
+ <link rel="stylesheet" href="../css/print.css" type="text/css" media="print" />
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ </head>
+ <body class="composite">
+ <div id="banner">
+ <a href="http://portals.apache.org/" id="bannerLeft">
+
+ <img src="../images/apache-portals.gif" alt="" />
+
+ </a>
+ <a href="http://portals.apache.org/bridges/" id="bannerRight">
+
+ Apache Portals Bridges
+
+ </a>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="breadcrumbs">
+
+
+
+
+
+
+
+
+ <div class="xleft">
+ Last Published: 29 September 2011
+ </div>
+ <div class="xright"> <a href="http://portals.apache.org/" class="externalLink">Portals</a>
+ |
+ <a href="http://portals.apache.org/applications" class="externalLink">Applications</a>
+ |
+ <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=168" class="externalLink">JSR-168</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=286" class="externalLink">JSR-286</a>
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="leftColumn">
+ <div id="navcolumn">
+
+
+
+
+
+
+
+
+ <h5>Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../index.html">Overview</a>
+ </li>
+
+ <li class="none">
+ <a href="../news.html">News and Status</a>
+ </li>
+ </ul>
+ <h5>Current Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../bridges-common/index.html">Common Utilities and Interfaces</a>
+ </li>
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-struts/index.html">Struts Bridge</a>
+ </li>
+
+ <li class="none">
+ <strong>Velocity Bridge</strong>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-script/index.html">Script Bridge</a>
+ </li>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-groovy/index.html">Groovy Bridge</a>
+ </li>
+ </ul>
+ <h5>Archived Portals Bridges</h5>
+ <ul>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-jsf/index.html">JSF Bridge</a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="../bridges-php/index.html">PHP Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-perl/index.html">Perl Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="../bridges-portletfilter/index.html">Portlet Filter</a>
+ </li>
+ </ul>
+ <h5>Get Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../download.html">Download</a>
+ </li>
+
+ <li class="none">
+ <a href="../release-notes.html">Release Notes</a>
+ </li>
+ </ul>
+ <h5>Support</h5>
+ <ul>
+
+ <li class="none">
+ <a href="../team-list.html">Project Team</a>
+ </li>
+
+ <li class="none">
+ <a href="../license.html">Project License</a>
+ </li>
+
+ <li class="none">
+ <a href="../mail-lists.html">Mailing List</a>
+ </li>
+
+ <li class="none">
+ <a href="../issue-tracking.html">Issue Tracking</a>
+ </li>
+ </ul>
+ <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
+ <img alt="Built by Maven" src="../images/logos/maven-feather.png"></img>
+ </a>
+
+
+
+
+
+
+
+
+ </div>
+ </div>
+ <div id="bodyColumn">
+ <div id="contentBox">
+ <subtitle></subtitle><authors><person name="David Le Strat" email="dlestrat@apache.org"><person name="Philip Mark Donaghy" email="philip.donaghy@gmail.com"></authors><div class="section"><h2><a name="Jetspeed_Simple_Velocity_Portlet_Guide"></a>Jetspeed Simple Velocity Portlet Guide</h2>
+<p>
+ This guide provides a tutorial for creating a very
+ simple Velocity portlet with one template in the portlet view mode.
+ </p>
+<div class="section"><h3><a name="a1._The_Portlet_Class"></a>1. The Portlet Class</h3>
+<p>
+ Create the file VelocitySimplest.java in a directory called
+ velocity-simplest/WEB-INF/classes:
+ <div class="source"><pre>
+public class VelocitySimplest extends org.apache.portals.bridges.velocity.GenericVelocityPortlet
+{
+
+ public void doView(javax.portlet.RenderRequest request, javax.portlet.RenderResponse response)
+ throws javax.portlet.PortletException, java.io.IOException
+ {
+ super.doView(request, response);
+ }
+}
+ </pre>
+</div>
+</p>
+<p>
+ Compile the class in the velocity-simplest/WEB-INF/classes directory using the command,
+ <div class="source"><pre>
+javac -cp portlet-api-1.0.jar:portals-bridges-velocity-1.0.jar:portals-bridges-common-1.0.jar VelocitySimplest.java
+ </pre>
+</div>
+</p>
+</div>
+<div class="section"><h3><a name="a2._The_portlet.xml"></a>2. The portlet.xml</h3>
+<p>
+ Create the file portlet.xml in the velocity-simplest/WEB-INF directory.
+ <div class="source"><pre>
+<?xml version="1.0" encoding="UTF-8"?>
+<portlet-app id="velocitysimplest" version="1.0">
+ <portlet id="VelocitySimplest">
+ <portlet-name>VelocitySimplest</portlet-name>
+ <display-name>Velocity Simplest Display Name</display-name>
+ <portlet-class>VelocitySimplest</portlet-class>
+ <init-param>
+ <name>ViewPage</name>
+ <value>/WEB-INF/view/world.vm</value>
+ </init-param>
+ <supports>
+ <mime-type>text/html</mime-type>
+ <portlet-mode>VIEW</portlet-mode>
+ </supports>
+ <supported-locale>en</supported-locale>
+ <portlet-info>
+ <title>Velocity Simplest Title</title>
+ <short-title>Velocity Simplest Short Title</short-title>
+ </portlet-info>
+ </portlet>
+</portlet-app>
+ </pre>
+</div>
+</p>
+</div>
+<div class="section"><h3><a name="a3._The_web.xml"></a>3. The web.xml</h3>
+<p>
+ Create the file web.xml in the velocity-simplest/WEB-INF directory.
+ <div class="source"><pre>
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+ <display-name>Velocity Simplest</display-name>
+ <description>The world's simplest Velocity portlet</description>
+
+ <!-- Define Velocity Servlet -->
+ <servlet>
+ <servlet-name>velocity</servlet-name>
+ <servlet-class>org.apache.portals.bridges.velocity.BridgesVelocityViewServlet</servlet-class>
+ </servlet>
+
+ <!-- Map *.vm files to Velocity -->
+ <servlet-mapping>
+ <servlet-name>velocity</servlet-name>
+ <url-pattern>*.vm</url-pattern>
+ </servlet-mapping>
+
+</web-app>
+ </pre>
+</div>
+</p>
+</div>
+<div class="section"><h3><a name="a4._The_View"></a>4. The View</h3>
+<p>
+ Create the world.vm file in the velocity-simplest/WEB-INF/view directory. Put
+ whatever content
+ you desire in it. Notice that the template file is defined in the portlet init
+ parameter <code>
+ ViewPage</code>. The objects <a href="http://portals.apache.org/pluto/multiproject/portlet-api/apidocs/javax/portlet/PortletConfig.html" class="externalLink">PortletConfig</a>, <a href="http://portals.apache.org/pluto/multiproject/portlet-api/apidocs/javax/portlet/RenderRequest.html" class="externalLink">RenderRequest</a>, and <a href="http://portals.apache.org/pluto/multiproject/portlet-api/apidocs/javax/portlet/RenderResponse.html" class="externalLink">RenderResponse</a>
+ are automatically
+ placed in the Velocity context for use in Velocity templates. Here is a sample
+ template showing a few of these objects methods and properties.
+<div class="source"><pre>
+$portletConfig.portletName
+$portletConfig.portletContext.serverInfo
+#set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
+$renderRequest.portletMode
+$renderResponse.namespace
+</pre>
+</div>
+</p>
+</div>
+<div class="section"><h3><a name="a5._The_Dependency_JARs"></a>5. The Dependency JARs</h3>
+<p>
+ Copy the commons-beanutils-1.7.0.jar, commons-collections-3.1.jar,
+ commons-digester-1.7.jar, portals-bridges-velocity-1.0.jar,
+ velocity-1.4.jar, and velocity-tools-1.2.jar to the velocity-simplest/WEB-INF/lib
+ directory. IMPORTANT:
+ Do NOT put the portlet-api-1.0.jar in the war file. If you have already built
+ Jetspeed these
+ jars should be in your Maven repository. If so executing these commands in the lib
+ directory will set up the dependencies for you.
+<div class="source"><pre>
+ln -s ~/.maven/repository/commons-beanutils/jars/commons-beanutils-1.7.0.jar
+ln -s ~/.maven/repository/commons-collections/jars/commons-collections-3.1.jar
+ln -s ~/.maven/repository/commons-digester/jars/commons-digester-1.7.jar
+ln -s ~/.maven/repository/org.apache.portals.bridges/jars/portals-bridges-velocity-1.0.jar
+ln -s ~/.maven/repository/velocity/jars/velocity-1.4.jar
+ln -s ~/.maven/repository/velocity-tools/jars/velocity-tools-1.2.jar
+</pre>
+</div>
+</p>
+</div>
+<div class="section"><h3><a name="a6._The_WAR_file"></a>6. The WAR file</h3>
+<p>
+ From the directory velocity-simplest combine the files above into a war file using the command,
+ <div class="source"><pre>
+jar cvf ../velocitysimplest.war .
+ </pre>
+</div>
+</p>
+</div>
+<div class="section"><h3><a name="a7._Deploy_the_WAR_file"></a>7. Deploy the WAR file</h3>
+<p>
+ Copy the war file to <code>$CATALINA_HOME/webapps/jetspeed/WEB-INF/deploy</code>.
+ Jetspeed-2 will deploy the webapp.
+ </p>
+</div>
+<div class="section"><h3><a name="a8._The_PSML"></a>8. The PSML</h3>
+<p>
+ Create the PSML page using the Jetspeed portlet chooser. Login and click on the
+ edit page icon.
+ Your user must have the permission to edit pages. The user <code>admin</code>
+ password
+ <code>admin</code> has permission to edit all pages.
+ </p>
+</div>
+</div>
+
+ </div>
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ <div id="footer">
+ <div class="xright">©
+ 2004-2011
+
+ Apache Software Foundation
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ </body>
+</html>
Propchange: portals/site-live/bridges/bridges-velocity/index.html
------------------------------------------------------------------------------
svn:executable = *
Added: portals/site-live/bridges/css/maven-base.css
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/css/maven-base.css?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/css/maven-base.css (added)
+++ portals/site-live/bridges/css/maven-base.css Sun Dec 16 18:11:05 2012
@@ -0,0 +1,143 @@
+body {
+ margin: 0px;
+ padding: 0px;
+}
+img {
+ border:none;
+}
+table {
+ padding:0px;
+ width: 100%;
+ margin-left: -2px;
+ margin-right: -2px;
+}
+acronym {
+ cursor: help;
+ border-bottom: 1px dotted #feb;
+}
+table.bodyTable th, table.bodyTable td {
+ padding: 2px 4px 2px 4px;
+ vertical-align: top;
+}
+div.clear{
+ clear:both;
+ visibility: hidden;
+}
+div.clear hr{
+ display: none;
+}
+#bannerLeft, #bannerRight {
+ font-size: xx-large;
+ font-weight: bold;
+}
+#bannerLeft img, #bannerRight img {
+ margin: 0px;
+}
+.xleft, #bannerLeft img {
+ float:left;
+}
+.xright, #bannerRight {
+ float:right;
+}
+#banner {
+ padding: 0px;
+}
+#banner img {
+ border: none;
+}
+#breadcrumbs {
+ padding: 3px 10px 3px 10px;
+}
+#leftColumn {
+ width: 170px;
+ float:left;
+ overflow: auto;
+}
+#bodyColumn {
+ margin-right: 1.5em;
+ margin-left: 197px;
+}
+#legend {
+ padding: 8px 0 8px 0;
+}
+#navcolumn {
+ padding: 8px 4px 0 8px;
+}
+#navcolumn h5 {
+ margin: 0;
+ padding: 0;
+ font-size: small;
+}
+#navcolumn ul {
+ margin: 0;
+ padding: 0;
+ font-size: small;
+}
+#navcolumn li {
+ list-style-type: none;
+ background-image: none;
+ background-repeat: no-repeat;
+ background-position: 0 0.4em;
+ padding-left: 16px;
+ list-style-position: outside;
+ line-height: 1.2em;
+ font-size: smaller;
+}
+#navcolumn li.expanded {
+ background-image: url(../images/expanded.gif);
+}
+#navcolumn li.collapsed {
+ background-image: url(../images/collapsed.gif);
+}
+#poweredBy {
+ text-align: center;
+}
+#navcolumn img {
+ margin-top: 10px;
+ margin-bottom: 3px;
+}
+#poweredBy img {
+ display:block;
+ margin: 20px 0 20px 17px;
+}
+#search img {
+ margin: 0px;
+ display: block;
+}
+#search #q, #search #btnG {
+ border: 1px solid #999;
+ margin-bottom:10px;
+}
+#search form {
+ margin: 0px;
+}
+#lastPublished {
+ font-size: x-small;
+}
+.navSection {
+ margin-bottom: 2px;
+ padding: 8px;
+}
+.navSectionHead {
+ font-weight: bold;
+ font-size: x-small;
+}
+.section {
+ padding: 4px;
+}
+#footer {
+ padding: 3px 10px 3px 10px;
+ font-size: x-small;
+}
+#breadcrumbs {
+ font-size: x-small;
+ margin: 0pt;
+}
+.source {
+ padding: 12px;
+ margin: 1em 7px 1em 7px;
+}
+.source pre {
+ margin: 0px;
+ padding: 0px;
+}
Propchange: portals/site-live/bridges/css/maven-base.css
------------------------------------------------------------------------------
svn:executable = *
Added: portals/site-live/bridges/css/maven-theme.css
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/css/maven-theme.css?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/css/maven-theme.css (added)
+++ portals/site-live/bridges/css/maven-theme.css Sun Dec 16 18:11:05 2012
@@ -0,0 +1,141 @@
+body {
+ padding: 0px 0px 10px 0px;
+}
+body, td, select, input, li{
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ font-size: 13px;
+}
+code{
+ font-family: Courier, monospace;
+ font-size: 13px;
+}
+a {
+ text-decoration: none;
+}
+a:link {
+ color:#36a;
+}
+a:visited {
+ color:#47a;
+}
+a:active, a:hover {
+ color:#69c;
+}
+#legend li.externalLink {
+ background: url(../images/external.png) left top no-repeat;
+ padding-left: 18px;
+}
+a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
+ background: url(../images/external.png) right center no-repeat;
+ padding-right: 18px;
+}
+#legend li.newWindow {
+ background: url(../images/newwindow.png) left top no-repeat;
+ padding-left: 18px;
+}
+a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
+ background: url(../images/newwindow.png) right center no-repeat;
+ padding-right: 18px;
+}
+h2 {
+ padding: 4px 4px 4px 6px;
+ border: 1px solid #999;
+ color: #900;
+ background-color: #ddd;
+ font-weight:900;
+ font-size: x-large;
+}
+h3 {
+ padding: 4px 4px 4px 6px;
+ border: 1px solid #aaa;
+ color: #900;
+ background-color: #eee;
+ font-weight: normal;
+ font-size: large;
+}
+h4 {
+ padding: 4px 4px 4px 6px;
+ border: 1px solid #bbb;
+ color: #900;
+ background-color: #fff;
+ font-weight: normal;
+ font-size: large;
+}
+h5 {
+ padding: 4px 4px 4px 6px;
+ color: #900;
+ font-size: normal;
+}
+p {
+ line-height: 1.3em;
+ font-size: small;
+}
+#breadcrumbs {
+ border-top: 1px solid #aaa;
+ border-bottom: 1px solid #aaa;
+ background-color: #ccc;
+}
+#leftColumn {
+ margin: 10px 0 0 5px;
+ border: 1px solid #999;
+ background-color: #eee;
+}
+#navcolumn h5 {
+ font-size: smaller;
+ border-bottom: 1px solid #aaaaaa;
+ padding-top: 2px;
+ color: #000;
+}
+
+table.bodyTable th {
+ color: white;
+ background-color: #bbb;
+ text-align: left;
+ font-weight: bold;
+}
+
+table.bodyTable th, table.bodyTable td {
+ font-size: 1em;
+}
+
+table.bodyTable tr.a {
+ background-color: #ddd;
+}
+
+table.bodyTable tr.b {
+ background-color: #eee;
+}
+
+.source {
+ border: 1px solid #999;
+}
+dl {
+ padding: 4px 4px 4px 6px;
+ border: 1px solid #aaa;
+ background-color: #ffc;
+}
+dt {
+ color: #900;
+}
+#organizationLogo img, #projectLogo img, #projectLogo span{
+ margin: 8px;
+}
+#banner {
+ border-bottom: 1px solid #fff;
+}
+.errormark, .warningmark, .donemark, .infomark {
+ background: url(../images/icon_error_sml.gif) no-repeat;
+}
+
+.warningmark {
+ background-image: url(../images/icon_warning_sml.gif);
+}
+
+.donemark {
+ background-image: url(../images/icon_success_sml.gif);
+}
+
+.infomark {
+ background-image: url(../images/icon_info_sml.gif);
+}
+
Propchange: portals/site-live/bridges/css/maven-theme.css
------------------------------------------------------------------------------
svn:executable = *
Added: portals/site-live/bridges/css/print.css
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/css/print.css?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/css/print.css (added)
+++ portals/site-live/bridges/css/print.css Sun Dec 16 18:11:05 2012
@@ -0,0 +1,7 @@
+#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks, #leftColumn, #navColumn {
+ display: none !important;
+}
+#bodyColumn, body.docs div.docs {
+ margin: 0 !important;
+ border: none !important
+}
Propchange: portals/site-live/bridges/css/print.css
------------------------------------------------------------------------------
svn:executable = *
Added: portals/site-live/bridges/css/site.css
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/css/site.css?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/css/site.css (added)
+++ portals/site-live/bridges/css/site.css Sun Dec 16 18:11:05 2012
@@ -0,0 +1,290 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+/*
+----------------------
+Theme Style
+----------------------
+*/
+body {
+ background-color: #fff;
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ margin-left: auto;
+ margin-right: auto;
+ background-repeat: repeat-y;
+ font-size: 13px;
+ padding: 0px;
+}
+
+td,select,input,li {
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ font-size: 12px;
+ color: #333333;
+}
+
+code {
+ font-size: 12px;
+}
+
+a {
+ text-decoration: none;
+}
+
+a:link {
+ color: #47a;
+}
+
+a:visited {
+ color: #666666;
+}
+
+a:active,a:hover {
+ color: #990000;
+}
+
+#legend li.externalLink {
+ background: url(../images/external.png) left top no-repeat;
+ padding-left: 18px;
+}
+
+a.externalLink,a.externalLink:link,a.externalLink:visited,a.externalLink:active,a.externalLink:hover
+ {
+ background: url(../images/external.png) right center no-repeat;
+ padding-right: 18px;
+}
+
+#legend li.newWindow {
+ background: url(../images/newwindow.png) left top no-repeat;
+ padding-left: 18px;
+}
+
+a.newWindow,a.newWindow:link,a.newWindow:visited,a.newWindow:active,a.newWindow:hover
+ {
+ background: url(../images/newwindow.png) right center no-repeat;
+ padding-right: 18px;
+}
+
+h2 {
+ font-size: 17px;
+ color: #333333;
+}
+
+h3 {
+ padding: 4px 4px 4px 24px;
+ color: #666;
+ background-color: #ccc;
+ font-weight: bold;
+ font-size: 14px;
+ background-image: url(../images/h3.jpg);
+ background-repeat: no-repeat;
+ background-position: left bottom;
+}
+
+p {
+ line-height: 1.3em;
+ font-size: 12px;
+ color: #000;
+}
+
+#breadcrumbs {
+ height: 6px;
+ background-image: url(../images/breadcrumbs.jpg);
+ padding: 5px 10px 14px 20px;
+}
+
+* html #breadcrumbs {
+ padding-bottom: 8px;
+}
+
+#leftColumn {
+ margin: 10px 0 10px 0;
+ background-color: #fff;
+ border-top-color: #ccc;
+ border-top-style: solid;
+ border-top-width: 1px;
+ border-right-color: #ccc;
+ border-right-style: solid;
+ border-right-width: 1px;
+ border-bottom-color: #ccc;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ padding-right: 5px;
+ padding-left: 5px;
+ width: 18%;
+}
+
+#bodyColumn {
+ margin-right: 1.5em;
+ margin-left: 20%;
+}
+
+#navcolumn h5 {
+ font-size: smaller;
+ border-bottom: 1px solid #aaaaaa;
+ padding-top: 2px;
+ padding-left: 9px;
+ color: #49635a;
+ background-image: url(../images/h5.jpg);
+ background-repeat: no-repeat;
+ background-position: left bottom;
+}
+
+table.bodyTable th {
+ color: white;
+ background-color: #bbb;
+ text-align: left;
+ font-weight: bold;
+}
+
+table.bodyTable th,table.bodyTable td {
+ font-size: 11px;
+}
+
+table.bodyTable tr.a {
+ background-color: #ddd;
+}
+
+table.bodyTable tr.b {
+ background-color: #eee;
+}
+
+.source {
+ border: 1px solid #999;
+ overflow: auto
+}
+
+dt {
+ padding: 4px 4px 4px 24px;
+ color: #333333;
+ background-color: #ccc;
+ font-weight: bold;
+ font-size: 14px;
+ background-image: url(../images/h3.jpg);
+ background-repeat: no-repeat;
+ background-position: left bottom;
+}
+
+.subsectionTitle {
+ font-size: 13px;
+ font-weight: bold;
+ color: #666;
+}
+
+table {
+ font-size: 10px;
+}
+
+.xright a:link,.xright a:visited,.xright a:active {
+ color: #666;
+}
+
+.xright a:hover {
+ color: #003300;
+}
+
+#banner {
+ height: 93px;
+ background: url(../images/banner.jpg);
+}
+
+#bannerLeft img, #bannerRight img {
+ margin: 8px;
+}
+
+#navcolumn ul {
+ margin: 5px 0 15px -0em;
+}
+
+#navcolumn ul a {
+ color: #333333;
+}
+
+#navcolumn ul a:hover {
+ color: red;
+}
+
+#intro {
+ border: solid #ccc 1px;
+ margin: 6px 0px 0px 0px;
+ padding: 10px 40px 10px 40px;
+}
+
+.section h2 {
+ background-color: #fff;
+ border: 0px;
+ padding-left: 0px;
+}
+
+.subsection {
+ margin-left: 3px;
+ color: #333333;
+}
+
+.subsection p {
+ font-size: 12px;
+}
+
+#footer {
+ padding: 10px;
+ margin: 20px 0px 20px 0px;
+ border-top: solid #ccc 1px;
+ color: #333333;
+}
+
+/*
+----------------------
+Project Style
+----------------------
+*/
+
+#downloadbox {
+ float: right;
+ margin: 0 10px 20px 20px;
+ padding: 5px;
+ border: 1px solid #999;
+ background-color: #eee;
+}
+
+#downloadbox {
+ float: right;
+ margin: 0 10px 20px 20px;
+ padding: 5px;
+ border: 1px solid #999;
+ background-color: #eee;
+}
+
+#downloadbox h5 {
+ color: #000;
+ margin: 0;
+ border-bottom: 1px solid #aaaaaa;
+ font-size: smaller;
+ padding: 0;
+}
+
+#downloadbox p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+#downloadbox ul {
+ margin-top: 0;
+ margin-bottom: 1em;
+ list-style-type: disc;
+}
+
+#downloadbox li {
+ font-size: smaller;
+}
\ No newline at end of file
Propchange: portals/site-live/bridges/css/site.css
------------------------------------------------------------------------------
svn:executable = *
Added: portals/site-live/bridges/dependencies.html
URL: http://svn.apache.org/viewvc/portals/site-live/bridges/dependencies.html?rev=1422646&view=auto
==============================================================================
--- portals/site-live/bridges/dependencies.html (added)
+++ portals/site-live/bridges/dependencies.html Sun Dec 16 18:11:05 2012
@@ -0,0 +1,234 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+
+
+
+
+
+
+
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>Apache Portals Bridges - Project Dependencies</title>
+ <style type="text/css" media="all">
+ @import url("./css/maven-base.css");
+ @import url("./css/maven-theme.css");
+ @import url("./css/site.css");
+ </style>
+ <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ </head>
+ <body class="composite">
+ <div id="banner">
+ <a href="http://portals.apache.org/" id="bannerLeft">
+
+ <img src="images/apache-portals.gif" alt="" />
+
+ </a>
+ <a href="http://portals.apache.org/bridges/" id="bannerRight">
+
+ Apache Portals Bridges
+
+ </a>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="breadcrumbs">
+
+
+
+
+
+
+
+
+ <div class="xleft">
+ Last Published: 29 September 2011
+ </div>
+ <div class="xright"> <a href="http://portals.apache.org/" class="externalLink">Portals</a>
+ |
+ <a href="http://portals.apache.org/applications" class="externalLink">Applications</a>
+ |
+ <a href="http://portals.apache.org/jetspeed-2" class="externalLink">Jetspeed-2</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=168" class="externalLink">JSR-168</a>
+ |
+ <a href="http://www.jcp.org/en/jsr/detail?id=286" class="externalLink">JSR-286</a>
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ <div id="leftColumn">
+ <div id="navcolumn">
+
+
+
+
+
+
+
+
+ <h5>Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="index.html">Overview</a>
+ </li>
+
+ <li class="none">
+ <a href="news.html">News and Status</a>
+ </li>
+ </ul>
+ <h5>Current Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="bridges-common/index.html">Common Utilities and Interfaces</a>
+ </li>
+
+
+
+
+
+ <li class="collapsed">
+ <a href="bridges-struts/index.html">Struts Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="bridges-velocity/index.html">Velocity Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="bridges-script/index.html">Script Bridge</a>
+ </li>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="bridges-groovy/index.html">Groovy Bridge</a>
+ </li>
+ </ul>
+ <h5>Archived Portals Bridges</h5>
+ <ul>
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="bridges-jsf/index.html">JSF Bridge</a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="collapsed">
+ <a href="bridges-php/index.html">PHP Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="bridges-perl/index.html">Perl Bridge</a>
+ </li>
+
+ <li class="none">
+ <a href="bridges-portletfilter/index.html">Portlet Filter</a>
+ </li>
+ </ul>
+ <h5>Get Portals Bridges</h5>
+ <ul>
+
+ <li class="none">
+ <a href="download.html">Download</a>
+ </li>
+
+ <li class="none">
+ <a href="release-notes.html">Release Notes</a>
+ </li>
+ </ul>
+ <h5>Support</h5>
+ <ul>
+
+ <li class="none">
+ <a href="team-list.html">Project Team</a>
+ </li>
+
+ <li class="none">
+ <a href="license.html">Project License</a>
+ </li>
+
+ <li class="none">
+ <a href="mail-lists.html">Mailing List</a>
+ </li>
+
+ <li class="none">
+ <a href="issue-tracking.html">Issue Tracking</a>
+ </li>
+ </ul>
+ <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
+ <img alt="Built by Maven" src="./images/logos/maven-feather.png"></img>
+ </a>
+
+
+
+
+
+
+
+
+ </div>
+ </div>
+ <div id="bodyColumn">
+ <div id="contentBox">
+ <div class="section"><h2>Project Dependencies</h2>
+<p>There are no dependencies for this project. It is a standalone application that does not depend on any other project.</p>
+</div>
+
+ </div>
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ <div id="footer">
+ <div class="xright">©
+ 2004-2011
+
+ Apache Software Foundation
+
+
+
+
+
+
+
+
+ </div>
+ <div class="clear">
+ <hr/>
+ </div>
+ </div>
+ </body>
+</html>
Propchange: portals/site-live/bridges/dependencies.html
------------------------------------------------------------------------------
svn:executable = *