浅谈 Struts2 中 文件下载 的 result 类型为 stream 及 该类型中的‘ inputName ’ | type='stream'


前言:

搞struts2文件下载时,在struts.xml中配置配置其初始参数,

contentType,contentDisposition,inputName等,前两个都能马上理解。

唯独最后一个,令人琢磨不定。



0x001:


参数中的 downloadFile 到底是哪儿来的,为什么要这么配置?

看到 downloadFile 立马觉得有点像FileDownAction中的getDownloadFile()

可按照正常理解,两个应该配置一样的。





0x002:

带着这个问题,去查了一些资料。顺便扒拉了源码。


官方API中这样给的解释:

这个名字是关于InputStream 流 属性 从这个 chain 中的action(默认是inputStream)

看到这里,应该就能明白点了,struts.xml中内配置的inputName参数肯定是跟action中那个有关InputStream 流方法有关



0x003:

再去看源码。

源码中定义了这些属性,这里可以看到,inputName的默认值为inputStream,下面有一系列的关于属性的 get set 方法。


下面再看这段代码。重点


注意它的提示:

// Find the inputstream from the invocation variable stack

解释一下,

它先去判断inputStream是否为空,默认是为空的,之后会进入判定条件。

然后它会获取值栈,从值栈中查找一个值,根据我们配置的inputName,最后将查找的值强转为inputStream。

(struts2将所有属性值封装在struts.valueStack请求属性里。)


而我们的getDownloadFile()方法就是设置一个inputStream流,并返回。

如果找不到,则报错。

基本可以断定,这 就 是 我 们 要 找 的 “为什么”。


Struts2内部会根据你在inputName中设置的downloadFile,去值栈中寻找getDownloadFile()这个方法。

至于Struts内部是怎么实现的,由于时间原因这里不再追究,

“ 应 该 是” 利用inputName中的值去拼接上get再将值得第一个字母大写。(个人理解,未证实)


由此得出:

struts.xml中内配置的inputName参数的   值   为

action中inputStream方法名    去掉get前缀    将    第一个字母改为小写

例如,方法名为 getDownloadFile() 那么inputName参数的值就为 downloadFile



0x004:

最后证实一下,果然,两个拿到的值是一样的。



接下来,我们来验证一下我们得出的结论

去改一下struts.xml中inputName的值,使其与action中inputStream流方法的名字不一致,这里多加个  s

之后就会报错。



这样更加证明里我们得出的结论是正确的。

这也就是编程中常说的:

约定大于配置



0x005:

完结

推荐阅读更多精彩内容