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中注册上一步中自定义的拦截器,最好定义一个拦截器栈,把默认的拦截器也加上,如下:
3 最后在需要使用拦截器的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拦截器 详解点击打开链接
二,工作原理:
在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拦截器 详解点击打开链接
相关文章推荐
- 关于Struts2的相关知识总结及应用
- struts2重点、精华、用法总结(三):Action相关专题
- Struts2上传文件及相关总结
- Struts2总结---Action中获取Servlet相关API(3)
- asp.net中窗口相关操作总结(javascript)
- 读RTL8139驱动自己的总结(PCI相关)
- [总结]关于VS2002下的项目迁移到VS2005下相关问题总结
- 创建者模式相关文章总结
- DataGrid相关知识总结(转的)
- 数据库相关问题的部分总结
- asp.net中窗口相关操作总结(javascript)
- DataGrid相关知识总结(收集自各位老大处)
- asp.net中窗口相关操作总结(javascript)
- asp_net中利用javascript对窗口相关操作总结
- asp.net中窗口相关操作总结(javascript)(转)
- 有关UNICODE、ANSI字符集和相关字符串操作的总结
- 总结jboss控制台,得出一下结论(数据库连接池相关)
- DataGrid相关知识总结(收集自各位老大处)
- asp.net中窗口相关操作总结(javascript)
- CVS相关工具下载地址总结