ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美一区二区视频,久久一本综合,一区精品视频http://www.aygfsteel.com/nikita/category/39788.htmlzh-cnThu, 09 Feb 2012 17:32:15 GMTThu, 09 Feb 2012 17:32:15 GMT60解决ServletUrlRenderer WARN警告http://www.aygfsteel.com/nikita/archive/2012/02/09/369656.htmlpicture talkpicture talkThu, 09 Feb 2012 04:42:00 GMThttp://www.aygfsteel.com/nikita/archive/2012/02/09/369656.htmlhttp://www.aygfsteel.com/nikita/comments/369656.htmlhttp://www.aygfsteel.com/nikita/archive/2012/02/09/369656.html#Feedback1http://www.aygfsteel.com/nikita/comments/commentRss/369656.htmlhttp://www.aygfsteel.com/nikita/services/trackbacks/369656.html

]]>
Struts 2与AJAXåQˆç¬¬ä¸€éƒ¨åˆ†åQ?http://www.aygfsteel.com/nikita/archive/2011/08/07/355970.htmlpicture talkpicture talkSun, 07 Aug 2011 14:36:00 GMThttp://www.aygfsteel.com/nikita/archive/2011/08/07/355970.htmlhttp://www.aygfsteel.com/nikita/comments/355970.htmlhttp://www.aygfsteel.com/nikita/archive/2011/08/07/355970.html#Feedback0http://www.aygfsteel.com/nikita/comments/commentRss/355970.htmlhttp://www.aygfsteel.com/nikita/services/trackbacks/355970.htmlhttp://www.aygfsteel.com/max/archive/2007/06/12/123682.html

]]>
Struts çš„MVC架构的基本原ç?/title><link>http://www.aygfsteel.com/nikita/archive/2008/10/04/232275.html</link><dc:creator>picture talk</dc:creator><author>picture talk</author><pubDate>Fri, 03 Oct 2008 16:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/nikita/archive/2008/10/04/232275.html</guid><wfw:comment>http://www.aygfsteel.com/nikita/comments/232275.html</wfw:comment><comments>http://www.aygfsteel.com/nikita/archive/2008/10/04/232275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/nikita/comments/commentRss/232275.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/nikita/services/trackbacks/232275.html</trackback:ping><description><![CDATA[ <p> <strong>1. 视图 VIEW<br /></strong> <br />   HTML + Struts Tag libè´Ÿè´£™åµé¢æ ¼å¼åQ?比如è¦è¾“å‡ÞZ¸€ä¸ªæŠ¥è¡¨ï¼ŒæŠ¥è¡¨éœ€è¦åˆ†å‡ åˆ—åQŒæ¯åˆ—显½CÞZ»€ä¹ˆé¢œè‰ŒÓ€?br />   <br />   Form Bean 负责内容ã€?如报表æ¯ä¸€™åÒŽ(gu¨©)•°æ®å†…å®V€?br /><br /><strong>2. 控制å™?Controller)</strong><br /><br />   主è¦ç”?ActionServlet + Action Bean ¾l„æˆã€?br /><br />   ActionServlet 是Struts中核å¿?j¨©)的部分åQŒå…¶åŠŸèƒ½å¦‚ä¸‹ã€?br /><br />      ActionServlet负责所有页é¢ä¿¡æ¯æ”¶é›†å’Œ™åµé¢ä¹‹é—´çš„è{æ¢ã€?br />      ¾pÈ»Ÿé€šè¿‡web.xmlçš?<servlet>æ¥é…¾|®ActionServlet<br />      ¾pÈ»Ÿé€šè¿‡web.xml çš?lt;init-param>ž®†Struts-config.xml 载入内存以备ActionServlet调用<br />      validation.xmlä»?lt;plug-in>æ–ÒŽ(gu¨©)³•载入内存备ActionServlet调用ã€?br />         <br />   ActionBean 的性能如下åQ?br />      <br />      ActionServlet通过Struts-config.xm 的酾|®æ¥è°ƒç”¨ç›¸åº”çš„Action Bean.<br />      Action Bean 从Form Bean å–出相应的倹{€?br />      Action Bean 把相应的å€ég»˜¾l™Form Bean<br />      Action Bean 负责调用相应的Model,<br />      Action Bean è´Ÿè´£ž®†é¡µé¢å‘å‰ä¼ é€’到相应的页é¢ã€?br /><br /><strong>3. 模型 (Model)</strong><br /><br />      模型Model 主è¦è´Ÿè´£ä¸šåŠ¡é€»è¾‘å®žçŽ°åQŒåŒ…括Web Service ã€Session Bean å’?Entity Bean. ä»Žæ•°æ®æµçš„角度æ¥çœ‹ï¼Œ˜q™ä¸€˜q‡ç¨‹ä¸»è¦åŒ…括以下两个斚w¢åQ?br /><br />        (1)ž®†å‰ç«¯çš„From Bean 的数æ®ä¼ åˆ°åŽç«¯ï¼Œ˜q›è¡Œæ•°æ®åº“çš„æ’å…¥åQŒæ›´æ–°å’Œåˆ é™¤ã€?br /><br />        (2)æ ÒŽ(gu¨©)®å‰ç«¯çš„请求,选择数æ®åº“æ•°æ®ï¼Œž®†æ•°æ®ä¼ åˆ°å‰ç«¯çš„Form Bean <br /><br /><br /><br />----------------------------------------------------------------------------------------------------------------------------------------------<br /><br /></p> <p> <font size="2">java.lang.Object<br />  |<br />  +--javax.servlet.GenericServlet<br />        |<br />        +--javax.servlet.http.HttpServlet<br />              |<br />              +--org.apache.struts.action.ActionServlet<br /><br />Strutsæä¾›äº?ji¨£n)一个缺çœç‰ˆæœ¬çš„ActionServlet¾c»ï¼Œä½ å¯ä»¥ç‘ô承这个类åQŒè¦†ç›–其中的一些方法æ¥è¾‘Öˆ°ä½ çš„ç‰ÒŽ(gu¨©)®Šå¤„ç†çš„需è¦ã€‚ActionServlet¾l§æ‰¿ä¸Žjavax.servlet.http.HttpServletåQŒæ‰€ä»¥åœ¨æœ¬è´¨ä¸Šå®ƒå’Œä¸€ä¸ªæ™®é€šçš„servlet没有区别åQŒä½ å®Œå…¨å¯ä»¥æŠŠå®ƒå½“åšä¸€ä¸ªservletæ¥çœ‹å¾…ï¼Œåªæ˜¯åœ¨å…¶ä¸­å®Œæˆçš„功能ä¸åŒ¾|¢äº†(ji¨£n)。ActionServlet主è¦å®Œæˆå¦‚下功能åQ?br /><br />ž®†ä¸€ä¸ªæ¥è‡ªå®¢æˆïL(f¨¥ng)«¯çš„URI映射åˆîC¸€ä¸ªç›¸åº”çš„Action¾c?br /></font> </p> <ul> <li> <font size="2">如果是这个Action¾cÀL˜¯½W¬ä¸€‹Æ¡è¢«è°ƒç”¨åQŒé‚£ä¹ˆå®žä¾‹åŒ–ä¸€ä¸ªåÆˆæ”‘Ö…¥¾~“å­˜<br /></font> </li> <li> <font size="2">如果在酾|®æ–‡ä»?struts-config.xml)中指定了(ji¨£n)相应的ActionFormåQŒé‚£ä¹ˆä»ŽRequestä¸­æŠ“å–æ•°æ®å¡«å……FormBean<br /></font> </li> <li> <font size="2">调用˜q™ä¸ªAction¾cÈš„perform()æ–ÒŽ(gu¨©)³•åQŒä¼ å…¥ActionMapping的一个引用,对应的ActionFormã€ä»¥å?qi¨¢ng)由容器传给ActionServletçš„HttpServletRequestã€HttpServletResponse对象ã€?/font> </li> </ul> <p> <br /> <br /> <font size="2">¼‹®çœç‰ˆæœ¬çš„ActionServletä¼?x¨¬)从é…置文äšgweb.xml中读å–如下åˆå§‹åŒ–傿•°åQ?br /></font> </p> <ul> <li> <font size="2">application<br />应用使用的资æºåŒ…(resources bundle)的基¾c?br /></font> </li> <li> <font size="2">factory<br />用于创å¾åº”用的MessageResources对象的MessageResourcesFactory的类åã€‚ç¡®çœæ˜¯org.apache.struts.util.PropertyMessageResourcesFactoryã€?br /></font> </li> <li> <font size="2">config<br />Struts的酾|®æ–‡ä»Óž¼Œ¼‹®çœæ˜?WEB-INF/struts-config.xml。注æ„这儿是与应用Contextå…Œ™”的相对èµ\径ã€?br /></font> </li> <li> <font size="2">content<br />定义äº?ji¨£n)ç¡®çœçš„内容¾cÕdž‹å’Œç¼–ç æ ¼å¼ï¼Œå®ƒä¼š(x¨¬)被自动地被设¾|®åˆ°æ¯ä¸ªresponse中,如果JSP/Servlet中没有明¼‹®çš„讄¡½®ã€‚ç¡®çœæ˜¯text/htmlã€?br /></font> </li> <li> <font size="2">debug<br />调试信æ¯çš„çñ”åˆ«ã€‚é»˜è®¤äØ“(f¨´)0åQŒæ¯”当剾U§åˆ«é«˜çš„调试信æ¯ä¼?x¨¬)被log到日志文件中ã€?br /></font> </li> <li> <font size="2">detail<br />与debug的作用类ä¼û|¼Œåªæ˜¯˜q™ä¸ªdetail是initMapping()时专用的。调试信æ¯ä¼š(x¨¬)被打å°åˆ°System.outåQŒè€Œä¸æ˜¯æ—¥å¿—文件ã€?br /></font> </li> <li> <font size="2">formBean<br />ActionFormBean的实现类åQŒç¡®çœäØ“(f¨´)org.apache.struts.action.ActionFormBean<br /></font> </li> <li> <font size="2">forward<br />应用中ä‹É用的ActionForward¾c»ï¼Œ¼‹®çœæ˜¯org.apache.struts.action.ActionForwardã€?br /></font> </li> <li> <font size="2">locale<br />指定äº?ji¨£n)ç¡®çœä‹É用的Locale对象。设为trueåQŒå½“得到一个sessionæ—Óž¼Œä¼?x¨¬)自动在session中存储一个以Action.LOCALE_KEY标示的Locale对象åQŒå¦‚æžœsession中还没有与Action.LOCALE_KEY¾l‘定的Locale对象ã€?br /></font> </li> <li> <font size="2">mapping<br />应用中ä‹É用的ActionMapping¾c»ï¼Œ¼‹®çœæ˜¯org.apache.struts.action.ActionMappingã€?br /></font> </li> <li> <font size="2">multipartClass<br />æ–‡äšg上传使用的MutipartRequestHandler的实现类。确çœäØ“(f¨´)org.apache.struts.upload.DiskMultipartRequestHandler<br /></font> </li> <li> <font size="2">nocache<br />å¦‚æžœè®¾äØ“(f¨´)trueåQŒé‚£ä¹ˆActionServletä¼?x¨¬)自动在æ¯ä¸ªåˆ°å®¢æˆïL(f¨¥ng)«¯çš„å“应中æ·ÕdŠ nocacheçš„HTMLå¤ß_(d¨¢)¼Œ˜q™æ ·å®¢æˆ·ç«¯å°±ä¸ä¼š(x¨¬)对应用中的页é¢è¿›è¡Œç¼“存。确çœäØ“(f¨´)false<br /></font> </li> <li> <font size="2">null<br />如果讄¡½®ä¸ºtrueåQŒé‚£ä¹ˆåº”用在得到一个未定义的messageèµ„æºæ—Óž¼Œä¼?x¨¬)返回nullåQŒè€Œä¸æ˜¯è¿”回一个错误信æ¯ã€‚ç¡®çœæ˜¯trueã€?br /></font> </li> <li> <font size="2">maxFileSize<br />æ–‡äšg上传的大ž®ä¸Šé™ï¼Œ¼‹®çœä¸?50M<br /></font> </li> <li> <font size="2">bufferSize<br />æ–‡äšg上传时的¾~“冲区的大å°åQŒç¡®çœäØ“(f¨´)4M<br /></font> </li> <li> <font size="2">tempDir<br />讄¡½®ç”¨äºŽä¸Šä¼ æ—¶çš„临时目录。工作目录会(x¨¬)ä½œäØ“(f¨´)一个Servlet环境åQˆContextåQ‰çš„属性æä¾›ã€?br /></font> </li> <li> <font size="2">validate<br />Are we using the new configuration file format?¼‹®çœä¸ºtrueã€?br /></font> </li> <li> <font size="2">validating</font> </li> </ul> <p> <br /> <font size="2">在解æžé…¾|®XMLæ–‡äšg是是å¦è¿›è¡Œæœ‰æ•ˆæ€§çš„验è¯ã€‚ç¡®çœäØ“(f¨´)true<br /><br />ActionServlet中应用了(ji¨£n)命ä×o(h¨´)设计模å¼ã€?br /><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 /></font> </p> <h3> <font size="2">init()</font> </h3> <p> <br /> <font size="2">在它的init()æ–ÒŽ(gu¨©)³•中,ActionServlet便¬¡è°ƒç”¨å¦‚下protected的方法完æˆåˆå§‹åŒ–åQ?br /></font> </p> <ul> <li> <font size="2">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 /></font> <div id="wmqeeuq" class="codeStyle"> <ol> <li> <font size="2"> </font> </li> <li> <font size="2">        <b><font color="#0000ff">synchronized</font></b> (actions) { </font> </li> <li> <font size="2">            actions.setFast(<b><font color="#0000ff">false</font></b>); </font> </li> <li> <font size="2">            actions.clear(); </font> </li> <li> <font size="2">            actions.setFast(<b><font color="#0000ff">true</font></b>); </font> </li> <li> <font size="2">        } </font> </li> </ol> </div> <br /> <font size="2">首先把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 /></font> </li> <li> <font size="2">initInternal() åQ     åˆå§‹åŒ–ActionServlet内部使用的资æºåŒ…MessageResourcesåQŒä‹É用MessageResources.getMessageResources(internalName)得到    internalNameä¸?org.apache.struts.action.ActionResources"对应的ActionResources.propertiesæ–‡äšg。这个资æºåŒ…主è¦ç”¨äºŽActionServlet处熘q‡ç¨‹ä¸­çš„用到的æ½CÞZ¿¡æ¯ï¼Œ˜q™å„¿ä¸å±•开讨论ã€?br /></font> </li> <li> <font size="2">initDebug() åQ     从web.xmlä¸­è¯»å–æœ¬åº”用的debug¾U§åˆ«å‚æ•°getServletConfig().getInitParameter("debug")åQŒç„¶åŽèµ‹¾l™debug属性ã€?br /></font> </li> <li> <font size="2">initApplication()åQ    åˆå§‹åŒ–应用资æºåŒ…,òq¶æ”¾¾|®å…¥ServletContext中ã€?br /></font> <div id="wmqeeuq" class="codeStyle"> <ol> <li> <font size="2"> </font> </li> <li> <font size="2">        <b><a target="_blank"><font class="classLink" color="#002c99"><u>String</u></font></a></b> factory =getServletConfig().getInitParameter(“factoryâ€?;     </font> </li> <li> <font size="2">        <b><a target="_blank"><font class="classLink" color="#002c99"><u>String</u></font></a></b> oldFacory = MessageResourcesFactory.getFactoryClass(); </font> </li> <li> <font size="2">        <b><font color="#0000ff">if</font></b> (factory !=<b><font color="#0000ff">null</font></b>) </font> </li> <li> <font size="2">                MessageResourcesFactory.setFactoryClass(factory); </font> </li> <li> <font size="2">        <b><a target="_blank"><font class="classLink" color="#002c99"><u>String</u></font></a></b> value = getServletConfig().getInitParameter(<font color="#ff33ff">"application"</font>); </font> </li> <li> <font size="2">        MessageResourcesFactory factoryObject = </font> </li> <li> <font size="2">                MessageResourcesFactory.createFactory(); </font> </li> <li> <font size="2">        application = factoryObject.createResources(value); </font> </li> <li> <font size="2">        MessageResourcesFactory.setFactory(oldFactory);  </font> </li> <li> <font size="2">        getServletContext().setAttribute(<font color="#ff0000">Action</font>.MESSAGES_KEY, application); </font> </li> </ol> </div> <br /> <font size="2">说明åQšæ–‡ä¸­å¼•ç”¨çš„ä»£ç ç‰‡æ–­å¯èƒ½ä¼?x¨¬)çœç•¥äº?ji¨£n)一些例外检查等éžä¸»¾U¿çš„内容åQŒæ•¬è¯äh³¨æ„ã€?br /><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¨¬)<br /></font> <div id="wmqeeuq" class="codeStyle"> <ol> <li> <font size="2">     </font> </li> <li> <font size="2">        MessageResourceFactory factoryObject= </font> </li> <li> <font size="2">                MessageResourcesFactory.createFactory(); </font> </li> <li> <font size="2">        application = factoryObject.createResources(value); </font> </li> </ol> </div> <br /> <font size="2"><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 /></font> <div id="wmqeeuq" class="codeStyle"> <ol> <li> <font size="2"> </font> </li> <li> <font size="2">        mappings.setServlet(<b><font color="#0000ff">this</font></b>); </font> </li> <li> <font size="2">        …â€?</font> </li> <li> <font size="2">        <i><font color="#339900">// I(y¨ªng)nitialize the name of our ActionFormBean implementation class</font></i></font> </li> <li> <font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"formBean"</font>); </font> </li> <li> <font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font> </li> <li> <font size="2">            formBeanClass = value; </font> </li> <li> <font size="2">     </font> </li> <li> <font size="2">        <i><font color="#339900">// I(y¨ªng)nitialize the name of our ActionForward implementation class</font></i></font> </li> <li> <font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"forward"</font>); </font> </li> <li> <font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font> </li> <li> <font size="2">                forwardClass = value; </font> </li> <li> <font size="2"> </font> </li> <li> <font size="2">        <i><font color="#339900">// I(y¨ªng)nitialize the name of our ActionMapping implementation class</font></i></font> </li> <li> <font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"mapping"</font>); </font> </li> <li> <font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font> </li> <li> <font size="2">                mappingClass = value; </font> </li> </ol> </div> <br /> <font size="2">在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 /></font> <div id="wmqeeuq" class="codeStyle"> <ol> <li> <font size="2"> </font> </li> <li> <font size="2">        <i><font color="#339900">// I(y¨ªng)nitialize the context-relative path to our configuration resources</font></i></font> </li> <li> <font size="2">        value = getServletConfig().getInitParameter(<font color="#ff33ff">"config"</font>); </font> </li> <li> <font size="2">        <b><font color="#0000ff">if</font></b> (value != <b><font color="#0000ff">null</font></b>) </font> </li> <li> <font size="2">                config = value; </font> </li> <li> <font size="2">                <i><font color="#339900">// Acquire an input stream to our configuration resource</font></i></font> </li> <li> <font size="2">        <font color="#ff0000">InputStream</font> input = getServletContext().getResourceAsStream(config); </font> </li> <li> <font size="2">        Digester digester = <b><font color="#0000ff">null</font></b>; </font> </li> <li> <font size="2">                digester = initDigester(detail); </font> </li> <li> <font size="2">        <b><font color="#0000ff">try</font></b> { </font> </li> <li> <font size="2">                formBeans.setFast(<b><font color="#0000ff">false</font></b>); </font> </li> <li> <font size="2">                forwards.setFast(<b><font color="#0000ff">false</font></b>); </font> </li> <li> <font size="2">                mappings.setFast(<b><font color="#0000ff">false</font></b>); </font> </li> <li> <font size="2">                digester.parse(input); </font> </li> <li> <font size="2">                mappings.setFast(<b><font color="#0000ff">true</font></b>); </font> </li> <li> <font size="2">                forwards.setFast(<b><font color="#0000ff">true</font></b>); </font> </li> <li> <font size="2">                formBeans.setFast(<b><font color="#0000ff">true</font></b>); </font> </li> <li> <font size="2">        } <b><font color="#0000ff">catch</font></b> (<font color="#ff0000">SAXException</font> e) { </font> </li> <li> <font size="2">                <b><font color="#0000ff">throw</font></b> <b><font color="#0000ff">new</font></b> ServletException </font> </li> <li> <font size="2">        (internal.getMessage(<font color="#ff33ff">"configParse"</font>, config), e); </font> </li> <li> <font size="2">        } <b><font color="#0000ff">finally</font></b> { </font> </li> <li> <font size="2">                input.close(); </font> </li> <li> <font size="2">        } </font> </li> </ol> </div> <br /> <font size="2">从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 /></font> <div id="wmqeeuq" class="codeStyle"> <ol> <li> <font size="2"> </font> </li> <li> <font size="2">        Digester digester = <b><font color="#0000ff">new</font></b> Digester(); </font> </li> <li> <font size="2">        digester.push(<b><font color="#0000ff">this</font></b>); </font> </li> <li> <font size="2">        digester.addObjectCreate(<font color="#ff33ff">"struts-config/action-mappings/action"</font>, </font> </li> <li> <font size="2">                                 mappingClass, <font color="#ff33ff">"className"</font>); </font> </li> <li> <font size="2">        digester.addSetProperties(<font color="#ff33ff">"struts-config/action-mappings/action"</font>); </font> </li> <li> <font size="2">        digester.addSetNext(<font color="#ff33ff">"struts-config/action-mappings/action"</font>, </font> </li> <li> <font size="2">                            <font color="#ff33ff">"addMapping"</font>, </font> </li> <li> <font size="2">                            <font color="#ff33ff">"org.apache.struts.action.ActionMapping"</font>); </font> </li> <li> <font size="2"> </font> </li> <li> <font size="2">        digester.addSetProperty </font> </li> <li> <font size="2">            (<font color="#ff33ff">"struts-config/action-mappings/action/set-property"</font>, </font> </li> <li> <font size="2">             <font color="#ff33ff">"property"</font>, <font color="#ff33ff">"value"</font>); </font> </li> </ol> </div> <br /> <font size="2">在这个方法中首先生æˆä¸€ä¸ª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 /></font> </li> <li> <font size="2">initUpload() åQ    åˆå§‹åŒ–有关Uploadçš„ä¸€äº›å‚æ•ŽÍ¼Œæ¯”如åQšbufferSizeã€tempDirã€?br /></font> </li> <li> <font size="2">initDataSource() åQå–出在initMapping()中从é…置文äšg中读å–çš„æ¯ä¸€ä¸ªDataSourceåQŒè®¾¾|®LogWriteråQŒå¦‚æžœäØ“(f¨´)GenericDataSourceçš„å®žä¾‹ï¼Œåˆ™æ‰“å¼€æ•°æ®æºã€‚ç„¶åŽï¼ŒæŠŠæ¯ä¸ªdataSource攑օ¥Context中ã€?br />dataSource.setLogWriter(scw)åQ?br />((GenericDataSource)dataSource).open();<br />getServletContext().setAttribute(key,dataSource);<br /></font> </li> <li> <font size="2">initOther() åQ        设¾|®å…¶å®ƒå°šæœªåˆå§‹åŒ–çš„çš„å‚æ•°åQˆcontentã€localeã€nocacheåQ‰ï¼Œòq¶å‘布formBeansã€forwardsã€mappings到ContextåQ?br />getServletContext().setAttribute(Action.FORM_BEANS_KEY, formBeans);<br />getServletContext().setAttribute(Action.FORWARDS_KEY, forwards);<br />getServletContext().setAttribute(Action.MAPPINGS_KEY, mappings);<br /></font> </li> <li> <font size="2">initServlet() åQ    åˆå§‹åŒ–Controller Servletçš„Servlet Mapping。这儿也使用äº?ji¨£n)Digester工具åQŒæ‰«æweb.xml所有的<web-app/servlet-mapping>åQŒå¯»æ‰¾servlet-name与当å‰Servlet相åŒçš„mappingåQŒç½®å…¥Context。代ç å¦‚下;<br /></font> <div id="wmqeeuq" class="codeStyle"> <ol> <li> <font size="2"> </font> </li> <li> <font size="2">        Digester digester = <b><font color="#0000ff">new</font></b> Digester(); </font> </li> <li> <font size="2">        digester.push(<b><font color="#0000ff">this</font></b>); </font> </li> <li> <font size="2">        digester.setDebug(debug); </font> </li> <li> <font size="2">        digester.setValidating(validating); </font> </li> <li> <font size="2">        digester.addCallMethod(“web-appservlet-mappingâ€?“addServletMappingâ€? 2); </font> </li> <li> <font size="2">        digester.addCallParm(“web-appservlet-mappingservlet-nameâ€? 0); </font> </li> <li> <font size="2">        digester.addCallParm(“web-appservlet-mappingurl-patternâ€? 1); </font> </li> <li> <font size="2">        <font color="#ff0000">InputStream</font> is = getServletContext().getResourceAsStream(â€?WEB-INFweb.xmlâ€?; </font> </li> <li> <font size="2">        digester.parse(is);  </font> </li> <li> <font size="2">        getServletContext().setAttribute(<font color="#ff0000">Action</font>.SERVLET_KEY,servletMapping); </font> </li> </ol> </div> <br /> </li> </ul> <img src ="http://www.aygfsteel.com/nikita/aggbug/232275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/nikita/" target="_blank">picture talk</a> 2008-10-04 00:07 <a href="http://www.aygfsteel.com/nikita/archive/2008/10/04/232275.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">Ïî³ÇÊÐ</a>| <a href="http://" target="_blank">ÎäÇ¿ÏØ</a>| <a href="http://" target="_blank">³£É½ÏØ</a>| <a href="http://" target="_blank">ÒÍÁ¼ÏØ</a>| <a href="http://" target="_blank">Æ½Ì¶ÏØ</a>| <a href="http://" target="_blank">»Æ´óÏÉÇø</a>| <a href="http://" target="_blank">Áé´¨ÏØ</a>| <a href="http://" target="_blank">ºÓ¼äÊÐ</a>| <a href="http://" target="_blank">³çÀñÏØ</a>| <a href="http://" target="_blank">äÒÖÐÏØ</a>| <a href="http://" target="_blank">Î÷ÎÚÖéÄÂÇ߯ì</a>| <a href="http://" target="_blank">ãë´¨ÏØ</a>| <a href="http://" target="_blank">Çí½áÏØ</a>| <a href="http://" target="_blank">Ã×Ò×ÏØ</a>| <a href="http://" target="_blank">¸ÊÈªÏØ</a>| <a href="http://" target="_blank">ÓÀÄþÏØ</a>| <a href="http://" target="_blank">Óå±±Çø</a>| <a href="http://" target="_blank">°¢ÀÕÌ©ÊÐ</a>| <a href="http://" target="_blank">ÐËÒåÊÐ</a>| <a href="http://" target="_blank">ÎߺþÏØ</a>| <a href="http://" target="_blank">ÜõÍåÇø</a>| <a href="http://" target="_blank">ÐÂÃÜÊÐ</a>| <a href="http://" target="_blank">ɽÎ÷Ê¡</a>| <a href="http://" target="_blank">ͨº£ÏØ</a>| <a href="http://" target="_blank">Ëì²ýÏØ</a>| <a href="http://" target="_blank">ËÕÄáÌØ×óÆì</a>| <a href="http://" target="_blank">ÉÐÒåÏØ</a>| <a href="http://" target="_blank">Ê®ÑßÊÐ</a>| <a href="http://" target="_blank">Î÷³ÇÇø</a>| <a href="http://" target="_blank">¹ÌÕòÏØ</a>| <a href="http://" target="_blank">³£µÂÊÐ</a>| <a href="http://" target="_blank">¸·¿µÊÐ</a>| <a href="http://" target="_blank">Óà½­ÏØ</a>| <a href="http://" target="_blank">ÇåÐÂÏØ</a>| <a href="http://" target="_blank">ÖÜÖÁÏØ</a>| <a href="http://" target="_blank">¼ÎÀèÏØ</a>| <a href="http://" target="_blank">¡µÂÏØ</a>| <a href="http://" target="_blank">´óÍ¬ÏØ</a>| <a href="http://" target="_blank">̨ÖÐÏØ</a>| <a href="http://" target="_blank">º¼½õÆì</a>| <a href="http://" target="_blank">¿ªÔ­ÊÐ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>