Struts1.x有两个execute方法,不要重写错哦HttpServletRequest才是对的(转)

Struts1.x 的 Action 有两个 execute 哦,小心搞错!
by agate - Published: 2008-05-01 [9:42 下午] - Category: 程序编码

不知道各位使用 Struts1.x 的朋友们晓得不晓得,Struts1.x 的
org.apache.struts.action.Action 中有两个 execute 方法,在我们使用 eclipse 的自动完成
override 功能的时候要是不小心给弄错了你就等着迎接一个不报错的空白页面吧!让我们看看代码:

//the one  excute()
 public ActionForward execute(ActionMapping mapping, ActionForm form,
        ServletRequest request, ServletResponse response)throws Exception {
        try {
            return execute(mapping, form, (HttpServletRequest) request,
                (HttpServletResponse) response);
        } catch (ClassCastException e) {
            return null;
        } }
//the other excute()
 public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {
        return null;
    }

好,公布结果!只有 override 第二个 execute 才能起作用。如果你 override 的是第一个 execute 的话,很不幸,您调用这个 action 的时候响应给你的是一个空白的页面,你也别想得到任何 exception 的提示!

在 eclipse 中我导入了 struts1.x 的 src 路径,并通过 Open Call Hierarchy 查找调用上面第一个
execute 的类时发现竟然没有调用者!换句话说当我们实现第一个 execute 的时候(没有实现第二个 execute
),是根本没用的!程序根本不会调用到我们 override 的那个 execute 只会傻傻地调用第二个 execute 的默认实现,返回一个
null

那第一个 execute 有什么用呢?我觉得他不是用来给我们重写的,看看它的内容:

 throws Exception {
        try {
            return execute(mapping, form, (HttpServletRequest) request,
                (HttpServletResponse) response);
        } catch (ClassCastException e) {
            return null;
        }}

在我看来,其实它是为了当一个请求是一个非 http 请求的时候,作为一个前端转换器,重新包装请求和响应,然后才交给真正的,也就是我们的第二个 execute 方法来实现。这个从 src 的注释中我们也可以比较清晰的了解:

 /**
     * <p>Process the specified non-HTTP request, and create the corresponding
     * non-HTTP response (or forward to another web component that will create
     * it), with provision for handling exceptions thrown by the business
     * logic. Return an {@link ActionForward} instance describing where and
     * how control should be forwarded, or <code>null</code> if the response
     * has already been completed.</p>
     *
     * <p>The default implementation attempts to forward to the HTTP version
     * of this method.</p>
     *
     * @param mapping  The ActionMapping used to select this instance
     * @param form     The optional ActionForm bean for this request (if any)
     * @param request  The non-HTTP request we are processing
     * @param response The non-HTTP response we are creating
     * @return The forward to which control should be transferred, or
     *         <code>null</code> if the response has been completed.
     * @throws Exception if the application business logic throws an
     *                   exception.
     * @since Struts 1.1
     */

顺便也说一下第二个excute的注释:

 /**
     * <p>Process the specified HTTP request, and create the corresponding
     * HTTP response (or forward to another web component that will create
     * it), with provision for handling exceptions thrown by the business
     * logic. Return an {@link ActionForward} instance describing where and
     * how control should be forwarded, or <code>null</code> if the response
     * has already been completed.</p>
     *
     * @param mapping  The ActionMapping used to select this instance
     * @param form     The optional ActionForm bean for this request (if any)
     * @param request  The HTTP request we are processing
     * @param response The HTTP response we are creating
     * @return The forward to which control should be transferred, or
     *         <code>null</code> if the response has been completed.
     * @throws Exception if the application business logic throws an
     *                   exception
     * @since Struts 1.1
     */

所以……当你重写这个 action 的 execute 方法时,注意咯!是重写那个参数是 http-request/response 的 execute哦!!!

这里严重鄙视一下 struts1.x 的编码态度!

