首页 > 编程知识 正文

struts2工作原理(struts拦截器配置)

时间:2023-05-03 17:25:46 阅读:66760 作者:516

拦截器是什么? 拦截器是一种允许用户在执行Action之前和执行Result之后执行一些功能处理的机制。

拦截器在执行ActionScript之前和执行result之后的顺序相反。 请参考下图。

也就是说,它依次运行interceptor1- interceptor2- interceptor3- action-result-interceptor3- interceptor2- interceptor 1

拦截器的优点之下有被总结成书的优点。 贴几张图,还是比自己写快。

拦截器发现,当我们使用Action时,我们的Action中的域值已经有值,并且这些值与用户请求的参数一一对应。 这表明在我们执行execute之前,有人做了这个。 他是拦截器。 这些默认配置的窃听器。 成为预定义的拦截器。

可以在预定义的拦截器default-struts.xml文件中查看。

interceptorsinterceptorname=' alias ' class=' com.opensymphony.xwork2. interceptor.alias interceptor '/interceptor 。 interceptor name=' multiselect ' class=' org.Apache.struts2. interceptor.multiselect interceptor ' /! - basic stack-- interceptor-stack name=' basic stack ' interceptor-refname=' exception '/interceptor-refname=' exception . */param/interceptor-ref interceptor-refname=' conversionerror '/interceptor-stack 3358 www .

名为interceptor name=' params ' class=' com.opensymphony.xwork2. interceptor.parameters interceptor ' /的阻止程序请求参数

接下来,让我们来看看这个拦截器是如何实现的。

查看参数转换器的源代码,官方说明如下。

(1) thisinterceptorsetsallparametersonthevaluestack.)2) thisinterceptorgetsallparametersfromactioncontexthan, 获取参数(andsetsthemonthevaluestackbycallingvaluestack.setvalue (字符串, 对象)、 typicallyresultinginthevaluessubmittedinaformrequestbeingappliedtoanactioninthevaluestack.notethattheparametermapmustcontation ersastring[]forthevalue .使该窃听器获取操作上下文请求的参数,并通过valuestack.setvalue(string,Object )

//allowednamesofparametersprivatestringacceptedparamnames='\ w ((.\ w ) ) 652) ((((() ) 私有价值堆栈工厂

valueStackFactory; @Inject public void setValueStackFactory(ValueStackFactory valueStackFactory) { this.valueStackFactory = valueStackFactory; }

上边的一段代码,可以看出在这个拦截器中通过使用正则表达式定义了可以接受的参数类型,并有一个ValueStackFactory,用于将数据存放在valueStack,想详细研究的可以看一下源码,这里不再多说了。

(2)staticParams
这个拦截器的功能是将我们在struts.xml配置文件中定义的Action参数,设置到对应的Action实例中去,

<action name="loginAction" class="com.lc.action.LoginAction"> <param name="account">test</param> </action>

如上述,在struts.xml文件中有一个param,同样要求Action中用于一个account的属性,并且有get和set方法。
注意:我们到这里发现,使用params拦截器和使用staticParams拦截器的功能都是向action中添加属性,那么如果我们遇到这种情况,就是我们的request域中有参数,而我们也在struts.xml文件中配置了参数,那么最终的结果是什么那?

其实在Action初始化之后,就会把struts.xml文件中的配置数据设置到action实例中相应的属性中区,然后用户请求的数据设置到Action实例中的属性中,很明显,最后的值应该是用户请求中account的数据,即被覆盖了在struts。xml文件中配置的属性。

拦截器的调用顺序


举例说明:

<package name="helloworld" extends="struts-default"> <action name="loginAction" class="com.lc.action.LoginAction"> <param name="account">test</param> <result>/welcome.jsp</result> </action> </package>

这个配置中是没有任何拦截器的,他自己没有生命拦截器的引用,他所在的报也没有生命默认的拦截器引用,但是他的父包struts-default中声明了默认的拦截器引用,也就是defaultStack,因此这个action有这个默认的拦截器。

<package name="helloworld" extends="struts-default"> <action name="loginAction" class="com.lc.action.LoginAction"> <param name="account">test</param> <result>/welcome.jsp</result> <interceptor-ref name="staticParams" /> </action> </package>

上边代码中引用了一个拦截器,则会覆盖父包中的定义的默认引用拦截器。只有这个拦截器起作用
正是这种覆盖的关系,我们就需要在action中添加一个默认的引用,如下:

<package name="helloworld" extends="struts-default"> <action name="loginAction" class="com.lc.action.LoginAction"> <param name="account">test</param> <result>/welcome.jsp</result> <interceptor-ref name="staticParams" /> <interceptor-ref name="defaultStack" /> </action> </package>

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。