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配置找到对应的返回结果