20NN课程网
扫一扫,放到手机桌面

struts中文手册

Struts action标签

Struts Action标签让你能够在你的视图层调用一个完整的Action B,并能把B的输出组合到当前网页中。这是一个非常强大的标签!即使如此,它的使用却让好多Java Web开发的老手疑惑重重。其原因是:许多朋友认为Action的属性就必须要从Request.getParameter中获取,其实不然,这仅仅是因为“恰好方便”,Action标签调用的Action对象,其属性是直接由标签代码设置,并同时会设置到setAttribute中,并不会修改当前请求的Parameters。

其实在一些特殊情况,如URLRewrite时,我们会把URL路径最后一段(比如其意义是文章的ID),设置到ArticleAction的id属性中。所以,为何执着属性的来源呢?

Struts Action标签属性

IF标签属性
属性名必要属性默认值类型描述
executeResultFALSEFALSEBoolean除了执行Action中的代码逻辑外,同时也执行其生成Html的逻辑,并把结果添加到本视图。
flushFALSETRUEBoolean把内存中解析的Html输出到流中,很少用到。
ignoreContextParamsFALSEFALSEBoolean是否把当前页面的参数设置到目标Action的属性中(通过attr传递与普通action不同)。
nameTRUEString被执行的Action名称,不包含后缀。
namespaceFALSEnamespace from where tag is usedString目标Action的名空间
rethrowExceptionFALSEFALSEBoolean是否把目标Action的异常继续往外抛。
varFALSEString被调用的Action在标签结束时会被放到PageContext中,并增加一个以var值为名称的映射,以%{#attr.varname}的方式获取Action
说明:省略奇葩属性performClearTagStateForTagPoolingServers、struts已经废弃的Ajax属性、以及html原生属性。

认为ignoreContextParams参数无效原因

网上有一些朋友因为设置了ignoreContextParams参数,但仍在request.getParameter时获取到参数,认为ignoreContextParams无效。这个验证方法是不对的,原因前面已经提到过,目标Action的属性由标签代码直接设置。ignoreContextParams只应保证对目标Action的属性生效(解与与ServletRequest环境的依赖,有助于防止多个Action标签使用时的冲突问题)。

同理

Action标签的param参数无效?

记住:从来没有见哪个Web框架会去修改request的param列表,也很少会在用户没发起请求时去生成一个新的request,因为这两个都是框架外的东西,是全局的东西,不能修改。param参数作用时只会由标签代码直接把它赋值给Action属性及request的attribute列表(attribute是PageContext里的概念,是可以修改的,我们自己写代码时也应当注意)。

Struts Action标签示例

Action标签的var属性正确用法

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

Action标签综合示例

父页面url地址

请关注参数:http://.../test?paramFromPage=I am a paramFromPage

被调用Action后台代码

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;
	}

被调用Action的视图代码

<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>

Action标签的输出结果

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.
写一些自己的看法

网站优选

备案:陕ICP备17014144号-5

不良信息举报电话:029-85678878,商务合作短信留言:18291486809,邮箱:yte1@qq.com

『野天鹅』以分享生活智慧为中心,内容包括社保、档案、户籍、学业、商业、理财等,我们希望我们精心编排的内容能为您的日常生活提供真正有效的帮助。

『西安野天鹅网络技术有限公司』