struts的原理以及基本使用
Struts2的访问结构图如下,来自官网:
struts2并不是一个陌生的web框架,它是以Webwork的设计思想为核心,吸收struts1的优点,可以说struts2是struts1和Webwork结合的产物。
1.客户端发出一个指向servlet容器的请求(tomcat);
2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。
3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2 的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一 些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中需要用到的Action。
4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象 。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。
6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。
7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。
注:以上转自百度知道;
使用方法简单介绍:
1.Action配置
命名空间默认为“”,可以接受所有路径的action,也可以写成/,/xxx,/xxx/yyy,
Namespace最好用模块来命名。每个package都有自己的namespace。在开发中相对路径会有问题,一般都是用绝对路径。
action的method属性指定访问的Action的方法,但是可以用动态访问的方法,也就是直接在action后面加上!methodName,直接访问方法。method默认是execute。
在配置的时候还可以用通配符指定一些参数,如星号*,{1},这就用到了约定,在开发前一定有个共同的项目约定,大家都按照约定去写,这样会减少开发的工作量,并且易于维护,约定优于配置
在传递参数的时候,可以直接在action中定义属性名字,然后加上set和get方法就,在访问的时候就能接受到,在参数较多的时候,可以使用domainModel来包含属性,或者实现ModelDriven<ModelName>接口
使用struts免不了要在action或者其他类中使用request,session等Servlet类,在这里有两种方法可以实现:
其中extends继承其他package就能访问替他package的global-result。
也可以采用动态的result,者只要在action的一个属性定义为返回结果集。其中${r}表示从值站中取值。再返回结果集中如果带有参数,可以直接写成/*.jsp?type=${type}
Struts标签
<%@taglib uri="/struts-tags" prefix="s"%>
常用标签
其中井号#表示:访问OGNL上下文和Action上下文。
1、属性
<s:property value="message"/>
2、iterator标签的使用
<s:set name="list" value="{'a','b','c','d'}"></s:set>
<s:iterator var="ent" value="#request.list" status="statu">
<s:if test="%{#statu.odd}">
<font color="red"><s:property value="#ent" /> </font>
</s:if>
<s:else>
<s:property value="#ent" />
</s:else>
</s:iterator>
3、if else语句的使用
4、调试标签
<s:debug></s:debug>
This.addFieldErrors(key,value);
暂时总结到这里吧,对付些基础开发,应该够了,以后要是有时间和契机,在去研究内部的设计机制,高级应用,甚至源码。