一:action实现RequestAware,SessionAware,ApplicationAware三个接口,用于读写web对象
struct通过Aware的void setXXX()方法,把web对象读到action中,赋值给私有属性
execute()方法把值写到contextStack里,
如果返回“success”的话,就会把全部上下文(其中有自己写的东西)传递到配置好的页面去,也就是这里配的result.jsp
(action对于web对象的读写,还有几种方式,有时间来补充)
package com.rt.struts2.actionDemo;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
//实现RequestAware,SessionAware,ApplicationAware三个接口,用于读写web对象
public class WebObjectAction01 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware
{
private Map<String,Object> request;//这仨名字固定,因为下边接口的set函数名固定。不然反射时候找不到
private Map<String,Object> session;
private Map<String,Object> application;
public String execute()
{
System.out.println("__WebObjectAction01__");
request.put("req1", "valueOfReq1");
//Response是servlet返给jsp的,所以不用在这设置
session.put("ses1", "valueOfSes1");
application.put("app1", "valueOfApp1");
return "success";
}
//接口内必须实现的方法,struts会把页面的对象set进来
public void setApplication(Map<String, Object> a) {
this.application = a;
}
public void setSession(Map<String, Object> s) {
this.session = s;
}
public void setRequest(Map<String, Object> r) {
this.request = r;
}
}
二:触发JSP
先执行此jsp,使程序跳转到action
<body>
<h2> 触发action的jsp </h2>
<form name="f1" action="" method="post" >
<!-- 用onclick,JS方法:'webObj/webObj01'不要以/打头,否则会补全地址 -->
<input type="button" value="用js提交表单" οnclick="javascript:document.f1.action='webObj/webObj01';document.f1.submit()">
</form><br>
</body>
三:显示action执行结果的jsp
显示action运行的结果,
<s:debug>标签中有这么一句话:
These items are available using the #key notation
就是说上下文中的项目,直接用#就能访问的到
显示要用到内置标签:
<%@ taglib uri="/struts-tags" prefix="s"%>
<body>
<h2>显示结果</h2> <br>
<!-- 《s:property》用于提取valueStack中的web对象,‘#’井号的解释可以在最下边的s:debug标签中找到 -->
<!-- getAttribute()能提取证明struts已经把action中的数据,写入到了web上下文之中,用相应的属性范围就能找到 -->
<s:property value="#request.req1" /> -IS- <%=request.getAttribute("req1") %> <br/>
<s:property value="#session.ses1" /> -IS- <%=session.getAttribute("ses1") %> <br/>
<s:property value="#application.app1" /> -IS- <%=application.getAttribute("app1") %> <br/>
<s:debug/>
</body>
PS:#arrt.* 能访问所有属性范围
<s:property value="#request.req1" /><br/>
<s:property value="#attr.req1" /><br/>
<!-- 上边两句执行结果一样,attr能够访问任意一个属性范围 -->
<s:property value="#attr.ses1" /><br/>
四:最后配置struts.xml
<!-- 读取web对象的值,通配数字01,02,03 -->
<package name="webObj" namespace="/webObj" extends="struts-default">
<action name="webObj*" class="com.rt.struts2.actionDemo.WebObjectAction{1}">
<result name="success">
/result.jsp
</result>
<result name="error">
/outputAction.jsp
</result>
</action>
</package>