struts2文件下载及 <param name="inputName">inputStream</param>的理解

struts.xml文件配置:

[html]  view plain copy
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.enable.DynamicMethodInvocation" value="false" />  
  8.     <constant name="struts.devMode" value="true" />  
  9.   
  10.     <package name="app14a" extends="struts-default">  
  11.         <action name="Menu">  
  12.             <result>/jsp/Menu.jsp</result>  
  13.         </action>  
  14.         <action name="ViewCss" class="app14a.FileDownloadAction">  
  15.             <result name="success" type="stream">  
  16.                 <param name="inputName">inputStream</param>  
  17.                 <param name="contentType">text/css</param>  
  18.                 <param name="contentDisposition">filename="main11.css"</param>  
  19.                 <param name="bufferSize">2048</param>  
  20.             </result>  
  21.         </action>  
  22.         <action name="DownloadCss" class="app14a.FileDownloadAction">  
  23.             <result name="success" type="stream">  
  24.                 <param name="inputName">inputStream</param>  
  25.                 <param name="contentType">application/octet-stream</param>  
  26.                 <param name="contentDisposition">filename="main111222.css"</param>  
  27.                 <param name="bufferSize">2048</param>  
  28.             </result>  
  29.         </action>  
  30.     </package>  
  31. </struts></span>  

    action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream,,struts2会寻找一个返回类型为InputStream的方法getInputStream()(方法名最好为getInputStream,有人说此方法名可以为别的可能需要与struts.xml中的inputName保存一致下面有解释,不过我实验的结果不是这样,须为getInputStream,可能是org.apache.struts2.dispatcher.ResultStream类限制造成,感兴趣的可以看看此类的源码,就会明白的),得到InputStream。

    另一种理解:action中定义一个返回InputStream的方法,该方法作为被下载文件的入口,且需要配置stream类型结果时指定inputName参数,inputName参数的值就是方法去掉get前缀、首字母小写的字符串。

下面则列出了和下载有关的一些参数列表: 

参数 说明 
contentType 
内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片 

inputName 
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法 

contentDisposition 
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为: 

attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt" 

bufferSize 
下载缓冲区的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你使用Java语言,可以使用Java的XML解析器将这个XML转换为对象。以下是一个可能的实现: 首先,我们需要定义一个Java类来表示XML中的`<matchLaser>`元素和其子元素: ```java public class MatchLaser { private String ne; private String tpid; private String alarmOid; private long neID; private byte slotNo; private int portNo; private int portType; // 省略 getter 和 setter 方法 } ``` 然后,我们可以使用Java的XML解析器来解析XML并将其转换为`MatchLaser`对象: ```java import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class XmlToObjectConverter { public static MatchLaser convert(InputStream xmlInput) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(xmlInput); Element root = document.getDocumentElement(); MatchLaser matchLaser = new MatchLaser(); NodeList params = root.getElementsByTagName("params"); if (params.getLength() > 0) { Element paramElement = (Element) params.item(0); matchLaser.setNe(paramElement.getElementsByTagName("ne").item(0).getTextContent()); matchLaser.setTpid(paramElement.getElementsByTagName("tpid").item(0).getTextContent()); } NodeList block = root.getElementsByTagName("block"); if (block.getLength() > 0) { Element declareElement = (Element) block.item(0).getElementsByTagName("declare").item(0); matchLaser.setAlarmOid(declareElement.getElementsByTagName("value").item(0).getTextContent()); matchLaser.setNeID(Long.parseLong(declareElement.getElementsByTagName("value").item(1).getTextContent())); matchLaser.setSlotNo(Byte.parseByte(declareElement.getElementsByTagName("value").item(2).getTextContent())); matchLaser.setPortNo(Integer.parseInt(declareElement.getElementsByTagName("value").item(3).getTextContent())); matchLaser.setPortType(Integer.parseInt(declareElement.getElementsByTagName("value").item(4).getTextContent())); } return matchLaser; } } ``` 使用示例: ```java import java.io.FileInputStream; public class Main { public static void main(String[] args) throws Exception { FileInputStream xmlInput = new FileInputStream("example.xml"); MatchLaser matchLaser = XmlToObjectConverter.convert(xmlInput); System.out.println(matchLaser); } } ``` 注意,这只是一个简单的示例实现,实际的XML解析和对象转换可能需要更复杂的逻辑和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值