ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美一区二区视频,久久一本综合,一区精品视频 http://www.aygfsteel.com/nikita/category/39788.htmlzh-cn Thu, 09 Feb 2012 17:32:15 GMT Thu, 09 Feb 2012 17:32:15 GMT 60 解决ServletUrlRenderer WARNè¦å‘Š http://www.aygfsteel.com/nikita/archive/2012/02/09/369656.htmlpicture talk picture talk Thu, 09 Feb 2012 04:42:00 GMT http://www.aygfsteel.com/nikita/archive/2012/02/09/369656.html http://www.aygfsteel.com/nikita/comments/369656.html http://www.aygfsteel.com/nikita/archive/2012/02/09/369656.html#Feedback 1 http://www.aygfsteel.com/nikita/comments/commentRss/369656.html http://www.aygfsteel.com/nikita/services/trackbacks/369656.html ]]>Struts 2与AJAXåQˆç¬¬ä¸€éƒ¨åˆ†åQ? http://www.aygfsteel.com/nikita/archive/2011/08/07/355970.htmlpicture talk picture talk Sun, 07 Aug 2011 14:36:00 GMT http://www.aygfsteel.com/nikita/archive/2011/08/07/355970.html http://www.aygfsteel.com/nikita/comments/355970.html http://www.aygfsteel.com/nikita/archive/2011/08/07/355970.html#Feedback 0 http://www.aygfsteel.com/nikita/comments/commentRss/355970.html http://www.aygfsteel.com/nikita/services/trackbacks/355970.html http://www.aygfsteel.com/max/archive/2007/06/12/123682.html ]]> Struts çš„MVC架构的基本原ç?/title> http://www.aygfsteel.com/nikita/archive/2008/10/04/232275.htmlpicture talk picture talk Fri, 03 Oct 2008 16:07:00 GMT http://www.aygfsteel.com/nikita/archive/2008/10/04/232275.html http://www.aygfsteel.com/nikita/comments/232275.html http://www.aygfsteel.com/nikita/archive/2008/10/04/232275.html#Feedback 0 http://www.aygfsteel.com/nikita/comments/commentRss/232275.html http://www.aygfsteel.com/nikita/services/trackbacks/232275.html
1. 视图 VIEW
   HTML + Struts Tag libè´Ÿè´£™åµé¢æ ¼å¼åQ?比如è¦è¾“å‡ÞZ¸€ä¸ªæŠ¥è¡¨ï¼ŒæŠ¥è¡¨éœ€è¦åˆ†å‡ 列åQŒæ¯åˆ—显½CÞZ»€ä¹ˆé¢œè‰ŒÓ€?br />      Form Bean 负责内容ã€?如报表æ¯ä¸€™åÒŽ(gu¨©)•°æ®å†…å®V€?br />2. 控制å™?Controller)    主è¦ç”?ActionServlet + Action Bean ¾l„æˆã€?br />    ActionServlet 是Struts䏿 ¸å¿?j¨©)的部分åQŒå…¶åŠŸèƒ½å¦‚ä¸‹ã€?br />       ActionServlet负责所有页é¢ä¿¡æ¯æ”¶é›†å’Œ™åµé¢ä¹‹é—´çš„è{æ¢ã€?br />      ¾pÈ»Ÿé€šè¿‡web.xmlçš?<servlet>æ¥é…¾|®ActionServlet       ¾pÈ»Ÿé€šè¿‡web.xml çš?lt;init-param>ž®†Struts-config.xml 载入内å˜ä»¥å¤‡ActionServlet调用       validation.xmlä»?lt;plug-in>æ–ÒŽ(gu¨©)³•载入内å˜å¤‡ActionServlet调用ã€?br />            ActionBean 的性能如下åQ?br />            ActionServlet通过Struts-config.xm 的酾|®æ¥è°ƒç”¨ç›¸åº”çš„Action Bean.       Action Bean 从Form Bean å–出相应的倹{€?br />      Action Bean 把相应的å€ég»˜¾l™Form Bean       Action Bean 负责调用相应的Model,       Action Bean è´Ÿè´£ž®†é¡µé¢å‘å‰ä¼ 递到相应的页é¢ã€?br />3. 模型 (Model)       模型Model 主è¦è´Ÿè´£ä¸šåŠ¡é€»è¾‘å®žçŽ°åQŒåŒ…括Web Service ã€Session Bean å’?Entity Bean. ä»Žæ•°æ®æµçš„角度æ¥çœ‹ï¼Œ˜q™ä¸€˜q‡ç¨‹ä¸»è¦åŒ…括以下两个斚w¢åQ?br />        (1)ž®†å‰ç«¯çš„From Bean 的数æ®ä¼ 到åŽç«¯ï¼Œ˜q›è¡Œæ•°æ®åº“çš„æ’å…¥åQŒæ›´æ–°å’Œåˆ 除ã€?br />         (2)æ ÒŽ(gu¨©)®å‰ç«¯çš„请求,选择数æ®åº“æ•°æ®ï¼Œž®†æ•°æ®ä¼ 到å‰ç«¯çš„Form Bean ----------------------------------------------------------------------------------------------------------------------------------------------
java.lang.Object   |   +--javax.servlet.GenericServlet         |         +--javax.servlet.http.HttpServlet               |               +--org.apache.struts.action.ActionServlet Strutsæä¾›äº?ji¨£n)一个缺çœç‰ˆæœ¬çš„ActionServlet¾c»ï¼Œä½ å¯ä»¥ç‘ô承这个类åQŒè¦†ç›–å…¶ä¸çš„一些方法æ¥è¾‘Öˆ°ä½ çš„ç‰ÒŽ(gu¨©)®Šå¤„ç†çš„需è¦ã€‚ActionServlet¾l§æ‰¿ä¸Žjavax.servlet.http.HttpServletåQŒæ‰€ä»¥åœ¨æœ¬è´¨ä¸Šå®ƒå’Œä¸€ä¸ªæ™®é€šçš„servlet没有区别åQŒä½ 完全å¯ä»¥æŠŠå®ƒå½“åšä¸€ä¸ªservletæ¥çœ‹å¾…ï¼Œåªæ˜¯åœ¨å…¶ä¸å®Œæˆçš„功能ä¸åŒ¾|¢äº†(ji¨£n)。ActionServlet主è¦å®Œæˆå¦‚下功能åQ?br /> ž®†ä¸€ä¸ªæ¥è‡ªå®¢æˆïL(f¨¥ng)«¯çš„URIæ˜ å°„åˆîC¸€ä¸ªç›¸åº”çš„Action¾c?br />
如果是这个Action¾cÀL˜¯½W¬ä¸€‹Æ¡è¢«è°ƒç”¨åQŒé‚£ä¹ˆå®žä¾‹åŒ–ä¸€ä¸ªåÆˆæ”‘Ö…¥¾~“å˜
如果在酾|®æ–‡ä»?struts-config.xml)䏿Œ‡å®šäº†(ji¨£n)相应的ActionFormåQŒé‚£ä¹ˆä»ŽRequest䏿Г喿•°æ®å¡«å……FormBean
调用˜q™ä¸ªAction¾cÈš„perform()æ–ÒŽ(gu¨©)³•åQŒä¼ å…¥ActionMapping的一个引用,对应的ActionFormã€ä»¥å?qi¨¢ng)ç”±å®¹å™¨ä¼ ç»™ActionServletçš„HttpServletRequestã€HttpServletResponse对象ã€?/font>
¼‹®çœç‰ˆæœ¬çš„ActionServletä¼?x¨¬)从é…置文äšgweb.xmlä¸è¯»å–如下åˆå§‹åŒ–傿•°åQ?br />
application 应用使用的资æºåŒ…(resources bundle)的基¾c?br />
factory 用于创å¾åº”用的MessageResources对象的MessageResourcesFactory的类åã€‚ç¡®çœæ˜¯org.apache.struts.util.PropertyMessageResourcesFactoryã€?br />
config Struts的酾|®æ–‡ä»Óž¼Œ¼‹®çœæ˜?WEB-INF/struts-config.xml。注æ„这儿是与应用Contextå…Œ™”的相对èµ\径ã€?br />
content 定义äº?ji¨£n)ç¡®çœçš„内容¾cÕdž‹å’Œç¼–ç æ ¼å¼ï¼Œå®ƒä¼š(x¨¬)被自动地被设¾|®åˆ°æ¯ä¸ªresponseä¸ï¼Œå¦‚æžœJSP/Servlet䏿²¡æœ‰æ˜Ž¼‹®çš„讄¡½®ã€‚ç¡®çœæ˜¯text/htmlã€?br />
debug 调试信æ¯çš„çñ”åˆ«ã€‚é»˜è®¤äØ“(f¨´)0åQŒæ¯”当剾U§åˆ«é«˜çš„调试信æ¯ä¼?x¨¬)被log到日志文件ä¸ã€?br />
detail 与debug的作用类ä¼û|¼Œåªæ˜¯˜q™ä¸ªdetail是initMapping()时专用的。调试信æ¯ä¼š(x¨¬)被打å°åˆ°System.outåQŒè€Œä¸æ˜¯æ—¥å¿—文件ã€?br />
formBean ActionFormBean的实现类åQŒç¡®çœäØ“(f¨´)org.apache.struts.action.ActionFormBean
forward 应用ä¸ä‹É用的ActionForward¾c»ï¼Œ¼‹®çœæ˜¯org.apache.struts.action.ActionForwardã€?br />
locale 指定äº?ji¨£n)ç¡®çœä‹É用的Locale对象。设为trueåQŒå½“得到一个sessionæ—Óž¼Œä¼?x¨¬)自动在sessionä¸å˜å‚¨ä¸€ä¸ªä»¥Action.LOCALE_KEYæ ‡ç¤ºçš„Locale对象åQŒå¦‚æžœsessionä¸è¿˜æ²¡æœ‰ä¸ŽAction.LOCALE_KEY¾l‘定的Locale对象ã€?br />
mapping 应用ä¸ä‹É用的ActionMapping¾c»ï¼Œ¼‹®çœæ˜¯org.apache.struts.action.ActionMappingã€?br />
multipartClass æ–‡äšgä¸Šä¼ ä½¿ç”¨çš„MutipartRequestHandler的实现类。确çœäØ“(f¨´)org.apache.struts.upload.DiskMultipartRequestHandler
nocache å¦‚æžœè®¾äØ“(f¨´)trueåQŒé‚£ä¹ˆActionServletä¼?x¨¬)自动在æ¯ä¸ªåˆ°å®¢æˆïL(f¨¥ng)«¯çš„å“åº”ä¸æ·ÕdŠ nocacheçš„HTMLå¤ß_(d¨¢)¼Œ˜q™æ ·å®¢æˆ·ç«¯å°±ä¸ä¼š(x¨¬)对应用ä¸çš„页é¢è¿›è¡Œç¼“å˜ã€‚ç¡®çœäØ“(f¨´)false
null 如果讄¡½®ä¸ºtrueåQŒé‚£ä¹ˆåº”用在得到一个未定义的messageèµ„æºæ—Óž¼Œä¼?x¨¬)返回nullåQŒè€Œä¸æ˜¯è¿”回一个错误信æ¯ã€‚ç¡®çœæ˜¯trueã€?br />
maxFileSize æ–‡äšgä¸Šä¼ çš„å¤§ž®ä¸Šé™ï¼Œ¼‹®çœä¸?50M
bufferSize æ–‡äšgä¸Šä¼ æ—¶çš„¾~“冲区的大å°åQŒç¡®çœäØ“(f¨´)4M
tempDir 讄¡½®ç”¨äºŽä¸Šä¼ 时的临时目录。工作目录会(x¨¬)ä½œäØ“(f¨´)一个Servlet环境åQˆContextåQ‰çš„属性æä¾›ã€?br />
validate Are we using the new configuration file format?¼‹®çœä¸ºtrueã€?br />
validating
在解æžé…¾|®XMLæ–‡äšg是是å¦è¿›è¡Œæœ‰æ•ˆæ€§çš„验è¯ã€‚ç¡®çœäØ“(f¨´)true ActionServletä¸åº”用了(ji¨£n)命ä×o(h¨´)设计模å¼ã€?br /> 一个Servletåœ¨ç”±å®¹å™¨ç”Ÿæˆæ—Óž¼Œé¦–å…ˆä¼?x¨¬)调用init()æ–ÒŽ(gu¨©)³•˜q›è¡Œåˆå§‹åŒ–,在接åˆîC¸€ä¸ªHTTPè¯äh±‚æ—Óž¼Œè°ƒç”¨ç›¸åº”的方法进行处ç†ï¼›æ¯”如GETè¯äh±‚调用doGet()æ–ÒŽ(gu¨©)³•åQŒPOSTè¯äh±‚调用doPost()æ–ÒŽ(gu¨©)³•。所以首先看看ActionServletçš„init()æ–ÒŽ(gu¨©)³•åQŒä½ ž®×ƒ¼š(x¨¬)å¾ˆæ¸…æ¥šäØ“(f¨´)什么ActionServletå¯ä»¥å®Œæˆ˜q™äº›åŠŸèƒ½äº?ji¨£n)ã€?br />
init()
在它的init()æ–ÒŽ(gu¨©)³•ä¸ï¼ŒActionServlet便¬¡è°ƒç”¨å¦‚下protected的方法完æˆåˆå§‹åŒ–åQ?br />
initActions() åQ     大家å¯èƒ½è¿˜æ›¾æœ‰˜q™ä¸ªç–‘é—®åQšStrutsä¸ÞZ»€ä¹ˆå¯ä»¥æ‰¾åˆîC¸€ä¸ªè¯·æ±‚URI对应的action¾cÕd‘¢åQŸç”案就在这儿,ActionServlet有一个actions属性,¾cÕdž‹ä¸ºorg.apache.struts.util.FastHashMapåQŒç”¨äºŽå˜å‚¨ä»¥¾cÈš„å…¨å为key的已实例化的Action¾c…R€‚在init()æ—‰™¦–先调用的ž®±æ˜¯initActions()æ–ÒŽ(gu¨©)³•åQŒåœ¨˜q™ä¸ªæ–ÒŽ(gu¨©)³•ä¸åªæ˜¯ç®€å•的清除mapä¸çš„æ‰€æœ‰çš„å值对åQ?br />
        synchronized  (actions) {
            actions.setFast(false );
            actions.clear();
            actions.setFast(true );
        }
