您的位置:首页 > 编程语言 > Java开发

Struts2相关总结

2016-11-17 10:00 344 查看
一,工作原理图


二,工作原理:

在Struts2框架中的处理大概分为以下几个步骤 
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
6 ActionProxy创建一个ActionInvocation的实例。 
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

三,Struts2中FilerDispatcher和StrutsPrepareAndExecuteFilter的区别:Struts2在2.0以后将FilerDispatcher改为了StrutsPrepareAndExecuteFilter。

四,Struts2的核心就是拦截器(interceptor),自定义拦截器 有两种常见方法,实现interceptor接口和继承AbstractInterceptor,分别重写对应的方法。应用实例—登陆权限验证。

  如何自定义一个拦截器?自定义一个拦截器需要三步:

      1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类,并重写intercept()方法。

      2 在strutx.xml中注册上一步中自定义的拦截器,最好定义一个拦截器栈,把默认的拦截器也加上,如下:

<interceptors>
<interceptor name="permission" class="com.remote3c.interceptor.PermissionInterceptor"></interceptor>
<interceptor-stack name="permissionStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="permission"></interceptor-ref>
</interceptor-stack>
</interceptors>

      3 最后在需要使用拦截器的Action中引用上述定义的拦截器栈,如下:

<action name="show" class="com.remote3c.action.ShowAction">
<!-- 使用此拦截器 -->
<interceptor-ref name="permissionStack" />
<result name="sss">/welcome.jsp</result>
</action>

Struts2拦截器的底层实现原理是运用了java的动态代理。

五,struts2的默认命名空间namespace,不写相当于namespace="",一般最好写namespace="/",省缺了以后的一些麻烦。

六,给项目添加Struts2框架,一种简单的方法,在myeclipse中,选中项目右键Myeclipse->Add Struts capabilities 选择版本,然后finish,就可以在struts中配置action了。

七,三种值传递方式

      1,直接在action中声明属性比如:private String name;然后生产get(),set()方法,jsp页面中输入框名称与之对应相同,然后提交页面到action,action中name属性就获取到输入框输入的值。

       2,DomainModel传值,域传值,例如创建一个存储数据的JavaBean,取名User,它有name等属性并生产get(),set()方法,在action中声明属性private User user ;同样也生产get(),set()方法,然后在jsp页面中输入框的名称命名为user.name,提交到action中,在acton中通过user.getName()方法就能获取到输入框的值了。

      3,ModelDriven传值,同样要创建与上面一样的JavaBean,User。这种传值方式需要action实现ModelDriven<E> 接口,重写public E getModel() {}方法,E对应的是接收参数的JavaBean,比如User,然后 在action中声明属性private User user,不需要get(),set()方法。最后在jsp页面中输入框的名称命名为name,提交到action中,在acton中通过user.getName()方法就能获取到输入框的值了。

详情可以参考点击打开链接

为什么通过名称,或者JavaBean就能把jsp中的值传递到actin中呢?怎么传的?原理是什么?

原理:

其实原理简单来说是这样的:

Struts2有个ParameterIntercepter拦截器,它是在调用你的Action之前调用的,它会把request里面的参数(就是jsp页面上传递过来的那些值)取出来,去跟Action里面的变量匹配,匹配到了就set进去,这里匹配是以setXXX方法为基准的。
比如jsp页面上有个userName参数,拦截器就去Action里面找setUserName()方法,找到了就把userName参数的值传递到setUserName()方法里面,setUserName()方法再把值赋给Action里面的userName变量(这个名字随便是什么都行,因为拦截器只认setUserName()方法)。意思就是跟名称没有关系,是根据setXXX名称传的值。
如果jsp页面上有个user.userName参数,拦截器就去Action里面找setUser()方法,当然setUser()方法的参数就是一个User对象,所以拦截器会new一个User对象给这个setUser()方法,接着拦截器会到User对象中找setUserName()方法,并将user.userName参数的值传递给这个setUserName()方法。

依此类推。。。

 ParameterIntercepter拦截器 详解点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: