struts2 拦截器

来源:互联网 发布:安卓超牛数据恢复软件 编辑:程序博客网 时间:2024/06/17 19:00

了解拦截器
拦截器是动态拦截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>
原创粉丝点击