struts2文件下载 以及拦截器

来源:互联网 发布:python pdf2txt 编辑:程序博客网 时间:2024/06/11 07:44

使用struts2控制文件下载
在这里 我总结一下 ActionContext 和servletActionContext的区别
ActionContext是Action 执行时的上下文,其实是一个容器 。请求参数会自动设置到我们所写Action的字段中,但是我们可能还会对请求(request)或session(会话)中信息获取,甚至需要对httpservletRequest httpServletResponse 操作。比如获取HttpSession
ActionContext.getContext().getSession();

而servletActionContext是对ActionContext的继承,它提供了直接与servlet相关对象访问的功能,它可以获取的对象有
HttpServletRequest HttpServletResponse ServletContext ActionContext PageContext

下面是利用struts2写文件下载的一个demo思路1、  DownloadAction.javaprivate String inputPath;    public String getInputPath() {        return inputPath;    }    public void setInputPath(String inputPath) {        this.inputPath = inputPath;    }    public InputStream getTargetFile() {        return ServletActionContext.getServletContext().getResourceAsStream(inputPath);    }    @Override    public String execute() throws Exception {        ActionContext ac= ActionContext.getContext();        Map session = ac.getSession();        String user = (String)session.get("user");        if(user!=null&&user.equals("gjl")) {            return SUCCESS;        }else {            ac.put("tip", "你还未登录 或用户名不正确!");            return LOGIN;        }    }

然后是配置

<action name="authority" class="com.gjl.action.AuthorityDownAction">            <param name="inputPath">/WEBINF/content/images/qqimg.png</param>            <result type="stream">                <paramname="ContentDisposition">filename="qqimg.png"</param>                <param name="ContentType">image/png</param>                <param name="inputName">targetFile</param>                <param name="bufferSize">4096</param>            </result>            <result name="login">WEB-INF/content/login.jsp</result>        </action>

Stream结果类型是返回给客户端一个输入流。
这是主要的 其实还有一个LoginAction 来封装login.jsp的表单数据。顺便把user属性放在session中。这样当在succes.jsp页面中请求我们开始写的action时可以获得user属性。在判断后来决定是否让其下载。(其实就是权限控制)。

拦截器机制
拦截器是struts2框架最重要的组成部分,可以把struts2理解成一个空容器,而大量的内建拦截器完成了该框架的大部分操作。如fileUpload拦截器负责解析请求参数的文件域,并把一个文件域设置成Action的3个属性。Params拦截器负责解析HTTP请求的参数,并设置Action的属性;servlet-config拦截器直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action。

strutsPrepareAndExecuteFilter拦截到用户的请求之后大量拦截器将会对用户请求进行处理,然后才会调用用户开发的Action实例的方法的方法来处理请求。

这里写图片描述
Struts2-defult.xml 中配置的拦截器 熟悉部分如下
ServletConfig 如果某个Action需要直接访问servlet API,就需要这个拦截器实现
Validation 通过执行在xxxAction-validation.xml中定义的校验器,从而完成校验。
Workflow 这个拦截器负责调用Action类中的validate方法如果校验失败返回input的逻辑视图。

自己配置拦截器

<interceptor name=”拦截器名” class=”拦截器实现类”>    <param name=”参数名”>中间指定参数值</param> </interceptor>

拦截器栈 :多个拦截器 例如如果需要在Action执行前同时做登录检查、安全检查 和记录日志,则可以把这三个动作对应的拦截器组成一个拦截器栈。定义拦截器栈

<interceptor-stack name=”拦截器栈名”>    <interceptor-ref name=”拦截器一”/><interceptor-ref name=”拦截器二”/></interceptor-stack>

系统为拦截器指定参数有如下俩个时机。
在定义时,这种将是拦截器的默认参数。
在配置时,如在文件上传时需要在struts.xml中配置fileUpload拦截器(可以覆盖默认参数)

<interceptor-ref name="fileUpload">                <param name="allowedTypes">image/png,image/gif</param>                <param name="maximumSize">20</param>        </interceptor-ref>

要知道,一个拦截器在一个action中配置后,拦截行为在Action execute 方法执行前被执行。
Struts-default.xml 中有这样的片段

这里写图片描述
这里写图片描述
每一个package都可以配置一个默认的拦截器。或者拦截器栈。而上面配置的拦截器栈,这就是你为什么每个web应用只需继承struts-default.xml就可以实现基本的功能。但是你的Action并未显式的配置任何的拦截器。

开发自己的拦截器实现包com.opensymphony.xwork2.interceptor.Interceptor接口该接口类定义代码如下Public interface Interceptor extends serializable{    Void destroy();Void init();String intercept (ActionInvocation invocation)  throws Exception//该方法是用户需要实现的拦截动作,就像Action的execute的方法一样,intercept方法返回一个字符串作为逻辑视图。如果该方法直接返回一个字符串,系统将会跳转到该逻辑视图对应的实际试图资源,不会调用被拦截的Action。该方法的ActionInvocation参数包含了被拦截的action 的引用,可以通过该参数的invoke 方法,将控制权传给下个拦截器,或者传给Action的execute方法。}
阅读全文
0 0