1. 定义新的返回类型:
package com.yuxipacific.common.result; import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import org.apache.struts2.views.xslt.XSLTResult; import org.xml.sax.InputSource; public class StringXSLTResult extends XSLTResult { private static final long serialVersionUID = -5603306939538425896L; private boolean parseStringAsXML = true; public void setParseStringAsXML(boolean parseStringAsXML) { this.parseStringAsXML = parseStringAsXML; } @Override protected Source getDOMSourceForStack(Object value) throws IllegalAccessException, InstantiationException { if(parseStringAsXML && value instanceof String) { try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); value = builder.parse(new InputSource(new StringReader((String)value))); } catch (Exception e) { return super.getDOMSourceForStack(value); } } return super.getDOMSourceForStack(value); } }
2. struts.xml中声明新的返回类型,并定义需要执行的action:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.i18n.encoding" value="UTF-8" /> <constant name="struts.custom.i18n.resources" value="ApplicationResources" /> <package name="default" namespace="/" extends="struts-default"> <result-types> <result-type name="sxslt" class="com.yuxipacific.common.result.StringXSLTResult"></result-type> </result-types> <interceptors> <interceptor name="cmInterceptor" class="com.yuxipacific.common.aop.CmInterceptor" /> <interceptor-stack name="cmStack"> <interceptor-ref name="cmInterceptor" /> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="cmStack" /> <action name="query" class="com.yuxipacific.action.QueryAction" method="query"> <result name="success" type="sxslt"> <param name="exposedValue">xmlString</param> <param name="stylesheetLocation ">/xslt/result.xslt</param> <param name="noCache">true</param> </result> </action> </package> </struts>
3. QueryAction.java
package com.yuxipacific.action; import com.yuxipacific.common.action.CmAction; public class QueryAction extends CmAction { private static final long serialVersionUID = 174546491330585634L; @Override public void doBeforeProcess() throws Exception { System.out.println("------------------------1"); } @Override public void doAfterProcess() throws Exception { System.out.println("------------------------2"); } public String query() { // String xmlString = "<user><name>Admin</name></user>"; // Map<String, Object> contextMap = ActionContext.getContext().getContextMap(); // contextMap.put("xmlString", xmlString); xmlString = "<user><name>Admin</name></user>"; return SUCCESS; } private String xmlString; public String getXmlString() { return xmlString; } public void setXmlString(String xmlString) { this.xmlString = xmlString; } }
xslt/result.xslt:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" omit-xml-declaration="yes" /> <xsl:template match="/user"> <xsl:value-of select="name"/> </xsl:template> </xsl:stylesheet>
更多参考内容如下:
http://unmi.cc/struts2-xslt-string-document-final