【筹码王指标源码】【梦幻04端源码】【ego商场源码】actioninvocation源码

时间:2024-11-26 12:43:01 来源:网易顶帖源码 分类:综合

1.java中status1和status2的区别?
2.struts2 java.lang.reflect.InvocationTargetException

actioninvocation源码

java中status1和status2的区别?

       ã€€ã€€Struts1和Struts2的区别和对比:

       ã€€ã€€Action ç±»:

       ã€€ã€€Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

       ã€€ã€€Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

       ã€€ã€€çº¿ç¨‹æ¨¡å¼:

       ã€€ã€€Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

       ã€€ã€€Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

       ã€€ã€€Servlet 依赖:

       ã€€ã€€Struts1 Action 依赖于Servlet API ,源码筹码王指标源码因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。

       ã€€ã€€Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

       ã€€ã€€å¯æµ‹æ€§:

       ã€€ã€€æµ‹è¯•Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。

       ã€€ã€€Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

       ã€€ã€€æ•èŽ·è¾“å…¥:

       ã€€ã€€Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)。

       ã€€ã€€ Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

       ã€€ã€€è¡¨è¾¾å¼è¯­è¨€ï¼š

       ã€€ã€€Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

       ã€€ã€€Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).

       ã€€ã€€ç»‘定值到页面(view):

       ã€€ã€€Struts 1使用标准JSP机制把对象绑定到页面中来访问。

       ã€€ã€€Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

       ã€€ã€€ç±»åž‹è½¬æ¢ï¼š

       ã€€ã€€Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

       ã€€ã€€Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

       ã€€ã€€æ ¡éªŒï¼š

       ã€€ã€€Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

       ã€€ã€€Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

       ã€€ã€€Action执行的控制:

       ã€€ã€€Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

       ã€€ã€€Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

       ã€€ã€€Struts1流程:

       ã€€ã€€ï¼ˆ1)用户的请求以HTTP方式传输到服务器上,接受请求的是ActionServlet.

       ã€€ã€€ï¼ˆ2)ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操作。如果没有,则返回一个用户请求无效的出错信息。

       ã€€ã€€ï¼ˆ3)当ActionServlet请求找到用户请求的Action后,首先将用户输入的表单参数打包成一个ActionFrom对象,这个ActionFrom对象其实也就是一个JavaBean,里面包含两个字段,分别是用户名和密码。接着ActionServlet再根据struts-config.xml中的配置信息决定是否要执行ActionFrom对象中的Validate方法。若Validate方法执行有错,则返回。否则,继续下一步。

       ã€€ã€€ï¼ˆ4)系统生成一个用户所请求的Action的实例对象,将前面的ActionFrom对象传递给它,运行它的Execute()方法。这一步其实就是用户登陆的控制器,在执行exectue()方法时,可以调用后台模型验证登陆名和密码是否正确等信息。

       ã€€ã€€ï¼ˆ5)execute()执行结束前会生成ActionForward类型的对象并将之返回给ActionServlet

       ã€€ã€€struts1的处理器

       ã€€ã€€processMultipart()要是提交方式为post而且类型为Multipart则返回重新包装的HttpServletRequest对象

       ã€€ã€€processPath()获取url路径以便选择struts Action组件

       ã€€ã€€processLocale()把用户提交的Locale信息保存到session中

       ã€€ã€€processContent()设置response.setContentType的值

       ã€€ã€€processNoCache()设置报头Cache-Control Pragma Expires的值

       ã€€ã€€processPreprocess()直接返回true 子类可以覆盖该方法实现己的操作

       ã€€ã€€processMapping()查找对应的ActionMapping 不存在则返回错误信息

       ã€€ã€€processRoles()判断对应的Action是否配置了安全角色 用户是否有权限

       ã€€ã€€processActionForm()查找ActionMapping是否配置ActionForm 有则查找该实例不存在则创建

       ã€€ã€€processPopulate()查找ActionMapping是否配置ActionForm 有则调用reset方法清空再装载表单数据

       ã€€ã€€processValidate()调用ActionForm的validate方法返回ActionErrors 要是存在ActionMessage对象则验证失败

       ã€€ã€€processForward()查找ActionMapping是否配置forward 有则采用forward结束流程

       ã€€ã€€processInclude()查找ActionMapping是否配置include 有则采用include结束流程

       ã€€ã€€processActionCreate()查找是否有对应的Action实例 不存在则创建

       ã€€ã€€processActionPerform()调用Action的execute方法

       ã€€ã€€processForwardConfig() 处理跳转

       ã€€ã€€struts2的执行流程

       ã€€ã€€1、客户端发起一个请求

       ã€€ã€€2、主控器FilterDispatcher拦截请求.

       ã€€ã€€3、主控器通过ActionMapper判断请求是否交给action

       ã€€ã€€å¤„理.如果是,那么判断请求的action是否存在,如果 不存在,报错误.如果不是交给action处理,那么将

       ã€€ã€€è¯·æ±‚转发给对应的web组件.

       ã€€ã€€4、主控器创建ActionProxy对象,这个对象全权负责 action的执行.

       ã€€ã€€5、ActionProxy通过ConfigurationManager对象获得当 前访问的action的相关配置信息.

       ã€€ã€€6、ActionProxy根据获得的action的配置信息,创建

       ã€€ã€€ActionInvocation对象.

       ã€€ã€€7、ActionInvocation对象负责执行action前面的拦截器

       ã€€ã€€ä»¥åŠaction对象,并且处理action执行后的结果.

       ã€€ã€€8、action前面的拦截器被执行,最后执行action.

       ã€€ã€€9、ActionInvocation得到action执行后的逻辑视图,æ ¹ 据逻辑视图找到物理视图,然后转发请求.

struts2 java.lang.reflect.InvocationTargetException

       nvocationTargetException 是一种包装由调用方法或构造方法所抛出异常的受查异常。这个异常并不是Eclipse插件开发特有的,而是标准JDK中的,它定义在 java.lang.reflect包下。在进行Java开发的时候很少会接触到这个异常,不过在进行Eclipse插件开发中则不同,很多API都声明抛出此类异常,因此必须对此异常进行处理。

        例如,我们开发一个方法用来统一处理异常:

        private static void handleException(Exception e)

        {

        MessageDialog.openError(Activator.getDefault().getWorkbench()

        .getDisplay().getActiveShell(), "error", e.getMessage());

        e.printStackTrace();

        }

        我们发现当传递来的参数e为InvocationTargetException 的时候弹出的对话框中的消息是空的,查看InvocationTargetException 的源码得知InvocationTargetException 并没有覆盖getMessage方法,所以消息当然是空的了。我们需要调用InvocationTargetException 的getTargetException方法得到要被包装的异常,这个异常才是真正我们需要的异常。修改代码如下所示:

        private static void handleException(Exception e)

        {

        String msg = null;

        if (e instanceof InvocationTargetException)

        {

        Throwable targetEx = ((InvocationTargetException) e)

        .getTargetException();

        if (targetEx != null)

        {

        msg = targetEx.getMessage();

        }

        } else

        {

        msg = e.getMessage();

        }

        MessageDialog.openError(Activator.getDefault().getWorkbench()

        .getDisplay().getActiveShell(), "error", msg);

        e.printStackTrace();

        }