首先把actionsè®¾äØ“(f¨´)slow模å¼åQŒè¿™æ—¶å¯¹FastHashMap的访问是¾U¿ç¨‹åŒæ¥çš„ï¼Œç„¶åŽæ¸…除actionsä¸çš„æ‰€æœ‰çš„å·²å˜åœ¨çš„å?值对åQŒæœ€åŽå†æŠŠactions的模å¼è®¾ä¸ºfast。由于FastHashMap是struts在java.util.HashMap的基¼‹€ä¸Šçš„一个扩展类åQŒæ˜¯ä¸ÞZº†(ji¨£n)适应多线½E‹ã€åƈ且对HashMap的访问大部分是åªè¯Èš„ç‰ÒŽ(gu¨©)®ŠçŽ¯å¢ƒçš„éœ€è¦ã€‚大家知é“java.util.HashMap是鞾U¿ç¨‹å®‰å…¨çš„,所以HashMap一般适用于啾U¿ç¨‹çŽ¯å¢ƒä¸‹ã€‚org.apache.struts.FastHashMapž®±æ˜¯¾l§æ‰¿äºŽjava.util.HashMapåQŒåœ¨å…¶ä¸æ·ÕdŠ å¤šçº¿½E‹çš„æ”¯æŒäº§ç”Ÿçš„。在fast模å¼ä¸‹çš„å·¥ä½œæ–¹å¼æ˜¯è¿™æ ïL(f¨¥ng)š„åQšè¯»å–是éžçº¿½E‹åŒæ¥çš„åQ›å†™å…¥æ—¶é¦–先克隆当å‰mapåQŒç„¶åŽåœ¨˜q™ä¸ªå…‹éš†ä¸Šåšå†™å…¥æ“åšåQŒå®ŒæˆåŽç”¨è¿™ä¸ªä¿®æ”¹åŽçš„克隆版本替æ¢åŽŸæ¥çš„map。那么在什么时候会(x¨¬)把Actions¾cÀL·»åŠ åˆ°˜q™ä¸ªmapä¸å‘¢åQŸæˆ‘们已¾læåˆîCº†(ji¨£n)struts是动æ€çš„生æˆAction¾cÈš„实例的,在毋ơActionServlet接收åˆîC¸€ä¸ªGET或POSTçš„HTTPè¯äh±‚æ—Óž¼Œä¼?x¨¬)在˜q™ä¸ªmap䏿Ÿ¥æ‰‘Ö¯¹åº”çš„Action¾cÈš„实例åQŒå¦‚æžœä¸å˜åœ¨åQŒé‚£ä¹ˆå°±å®žä¾‹åŒ–一个,òq¶æ”¾å…¥mapä¸ã€‚å¯è§è¿™ä¸ªactions属性è“våˆîCº†(ji¨£n)对Action¾cÕd®žä¾‹çš„¾~“å˜çš„作用ã€?br />
initInternal() åQ     åˆå§‹åŒ–ActionServlet内部使用的资æºåŒ…MessageResourcesåQŒä‹É用MessageResources.getMessageResources(internalName)得到    internalNameä¸?org.apache.struts.action.ActionResources"对应的ActionResources.propertiesæ–‡äšg。这个资æºåŒ…主è¦ç”¨äºŽActionServlet处熘q‡ç¨‹ä¸çš„用到的æ½CÞZ¿¡æ¯ï¼Œ˜q™å„¿ä¸å±•开讨论ã€?br />
initDebug() åQ     从web.xmlä¸è¯»å–本应用的debug¾U§åˆ«å‚æ•°getServletConfig().getInitParameter("debug")åQŒç„¶åŽèµ‹¾l™debug属性ã€?br />
initApplication()åQ    åˆå§‹åŒ–应用资æºåŒ…,òq¶æ”¾¾|®å…¥ServletContextä¸ã€?br />
        String  factory =getServletConfig().getInitParameter(“factoryâ€?;   Â
        String  oldFacory = MessageResourcesFactory.getFactoryClass();
        if  (factory !=null )
                MessageResourcesFactory.setFactoryClass(factory);
        String  value = getServletConfig().getInitParameter("application" );
        MessageResourcesFactory factoryObject =
                MessageResourcesFactory.createFactory();
        application = factoryObject.createResources(value);
        MessageResourcesFactory.setFactory(oldFactory);Â
        getServletContext().setAttribute(Action .MESSAGES_KEY, application);
说明åQšæ–‡ä¸å¼•用的代ç 片æ–å¯èƒ½ä¼?x¨¬)çœç•¥äº?ji¨£n)一些例外检查ç‰éžä¸»¾U¿çš„内容åQŒæ•¬è¯äh³¨æ„ã€?br /> 首先从酾|®æ–‡ä»¶ä¸è¯Õd–factory傿•°åQŒå¦‚æžœè¿™ä¸ªå‚æ•îC¸ä¸ºç©ºåQŒé‚£ä¹ˆå°±åœ¨MessageResourcesFactoryä¸ä‹É用这个指定的Factory¾c»ï¼›å¦åˆ™åQŒä‹É用默认的工厂¾c»org.apche.struts.util.PropertyMessageResourceFactory。然åŽè°ƒç”¨MessageResourcesFactoryçš„é™(r¨´n)æ€createFactory()æ–ÒŽ(gu¨©)³•åQŒç”Ÿæˆä¸€ä¸ªå…·ä½“çš„MessageResourceFactory对象åQˆæ³¨æ„:(x¨¬)MessageResourcesFactory是抽象类åQ‰ã€‚è¿™æ ·å°±å¯ä»¥è°ƒç”¨˜q™ä¸ªå…·ä½“çš„MessageResourceFactoryçš„createResource()æ–ÒŽ(gu¨©)³•得到é…置文äšg(web.xml)ä¸å®šä¹‰çš„èµ„æºæ–‡äšgäº?ji¨£n)ã€?br />上é¢çš„application对象¾cÕdž‹ä¸ºMessageResources。在web.xmlä¸åœ¨é…ç½®ActionServletæ—¶å¯ä»¥æŒ‡å®šä¸€ä¸ªç‰¹å®šçš„工厂¾c…R€‚ä¸èƒ½ç›´æŽ¥MessageResourcesFactoryçš„createResources()æ–ÒŽ(gu¨©)³•åQŒå› 䏸™¿™ä¸ªæ–¹æ³•是abstract的。创建factoryObject的过½E‹å¦‚下:(x¨¬)
   Â
        MessageResourceFactory factoryObject=
                MessageResourcesFactory.createFactory();
        application = factoryObject.createResources(value);
