十、Struts2结果集

 

 

 

 

 

 

 

 

 

 

 

 

1、Struts.xml配置文件

result元素:指定动作类的动作方法执行完后的结果视图.

属性:

name:字符串,与动作方法返回的值一致。默认是success

type:指定处理结果的结果类型的别名。(struts-default.xml有定义)。默认值是dispatcher

2、局部和全局结果视图

public
class
UserAction
extends ActionSupport {

    @Override

    public String execute() {

        // 输入你好到页面上面去

 

        // 把显示内容的代码写在这里

 

        //配置文件根据返回的字符串,转发到对应的jsp页面

        return
SUCCESS;

    }

 

    public String execute2() {

        return
ERROR;

 

    }

}

 

<package
name="p1"
extends="struts-default">

        <!--全局结果视图:包中所有的action都能使用同一个视图 -->

        <global-results>

            <result
name="error">/error.jsp</result>

        </global-results>

        <action
name="action1"
class="com.itheima.action.Demo1Action"

            method="execute">

            <!--局部结果视图:配置在了action的内部 -->

            <result
name="success"
type="dispatcher">/success.jsp</result>

        </action>

 

        <action
name="action2"
class="com.itheima.action.Demo1Action"

            method="execute2"
/>

    </package>

 

3、补充知识:动作类的生命周期

Struts2每次请求,都会实例化动作类的对象,因此它是线程安全的。

4、Struts2提供的结果视图

  • chain:转发到另外一个动作

转发到包内的动作:

<action
name="a1">

            <!-- 转发到另外一个动作:同一个包中的 -->

            <!-- 位于result标签元素内部的值会调用chain处理类的setActionName("a2") -->

            <result
type="chain">a2</result>

            

            <!-- <result type="chain">

                <param name="actionName">a2</param>

            </result> -->

        </action>

 

转发到另外一个带有名称空间的包中的动作

<package
name="p1"
extends="struts-default">

        <action
name="a3">

            <!--转发到另外一个动作:不同包且另外还有命名空间 -->

            <!-- 以下的写法是不对的 -->

            <!-- <result type="chain">/hello/a33</result> -->

            

            <result
type="chain">

个方法:

            setNamespace(String str) setActionName(String name) -->

                <param
name="namespace">/hello</param>

                <param
name="actionName">a33</param>

            </result>

        </action>

    </package>

    

    <package
name="p3"
extends="struts-dafault"
namespace="/hello">

        <action
name="a33">

            <result
type="dispatcher">/3.jsp</result>

        </action>

    </package>

 

 

  • dispatcher:转发到一个页面,jsp

<action
name="a2">

            <!--

            <result type="dispatcher">/3.jsp</result>

            -->

            <result>

                <param
name="location">/3.jsp</param>

            </result>

        </action>

 

 

  • redirect:重定向到一个页面

<result
type="redirect">

                <param
name="location">/3.jsp</param>

            </result>

 

  • redirectAction:重定向到一个动作

<action
name="a4">

            <!--重定向到另外一个包中的动作 -->

            <result
type="redirectAction">

                <param
name="namespace">/hello</param>

                <param
name="actionName">a44</param>

            </result>

        </action>

 

 

<package
name="p3"
extends="struts-dafault"
namespace="/hello">

        <action
name="a33">

            <result
type="dispatcher">/3.jsp</result>

        </action>

        <action
name="a44">

            <result
type="dispatcher">/3.jsp</result>

        </action>

    </package>

 

 

  • stream:文件下载(此处不讲,文件上传和下载再讲)
  • plainText:以纯文本的形式显示结果

<action
name="a5">

            <!--以纯文本的形式显示目标页面:直接显示源码 -->

            <result
type="plainText">/4.jsp</result>

        </action>

 

5、自定义结果视图

目标:用一个叫做image的视图,输入随机验证码图片

 

步骤:

  1. 定义一个类,实现com.opensymphony.xwork2.Result接口

    /*

    * 该类实现Rusult接口,实现自定义结果视图

    */

    public
    class CaptchaResult implements Result {

        /**

         *

         */

        private
    static
    final
    long
    serialVersionUID = 1L;

        private
    int
    width = 110;

        private
    int
    height = 25;

            

        public
    void setWidth(int
    width) {

            this.width = width;

        }

     

        public
    void setHeight(int
    height) {

            this.height = height;

        }

     

        @Override

        public
    void execute(ActionInvocation arg0) throws Exception {

        //验证码的代码

            // BufferedImage:代码内存图片

            BufferedImage image = new BufferedImage(width, height,

                    BufferedImage.TYPE_INT_RGB);

     

            // Graphics:画笔

            Graphics g = image.getGraphics();

            

            // 画边线

            g.setColor(Color.GREEN);

            g.drawRect(0, 0, width, height);

            

            // 填充背景色

            g.setColor(Color.YELLOW);

            g.fillRect(1, 1, width - 2, height - 2);

     

            // 干扰线

            Random r = new Random();

            g.setColor(Color.GRAY);

            for (int
    i = 0; i < 15; i++) {

                g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width),

                        r.nextInt(height));

            }

            // 验证码

            g.setColor(Color.RED);

            g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 18));

     

            int
    x = 19;

            for (int
    i = 0; i < 5; i++) {

                g.drawString(r.nextInt(10) + "", x, 20);

                x += 20;

            }

     

            // ImageIO:输出图片给指定的流

            OutputStream output = ServletActionContext.getResponse()

                    .getOutputStream();

            ImageIO.write(image, ".jpg", output);

     

        }

    }

     

  2. 在配置文件中定义结果类型

    <package
    name="p3"
    extends="struts-dafault">

            <result-types>

        <result-type
    name="image"
    class="com.itheima.results.CaptchaResult"></result-type>

            </result-types>

        </package>

     

  3. 现在就可以在动作中使用该结果类型

    <!-- 使用自定义结果视图 -->

            <action
    name="imageAction">

                <result
    name="success"
    type="image">

                    <param
    name="width">400</param>

                    <param
    name="height">300</param>

                </result>

            </action>

     

    小技巧:很多包中都要使用该结果视图怎么办?

    <package
    name="mydefault"
    extends="struts-dafault">

            <!--自定义结果视图 -->

            <result-types>

                <result-type
    name="image"

    class="com.itheima.results.CaptchaResult">

    </result-type>

            </result-types>

        </package>

     

    <!--继承配置了结果视图的包 -->

        <package
    name="p4"
    extends="mydefault">

            <!-- 使用自定义结果视图 -->

            <result
    name="success"
    type="image">

                <param
    name="width">400</param>

                <param
    name="height">300</param>

            </result>

        </package>

     

