传智播客 struts1.x 配置对象与Form的填充

来源:互联网 发布:重生之网络娱乐 精校 编辑:程序博客网 时间:2024/05/16 18:10

 

    在初步了解Action的基础上,接下来需要认识的是ActionMaping,配置文件中每一个<action>元素就是一个ActionMaping的实例。该实例中不仅含有控制器通过请求路径选择Action的信息,还包括请求转发等的相关信息。简单的说,就是struts将配置文件中的<action>元素的配置信息读取后都封装在了一个ActionMaping对象中,因此也可以调用该对象的相关方法在程序中获取那些配置信息。如下所示,重写前面工程中的AddStudentAction的execute方法:
      @Override
      public ActionForward execute(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
              throws Exception {
          String name = mapping.getName();
          String path = mapping.getPath();
          String type = mapping.getType();
          System.out.println("name=" + name + "/t path=" + path + "/ttype="
                  + type);
          String[] forwardNames = mapping.findForwards();
          for (String forwardName : forwardNames) {
              ActionForward forward = mapping.findForward(forwardName);
              String forwardPath = forward.getPath();
              System.out.println("name=" + forwardName + "/tpath=" + forwardPath);
          }
          return null;
      }
    部署完成后,直接发送请求可以在控制台中到配置信息的打印信息。这样就提供了动态的读取配置信息的方法。在调用API的过程中可以看到除了有相应的get方法,里面还提供了set方法。那么是否能够在程序中修改这些信息呢?测试时会发现程序将报一个配置冻结的异常,所以这些配置信息在程序中是不能修改的,之所以提供这些方法是因为struts在初始化的时候自身需要用到相应的set方法来初始化配置信息。在了解了这些同时也就学会一种方式,如果提供的API的某个方法不让客户端程序调用,可以通过抛出一个异常来阻止。
    接下来详细了解的是AcitonForward,也称作导航器,它有两个常用属性:一是name属性,表示该对象的逻辑名称,二是path属性,表示页面或者模块的访问路径。AcitonForward对象是配置对象,它们拥有独一无二的标示允许按name属性来检索。AcitonForward对象封装了流程中URL路径和被请求处理器用于识别目标视图。通过阅读API文档可以发现,AcitonForward表示的一个控制器跳转的目的地。控制器根据AcitonForward来决定是通过RequestDispatcher.forward方法来执行跳转还是通过HttpServletResponse.sendRedirect方法来执行跳转。改元素还有一个配置属性是redirect属性,如果该属性为true,就会执行sendRedirect方法来进行跳转。反之如果是false就执行那个forward,默认情况下该属性的值为false。
    还有一个与Action有关的就是ActionForm,如前面所说的,它也应该归属于控制层的。只不过它的功能是为模型层和视图层传递数据。处理ActionForm一般有如下几步:
      1.请求到来的时候,就检查Action的映射,即通过ActionMapping对象的getName方法确定Action中已经配置了对ActionForm的映射。
      2.根据name属性值,去<form-bean>的配置信息中查找同样属性的元素信息。
      3.检查Action的form bean的使用范围,确定范围是在request下还是session下,默认情况是session下,确定范围后在该范围内查看是否有此form bean的实例。
      4.假如当前范围下,已经存在了form bean的实例,而对当前请求来说,是同一种类型的话,就可以重用该对象。
      5.如果第四步中的条件不成立,比如说当前范围下无此实例或者有实例但是不是同一种类型的话,就重新构建一个form bean的实例,并且保存在相应的作用范围内。
      6.调用form bean的reset方法,主要作用是对重用对象里的属性值进行复位。这个需要注意的是直接从ActionForm继承的reset的方法并不会实现什么处理功能,所以要实现某些复位操作就需要重写父类的reset方法。
      7.复位完成后,就应该从客户端获取数据(request.getParameter()方法)然后调用相应的setter方法,对对象的状态属性进行赋值操作了。
      8.如果<action>元素中的属性validate的值为true就会调用form bean的validate方法进行校验。同样,从ActionForm继承的的validate方法也不会进行任何处理。因此如需要校验就应该重写父类的validate方法。
      9.如果validate方法没有返回任何错误,控制器将AcitonForm作为参数,传给相应Action实例的execute方法。如果校验失败,就会跳转到错误页面。
    以上相当于是与ActionForm有关的流程图,只是理论上的东西,可以从struts API的文档上读到。有时候,理论东西往往印象不深刻,那么在接下来,通过一些代码来测试一下这个流程的正确性,同时也加深自己的印象和对struts的原理的理解。
原创粉丝点击