Struts1.x有两个execute方法,不要重写错哦HttpServletRequest才是对的(转),布布扣,bubuko.com

时间: 2024-12-19 19:58:01

Struts1.x有两个execute方法,不要重写错哦HttpServletRequest才是对的(转)的相关文章

12.ThreadPoolExecutor线程池原理及其execute方法

jdk1.7.0_79  对于线程池大部分人可能会用,也知道为什么用.无非就是任务需要异步执行,再者就是线程需要统一管理起来.对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任务,那我就把任务丢到线程池里,线程池里有空闲的线程就执行,没有空闲的线程就等待.实际上对于线程池的执行原理远远不止这么简单. 在Java并发包中提供了线程池类——ThreadPoolExecutor,实际上更多的我们可能用到的是Executors工厂类为我们提供的线程池:newFixedThread

Java并发---- Executor并发框架--ThreadToolExecutor类详解(execute方法)

1.构造方法 请参考上篇文章:http://blog.csdn.net/ochangwen/article/details/53044733 2.源码详解 线程池内部有一些状态,先来了解下这些状态的机制.以下用代码注释的方式来解释其中的含义. /* 这个是用一个int来表示workerCount和runState的,其中runState占int的高3位, 其它29位为workerCount的值. workerCount:当前活动的线程数: runState:线程池的当前状态. 用AtomicIn

Struts2 调用非execute方法

调用非execute方法 1)如果你的Action类是继承自ActionSupport的话,确切的说是重写了execute方法,ActionSupport里的默认实现就是返回"success"视图.因此,你可以不实现execute方法,只要你的struts.xml里有"success"对应的result即可. 2)如果你的Action类没有继承ActionSupport,而你又没有在struts.xml中对应<action>标签中用method属性指定你

execute方法有感

有一个method困扰了我一周之久:execute 我跟着<java web开发技术详解>这本书一步一步编程,结果卡在了this.execute(request,response); 编译器一直报错:cannot resolve method execute 于是我百度,谷歌,查java sdk. 就在准备砸电脑的时候,我发现这个execute方法是作者自己定义的,后面一页就有... 这件事告诉我们,相比于埋头拉车,抬头看路才是最重要的. bye~

JQuery的两个each方法的注意点

Jquery官网上两个each用法: http://api.jquery.com/jQuery.each/ http://api.jquery.com/each/ 使用时注意点 <!DOCTYPE html> <html> <head> <title>Untitled Page</title> <script type="text/javascript" src="jquery141.js">&

基于Apache+Tomcat负载均衡的两种实现方法

Apache+Tomcat实现负载均衡的两种实现方法 如果我们将工作在不同平台的apache能够实现彼此间的高效通信,因此它需要一种底层机制来实现--叫做apr Apr的主要目的就是为了其能够让apache工作在不同的平台上,但在linux上安装apache的时候通常都是默认安装的 [[email protected] ~]#rpm -qi aprName                 :apr                                        Relocation

OGG的Director web hang住的两种解决方法

OGG的Director web hang住的两种解决方法: OGG的Director web hang住的解释:是指web界面能登陆进去,但是看得刷新日期是很久之前的日期,并且该日期不变化. OGG的Director web hang住 的情况之一: 参考如下的mos文章: Director web displaying "Error 500-Internal Server Error". Domain log has Cannot open paging store. (Doc I

html()和text()这两个jQuery方法有什么区别

html()和text()这两个jQuery方法有什么区别:标题中的两个方法是jQuery非常常用的两个方法,并且有时候作用似乎是一模一样的,其实这只是一种假象而已,下面结合实例来介绍一下他们的区别,首先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www

git两种合并方法 比较merge和rebase

18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用merge,所以好像都是用rebase却别讲解,比如:在服务器上的develop分支有多人在开发,你们同时clone或pull下来最新代码,但是开发进度不一样,你在开发一个任务的时候其他人提交了编号为1,2的commit和push,你现在开发完了也要提交,你的提交编号是3,4(注意:编号不代表顺序现实