1.什么是拦截器组件,拦截器组件的作用
拦截器组件,适合封装一些共通功能。
可以采用配置方式,灵活使用,重复使用。
Struts框架中提供了大量的拦截器组件,默认执行一个名为defaultStack的拦截器。
拦截器可以将Action->Result包裹起来,在它们之前或之后追加处理逻辑。
action请求-->拦截器1-->拦截器2-->Action-->Result-->拦截器2-->拦截器1-->响应
2.拦截器组件原理
Struts2提供的拦截器不能满足需求,可以允许开发者自定义。自定义步骤如下:
1)编写一个拦截器组件类
要符合Interceptor接口标准,实现其定义的方法。
也可继承extends AbstractInterceptor 实现拦截器
--ActionInvocation API的使用:
Object action = in.getAction();
ValueStack vs = in.getStack();
ActionContext ac =in.getInvocationContext();
in.invoke();
in.invokeActionOnly();
--intercept()方法返回值的作用
当该方法执行了in.invoke(),该返回值无效。
如果没有执行invoke(),返回的String标识,控制器会根据返回的标识寻找Result组件处理响应。
2)将拦截器组件注册到Struts框架
在struts.xml配置中,定义拦截器.定义格式如下:
<interceptors>
<interceptor name="标识符" class="拦截器实现类"/>
</interceptors>
3)拦截器使用
--为某一个Action指定拦截器
<action name="" class="">
<interceptor-ref name="要引用的拦截器的标识符"/>
//可以添加多个
<interceptor-ref/>
</action>
--为当前package中所有Action指定默认拦截器
<default-interceptor-ref name=""/>
注意:当使用了自定义的拦截器后,默认的defaultStack不再执行,会破坏Struts原有机制,
因此需要添加defaultStack的引用。
*3.拦截器组件的使用
1)自定义拦截器组件(参考netctoss登录检查示例)
*2)使用struts2框架的拦截器组件
利用fileUpload拦截器实现文件上传功能
--掌握fileUpload拦截器的使用方法
提示:引入commons-io.jar开发包
a.JSP页面表单属性设置
method="post"
enctype="multipart/form-data"
<input type="file" name="xxx"/>
b.Action组件
private File xxx;
private String xxxFileName;
private String xxxContentType;
public String execute(){
//将临时文件xxx对象复制到目标位置
}
c.拦截器配置
默认执行的defaultStack包含了fileUpload拦截器,所以可以不用配置。
--fileUpload实现原理
public class FileUploadInterceptor
extends AbstractInterceptor{
public String intercept(ActionInvocation in){
//调用commons-fileupload.jar组件解析request信息
//将解析出来的文件信息,以临时文件形式保存到Tomcat一个临时目录
//将临时文件,源文件名,源文件类型给Action属性赋值
in.invoke();//执行UploadAction.execute()
//将临时文件移除
}
}
///
4.拦截器例子:
/**
* 登录检查拦截器
* @author Administrator
*
*/
public class CheckLoginInterceptor
extends AbstractInterceptor{
//拦截器主处理方法
public String intercept(ActionInvocation in) throws Exception {
//登录检查
ActionContext ac = in.getInvocationContext();
Map<String,Object> session = ac.getSession();
//获取session中的用户信息
Admin admin = (Admin)
session.get(Constants.KEY_ADMIN);
if(admin == null){//找不到用户信息
//定位到登录页面
return "login";//有效,将来去struts.xml中找result定义
}
in.invoke();//调用后面的Action-->Result功能
return null;//因为执行了invoke,该返回值无效
}
}
//