第四章 Struts2深入

4.1 Struts2架构
    1、ActionMapper:
        提供请求和Action之间的映射。根据请求查找是否存在对于的action,如有,翻译描述action映射的ActionMapping对象,没有,返回null
    2、ActionMapping:
        保存了调用action的映射信息,其中必须保存Action的命名空间信息和name属性
    3、ActionProxy:
        在XWork和真正的Action之间充当代理
    4、ActionInvocation:
        表示执行状态,它按顺序保存拦截器,Action,实例,由ActionProxy创建,通过调用invoke()方法开始Action的执行
    5、Interceptor(拦截器):
        是一种可以在请求处理之前或者之后执行的Struts2组件
4.2 Struts2拦截器
    工作原理:
        做一些Action执行前的预处理,可以准备,过滤,改变或者操作任何可以访问的数据,包括Action
        调用ActionInvocation的invoke()方法将控制转交给后续的拦截器或者返回结果字符串终止执行,如果请求不应该继续,可以不调用invoke()方法
            而是直接返回一个控制字符串,通过这种方式,可以停止后续的执行,并且决定哪个结果来呈现给客户端。
        做一些Action执行之后的处理:此时拦截器依然可以改变可以访问的对象和数据,执行此时框架已经选择一个结果呈现给客户端了
    
    拦截器的配置
        1、通过<interceptor.../>元素来定义拦截器
        2、通过<interceptor-ref.../>元素来使用拦截器
        例:
        <package name="default" extends="struts-default" namespace="/">
            <interceptors>
            定义拦截器
                <interceptor name="interceptorName" class="interceptor.MyTimerInterceptor"/>
            定义拦截器栈
                <interceptor-stack name="interceptorStackName">
                指定引用的拦截器
                <interceptor-ref name="interceptorName | interceptorStackName"/>
                </interceptor-stack>
            </interceptors>
            定义默认的拦截器引用
                <default-interceptor-ref name="interceptorName | interceptorStackName"/>
                <action name="actionName" class="interceptor.MyTimerAction">
                    为Action指定拦截器引用
                    <interceptor-ref name="interceptorName | interceptorStackName"/>
                    <result name="success">indexWelcom.jsp</result>
                    <result name="input">index.jsp</result>
                </action>
        </package>
    内置拦截器
        1、params拦截器:将请求中的数据设置到Action的属性上
        2、staticParams拦截器:将在配置文件中通过action元素的子元素Param设置的参数设置到对应的Action属性中
        3、servletConfig拦截器:提供了一种将源于Servlet API 的各种对象注入Action中的方法
            获取ServletAPI对象的接口
                        接口                        作用
                ServletContextAware               设置ServletContext
                ServletRequestAware                 设置HttpServletRequest
                ServletResponseAware            设置HttpServletResponse
                ParameterAware                    设置Map类型的请求参数
                ResquestAware                    设置Map类型的请求HttpServletRequest属性
                SessionAware                    设置Map类型的会话HttpSession属性
                ApplicationAware                设置Map类型的应用程序作用域对象ServletContext
        4、fileUpload拦截器:将文件和元数据从多重请求(multipart/form-data)转换为常规请求数据,以便于将他们设置在对于的Action上
        5、validation拦截器:执行数据校验
        6、workflow拦截器:提供当数据校验错误时终止执行流程的功能
        7、exception拦截器:捕获异常
    拦截器栈
        <interceptor-stack name="defaultStack">
            <interceptor-ref name="exception"/>
            <interceptor-ref name="alias"/>
            <interceptor-ref name="servletConfig"/>
            <interceptor-ref name="prepare"/>
            <interceptor-ref name="il8n"/>
            <interceptor-ref name="chain"/>
            <interceptor-ref name="debugging"/>
            <interceptor-ref name="profiling"/>
            <interceptor-ref name="scopedModelDriven"/>
            <interceptor-ref name="modelDriven"/>
            <interceptor-ref name="fileUpload"/>
            <interceptor-ref name="checkbox"/>
            <interceptor-ref name="staticParams"/>
            <interceptor-ref name="params">
                <param name="excludeParams">dojo\..*</param>
            </interceptor-ref>
            <interceptor-ref name="conversionError"/>
            <interceptor-ref name="validation">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
            <interceptor-ref name="workflow">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
        </interceptor-stack>
    自定义拦截器
        在Struts2中所有拦截器都直接或间接的实现接口om.opensymphony.xwork2.interceptor.Interceptor.
        该接口提供了3各个方法:
            void init():该拦截器初始化之后,在拦截器执行拦截之前,系统回调该方法,此方法只执行一次
            void destroy():在拦截器实例被销毁之前,系统回调该方法
            String intercept(ActionInvocation invocation) throws Exception:是用户需要实现的拦截动作,返回结果字符串
            
        首先编写权限验证拦截器

 public class AuthorizationInterceptor extends AbstractInterceptor {
            /**
             * 拦截器的拦截方法
             */
            @Override
            public String intercept(ActionInvocation invocation) throws Exception {
                    //获取回话信息
                    @SuppressWarnings("rawtypes")
                    Map session=invocation.getInvocationContext().getSession();
                    users user=(users) session.get("login");
                    if(user==null){
                        //终止执行,返回登录页面
                        return Action.LOGIN;
                    }else{
                        //继续执行剩余的Action和拦截器
                        return invocation.invoke();
                    }
                }
            }

