1. 客户端浏览器向servlet容器(Tomcat)发出请求。
2. Web.xml配置的过滤器StrutsPrepareAndExecuteFilter起作用,设定的请求转发给Struts。
3. StrutsPrepareAndExecuteFilter过滤器到ActionMapper中查找Action。
4. 如果找到了Action,那么控制权移交给ActionProxy。
5. ActionProxy向ConfigurationManager查询配置文件struts.xml信息,加载Action类。
6. ActionProxy创建了ActionInvocation负责命令模式的实现。
7. 拦截器调用
8. 执行Action的方法(默认execute或者指定方法),ActionInvocation根据返回结果查找对应的视图资源。
9. 执行返回结果。
10. 拦截器反向调用
11. 清除ActionContext的内容,完成访问。
一个最简单的例子。首先我们需要将struts2的支持库添加到lib文件夹下。需要注意的是Struts2通过在web.xml中配置过滤器建立和web应用的关联。
过滤器
<filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在web项目的源码文件夹下,需要创建名为struts.xml的配置文件,这个文件定义了Action对象,Action对象用<result>指定了要返回的页面。
Struts配置信息
<struts> <package name="myPakeage" extends="struts-default"> <action name="first"> <result>/first.jsp</result> </action> </package> </struts>
使用actionName.action的方式调用action
<a href="first.action">struts2</a>
调用上述Action后,输出页面first.jsp的内容。上述方式测试并没有建立一个实际的Action类,下面我们建立一个实际的Action对象。它有两个方法add和update和属性info以及他的getter和setter访问器。
package www.gongqingkui.cn; import com.opensymphony.xwork2.ActionSupport; public class userAction extends ActionSupport { private String info; public StringgetInfo() { return info; } public voidsetInfo(String info) { this.info =info; } public String add(){ info ="add method"; return"add"; } public Stringupdate(){ info="update method"; return"update"; } }
在Struts2.xml中配置上述Action以及跳转信息。
<action name="userAction"class="www.gongqingkui.cn.userAction"> <resultname="add">/addResult.jsp</result> <resultname="update">/updateResult.jsp</result> </action>
建立跳转到的显示页面,如addResult.jsp,使用struts2标签输出Action中的属性info。要使用struts2标签,需要引入struts标签。
<%@ taglib prefix="s" uri="/struts-tags"%> <body> AddResultpage!<s:property value="info"/> </body>
在index.jsp中建立访问上述Action不同功能方法的连接,注意这里需要使用!分隔符。
<a href="userAction!add">userAction!add</a> <ahref="userAction!update">userAction!update</a>
上述程序,用户点击链接时为http://192.168.195.54:8080/JavaWeb_8_Struts2/userAction!add结构,后面的字串指示用userAction的add方法。根据方法具体返回值和result标签的name对应,如上述连接在userAction的add方法中返回字串add,这个结果和name=”add”的result标签对应起来就是要显示addResult.jsp页面。这里info信息在程序里进行了设置,我们也可以采用注入的方式,将上述连接作为表格的提交连接,info作为变量传入即可,形式为http://127.0.0.1:8080/JavaWeb_8_Struts2/userAction!add?info=bb,这样bb就作为info传入。如果将方法名作为name的参数传入action标签的属性中,则可以根据方法名进行跳转。
此时的配置信息应改成
<action name="userAction" class="www.gongqingkui.cn.userAction" method="add"> <result>/addResult.jsp</result> </action> <action name="userAction" class="www.gongqingkui.cn.userAction" method="update"> <result>/updateResult.jsp</result> </action>
而其Action方法应该改成
public String add(){ info ="add method"; returnSUCCESS; } public Stringupdate(){ info ="update method"; returnSUCCESS; }
SUCCESS返回值默认直接显示,不用标出name名,其它方法则需要表示出。为了简化开发,Struts2支持通配符匹配,什么情况是不言而喻的了吧。
<action name="*Action" class="www.gongqingkui.cn.{1}Action"> <result name="error">/error.jsp</result> <result name="add">/add.jsp</result> </action>
1. Struts的简单使用
2. Struts+Spring+Hibernate整合的简单实例
3. 理解Struts