Struts1.3源码分析(1)

1.Struts各部分结构:

组织部分

作用

Struts-config.xml

Struts配置文件

ActionServlet 

控制器 

Action Class 

包含事务逻辑 

ActionForm 

显示模块数据 

ActionMapping 

帮助控制器将请求映射到操作 

ActionForward   

用来指示操作转移的对象 

ActionError   

用来存储和回收错误 

Struts标记库 

可以减轻开发显示层次的工作 

2.Struts 1的优缺点:

struts1的好处

struts1的缺点

  1.良好的架构和设计
  2.可重用,模块化,扩展性好
  3.Open source
  4.它提供了丰富的标签库,使页面能更加灵活的使用。

  1.它太过于依赖web容器,当配置文件改动一次就要重新启动。
  2.它的配置文件太过于复杂。
  3.ActionForm无法进行测试.
  4.Action测试太过于依赖servlet api,所以在测试的时候要用到模拟对象.


3.一次请求的流程
    1..do结尾的URLActionServlet拦截,执行service方法
    2.根据请求传递的方法GET/POST选择执行doGet()doPost()方法
    3.doGet()/doPost()方法中,调用process()方法
    4.process()方法中获得RequestProcessor的实例
    5.RequestProcess的实例调用process()方法,处理请求
    6.RequestProcessprocess()方法中,
        首先通过processMultipart()处理请求。
            若传送方法为get,不做处理,直接返回到process()方法
            若传送方法为post,做简单处理后返回process()方法
        其次通过processPath()方法获取path
            若pathnull,返回上一层调用
        path不为null,接着进行其它处理
            包括对Locale,Content,NoCache,Preprocess,CachedMessages,Mapping,
            Roles,ActionForm,Populate,Validate,Forward,Include的处理。
          
             然后创建Action实例,并执行Action返回ActionForward,最后处理
            ActionForward
          
             在处理的过程中,采用责任链模式分别由对应的Command类进行处理,
            并随时可能由于异常等原因返回。
          
     7.一次请求到此结束,会根据ActionForward执行下一个流程 或 直接转往JSP生成
        HTML发送到浏览器。

4.Struts1.3Struts 2 的区别:

Struts1.x综述

一、业务逻辑 :应包含在POJO类或EJB中,完全独立于Action。这样做的优点就是不依赖与框架本身,更好复用。 原则:类和类的方法应该有自己独立的职责,能够完成所建领域的特定任务(如ActionForm) 

二、处理Exception 

原则:1)在异常离开业务层之前捕获,处理,记录业务层抛出的所有异常; 

      2)在业务层捕获一个异常时,作为一个通用的异常类型重新抛出。 

编制定制ExceptionHandler(如加入邮件通知,log记录等功能) 

  1、扩展org.apache.struts.action.ExceptionHandler,并重写execute方法 

  2、配置exception时,加入handle选项 

三、ActionFormAction 

  1、将ActionForm与业务逻辑分离,将ActionForm收集的数据copyVO对象中,可以借助BeanUtils类完成该项功能。 

  2、将ActionForm中的公共属性设置为String类型(用户处理数字类型或Date类型,ActionForm默认会做类型转化,如果不能转化会抛出异常,可以用JS在前台处理数据或后台转化,后台转化不成抛出自定义异常信息) 

  3、将Action作为业务逻辑的调用点,而不是插入点。 

  4、在ActionFormreset方法中注意清空checkbox,应为在没有选中checkbox时,HTTP协议发送的数据为空,而页面中原来被选中的不会改变。 

四、验证 

  ActionFormvalidate方法 

  Struts验证框架 

  JS前台验证 

五、扩展Struts 

1、扩展RequestProcessor,实现自己的控制器实际上struts的控制器是RequestProcessor,而不是ActionServlet 

  a)继承org.apache.struts.action.RequestProcessor 

  b)重写process,processActionPerform,processPreProcess方法 

  一般不重写processPreProcess方法,主要是其抛出了ServletExceptionIOException 

  c)在配置文件中配置<controller processorClass="**.*Controller"/> 

========strut1.x源码分析==========

一、Struts1.x 

1ActionServlet 

  init方法中初始化ActionMappingActionForward 

  doGet,doPost方法调用ActionServlet.process方法,其间接调用RequestProcessor.process方法 

                                 

2RequestProcessor 

Process()方法中 processPreProcess 设计上是一个钩子 可以在Action调用之前做一些动作。 

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

private static Log log = LogFactory.getLog(ActionMapping.class); 

processActionCreate Action 是单实例的,因为其存在一个HashMap中 

        Action instance = (Action) actions.get(className); 

            if (instance != null) { 

                if (log.isTraceEnabled()) { 

                    log.trace("  Returning existing Action instance"); 

                } 

                return (instance); 

        } 

        

ServletContext.getRequestDispatcher(String url) url为绝对地址 

ServletRequest.getRequestDispatcher(String url) url为相对地址 

HashMapkeySet方法返回key值集合,values方法返回value集合 

http://localhost:8088/news/main/list.jsp news是应用程序的名字 

则执行下面向行代码后打印出如下结果: 

1System.out.println(request.getContextPath());  打印结果:/news 

2System.out.println(request.getServletPath());  打印结果:/main/list.jsp 

3System.out.println(request.getRequestURI());   打印结果:/news/main/list.jsp 

4System.out.println(request.getRealPath("/"));  打印结果: F:/Tomcat 6.0/webapps/news/test 

struts1.x配置细节:Action中配置ActionForm,实例化ActionForm根据attribute配置 

processPopulate中定义了处理ActionForm的定义 

ModuleConfigImpl implements ModuleConfig 

   public ModuleConfigImpl(String prefix) { 

        super(); 

        this.prefix = prefix; 

        this.actionConfigs = new HashMap(); 

        this.actionConfigList = new ArrayList(); 

        this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean"; 

        this.actionMappingClass = "org.apache.struts.action.ActionMapping"; 

        this.actionForwardClass = "org.apache.struts.action.ActionForward"; 

        this.configured = false; 

        this.controllerConfig = null; 

        this.dataSources = new HashMap(); 

        this.exceptions = new HashMap(); 

        this.formBeans = new HashMap(); 

        this.forwards = new HashMap(); 

        this.messageResources = new HashMap(); 

        this.plugIns = new ArrayList(); 

   }

2.Action类中最重要的方法: execute().
    3.它的验证方式有两种:在服务器端验证(在FormBean里面重写Validate方法),在客户端验证(通过配置文件来进行验证)。
    4.在服务器启动时会执行init()来进行初始化一些信息。
    5.它的乱码问题可以通过过滤器来解决。
    6.struts1所需要用到的jar包可能会和tomcat中的jsp-api.jar,servlet-api.jar包冲突,最好的解决方案是将这两个jar包放到重新建的一个包中去,然后再引用这个包中的jar
    7.在使用validate框架时from类一定要继承ValidatorFrom这个类。
        Struts Validator框架采用两个基于XML的配置文件来配置验证规则。
        这两个文件为validator-rules.xmlvalidation.xml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值