然后在配置文件中定义拦截器并引用

 <package name="default" extends="struts-default" namespace="/">
                <interceptors>
                <!-- 定义权限验证拦截器 -->
                    <interceptor name="myAuthorization" class="interceptor.AuthorizationInterceptor"></interceptor>
                    <interceptor-stack name="myStack">
                        <interceptor-ref name="defaultStack"/>
                        <interceptor-ref name="myAuthorization"/>
                    </interceptor-stack>
                </interceptors>
                <!-- 定义默认拦截器 -->
                <default-interceptor-ref name="myStack"/>
                <default-action-ref name="defaultAction"/>
                <!-- 定义全局结果 -->
                <global-results>
                    <result name="login" type="redirect">login.jsp</result>
                </global-results>
                <action name="defaultAction" class="interceptor.MyTimerAction">
                    <result name="fail">fail.jsp</result>
                </action>
                <action name="house" class="interceptor.MyTimerAction">
                    <result name="success">guanli.jsp</result>
                    <interceptor-ref name="myStack"></interceptor-ref>
                </action>
            </package>

4.3 实现文件上传
        UploadAction.java

  public class uploadAction  extends ActionSupport{
                //封装上传文件属性
                private File upload;
                //封装上传文件类型
                private String uploadContentType;
                //封装上传文件名称
                private String uploadFileName;
                //封装上传文件的路径
                private String savePath;

                @Override
                public String execute()throws Exception{
                    byte[] buffer=new byte[1024];
                    //读取文件
                    FileInputStream fis=new FileInputStream(getUpload());
                    //保存文件,设置保存目录路径
                    FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName());
                    int length=fis.read(buffer);
                    while(length>0) {
                        //每次写入length长度的内容
                        fos.write(buffer, 0, length);
                        length=fis.read(buffer);
                    }
                    fis.close();
                    fos.flush();
                    fos.close();
                    return "success";
                }
                //获取上传文件的保存路径
                //通过读取存放目录获得保存路径
                //省略get/set方法
                public String getSavePath() {
                    return ServletActionContext.getServletContext().getRealPath(savePath);
                }
            }    

配置文件中定义uploadAction

  <action name="download" class="interceptor.FileDownAction">
            <param name="savePath">/upload</param>
            <result name="success" type="stream">
                <param name="contentType">application/octet-stream</param>
                <param name="inputName">inputStream</param>
                <param name="contentDisposition">attachment;filename="${fileName}"</param>
                <param name="bufferSize">4096</param>
             </result>
            </action>