<li>initMapping() åQÂ Â Â Â äØ“(f¨´)应用åˆå§‹åŒ–mappingä¿¡æ¯ActionServlet有一个protected的属性:(x¨¬)mappingåQŒå°è£…了(ji¨£n)一个ActionMapping的对象集åˆï¼Œä»¥ä¾¿äºŽç®¡ç†ã€æŸ¥æ‰¾ActionMapping。mappings是org.apache.struts.action.ActionMappings¾cÈš„å®žä¾‹ã€‚ä¸»è¦æœ‰ä¸¤ä¸ªæ–ÒŽ(gu¨©)³•åQšaddMapping(ActionMapping mapping)å’ŒfindMapping(String path)。ActionMappingä¹Ÿæ˜¯ä½¿ç”¨ä¸Šé¢æåˆ°çš„org.apache.struts.util.FastHashMap¾cÀL¥å˜å‚¨æ‰€æœ‰çš„ActionMapping对象ã€?br />
        mappings.setServlet(this );
        …�
        // I(y¨ªng)nitialize the name of our ActionFormBean implementation class
        value = getServletConfig().getInitParameter("formBean" );
        if  (value != null )
            formBeanClass = value;
   Â
        // I(y¨ªng)nitialize the name of our ActionForward implementation class
        value = getServletConfig().getInitParameter("forward" );
        if  (value != null )
                forwardClass = value;
        // I(y¨ªng)nitialize the name of our ActionMapping implementation class
        value = getServletConfig().getInitParameter("mapping" );
        if  (value != null )
                mappingClass = value;
在initMapping()ä¸ï¼Œé¦–先链接mappings对象到本servlet实例。其实这å¥è¯çš„作用很½Ž€å•,在ActionMappingsä¸ä¼š(x¨¬)有一个ActionServlet¾cÕdž‹çš„属性,˜q™ä¸ªå±žæ€§å°±ç•Œå®šäº?ji¨£n)这个ActionMappings对象所属的ActionServlet。Struts的实现比较絋z»ï¼Œå…¶ä¸çš„ActionFormBeanã€ActionForwardã€ActionMapping¾cÖM½ 完全å¯ä»¥ä½¿ç”¨è‡ªå·±å®žçŽ°çš„å¾c»ï¼Œæ¥å®šåˆ¶Struts的工作方å¼ã€‚上é¢çš„ä»£ç ž®×ƒ»Žé…置文äšgåQˆweb.xmlåQ‰ä¸è¯Õd–formBeanã€forwardã€mapping傿•°åQŒè¿™äº›å‚æ•°å°±æ˜¯ä½ å®šåˆ¶çš„ActionFormBeanã€ActionForwardã€ActionMapping¾cÕdã€?br />
        // I(y¨ªng)nitialize the context-relative path to our configuration resources
        value = getServletConfig().getInitParameter("config" );
        if  (value != null )
                config = value;
                // Acquire an input stream to our configuration resource
        InputStream  input = getServletContext().getResourceAsStream(config);
        Digester digester = null ;
                digester = initDigester(detail);
        try  {
                formBeans.setFast(false );
                forwards.setFast(false );
                mappings.setFast(false );
                digester.parse(input);
                mappings.setFast(true );
                forwards.setFast(true );
                formBeans.setFast(true );
        } catch  (SAXException  e) {
                throw  new  ServletException
        (internal.getMessage("configParse" , config), e);
        } finally  {
                input.close();
        }
