在刚开始上struts2的时候,刀哥就提到在struts2里面servlet都没有了,采用的全是filter,也就是拦截器,今天终于学习到这东东了。
首先,在昨天的验证中,我们发现了有很多自动显示的错误信息,而我们是从来没有编写过的,这就是struts2自带的的拦截器帮我们完成了这些工作。其实关键之处在于struts.xml文件中,extends=“struts-default”这个属性。
那么如何自己编写一个拦截器呢?
有三种基本的实现方法:
1 implements Interceptor接口,需要实现init,destory,intercept方法,
在intercept方法里面调用arg0.invoke来拦截方法。
2.extends AbstractInterceptor,就只需要实现intercept方法,其他操作和方法1相同。
3.extends MethodFilterInterceptor,实现doIntercept方法,其他操作也相同。
那么2,3有什么区别呢?仅仅是继承不同的父类吗?
当然不是,MethodFilterInterceptor,当和他绑定的action里面有多个业务方法的时候,可以
通过配置来实现拦截哪几个或者,或者不拦截某些方法。这些都是配置文件里面的动作。
那么,接下来就说说配置文件的编写。
注意,配置需要在<action>前面编写
<interceptors>
<interceptor name="method1" class="com.lovo.interceptor.MyInterceptor1"/>
</interceptors>
接下来在对应的action里面配置
<action ................>
<interceptor-ref name="method1"/>
</action>
当然,如果一个action需要很多的interceptor,而这些interceptor在其他的action同样需要使用的话,
这样配置就显得太麻烦,那么我们就可以通过配置拦截器链来简化操作。
首先,定义链
<interceptor-stack name="MyStack">
<interceptor-ref name="method1"></interceptor-ref>
<interceptor-ref name="method2"></interceptor-ref>
<interceptor-ref name="method3">
<!--这就是前面提到的不需要拦截的方法-->
<param name="excludeMethods">myexecute</param>
</interceptor-ref>
<!-- 添加一个系统默认的拦截器链由此可见链可以嵌套-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
添加默认的链是因为我们自己写的拦截器,相当于会替换掉系统默认的拦截器链,但是我们前面是有验证的,所以要加上系统默认的链,就大功告成。
接下来再看下文件上传,已经简化到了很简单很简单的程度了,struts2已经自动的帮我们读了,我们做的就仅仅是写,也就是输出的操作了。用文字不好描述,粘一点核心代码。
public String execute() throws Exception {
InputStream ins = null;
OutputStream ous = null;
String path = request.getRealPath("/upload");
try{
ins = new FileInputStream(myFile);
ous = new FileOutputStream(path + "/" + myFileName);
int b = 0;
while((b = ins.read())!= -1){
ous.write(b);
}
}catch(IOException e){
e.printStackTrace();
}finally{
ins.close();
ous.close();
}
return super.execute();
}
看,就是这样一个简单的输出操作就能完成我们需要的文件上传功能,当然,里面有一个问题是需要注意的,那就是文件名,因为struts2自动帮我们输入了我们选择的文件,那么为了它内部的解析,文件名就已经被修改了,如果我们不管他,最后上传上来的文件文件名就很显得太怪异了,所以,我们需要在提供一个 private属性,名字为private File myFile myFile+FileName,再提供get set方法,就能得到文件原先的名字了。
分享到:
相关推荐
由于struts2标签的性能不好,项目组决定不使用,但是如果用struts2自带的拦截器防止重复提交又必须struts标签,所以只好自定拦器实现
由于struts2标签的性能不好,但是如果用struts2自带的拦截器防止重复提交又必须struts标签,所以只好自定拦器实现
4.1 拦截器在Struts2中的缺省应用 47 4.2 拦截器原理实现 50 4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的...
7.开启struts2自带的开发模式常量 6 8.vo传参模式 7 9.ModerDriven传参模式(不建议采用) 7 10.为什么要使用struts2代替struts1.x 7 二、struts.xml配置及例程 7 1.配置文件的优先级 7 2.配置形式 8 3.package配置...
Struts2的核心组成部分是Action,拦截器和结果页。 Struts2提供了许多方法来创建Action类,并通过struts.xml中或通过注释进行配置。我们可以创建自己的拦截器实现常见任务。 Struts2中自带了很多的标签,并使用...
NULL 博文链接:https://handonghandong.iteye.com/blog/453603
2.6.1 struts 2内建拦截器介绍 95 2.6.2 定义和使用拦截器栈 97 2.6.3 使用自定义拦截器 98 2.7 小结 100 第3章 struts 2标签库详解与ajax技术应用 103 3.1 struts 2主题与模板 103 3.2 struts 2控制标签详解 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...
9.2 利用拦截器(Interceptor)生成审计日志 9.3 Hibernate的事件处理机制 9.4 批量处理数据 9.4.1 通过Session来进行批量操作 9.4.2 通过StatelessSession来进行批量操作 9.4.3 通过HQL来进行批量操作 ...