Struts Action标签让你能够在你的视图层调用一个完整的Action B,并能把B的输出组合到当前网页中。这是一个非常强大的标签!即使如此,它的使用却让好多Java Web开发的老手疑惑重重。其原因是:许多朋友认为Action的属性就必须要从Request.getParameter中获取,其实不然,这仅仅是因为“恰好方便”,Action标签调用的Action对象,其属性是直接由标签代码设置,并同时会设置到setAttribute中,并不会修改当前请求的Parameters。
其实在一些特殊情况,如URLRewrite时,我们会把URL路径最后一段(比如其意义是文章的ID),设置到ArticleAction的id属性中。所以,为何执着属性的来源呢?
IF标签属性 | ||||
---|---|---|---|---|
属性名 | 必要属性 | 默认值 | 类型 | 描述 |
executeResult | FALSE | FALSE | Boolean | 除了执行Action中的代码逻辑外,同时也执行其生成Html的逻辑,并把结果添加到本视图。 |
flush | FALSE | TRUE | Boolean | 把内存中解析的Html输出到流中,很少用到。 |
ignoreContextParams | FALSE | FALSE | Boolean | 是否把当前页面的参数设置到目标Action的属性中(通过attr传递与普通action不同)。 |
name | TRUE | String | 被执行的Action名称,不包含后缀。 | |
namespace | FALSE | namespace from where tag is used | String | 目标Action的名空间 |
rethrowException | FALSE | FALSE | Boolean | 是否把目标Action的异常继续往外抛。 |
var | FALSE | String | 被调用的Action在标签结束时会被放到PageContext中,并增加一个以var值为名称的映射,以%{#attr.varname}的方式获取Action |
说明:省略奇葩属性performClearTagStateForTagPoolingServers、struts已经废弃的Ajax属性、以及html原生属性。
网上有一些朋友因为设置了ignoreContextParams参数,但仍在request.getParameter时获取到参数,认为ignoreContextParams无效。这个验证方法是不对的,原因前面已经提到过,目标Action的属性由标签代码直接设置。ignoreContextParams只应保证对目标Action的属性生效(解与与ServletRequest环境的依赖,有助于防止多个Action标签使用时的冲突问题)。
同理
记住:从来没有见哪个Web框架会去修改request的param列表,也很少会在用户没发起请求时去生成一个新的request,因为这两个都是框架外的东西,是全局的东西,不能修改。param参数作用时只会由标签代码直接把它赋值给Action属性及request的attribute列表(attribute是PageContext里的概念,是可以修改的,我们自己写代码时也应当注意)。
Action标签的var属性与许多普通的Struts标签var属性行为不一样,它需要Action标签执行完结束标签后,才把整体Action放到PageContext并命名为var指定的名称。我们再看下面代码示例:
<s:action var="myAction" name="MyAction" namespace="/"> <s:property value="#myAction == null" /> </s:action> <s:property value="#myAction == null" /> 输出结果: true false
请关注参数:http://.../test?paramFromPage=I am a paramFromPage
public class DemoAction extends ActionSupport { private String paramFromPage; private String paramFromParamTag; public String execute() throws Exception { ServletActionContext.getRequest().setAttribute("fromSameRequest", "We share the same request object."); return "done"; } public String getParamFromPage() { return paramFromPage; } public void setParamFromPage(String paramFromPage) { this.paramFromPage = paramFromPage; } public String getParamFromParamTag() { return paramFromParamTag; } public void setParamFromParamTag(String paramFromParamTag) { this.paramFromParamTag = paramFromParamTag; }
<div> <hr> <h1>Sub Action Output</h1> <table> <tr><td>paramFromPage</td><td><s:property value="paramFromPage"/></td></tr> <tr><td>paramFromParamTag</td><td><s:property value="paramFromParamTag"/></td></tr> </table> <hr> </div>
<body> <s:action name="demo" executeResult="true" ignoreContextParams="false"> <s:param name="paramFromParamTag" value="%{'I am a paramFromParamTag'}"></s:param> </s:action> <s:property value="#attr.fromSameRequest" /> </body>
Sub Action Output paramFromPage I am a paramFromPage paramFromParamTag I am a paramFromParamTag ------------------------------ We share the same request object.
猜一猜:ignoreContextParams如果设置为true时,输出结果会是什么?答案见下面:
Sub Action Output paramFromPage paramFromParamTag I am a paramFromParamTag ------------------------------ We share the same request object.
版权声明:本文为20NN作者「sophia」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:http://www.20nn.cn/struts/struts-action.html
不良信息举报电话:029-85678878,商务合作短信留言:18291486809,邮箱:yte1@qq.com
『野天鹅』以分享生活智慧为中心,内容包括社保、档案、户籍、学业、商业、理财等,我们希望我们精心编排的内容能为您的日常生活提供真正有效的帮助。
『西安野天鹅网络技术有限公司』