HttpClient结合XSLT在JAVA中的应用

 介绍:

    XSL 指扩展样式表语言(EXtensible Stylesheet Language)。

它是W3C 的标准,主要用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。

通过 XSLT,您可以向或者从输出文件添加或移除元素和属性。您也可重新排列元素,执行测试并决定隐藏或显示哪个元素,等等。(个人理解:就是把一个XML转换成其他文本的工具,可以转换成纯文本,HTML代码,XML等,感觉有点象个脚本解释器)

 

    HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。(个人理解:相当于一个后台请求,可以把请求到的页面中的内容返回回来;例如,用HttpClient 去请求一个HTML页面,可以得到该HTML页面的源码字符串,即HTML代码,如果访问一个XML,则返回一个XML的字符串,要用它需要有commons-httpclient.jar这个JAR包,可以从http://wiki.apache.org/jakarta-httpclient/HttpClientPowered下载

 

使用目的:

    FLEX中可以使用HTTPService来与后台进行数据交互,传递的格式经常是XML型,这些XML通常是由一个Servlet查库或间接查库后拼接而成的(不建议直接拼接,最好是用DOM4J生成DOM文档操作,最后toString()出来);

    但有些时候,同一批数据需要以不同种XML格式输出,这些复杂的转换工作其实在程序内部也能实现,但过程相对麻烦,并且不灵活,如果后来需要再加入一个属性或更改一个结点的名称等,就必须要重新更改JAVA文件或AS文件并重新编译了;这个时候如果用XSLT做这个转换工作,则省去了复杂的DOM文档操作,并且如果以后要更改格式,只需要更改XSLT文件即可,而XLS文件是以XML文件的格式保存的,所以不需要再次编译。

 

具体实例:

    先看看XSLT是怎么工作的,例如有一个ServletA,它最后输出的XML格式如下:

 

 
 

 
 
	
  
  
	
  
  
	
  
  
	
  
  
	
  
  
	
  
  
	
  
  
	
  
  
	
  
  

 
 

经过如下的XSL的转换

 

 
 
 
 
	
  
  
  
  
	
  
  
   
   
		
   
   
			
    
    
    
    
		
   
   
	
  
  

	
  
  
   
   
		
   
   
   
   
		
   
   
    
    
			
    
    
    
    
			
    
    
    
    
		
   
   
	
  
  

 
 

最后的结果就会是:

 

 
  

  
  
	
   
   
		
    
    
			
     
      
		
    
    
		
    
    
			
     
     
				
      
       
				
      
       
        
      
			
     
     
		
    
    
		
    
     
	
   
   

  
  

 

是不是很简单,下面就是如何把这个转换工作放到JAVA中去完成,

步骤如下:

1、创建ServletB;

2、通过HttpClient取得ServletA的XML结果;

3、用XSLT转换ServletA的结果;

4、输出转换后的结果。

 

第一步跟第四步就省略了,下面列出步骤二和步骤三的代码样例:

步骤二

 

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;


HttpClient client = new HttpClient();
		
String path = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
PostMethod method = new PostMethod(path+"/ServletA");
//设置请求字符集
method.addRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");

/*如果有参数,可以通过这样设置参数
NameValuePair nvpUserName = new NameValuePair("User", session.getAttribute("UserName").toString());
NameValuePair nvpPassWord = new NameValuePair("Password", session.getAttribute("PassWord").toString());*/

StringBuffer sbuffer = new StringBuffer();
try
{
	//将参数放入请求中
	//method.setRequestBody(new NameValuePair[] {nvpUserName,nvpPassWord});
	//执行请求动作
	client.executeMethod(method);
	//取得请求状态码,状态码200为请求成功,404为未找到文件,500表示请求的程序错误
	int nHttpState = method.getStatusCode();
	if(nHttpState == 200)
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), "UTF-8"));
		String line = null;
		while ((line = br.readLine()) != null) 
		{
			sbuffer.append(line);
		}
		br.close();
	}
	else
	{
		//Handle error
	}
	method.releaseConnection();
}
catch(Exception e)
{
	//Handle Exception
	System.out.println("Exception name is "+e.getClass().getName()+", message is " + e.getMessage());
}
//这里的sbuffer即为ServletA中的XML内容

步骤三:

 

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

//这里的sourceXml即为上面的sbuffer中的内容,xsltPath为XSL文件的存放路径,
//最后返回出来的就是转换之后的格式了
public String formatByXslt(String sourceXml, String xsltPath)
{
	Source xmlSource = new StreamSource(new StringReader(sourceXml));
	File xsltFile = new File(xsltPath);
	Source xslSource = new StreamSource(xsltFile);
	StringWriter sw = new StringWriter();
	Result result = new StreamResult(sw);
	TransformerFactory tFactory = TransformerFactory.newInstance();
	
	Transformer transformer;
	String sTransitionResult = "";
	try 
	{
		transformer = tFactory.newTransformer(xslSource);
		transformer.transform(xmlSource, result);
		sTransitionResult = sw.toString();
		sw.flush();
		sw.close();
	} 
	catch(TransformerException te)
	{
		//Handle TransformerException
	}
	catch(IOException ie)
	{
		//Handle IOException
	}
	catch(Exception e)
	{
		//Handle Unknown Exception
	}
	return sTransitionResult;
}

 

暂时就写这么多,希望对大家有帮助:)

另:XSLT语法并不难学,估计认真一天加上实际动手操作一下,很快就能基本掌握。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值