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>
posted @ 2017-06-19 16:45  webzom  阅读(102)  评论(0)    收藏  举报