1.struts2简介
2.struts2流程
3.struts2核心概念
一、struts简介
struts2是由Apache软件基金会开发的一个基于MVC模式的轻量级Java EE框架,struts2在struts1的基础上,借鉴了WebWork的很多有点发展而来,但与struts2有着明显的区别。struts2中Action类的execute()方法不再依赖于Servlet API,大大降低了耦合性; 引入了拦截器机制; 提供了更为强大的数据校验功能; 发布了全新的标签和OGNL表达式; 另外还支持Ajax等。说了这么多struts2,来说一下它的替代技术,spring mvc。单从名字上就能看出,它也是一个mvc框架。有人推荐struts2,有人推荐spring mvc,在我看来,这两个就像是风格各异的美女,各有她婀娜多姿的一面。
二、struts2流程
学习struts2之前,最好先把它的工作流程了解一下。
上图中有一点需要指出:org.apache.struts2.dispatcher.FileterDispatcher核心过滤器只在struts2.1.3版本以前使用,在后续版本中使用的核心过滤器更改为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
如上图所示,struts2的具体执行过程可以分为以下几步:
第一步:客户端向web容器(如tomcat)发送请求(如访问index.jsp)
第二步:请求经过一系列的过滤器过滤之后,把该请求传递给struts2的核心过滤器StrutsPrepareAndExecuteFilter
第三步:核心过滤器接收到请求信息之后,根据请求的url(如/login/HelloAction)搜索Action的映射信息。
第四步:找到对应的映射信息,则在struts.xml中对应的Action被实例化,并且执行该action的execute方法(如何没有指定任何方法的话,则默认执行该方法),处理用户请求信息。另外在action对象被调用前后,interceptors也会被先后执行。
第五步:action对请求处理完毕以后返回一个逻辑视图(说白了就是一个字符串),该逻辑视图在struts.xml文件中相应的<result>元素中寻找对象的物理视图(这个物理视图既可以是JSP/HTML页面,也可以是Freemarker/Velocity模板,甚至可以是Action),并返回给客户端
注释:学习struts2,把上面那张图中各个部分的细节都掌握了,寓意着你真正掌握了struts2。
三、struts2的核心概念
先说一下web.xml,web应用程序在启动tomcat服务器时,首先会建在web.xml文件。在web.xml文件中配置struts2的核心控制器StrutsPrepareAndExecueFilter,然后这个控制器就会加载整个struts2框架。
然后再说一下struts.xml,它一般放在web应用的类加载路径下,通常web应用编译之后放在WEB-INF/classes路径下。在eclipse中,把它放在src目录下即可。
struts.xml的配置
常用的配置元素和功能:
include元素:包含其他的xml配置文件
constant元素:配置常量信息
package元素:包含一系列的Action及拦截器配置信息,便于对action进行统一管理
default-action-ref元素:配置默认的action
default-interceptor-ref元素:配置默认的拦截器,对package范围内的所有action有效
global-results元素:配置全局结果集,对package范围内的所有action有效
interceptors,interceptor,interceptor-stack,interceptor-ref:都和拦截器相关
action:包含于action操作相关的一系列配置信息
result元素:配置action的结果映射,嵌套在<action>元素内
param元素:配置参数信息
重点说一下action
在struts2中,action作为业务逻辑控制器,是整个struts2应用的核心。action本质上就是一个java类,一个继承了ActionSupport类的java类(当然也可以实现action接口)。
关于action和ActionSupport的具体代码,可以去struts2的安装包中查看。注:在ActionSupport类中除了实现Action接口之外,还增加了获取国际化信息的方法getText(),输入校验的方法validate()方法等等。
package com.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String Execute() throws Exception
{
return SUCCESS;
}
}
上面就是一个灰常简单的action代码示例,其实不提供私有属性,只要提供相应的get/set方法即可,但是为了方便理解,还是加上吧。
在action中你还可以实现其它的方法,想想看,一个action不可能只负责一个业务逻辑处理,如果一个action仅仅负责一个单一的功能的话,那得定义多少个action呀!!!!
接下来就是如何调用含有多个方法的action
一种是动态调用方式(不太提倡),另一种就是指定method属性方式
看下面struts.xml中的一段代码:
<package name="default" namespace="/" extends="struts-default">
<action name="loginAction" class="com.action.UserAction" method="login">
<result name="student">/hwshow.jsp</result>
<result name="teacher">/teacher.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="registAction" class="com.action.UserAction" method="regist">
<result name="regist">/login.jsp</result>
</action>
</package>
loginAction和registAction对应的具体类都为com.action.UserAction。通过为action指定不同的方法名,来调用同一个action中不同的方法。说明几点:一 package的namespace和action的name共同组成的访问该action的url。二 package的extends属性为struts-default 说明该包继承struts-default包,那么该包会自动加载defaultStack拦截器栈。
注入action属性值在这里就不再赘述