struts2 拦截器
了解拦截器
拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.
自定义拦截器
/**
* 创建一个普通类继承 AbstractInterceptor,实现抽象方法intercept
*
*/
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("执行动作方法之前");
//放行:如果有下一个拦截器,就前往下一个拦截器,如果没有了,就到达动作方法
String invoke = invocation.invoke();//结果视图名称
System.out.println("执行动作方法之后");
return invoke;
}
}
struts.xml注册拦截器
<!--声明拦截器-->
<interceptors>
<interceptor name="interceptorOne" class="inerceptor.InterceptorOne"></interceptor>
</interceptors>
<action name="funOne" class="web.IterceptorAction" method="demoFunctionOne">
<!--使用拦截器-->
<interceptor-ref name="interceptorOne"></interceptor-ref>
<result name="success">/index.jsp</result>
</action>
执行顺序
执行动作方法之前
2017-06-19 15:23:10,554
action方法
2017-06-19 15:23:10,561
执行动作方法之后
检查登录拦截器
public String intercept(ActionInvocation arg0) throws Exception {
Object user = ServletActionContext.getRequest().getSession().getAttribute("user");
if(user!=null){
return arg0.invoke();
}else {
return "login";
}
}
当我们使用了自定义拦截器之后,默认的拦截器栈就不再工作了
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="checkLoginInterceptor1" class="interceptor.CheckLoginInterceptor1" />
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checkLoginInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
<global-results>
<result name="input">/login.jsp</result>
</global-results>
<action name="login" class="web.action.Demo2Action" method="login">
<interceptor-ref name="myDefaultStack">
<!-- 在引用自定义拦截器栈的时候,给指定的拦截器注入参数。方式就是:拦截器名称.属性名称 -->
<param name="checkLoginInterceptor1.excludeMethods">login</param>
</interceptor-ref>
<result type="redirectAction">showMain</result>
</action>
<action name="showMain" class="web.action.Demo2Action" >
<result>/main.jsp</result>
</action>
<action name="showOther" class="web.action.Demo2Action" >
<result>/otherpage.jsp</result>
</action>
</package>
文件上传拦截器
表单
<s:from action="fileUpload" enctype="multipart/from-data">
<s:file name="photo" lable="照骗"></s:file>
<s:submit value="提交"></s:submit>
Action
private File photo;
//上传文件名 写法:上传字段名称+FileName
private String photoFileName;
private String photoContext;
public String upload(){
String path = ServletActionContext.getServletContext().getRealPath("WEB-INF/Files");
File file=new File(path);
if(file.exists()){
file.mkdirs();
}
photo.renameTo(new File(file,photoFileName));
return null;
}
struts.xml
设置文件上传大小
<constant name="struts.multipart.maxSize" value="123456"></constant>
<action name="fileUpload" class="web.action.UploadAction" method="upload">
<param name="fileUpload.maximumSize">31457280</param>-->
<interceptor-ref name="defaultStack">
<!-- 限制上传文件的MIME类型。 如果有多个,使用逗号分隔 -->
<param name="fileUpload.allowedTypes">image/jpg,image/pjpeg,image/png</param>
</interceptor-ref>
<result name="input">/upload1.jsp</result>
</action>
<action name="upload1" class="web.action.UploadAction1" method="upload">
<result name="input">/upload2.jsp</result>
</action>
上传失败错误信息提示
解决办法:用国际化消息资源包,把对应的key取值改为中文即可。
文件下载
//注意:在给InputSteam指定名称时,不能使用in
private InputStream inputStream;
//创建一个文件名的属性
private String filename;
public String download()throws Exception{
//1.找到文件的存储路径
String filePath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files/5.jpg");
//2.把文件读到一个InputStream中
inputStream = new FileInputStream(filePath);
//在返回之前,给filename赋值
filename="照片.jpg";
//3.返回一个成功
return SUCCESS;
//4.由一个叫做stream的结果类型为我们把剩下的事情做完。
}
<action name="download" class="web.action.DownloadAction" method="download">
<result name="success" type="stream">
<!-- 给stream的结果类型注入参数:Content-Type -->
<param name="contentType">application/octet-stream</param>
<!-- 告知客户浏览器以下载的方式打开
<param name="contentDisposition">attachment;filename=photo.jpg</param> -->
<!-- 使用OGNL表达式,来动态获取文件名
${@java.net.URLEncoder@encode(filename,"UTF-8")} 把${}中间的内容当成一个OGNL表达式来看待
-->
<param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(filename,"UTF-8")}</param>
<!-- 注入字节输入流 :取值要写动作类中set方法的名称,首字母改成小写-->
<param name="inputName">inputStream</param>
</result>
</action>

浙公网安备 33010602011771号