您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页【Struts2框架】第六节-介绍和总结

【Struts2框架】第六节-介绍和总结

来源:保捱科技网

一.概念

Strrurs是可插拔式的:如果我们要使用某个,只需要在配置文件中应用该即可。

Struts由struts-default.xml,struts.xml等配置文件中进行管理。

Struts2中已经默认启动了大量通用功能的(这些以name-class对的形式配置在struts-default.xml文件中),只要我们配置Action的package继承了struts-default包,这些就会起作用。

几乎完成了Sturts2框架70%的工作。

Sturts2几个常用内建的介绍:

1)conversation:这是一个处理类型转换错误的,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误。
2)Exception:这个负责处理异常,它将异常映射成结果。
3)fileUpload:这个主要用于文件上传,它负责解析表单中文件域的内容。
4)i18n:这是支持国际化的,它负责把所选的语言、区域放入用户Session中。
5)params:这是最基本的一个,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值。
6)scope:这是范围转换,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
7)token:这个主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。
只要我们定义的包继承了struts-default包,就可以直接使用这些。


2.配置

1.定义一个
在strust.xml中定义:

<interceptor name="名" class="实现类"/>

2.定义的时候传入参数:
<interceptor name="名" class="实现类">
   <!--可以加0个或N个参数-->
   <param name="参数名">参数值</param>
</interceptor>

3.定义栈:
<interceptor-stack name="栈名">
   <interceptor-ref name="一"/>
   <interceptor-ref name="二"/>
     ...
</interceptor-stack>
(栈中也可以包含栈)

4.通过为<interceptor-ref.../>元素增加<para.../>子元素,就可以在使用的时候为参数指定值:
<interceptor-stack name="栈名">
   <interceptor-ref name="一">
	<param name="参数名1">参数值1</param>
	<param name="参数名2">参数值2</param>	
   <interceptor-ref/>
   <interceptor-ref name="二"/>
     ...
</interceptor-stack>

5.定义所有的:
在struts.xml中,把所有定义在
<interceptors></interceptor>中


6.使用

在Action中配置的示例:
struts.xml:

<pre name="code" class="html"><interceptors>
   <!--定义第一个-->
   <interceptor name="mysimple" class="cn.edu.hpu.Int.SimpleInterceptor"/>
   <!--定义第二个-->
   <interceptor name="later" class="cn.edu.hpu.Int.LaterInterceptor">
       <param name="name">第一个</param>
   </interceptor>		
</interceptors>

<package name="test">
   <action name="login" class="cn.edu.hpu.action.LoginAction">
       <result name="error">/error.jsp</result>
       <result name="success">/success.jsp</result>
       <!--使用系统默认的栈-->
       <interceptor-ref name="defaultStack"/>
       <!--使用第一个-->
       <interceptor-ref name="mysimple"/>
       <!--使用第二个-->
       <interceptor-ref name="later">
            <!--为action指定参数,覆盖name参数的默认值-->
            <param name="name">动态参数</param>
       </interceptor>
   </action>
</package>


 上面的配置文件的代码一共使用了三个(栈),其中default是系统默认的。而mysimple和later就是用户自定义的,因此在执行Login之前,这三个都会起作用。注意的是,Actionx显式应用了某个,则默认的不会起作用;如果该Action需要使用该默认,则必须手动配置的引用。所以这里为了应用系统默认的defaultStack栈,我们在配置文件中显式地应用了默认。 
 

7.配置默认

配置默认使用<default-interceptor-ref.../>元素,该元素作为<package.../>元素的子元素使用,为该包下的所有Action配置默认的。要注意的是,只有当Action中没有显式应用时,该Action所在的包的默认才会生效。配置例子:

<package name="包名">
   <interceptors>
      <interceptor.../>
      <interceptor-stack.../>
   </interceptors>
   <!--配置该包下的默认,既可以是,也可以是栈-->
   <default-interceptor-ref name="名或栈名"/>
</package>

8.实现类

如果用户要开发类,应该实现com.opensymphony.xwork2.ActionInvocation接口,该接口的类定义代码如下:

public class MyInterceptor implements Interceptor{


	public void destroy() {
		
	}


	public void init() {
		
	}


	//写好了一个拦截(计算了一个action运行的时间)
	public String intercept(ActionInvocation invocation) throws Exception {
		long start=System.currentTimeMillis();
		String r=invocation.invoke();
		long end=System.currentTimeMillis();
		System.out.println("Action Time="+(end-start));
		return r;
	}


}
其中init()方法,在执行拦截之前调用该方法。
destory方法,在实例被销毁之前。
intercept(ActionInvocation invocation)方法是用户要实现的拦截动作。

Stuts2还提供了一个AbstractInterceptor类,该类提供了一个init和destory方法的空实现,如果我们实现的不需要打开资源,则可以无需实现这连个方法。可见,继承AbstractInterceptor类来实现自定义会更加简单。

下面实现了一个简单的:
import cn.edu.hpu.action.LoginAction;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;


public class SimpleInterceptor extends AbstractInterceptor {


	//简单的名字
	private String name;
	public void setName(String name) {
		this.name = name;
	}


	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		//取得被拦截的Action实例的方法
		LoginAction action=(LoginAction)invocation.getAction();
		
		//执行该的后一个
		//如果该后没有其他,则直接执行Action的execute方法
		String result=invocation.invoke();
		return result;
	}


}

当我们执行intercept(ActionInvocation invocation)方法时,可以获得ActionInvocation参数,这个参数又可以获得被拦截的Action实例,一旦获得了Action实例,几乎获得了全部的控制权:可以实现将HTTP请求中的参数解析出来,设置成Action的属性(这是系统param完成的事情);也可以直接将HTTP请求中的HttpServletRequest实例和httpServletResponse实例传给Action(这是servlet-config完成的事情)......当然,也可以实现应用相关的逻辑。


转载请注明出处:

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务