多文件上传

  public class uploadActions extends ActionSupport{
                //封装上传文件属性
                private File[] upload;
                //封装上传文件类型
                private String[] uploadContentType;
                //封装上传文件名称
                private String[] uploadFileName;
                //封装上传文件的路径
                private String savePath;          //省略get/set方法
                @Override
                public String execute()throws Exception{
                    byte[] buffer=new byte[1024];
                    for (int i = 0; i < upload.length; i++) {
                        //读取文件
                        FileInputStream fis=new FileInputStream(getUpload()[i]);
                        //保存文件,设置保存目录路径
                        FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName());
                        int length=fis.read(buffer);
                        while(length>0) {
                            //每次写入length长度的内容
                            fos.write(buffer, 0, length);
                            length=fis.read(buffer);
                        }
                        fis.close();
                        fos.flush();
                        fos.close();

                    }
                    return "success";
                }
            }

4.4文件下载
        Stream结果类型
            contentType            设置发送到浏览器的MIME类型
            contentLength        设置文件大小
            contentDisposition    设置响应的HTTP头信息中的content-Disposition参数的值
            inputName            指定Action中提供的inputStream类型的属性名称
            bufferSize            设置读取和下载文件是的缓冲区大小
                
        FileDownAction.java

 public class FileDownAction extends ActionSupport {
                //读取下载文件目录
                private String inputPath;
                //下载文件的文件名
                private String fileName;
                //读取下载文件的输入流
                private InputStream inputStream;
                //下载文件类型
                private String contentType;
                public String getInputPath() {
                    return inputPath;
                }
                public void setInputPath(String inputPath) {
                    this.inputPath = inputPath;
                }
                public String getFileName() {
                    return fileName;
                }
                public void setFileName(String fileName) {
                    this.fileName = fileName;
                }

                public InputStream getInputStream()throws FileNotFoundException {
                    String path=ServletActionContext.getServletContext().getRealPath(inputPath);
                    return new BufferedInputStream(new FileInputStream(path+"\\"+fileName));
                }
                public void setInputStream(InputStream inputStream) {
                    this.inputStream = inputStream;
                }
                public String getContentType() {
                    return contentType;
                }
                public void setContentType(String contentType) {
                    this.contentType = contentType;
                }
                @Override
                public String execute()throws Exception{
                    return "success";
                }
            }

配置文件

 <action name="download" class="interceptor.FileDownAction">
                <param name="savePath">/upload</param>
                <result name="success" type="stream">
                    <param name="contentType">application/octet-stream</param>
                    <param name="inputName">inputStream</param>
                    <param name="contentDisposition">attachment;filename="${fileName}"</param>
                    <param name="bufferSize">4096</param>
                 </result>
            </action>

contentType对应的文件类型
            Word            application/msword
            Execl            Application/vnd.ms-excel
            PPT                Application/vnd.ms-powerpoint
            图片            image/gif、image/bmp、image/jpeg
            文本文件        text/plain
            HTML网页        text/html
            可执行文件        application/octet-stream

时间: 2024-10-10 00:50:43

第四章 Struts2深入的相关文章

第四章 Hibernate入门

第四章 Hibernate入门4.1 框架技术    4.1.1 框架的概念        框架是一个提供了可重用的公共结构的半成品.    4.1.2 主流框架        4.1.2.1 Struts框架        4.1.2.2 Struts2框架        4.1.2.3 Hibernate框架            一个优秀的持久化框架,负责简化对象数据保存到数据库中,或从数据库中读取数据并封装到对象的工作.        4.1.2.4 Spring框架4.2 Hibern

第四章

第四章 源代码的下载和编译 1.下载.编译和测试Android源代码 配置Android源代码的下载环境 ①创建一个存放下载脚本文件(repo)的目录 # mkdir  ~/bin # PATH=~/bin:$PATH ②下载repo脚本文件 # curi http://dl-ssl.google.com/dl/googlesource/git-repo/repo > -/bin/repo # chmod a+x ~/bin/repo ③创建存放Android源代码的目录 # mkdir and

