|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.apache.struts2.views.xslt.XSLTResult
public class XSLTResult
XSLTResult uses XSLT to transform an action object to XML. The recent version has been specifically modified to deal with Xalan flaws. When using Xalan you may notice that even though you have a very minimal stylesheet like this one
<xsl:template match="/result"> <result/> </xsl:template>
Xalan would still iterate through every property of your action and all its descendants.
If you had double-linked objects, Xalan would work forever analysing an infinite object tree. Even if your stylesheet was not constructed to process them all. It's because the current Xalan eagerly and extensively converts everything to its internal DTM model before further processing.
That's why there's a loop eliminator added that works by indexing every object-property combination during processing. If it notices that some object's property was already walked through, it doesn't go any deeper. Say you have two objects, x and y, with the following properties set (pseudocode):
x.y = y; and y.x = x; action.x=x;
Due to that modification, the resulting XML document based on x would be:
<result> <x> <y/> </x> </result>
Without it there would be endless x/y/x/y/x/y/... elements.
The XSLTResult code tries also to deal with the fact that DTM model is built in a manner that children are processed before siblings. The result is that if there is object x that is both set in action's x property, and very deeply under action's a property then it would only appear under a, not under x. That's not what we expect, and that's why XSLTResult allows objects to repeat in various places to some extent.
Sometimes the object mesh is still very dense and you may notice that even though you have a relatively simple stylesheet, execution takes a tremendous amount of time. To help you to deal with that obstacle of Xalan, you may attach regexp filters to elements paths (xpath).
Note: In your .xsl file the root match must be named result.
This example will output the username by using getUsername on your
action class:
<xsl:template match="result"> <html> <body> Hello <xsl:value-of select="username"/> how are you? </body> </html> </xsl:template>
In the following example the XSLT result would only walk through action's properties without their childs. It would also skip every property that has "hugeCollection" in their name. Element's path is first compared to excludingPattern - if it matches it's no longer processed. Then it is compared to matchingPattern and processed only if there's a match.
<result name="success" type="xslt"> <param name="location">foo.xslt</param> <param name="matchingPattern">^/result/[^/*]$</param> <param name="excludingPattern">.*(hugeCollection).*</param> </result>
In the following example the XSLT result would use the action's user property instead of the action as it's base document and walk through it's properties. The exposedValue uses an ognl expression to derive it's value.
<result name="success" type="xslt"> <param name="location">foo.xslt</param> <param name="exposedValue">user$</param> </result>* This result type takes the following parameters:
struts.properties
related configuration:
<result name="success" type="xslt">foo.xslt</result>
Field Summary | |
---|---|
private AdapterFactory |
adapterFactory
|
static String |
DEFAULT_PARAM
'stylesheetLocation' parameter. |
private String |
excludingPattern
Indicates the property name patterns which should be excluded from the xml. |
private String |
exposedValue
Indicates the ognl expression respresenting the bean which is to be exposed as xml. |
private static Logger |
LOG
Log instance for this result. |
private String |
matchingPattern
Indicates the property name patterns which should be exposed to the xml. |
protected boolean |
noCache
Determines whether or not the result should allow caching. |
private boolean |
parse
|
private static long |
serialVersionUID
|
private String |
stylesheetLocation
Indicates the location of the xsl template. |
private static Map<String,Templates> |
templatesCache
Cache of all tempaltes. |
Constructor Summary | |
---|---|
XSLTResult()
|
|
XSLTResult(String stylesheetLocation)
|
Method Summary | |
---|---|
void |
execute(ActionInvocation invocation)
Represents a generic interface for all action execution results. |
protected AdapterFactory |
getAdapterFactory()
|
protected Source |
getDOMSourceForStack(Object value)
|
String |
getExcludingPattern()
Deprecated. Since 2.1.1 |
String |
getExposedValue()
|
String |
getMatchingPattern()
Deprecated. Since 2.1.1 |
String |
getStylesheetLocation()
|
protected Templates |
getTemplates(String path)
|
protected URIResolver |
getURIResolver()
Get the URI Resolver to be called by the processor when it encounters an xsl:include, xsl:import, or document() function. |
protected void |
setAdapterFactory(AdapterFactory adapterFactory)
|
void |
setExcludingPattern(String excludingPattern)
Deprecated. Since 2.1.1 |
void |
setExposedValue(String exposedValue)
|
void |
setLocation(String location)
Deprecated. Use #setStylesheetLocation(String) |
void |
setMatchingPattern(String matchingPattern)
Deprecated. Since 2.1.1 |
void |
setNoCache(String val)
|
void |
setParse(boolean parse)
If true, parse the stylesheet location for OGNL expressions. |
void |
setStylesheetLocation(String location)
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
private static final long serialVersionUID
private static final Logger LOG
public static final String DEFAULT_PARAM
private static final Map<String,Templates> templatesCache
protected boolean noCache
private String stylesheetLocation
private String matchingPattern
private String excludingPattern
private String exposedValue
private boolean parse
private AdapterFactory adapterFactory
Constructor Detail |
---|
public XSLTResult()
public XSLTResult(String stylesheetLocation)
Method Detail |
---|
public void setNoCache(String val)
public void setLocation(String location)
public void setStylesheetLocation(String location)
public String getStylesheetLocation()
public String getExposedValue()
public void setExposedValue(String exposedValue)
public String getMatchingPattern()
public void setMatchingPattern(String matchingPattern)
public String getExcludingPattern()
public void setExcludingPattern(String excludingPattern)
public void setParse(boolean parse)
parse
- public void execute(ActionInvocation invocation) throws Exception
Result
execute
in interface Result
invocation
- the invocation context.
Exception
- can be thrown.protected AdapterFactory getAdapterFactory()
protected void setAdapterFactory(AdapterFactory adapterFactory)
protected URIResolver getURIResolver()
protected Templates getTemplates(String path) throws TransformerException, IOException
TransformerException
IOException
protected Source getDOMSourceForStack(Object value) throws IllegalAccessException, InstantiationException
IllegalAccessException
InstantiationException
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |