×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

比较复杂Struts 多模块的一个影院项目

我在做STRUTS 多模块的一个影院项目, 它有5个模块, 假设 1,2,3,4,5.代表LOGIN,选座, 换座, 确认, 打印票据 5个模块. 我要做的是它应该为同时2个影院 A,B 服务. 例如, A 只要1,2,4,5 模块(LOGIN, 选座,确认, 打印票据), B 只要2,3,5 模块(选座, 换座, 打印票据). 当A,B 影院确定各自的模块后. 我要为它们自动生成相应的配置文件来满足各自的观众需求. 要求是两个都要执行在一个应用上.
我的想法是用在 缺省的STRUTS配置文件上生成两个不同的子配置文件用XML DOM. 但这样一来就地扩展ActionServlet, 还没有想好, 另外能否可在不同模块间跳转(用全局或SWITHACTION)?
有人说用SPRING WEBFLOW 也能,但基于STRUS 框架不知可以不可以.
Report

Replies, comments and Discussions:

  • 工作学习 / 专业技术讨论 / 比较复杂Struts 多模块的一个影院项目
    我在做STRUTS 多模块的一个影院项目, 它有5个模块, 假设 1,2,3,4,5.代表LOGIN,选座, 换座, 确认, 打印票据 5个模块. 我要做的是它应该为同时2个影院 A,B 服务. 例如, A 只要1,2,4,5 模块(LOGIN, 选座,确认, 打印票据), B 只要2,3,5 模块(选座, 换座, 打印票据). 当A,B 影院确定各自的模块后. 我要为它们自动生成相应的配置文件来满足各自的观众需求. 要求是两个都要执行在一个应用上.
    我的想法是用在 缺省的STRUTS配置文件上生成两个不同的子配置文件用XML DOM. 但这样一来就地扩展ActionServlet, 还没有想好, 另外能否可在不同模块间跳转(用全局或SWITHACTION)?
    有人说用SPRING WEBFLOW 也能,但基于STRUS 框架不知可以不可以.
    • 重写RequestProcessor?
      听说用RoadMap,有用过的么?
    • 有没有人知道一点?
    • 还是没有找到点相应资料从GOOGLE.COM
    • 在线等
    • RequestProcessor + apache common configuration.
      1. Your own RequestProcessor will initially load XML which includes structure of cinemas and the modules belongs to these cinemas. This XML can be reprented by Apache common configuration.
      2. overwrite process, according to request's cinema category and pre-loaded XML config, forward the request to its related module. (You can pass cinema and module related information to this request also at this time if you want, or just simply forward to its related module).
      • 聆风您好,下面是我对你想法的理解和疑惑,对否? 望指教.
        1)先生成A与B的两个单独的培植文件, 例如: Struts-config-A.xml 和 Struts-config-B.xml,它们各自包括各自的要求模块的转发路径, A(LOGIN, 选座,确认, 打印票据), B(选座, 换座, 打印票据).然后加载到RequestProcessor中做参考.

        问题: 因为是基于多模块,这里5个模块各有一个RequestProcessor, 也就是说在5个模块外还有一个RequestProcessor ? 即ActionServlet转发请求给总的RequestProcessor,处理后在转发响应的模块内RequestProcessor? 有点不明不白, 望指教.

        2) 重写RequestProcessor的process(),根据请求来检索加载相应的Struts-config-A.xml 或 Struts-config-B.xml, 在这里A与B彻底分开,各自运行各自的转发基于各自的配置文件. 在请求中加入相应的标志. 例如,ActionServlet接到请求,转发哪一个RequestProcessor? 还是上面的问题.

        聆风, 能否说的详细些.
        • 关于RequestProcessor 的配置.
          在struts-config 文件中 (无论你有多少个), 你的case 只用指定一个RequestProcessor(虽然不同的struts-config-x.xml 可有自己的RequestProcessor), 即: 你的module都用同一个你自己create 的RequestProcessor. 这样一来, 所有的requests就都先进这个RequestProcessor 来被处理. 于是, 你就可以很容易的分析incoming requests 是属于那个cinema的. 这样, 你的问题就可迎刃而解 --- 这就是struts single controller的好处. 你可以在这个single controller 中处理security for different modules, process locale, add module related information, process form, etc.
          • 聆风, 在多module上用单module的RequestProcessor处理问题,精彩!!! 1)A,B2个入口;2)找到相应配置文件.问题--forward下一页JSP后, 在新request中怎样鉴别它属于A或B呢?
            用到apache common config 去Setproperty 然后藏在被forward的JSP 么?
            • 我本想加每一个module一个单独action专门处理加A或B的标志在被forward下一页JSP 中. 可以但不简洁, 为一标志去用一专门action 不理想.有别的方法么?
          • 聆风, 再一次感谢您的提示,下面是我整理的思路.希望看到您的建议.
            本文发表在 rolia.net 枫下论坛1) 有两个入口A与B的, 例如:http://127.0.0.1/A/login.html 与 http://127.0.0.1/B/login.html, the ActionServlet 只是通过process()转发request到RequestProcessor , 下面是ActionServlet 的process()源码

            (注:转载)------------------------------
            protected void process(HttpServletRequest request,
            HttpServletResponse response)
            throws IOException, ServletException {
            RequestUtils.selectApplication(request,
            getServletContext());
            getApplicationConfig(
            request).getProcessor().process(request, response);
            }
            RequestUtils是個工具類,ActionServlet呼叫其selectApplication()方法,藉由 request.getServletPath()來取得請求路徑以選擇應用程式模塊來處理請求,之後從ApplicationConfig物件取得 RequestProcessor物件,將使用者的請求委託它來進行處理
            -----------------------------

            2) 通过getApplicationConfig,我们得到了RequestProcessor,然后得到它的Process()方法.下面是Process()的主要方法:
            -------
            protected String processPath()
            protected ActionForm processActionForm()
            protected ActionMapping processMapping()
            protected Action processActionCreate()
            protected ActionForward processActionPerform()
            processLocale()
            protected void processForwardConfig()
            ...
            --------
            问题1? 在这里怎样让它与A的Struts-config-A.xml联系起来?也就是说怎样加载A的配置文件而不是B的Struts-config-B.xml呢?

            问题2? 假如繼承RequestProcessor,並改寫其中的processXXXXX()方法來自定義請求的處理方式,那么要在struts-config.xml中使用<controller>標籤來定義还是在Struts-config-A.xml中来定义?

            3)假设RequestProcessor在request中发现了是A的入口,通过Struts-config-A.xml找到了A的<Action>....</Action>,运行action,然后forward 到一个变量,再通过<Action>....</Action>找到了被forward的login.jsp.这时候观众看到了login的页面.

            问题? 在login 的页面里怎样才能体现它是属于A的request 的呢?在观众填了姓名 和密码然后摁了发送键后.用您说的common config set...() 与 get...() 么? 也就是说A,B入口后怎样区分A,B的第二次请求?


            聆风, 还有什么考虑不周的地方么? I use chinese words writting the above to make it easier to understand.更多精彩文章及讨论,请光临枫下论坛 rolia.net
            • 聆风, 这样想行不行: processMapping --->ActionMapping--->取得A的配置信息Struts-config-A.xml. ActionMapping怎样加载A的Strtus-config-A.xml?
              下面摘自google.com. 

              ========1==========

              // 從URI路徑確定ActionMapping
              ActionMapping mapping =
              processMapping(request, response, path);
              if(mapping == null) {
              return;
              }
              =========2========
              ActionMapping是ActionConfig的子类,实质上是对struts-config.xml的一个映射,从中可以取得所有的配置信息
              RequestProcessor根据提交过来的url,如*.do,从ActionMapping 中得到相应的ActionForn和Action。然后将request的参数对应到ActionForm中,进行form验证。如果验证通过则调用Action的execute()方法来执行Action,最终返回ActionFoward。
              ActionFoward是对mapping中一个foward的包装,对应于一个url
              ============
          • 聆风,下面是我转载的片段,它好象用了ActionServlet通过struts-config.xml决定使用哪个RequestProcessor,不明白另外思路还是与您的有冲突? 
            转载----Struts的ActionServlet通过struts-config.xml决定使用哪个RequestProcessor。如果没有显式的指出,ActionServlet将使用org.apache.struts.action.RequestProcessor。他首先得到一个RequestProcessor的实例,调用实例的init方法,然后执行实例的process方法。

            它的:
            ActionServlet--->struts-config.xml--->RequestProcessor--->init + process

            您的:
            ActionServlet--->RequestProcessor--->init + process--->load struts-config-A.xml

            问题? ActionServlet怎样通过struts-config.xml决定使用哪个RequestProcessor?能用ActionServlet通过A的struts-config-A.xml决定使用哪个A的RequestProcessor?
          • 聆风,我知道把缺省配置文件,A与B的配置文件3个放在web.xml,让Server读到内存中,但RequestProcessor拿到request 后怎样鉴别它们呢?还望指点
            在内存中所有的配置文件都以对象形式存在,RequestProcessor的process()怎样区分缺省配置文件,A与B的配置文件,然后根据ActionServlet传来的request去找呢?
    • 如果我看懂题目的话,我觉得可用2个或2组struts config来解决。
      Map Cinema A's actions to /A/... and Cinema B's to /B/...
      In struts-config-a.xml, you only config actions for 1/2/4/5 while in struts-config-b.xml only 2/3/5.
      In ActionServlet, you have at least two entries, one for struts-config-a.xml and another for struts-config-b.xml.
      • 电脑民工您好, 怎样才能检索上载相应配置文件, 请指教
        刚开始我也是你的思路,弄两个不同的配置文件, 例如: Struts-config-A.xml 和 Struts-config-B.xml,里面是A与B的相应要求的流程. 用请求里的A 或B标志来检索上载相应的Struts-config-A.xml 或 Struts-config-B.xml.

        电脑民工,您能说的详细些么? 怎样才能检索上载相应的Struts-config-A.xml 或 Struts-config-B.xml 在RequestProcessor的process()中?,能给个大致思路或相应的例子或link?
    • 非常感谢聆风和电脑民工,华山论剑,英雄所见略同!
    • 我今早醒后躺床上的大致思路.
      本文发表在 rolia.net 枫下论坛1. LOGIN,选座, 换座, 确认, 打印票据 5个模块 分别同时有2个影院 A,B的各自的模块配置文件.
      例如: 选座模块下有A,B 2个模块配置文件: Struts-config-A.xml 和 Struts-config-B.xml. 第一个配置文件大概象:
      <acton-mappings>
      <action ...>
      <forward name = "success" contextRelative = "true"
      path ="/确认/confirm.jsp" redirect = "true"/>
      ...
      </action-mappings>
      因为A的选座模块局部转发到确认模块,所以path ="/确认/confirm.jsp" redirect = "true"/>

      (注意这里,要想办法把A模块的标志加到confirm.jsp中.以便RequestProcessor能在在confirm.jsp的请求中鉴别出它属于A模块来加载A的相应配置文件,下面会讲到.)

      第二个配置文件大概象:
      <acton-mappings>
      <action ...>
      <forward name = "success" contextRelative = "true"
      path ="/换座,/changeseat.jsp" redirect = "true"/>
      ...
      </action-mappings>
      因为B的选座模块局部转发到换座模块,所以path ="/换座,/changeseat.jsp" redirect = "true"/>

      别的模块依此类推.

      ActionServlet 只有一个, 只管转发请求, 不去动它, 但要重写各个模块的RequestProcessor 的 process() 用覆盖或Decorator 模式只扩展process()功能. 让它鉴别 ActionServlet转发的请求是来源于A的或来源于B的. 类似 request("A", chooseseat) 或 request("B", chooseseat),然后检索和加载相应的模块配置文件: Struts-config-A.xml 和 Struts-config-B.xml. 仍举例A, 当观众点了A选座模块的按钮, 要转到path ="/确认/confirm.jsp, 这时候在confirm.jsp中有A的标志, 当观众选好座位后点击confirm.jsp上的按钮.一个带有A标志的请求发到ActionServlet, 因为"确认"后是"打印票据",printticket.do,所以ActionServlet找到"打印票据"模块后,把请求转发给它的 RequestProcessor.因请求有A的标志,所以process("A" printticket) 能检索加载Struts-config-A.xml 而不是 Struts-config-B.xml.

      依此类推,就把A与B区分开了,并且运行在同一个应用上.

      我也只是想到这里, 能有些建议么?更多精彩文章及讨论,请光临枫下论坛 rolia.net
    • 聆风和电脑民工都不约而同的想到了生成单独的相应配置文件, 不知有例子作参考否?
    • 今天是个好心情,一起床,就看到了聆风,电脑民工的指点.释吾疑, 好!!!多谢二位!!!
    • 说到底, 或者把与A有关的模块配置放在一个Struts配置文件里或者在各个模块下生成A 与B的不同的配置文件.但会有一个总的RequestProcessor处理前着所有A的大的配置文件么?
    • 在多模块下,我知道每个模块应各有一个配置文件.每个模块应有一个RequestProcessor实例. 问题: 1) 和 2) 下面
      问题: 1) 是否有一个总RequestProcessor在所有模块之前? 2) 若用一个包含所有A模块的配置文件,那每个模块的单独配置文件又怎样处理?
      • 见#3264562
    • 再一次性非常感谢聆风和电脑民工的指点, 又总结了下,下面是比较成型的流程.
      本文发表在 rolia.net 枫下论坛1) 有两个入口A与B的, 例如:http://127.0.0.1/A/welcome.do 与 http://127.0.0.1/B/welcome.do
      2) 3个配置文件,Struts-config.xml, Struts-config-A.xml 和 Struts-config-B.xml.
      放在Web.xml中,deploy时加载到内存中以对象形式存在.
      3)ActionServlet 接到 http://127.0.0.1/A/welcome.do后传给RequestProcessor.
      4)RequestProcessor的process()函数用它的processPath()解析URI得到A/welcome字段.
      5)RequestProcessor的process()函数用它的processMapping(request response path)从内存中得到Struts-config-A.xml 的对象.
      6)在session中保存path中的A标志.
      7)观众填完后按钮发送http://127.0.0.1/login.jsp的request请求(注意,这里URI没有A的标志).
      8)ActionServlet 接到 http://127.0.0.1/login.jsp后传给RequestProcessor.
      9)RequestProcessor的process()函数用它的processPath()解析URI得到login字段.
      10)RequestProcessor的process()函数用它的重写的processMapping(request response path)从Request得到session,从session中的到A的标志,然后前缀在path中的login字段前象A/login, 然后再processMapping(request response path)从内存中得到Struts-config-A.xml 的对象.
      11)观众下次按钮循环.
      12)直到结束.更多精彩文章及讨论,请光临枫下论坛 rolia.net
      • sorry, "再一次性" 应改 "再一次"
      • 补充一点介于1)与2),把扩展的RequestProcessor写进Struts-config-A.xml与Struts-config-B.xml的<controller>...</controller>中.
      • 聆风和电脑民工, 能指点下上面我的流程么?看看还有什么不足之处.先谢了.
      • 急急急---有几天没有见到聆风和电脑民工了, 总感觉requestprocessor处不好得到A与B的配置文件.计划周末2天写出来.
    • 繁体字来自转载.我来自山东.有点迷惑关于path从getServletPath()或ProcessPath()
      path 是从ActionServlet的selectApplication()的 request.getServletPath()得到还是从RequestProcessor的process()的ProcessPath()中得到.有点迷惑.
      • Struts旧版本path 是从ActionServlet的selectApplication()的 request.getServletPath()得到,新版本后加的RequestProcessor, 它的process()的ProcessPath()中得path.
    • 慢慢的沉下去了