《UML精粹》 第四章 时序图

第四章 时序图 一般来说,我们会在一张时序图中画出某个情节的相关行为,图种会秀出这个使用案例(use case)里面可能出现的一些对象,以及在对象间传送的信息. 本章将通过一个简单情节,做时序图各方面的相关讨论.假设我们现在有一份订单,并且准备调用它的一个命令,算出这份订单的价格.为了达到这个目的,订单需要产看它里面所拥有的一些订单明细.决定它们的价格,价格决定方式是以订单明细中所包含产品之定价规则为基础决定的.对所有订单明细做完上述动作之后,接下来订单要算出整个折扣,这时候它是以跟客户绑在一起

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

2017.06.29数据挖掘基础概念第四章

第四章39.为什么在进行联机分析处理(OLAP)时,我们需要一个独立的数据仓库,而不是直接在日常操作的数据库上进行 1.提高两个系统的性能 2.操作数据库支持多事务的并发处理,需要并发控制和恢复机制,确保一致性和事务的鲁棒性 3.两者有着不同的数据的结构.内容和用法40.什么是数据仓库 数据仓库是一种数据库,它与单位的操作数据库分别维护,数据仓库系统允许将各种应用系统集成在一起,为统一的历史数据分析提供坚实的平台,对信息处理提供支持,是一个面向主题的.集成的.时变得.非易失的数据集合,支持管理者

构建之法学习(第四章 两人合作)

第四章 两人合作 1.代码规范  1)代码风格规范.主要是文字上的规定,看似表面文章,实际上非常重要. *原则:简明,易读,无二义性 *缩进:4个空格 *行宽:行宽必须限制,可以限定为100字符 *括号:在复杂的条件表达式中,用括号清除地表示逻辑优先级 *断行与空白的{}行:推荐格式如下 if ( condition ) {        DoSomething(); } else {       DoSomethingElse(); } *分行:不要把多条语句放在一行上.并且,不要把多个变量定

第四章—变量,作用域和内存问题(二)

第四章-变量,作用域和内存问题(二) JS没有块级作用域 js没有块级作用域,这个概念容易导致误解,这里就区分下几个情况,大家好好参考下: 我们知道,在其他类C的语言中,由花挂号封闭的代码块都有自己的作用域.但是在JS中,却没有块级作用域: 这里if(true){}代表条件永真,永远执行这条.if(false){}的话就是永远不执行这条. 这个代码执行之后,在if语句定义的变量,在if语句外可以访问的到.在if语句中的变量声明会将变量添加到当前的执行环境中(这里是全局环境). 还有如下的两个例子

Shell脚本学习指南 [ 第三、四章 ] 查找与替换、文本处理工具

摘要:第三章讨论的是编写Shell脚本时经常用到的两个基本操作.第四章总共介绍了约30种处理文本文件的好用工具. 第三章 查找与替换 概括:本章讨论的是编写Shell脚本时经常用到的两个基本操作:文本查找.文本替换. 3.1  查找文本 如需从输入的数据文件中取出特定的文本行,主要的工具为grep程序.POSIX采用三种不同grep变体:grep.egrep.fgrep整合为单个版本,通过不同的选项,分别提供这三种行为模式.who | grep -F root上面使用-F选项,以查找固定字符串r

javascript高级程序设计 第十四章--表单脚本

javascript高级程序设计 第十四章--表单脚本 在HTML中表单由<form>元素表示,在js中表单对应的是HTMLFormElement类型,这个类型也有很多属性和方法:取得表单元素的引用还是为它添加id特性,用DOM操作来获取表单元素:提交表单:把<input>或<button>元素的type特性设置为"submit",图像按钮把<input>元素的type特性设置为"image",也可以调用submit(