从web.xmlè¯Õd–Struts的酾|®æ–‡ä»¶çš„ä½ç½®ã€‚ä‹É用org.apache.struts.digester.Digesterè§£æžconfig傿•°æ ‡ç¤ºçš„é…¾|®æ–‡ä»Óž¼Œé€šå¸¸ä¸ºâ€?WEB-INF/struts-config.xmlâ€ï¼Œè§£æžå‡ºæ‰€æœ‰çš„data-sourceã€form-beanã€action-mappingã€forward。从上é¢çš„程åºç‰‡æ–看刎ͼŒDigester仅仅调用äº?ji¨£n)一个parse()æ–ÒŽ(gu¨©)³•åQŒé‚£ä¹ˆï¼ŒDigesteræ˜¯æ€Žæ ·æŠŠè§£æžstruts-config.xmlæ–‡äšgòq¶æŠŠè§£æžçš„结果form-bean½{‰ä¿¡æ¯å˜å‚¨åˆ°å±žæ€§å˜é‡formBeans½{‰ä¸çš„å‘¢åQŸä½ å¯ä»¥æ³¨æ„到在调用digester.parse(InputStream)之å‰åQŒé¦–先调用了(ji¨£n)initDigester()æ–ÒŽ(gu¨©)³•åQ?br />
        Digester digester = new  Digester();
        digester.push(this );
        digester.addObjectCreate("struts-config/action-mappings/action" ,
                                 mappingClass, "className" );
        digester.addSetProperties("struts-config/action-mappings/action" );
        digester.addSetNext("struts-config/action-mappings/action" ,
                            "addMapping" ,
                            "org.apache.struts.action.ActionMapping" );
        digester.addSetProperty
            ("struts-config/action-mappings/action/set-property" ,
             "property" , "value" );
在这个方法ä¸é¦–先生æˆä¸€ä¸ªDigester对象åQŒç„¶åŽè®¾¾|®è§£æžçš„è§„åˆ™å’Œå›žè°ƒï¼Œå¦‚æžœä½ å¯¹XMLã€SAX䏿˜¯å¾ˆç†ŸåQŒè¿™å„¿ä¸å¿…çº ¾~ å¤ªæ·±ã€‚è¦æ³¨æ„的是addSetNext()æ–ÒŽ(gu¨©)³•åQŒè®¾¾|®äº†(ji¨£n)æ¯ä¸€ä¸ªè¦è§£æžå…ƒç´ çš„Set Next回调æ–ÒŽ(gu¨©)³•åQŒè€Œè¿™ä¸ªæ–¹æ³•就是由digesterè§£æžå™¨çš„父æä¾›çš„。上é¢çš„片æ–ä¸çš„“addMappingâ€å°±æ˜¯ActionServlet本èín定义的一个方法,ž®†ç”±Digester回调。Digesterž®±æ˜¯¾cæ¤æŠŠè§£æžå‡ºçš„æ¯ä¸€ä¸ªFormBeanã€ActionForwardã€ActionMapping½{‰å˜å‚¨åˆ°å±žæ€§å˜é‡formBeansã€forwardsã€mappings½{‰ä¸çš„ã€?br />
initUpload() åQ    åˆå§‹åŒ–有关Uploadçš„ä¸€äº›å‚æ•ŽÍ¼Œæ¯”如åQšbufferSizeã€tempDirã€?br />
initDataSource() åQå–出在initMapping()ä¸ä»Žé…置文äšgä¸è¯»å–çš„æ¯ä¸€ä¸ªDataSourceåQŒè®¾¾|®LogWriteråQŒå¦‚æžœäØ“(f¨´)GenericDataSourceçš„å®žä¾‹ï¼Œåˆ™æ‰“å¼€æ•°æ®æºã€‚ç„¶åŽï¼ŒæŠŠæ¯ä¸ªdataSource攑օ¥Contextä¸ã€?br />dataSource.setLogWriter(scw)åQ?br />((GenericDataSource)dataSource).open(); getServletContext().setAttribute(key,dataSource);
initOther() åQ        设¾|®å…¶å®ƒå°šæœªåˆå§‹åŒ–çš„çš„å‚æ•°åQˆcontentã€localeã€nocacheåQ‰ï¼Œòq¶å‘布formBeansã€forwardsã€mappings到ContextåQ?br />getServletContext().setAttribute(Action.FORM_BEANS_KEY, formBeans); getServletContext().setAttribute(Action.FORWARDS_KEY, forwards); getServletContext().setAttribute(Action.MAPPINGS_KEY, mappings);
initServlet() åQ    åˆå§‹åŒ–Controller Servletçš„Servlet Mapping。这儿也使用äº?ji¨£n)Digester工具åQŒæ‰«æweb.xml所有的<web-app/servlet-mapping>åQŒå¯»æ‰¾servlet-name与当å‰Servlet相åŒçš„mappingåQŒç½®å…¥Context。代ç 如下;
        Digester digester = new  Digester();
        digester.push(this );
        digester.setDebug(debug);
        digester.setValidating(validating);
        digester.addCallMethod(“web-appservlet-mapping�“addServletMapping� 2);
        digester.addCallParm(“web-appservlet-mappingservlet-name� 0);
        digester.addCallParm(“web-appservlet-mappingurl-pattern� 1);
        InputStream  is = getServletContext().getResourceAsStream(�WEB-INFweb.xml�;
        digester.parse(is);Â
        getServletContext().setAttribute(Action .SERVLET_KEY,servletMapping);
]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º
Ïî³ÇÊÐ |
ÎäÇ¿ÏØ |
³£É½ÏØ |
ÒÍÁ¼ÏØ |
Æ½Ì¶ÏØ |
»Æ´óÏÉÇø |
Áé´¨ÏØ |
ºÓ¼äÊÐ |
³çÀñÏØ |
äÒÖÐÏØ |
Î÷ÎÚÖéÄÂÇ߯ì |
ãë´¨ÏØ |
Çí½áÏØ |
Ã×Ò×ÏØ |
¸ÊÈªÏØ |
ÓÀÄþÏØ |
Óå±±Çø |
°¢ÀÕÌ©ÊÐ |
ÐËÒåÊÐ |
ÎߺþÏØ |
ÜõÍåÇø |
ÐÂÃÜÊÐ |
ɽÎ÷Ê¡ |
ͨº£ÏØ |
Ëì²ýÏØ |
ËÕÄáÌØ×óÆì |
ÉÐÒåÏØ |
Ê®ÑßÊÐ |
Î÷³ÇÇø |
¹ÌÕòÏØ |
³£µÂÊÐ |
¸·¿µÊÐ |
Óà½ÏØ |
ÇåÐÂÏØ |
ÖÜÖÁÏØ |
¼ÎÀèÏØ |
¡µÂÏØ |
´óÍ¬ÏØ |
̨ÖÐÏØ |
º¼½õÆì |
¿ªÔÊÐ |