十、Struts2结果集的更多相关文章

  1. ES系列十六、集群配置和维护管理

    一.修改配置文件 1.节点配置 1.vim elasticsearch.yml # ======================== Elasticsearch Configuration ===== ...

  2. Docker Swarm(十)Portainer 集群可视化管理

    前言 搭建好我们的容器编排集群,那我们总不能日常的时候也在命令行进行操作,所以我们需要使用到一些可视化的工具,Docker图形化管理提供了很多工具,有Portainer.Docker UI.Shipy ...

  3. nodejs的mysql模块学习(十)连接池集群配置选项

    连接池集群选项 canRetry : 如果true ,连接池集群会在连接失败时尝试连接 默认true removeNodeErrorCount : 如果连接失败,节点的errCount增加.当erro ...

  4. Redis进阶实践之十 Redis哨兵集群模式

    一.引言             上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  5. 【iCore4 双核心板_uC/OS-II】例程十:信号量集

    一.实验说明: 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集. 二.实验 ...

  6. 【Redis学习之十】Redis集群维护

    Redis集群增删节点部署环境 redis-3.0.0 VM虚拟机redhat6.5-x64:192.168.1.201.192.168.1.202.192.168.1.203.            ...

  7. Dubbo实践(十六)集群容错

    Dubbo作为一个分布式的服务治理框架,提供了集群部署,路由,软负载均衡及容错机制.下图描述了Dubbo调用过程中的对于集群,负载等的调用关系: 集群 Cluster 将Directory中的多个In ...

  8. Redis(十六):集群搭建(手动和自动)

    一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):slave->master ...

  9. RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡

    RabbitMQ 默认的集群模式,也就是普通模式,最大的问题就在于存储队列完整数据的节点一旦宕机, 如果是非持久化队列,则消息丢失;如果是持久化队列+持久化消息,则必须等该节点恢复. 所以后来 Rab ...

随机推荐

  1. bootstrap-按钮组、字体图标

    字体图标: <div class="container"> <div class="row"> <span class=" ...

  2. 最完美的xslt数值函数与字符串函数(转)

    http://www.cnblogs.com/guoxu/articles/1744007.html 任何的编程语言或者是SQL语句都有内置的函数或方法,而强大灵活的xslt技术也是如此.熟练掌握XS ...

  3. MYSQL C API : mysql_real_connect()

    MYSQL * mysql_real_connect( MYSQL *mysql, const char *host, const char *user, const char *passwd, co ...

  4. Redis集群搭建&访问

    集群搭建步骤 1.创建多个节点: 2.为每个节点指派槽,并将多个节点连接起来,组成一个集群: 3.当集群数据库的16384个槽都有节点在处理时,集群进入上线状态: 要求:搭建一个包含6个节点的Redi ...

  5. 解决Git报错:The current branch is not configured for pull No value for key branch.master.merge found in configuration

    1.在本地工程目录找到config文件(我的是在D:\git\demo\.git):2.修改config文件内容为: [core] repositoryformatversion = 0 filemo ...

  6. Rehat 5.8下oracle11g安装

    Oracle 11g Redhat 5安装  一.检查硬件是否满足要求 检查一内存 On Linux x86: At least 1 GB of RAM 内存至少1G To determine the ...

  7. The Ninth Hunan Collegiate Programming Contest (2013) Problem G

    Problem G Good Teacher I want to be a good teacher, so at least I need to remember all the student n ...

  8. [转]整理索引碎片,提升SQL Server速度

    数据库表A有十万条记录,查询速度本来还可以,但导入一千条数据后,问题出现了.当选择的数据在原十万条记录之间时,速度还是挺快的:但当选择的数据在这一千条数据之间时,速度变得奇慢. 凭经验,这是索引碎片问 ...

  9. svn老鸟转用git必须理解的概念

    不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入“查阅过很多资料,依然掌握不好”的困境,至少我们团队是这样的. 网上的资料确实已经很多了,却没有把 ...

  10. 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面

    Donut Caching是缓存除了部分内容以外的整个页面的最好的方式,在它出现之前,我们使用"输出缓存"来缓存整个页面. 何时使用Donut Caching 假设你有一个应用程序 ...