在刚开始上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自带的的拦截器帮我们完成了这些工作。其实关键之处在于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方法,就能得到文件原先的名字了。