
前言:
搞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:
完结
网友评论