struts2和struts1一样,都是应用在web层的框架,不过,它不是基于struts1升级而来,而是一个基于webWork的全新框架,webWork框架是继struts1之后推出的开源框架。
struts2和struts1在体系结构上是有很大差别的,struts2中需要用户实现的组件及元素有:Action类、strusts.xml。去掉了struts1中的actionForm,换了一种新的传递表单数据的方式。通过代码看一下区别吧。
下面是一个简单的登录。
1.页面
<form id="form" action="user/logon" method="post" name="UserForm">
<input type="text" id="userName" name="user.userName" >
<input type="text" id="passWord" name="user.passWord">
<input type="submit" value="登录">
</form>
2.需要引入的jar以及配置文件的编写。
web.xml文件
<filter>
<filter-name>struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!--struts2的struts.xml文件的默认路径是在src下,如果为了将配置文件集中放置到一个地方,需要在配置过滤器时指定配置文件。同时还需要指定struts-default.xml和struts-plugin.xml这两个配置文件。现在strtus.xml是放在src/config下的-->
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,config/struts.xml</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml文件核心配置文件
<struts>
<!--struts-default是必须要继承的 -->
<package name="pac" namespace="/" extends="struts-default">
<action name="user" class="com.tgb.struts2.action.LogonAction" >
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
3.Action实现类
public class LogonAction {
private User user;
//get、set方法
public String execute() throws Exception{
if("liusong".equals(user.getUserName())&&"liusong".equals(user.getPassWord())){
return "success";
}else{
return "error";
}
}
}
Action可以继承ActionSupport,也可以采用不继承方式。
接收参数:可以建一个实体类来获取页面数据,就像struts1中的form,但是不需要继承ActionForm,也可以直接在action中定义userName和passWord属性来接收表单数据,但是struts2不支持直接在action的方法中直接加形参接收参数,这个在springMVC中是支持的。
下面是struts2官网中关于struts2运行流程的图解,非常清晰:
客户端发出请求,该请求经过一些过滤器,最后到达FilterDispacher
。FilterDispacher
根据配置文件的信息,判断该请求是否需要某个action,并找到对应的action,action
的方法被执行后,根据返回结果在配置文件中匹配相应的页面或者重定向请求,最后将结果返回到客户端。
如果想了解struts2内部更细致的执行流程,可以参考下面在网上摘录的一段描述:
1. 客户端向服务器发出请求
2. 请求经过一系列的过滤器,最终到达FilterDispatcher
3. ActionMapper判断是否需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
4. actionProxy通过ConfigurationManager读取配置文件,根据截取的url找到对应的Action
5. ActionProxy创建一个ActionInvocation实例
6. ActionInvocation调用Action的execut方法
7. ActionInvocation根据struts.xml配置找到对应的返回结果