学习几个框架过程中,知识点杂乱,如不复习总结,过后就忘。
struts2是基于拦截器的mvc结构,比如当提交表单到action类时,先经过一系列的拦截器,再执行action类方法,返回字符串到action的result,然后显示某个jsp页面或转到另一个action等。其拦截器是采用递归方法调用的,如果自定义拦截器类实现方法里不调用invoke方法(不执行action里方法),则只执行第一个拦截器后直接将字符串结果返回给result。
附上拦截器与过滤器的比较(摘自http://blog.csdn.net/kiss_vicente/article/details/7597700):
1)拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的。
2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
3)拦截器只能对Action请求起作用,而过滤器可以对几乎所有的请求起作用。
4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能
5)在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
struts2的流程:
0,导包
1,web.xml配置核心过滤器
指定filter-class为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
2,action类
a,参数封装
推荐模型驱动,即action类继承ActionSupport类(实现其中execute方法),实现ModelDriven接口(它将获得值栈和值栈将对象压栈操作封装了),类中要把对象new出来。
属性驱动和对象驱动差不多,继承ActionSupport类(实现其中execute方法),设置set和get方法
3,struts.xml
a,先导入struts的dtd约束文件
b,在struts标签下配置package,package一般配置name,namespace和extends(必选,设置为struts-default)等属性
c,package下设action标签,一般设置name,class和method属性。name属性可以为ActionDemo_*,class为action类,method={1}(表示第一个星号即是要调用的action类中的对应方法,实现动态调用)
d,action下设result标签,一般设置name和type属性。name为action类中返回的字符串,标签中间设置要跳到的jsp页面(如果action成功返回与name中相同的字符串,则跳转到此jsp)。type为result的动作,即转发还是重定向等,如果type为chain(转发到action或者redirectAction)result下设2个param标签,一个name为actionName,标签中填要转发到的类名,一个name为namespace,与转发到的action的namespace要一致还可以设置其他param标签,name的值如果struts不认识,会以参数形式将param标签中的表达式(如${name}动态参数)追加到转发到的action类名后面。
4,其他
Ognl工具:
new一个OgnlContext,设置root(对象)和values(map),使用Ognl.getValue(String expression,Map context,Object root)可以完成取值,赋值和调用方法功能
自定义拦截器:
自定义的拦截器类继承MethodFilterInterceptor类,可以自定义需要拦截的方法
配置文件中,在package下设interceptors标签
a,注册拦截器:在interceptors标签下设interceptor标签,属性为name和class,分别为自定义拦截器的名字和类
b,注册拦截器栈:在interceptors下设interceptor-stack,设置自定义栈名字name
在interceptor-stack下设interceptor-ref标签,name为interceptor的name
在interceptor-ref下设param标签,name为excludeMethods或者includeMethods,标签中间写上拦截或不拦截的方法
在interceptor-stack下设interceptor-ref标签,name为defaultStack,即引入默认拦截器栈
c,定义默认拦截器栈:在interceptors后设default-interceptor-ref标签,name为interceptor-stack的name。即将修改后的拦截器栈设为默认。
标签
导入标签库 <%@ taglib prefix="s" uri="/struts-tags" %>
控制标签:iterator/if/elseif/else
数据标签:property
表单标签:有name和label属性,内置样式,可以根据name属性自动回显。from/textfield/password/file/radio/checkboxlist/select/textarea/submit
非表单:actionerror