ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久草福利在线,久久久国产一区二区三区 ,亚洲午夜精品一区 二区 三区http://www.aygfsteel.com/kobe09/category/11880.html爪吐奕奕征é€?/description>zh-cnThu, 01 Mar 2007 22:14:37 GMTThu, 01 Mar 2007 22:14:37 GMT60Structs中基本配¾|®å…¥é—?/title><link>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52749.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Wed, 14 Jun 2006 07:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52749.html</guid><wfw:comment>http://www.aygfsteel.com/kobe09/comments/52749.html</wfw:comment><comments>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52749.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kobe09/comments/commentRss/52749.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kobe09/services/trackbacks/52749.html</trackback:ping><description><![CDATA[  1.为Structs应用配置Web.xmlæ–‡äšg<br />  <br />  ½W¬ä¸€æ­?配置ActionServlet<br />  <br />  <servlet><br />  <servlet-name>action</servlet-name><br />  <servlet-class>org.appache.structs.ActionServlet</servlet-class><br />  </servlet><br />  <br />  <servlet-mapping><br />  <servlet-name>action</servlet-name><br />  <uri-pattern>*.do</url-pattern><br />  </servlet-mapping><br />  <br />  注意:不管应用中包含多ž®‘个子应ç”?都只需配置一个ActionServlet,因䨓ActionServlet支持多线½E?目前的Structs框架只允许在应用中配¾|®ä¸€ä¸ªActionServletã€?br />  <br />  ½W¬äºŒæ­¥ï¼šåˆå§‹åŒ–参数对Servlet的运行环境进行初始化配置ã€?br />  <br />  <servlet><br />  <servlet-name> action</servlet-name><br />  <servlet-class> org.appache.structs.ActionServlet </servlet-class><br />  <init-param><br />  <param-name>config</param-name><br />  <param-value>/WEB-INF/structs-config.xml</param-value><br />  </init-param><br />  </servlet><br />  <br />  è¡?-1. Struts1.1中用到的初始化参æ•?br />  <br />  参数名       含义/默认å€?br />  config     以相对èµ\径的方式指明Struts应用½E‹åºçš„配¾|®æ–‡ä»¶ä½¾|®ã€‚如不设¾|®ï¼Œåˆ™é»˜è®¤å€égØ“/WEB-INF/struts-config.xmlã€?br />  config/sub1   以相对èµ\径的方式指明子应用程序的配置文äšg位置åQŒä¸€èˆ¬æ¥è¯ß_¼Œå¾ˆå°‘用到子应用程序,在此不多描述ã€?br />  debug      讄¡½®Servletçš„debug¾U§åˆ«åQŒæŽ§åˆ¶æ—¥å¿—记录的详细½E‹åº¦ã€‚é»˜è®¤äØ“0åQŒè®°å½•相å¯ÒŽœ€ž®‘的日志信息ã€?br />  detail     讄¡½®Digesterçš„debug¾U§åˆ«åQŒDigester是Struts框架所使用的用来解析xml配置文äšg的一个框æžÓž¼Œé€šè¿‡è¯¥è®¾¾|®ï¼Œå¯ä»¥æŸ¥çœ‹ä¸åŒè¯¦ç»†½{‰çñ”çš„è§£æžæ—¥å¿—ã€‚é»˜è®¤äØ“0åQŒè®°å½•相å¯ÒŽœ€ž®‘的日志信息ã€?br />  <br />  ½W¬ä¸‰æ­¥ï¼šé…ç½®‹Æ¢è¿Žæ¸…单<br />  <br />  当客戯‚®¿é—®Web应用æ—Óž¼Œå¦‚果仅仅¾l™å‡ºWeb应用的Root URLåQŒæ²¡ç”¨æŒ‡å®šå…·ä½“的文äšg名,Web容器会自动调用Web应用的欢˜qŽæ–‡ä»¶ã€?br />  <br />  <welcome-file-list><br />  <welcome-file>welcome.jsp</welcome-file><br />  <welcome-file>index.jsp</welcome-file><br />  </welcome-fiel-list><br />  <br />  说明åQ?lt;welcome-file-list>可以包含多个<welcome-file>子元素,首先查找½W¬ä¸€ä¸?lt;welcome-file>æ–‡äšgã€?br />  <br />  ç”׃ºŽ<welcome-file-list>元素中不能配¾|®Servlet映射åQŒå› æ­¤ä¸èƒ½ç›´æŽ¥æŠŠStructsçš„Actionä½œäØ“‹Æ¢è¿Žæ–‡äšgåQŒå¯ä»¥é‡‡ç”¨ä¸€¿Uå˜é€šçš„æ–ÒŽ³•来实现在‹Æ¢è¿Žæ–‡äšg中调用Structs Action。首先,在Structs配置文äšgä¸­äØ“è¢«è°ƒç”¨çš„Action创徏一个全局的è{发项åQŒä¾‹å¦‚:<br />  <global-forwards><br />  <forward name=”welcomeâ€?path=”HelloWord.doâ€?><br />  </global-forwords><br />  <br />  创徏一个welcome.jsp的文ä»?br />  <br />  最后在web.xmlæ–‡äšg中把welcome.jspæ–‡äšg配置为欢˜qŽæ–‡ä»Óž¼Œä»£ç å¦‚下åQ?br />  <welcome-file-list><br />  <welcome-file>welcome.jsp</welcome-file><br />  </welcome-file-list><br />  <br />  ½W¬å››æ­¥ï¼šé…ç½®é”™è¯¯å¤„理<br />  <br />  <error-page><br />  <error-code>404</error-code><br />  <location>/commom/404.jsp</location><br />  </error-page><br />  <error-page><br />  <error-code>505</error-code><br />  <location>/commom/505.jsp</location><br />  </error-page><br />  <br />ã€€ã€€ä¹Ÿå¯ä»¥äØ“Web容器捕获的Java异常配置<error-page>,需要设¾|?lt;exception-type>子元素,它用于指定Java异常¾c…R€‚Web容器可能捕获如下异常åQ?br />  <br />  RuntimeException或Error  ServletException或它的子¾c…R€€IOException或它的子¾c?br />  <br />  <error-page><br />  <exception-type>java.io.IOException</exception-type><br />  <location>/common/system_ioerror.jsp</location><br />  </error-page><br />  <br />  ½W¬äº”步:配置Structs标签åº?br />  <br />  使用客户化的标签库,要配¾|®å®ƒä»?br />  <br />  <taglib><br />  <tag-uri>/WEB-INF/structs-html.tld<tag-uri><br />  <taglib-location>/WEB-INF/structs-html.tld</taglib-location><br />  </taglib><br />  <br />  <tag-uri>用于指定标签库的相对或者绝对URI地址åQŒWeb应用æ ÒŽ®˜q™ä¸€URI来访问标½{‘Öº“ã€?br />  <br />  <taglib-location>指定标签描述文äšg在文件资源系¾lŸä¸­çš„物理位¾|®ã€?br />  <br />  2.Structs配置文äšg<br />  <br />  Structs框架在启动时会读入其配置文äšgåQŒæ ¹æ®å®ƒæ¥åˆ›å»ºå’Œé…ç½®å„种Structs¾l„äšgã€?br />  <br />  1<Structs-config>元素<br />  <br />  <structs-config>元素是Structs配置文äšg的根元素åQ?lt;structs-cofig>元素æœ?个子元素。它的DTD定义如下åQ?br />  <br />  <!ELEMENT structs-config(data-sources?,formbean?,global-exeception?,global-forward?,action-mapping,controller?,message-resources*,plug-in*)><br />  <br />  在Struts配置中,必须按照以上的DTD指定的先后顺序来配置<Structs-config>元素的各个子元素åQŒå¦‚果颠倒了˜q™äº›å…ƒç´ çš„配¾|®æ–‡ä»¶ä¸­çš„位¾|®ï¼Œåœ¨Structs应用启动时会生成错误ã€?br />  <br />  <data-sources>元素<br />  <br />  <data-sources>元素包含零个、一个或者多ä¸?lt;data-sources>子元素,<data-sources>用于配置特定的数据源åQŒå®ƒå¯ä»¥åŒ…含多个<set-property>子元素,用于讄¡½®æ•°æ®æºçš„各种属性ã€?br />  。。ã€?br />  <br />  配置了数据源后,ž®±å¯ä»¥åœ¨Action¾cÖM¸­è®‰K—®æ•°æ®æºï¼Œåœ¨org.apache.structs.action.Action¾cÖM¸­å®šä¹‰äº†getDataSource(HttpRequrst)æ–ÒŽ³•åQŒå®ƒç”¨äºŽèŽ·å–æ•°æ®æºå¯¹è±¡çš„å¼•ç”¨ã€?br />  <br />  DataSource dataSource;<br />  Connection connection;<br />  dataSource =getDataSource(request);<br />  connection=dataSource.getConnection();<br />  <br />  也可以在配置文äšg中声明多个数据源åQŒæ­¤æ—‰™œ€è¦äؓ每一个数据源分配唯一的keyå€û|¼Œé€šè¿‡æ”¹å€¼æ¥æ ‡è¯†ç‰¹å®šçš„æ•°æ®æºã€?br />  <br />  2<form-beans>元素<br />  <br />  <form-beans>元素用来配置多个ActionForm BeanåQ?lt;form-beans>包含多个<forom-bean>子元素,,每个<from-bean>包含多个属性,ClassName , name,type<br />  <br />  <form-beans><br />  <form-bean name="HelloForm" type="hello.HelloForm"/><br />  </form-beans><br />  <br />  注意åQšé…¾|®åŠ¨æ€ActionForm BeanåQŒè¿˜å¿…须配置<form-bean>元素çš?lt;form-property>元素ã€?br />  <br />  <form-beans><br />  <form-bean name="HelloForm" type="hello.HelloForm"/><br />  <form-bean name="userForm" type="org.apache.structs.action.DynaAction"><br />  <from-property name="firstname" type="java.lang.String"/><br />  <form-property name="secondname" type="java.lang.String"><br />  <form-property name="age" type="java.Integer" initial="18"><br />  </form-beans><br />  <br />  3<global-exception>元素<br />  <br />  <global-exception>用于配置异常处理åQ?lt;global-exception>元素可以包含零个或者多ä¸?lt;exception>元素ã€?br />  <br />  <exception>元素用来讄¡½®java异常和异常处理类org.apache.structs.action,Exception Hander之间的映ž®„ã€?br />  <br />  4<gloable-forwards>元素<br />  <br />  <global-forwards>元素用来声明全局的è{发关¾p»ï¼Œ<global-forwards>有零个或多个<forward>元素¾l„成ã€?lt;forward>元素用于把一个逻辑映射到特定的URL<br />  <br />  属性      描 ˜q?br />  <br />  className  å’?lt;forward>元素对应的配¾|®ç±»åQŒé»˜è®¤äØ“org.apache.structs.action.ActionForWard<br />  <br />  name     转发路径的逻辑名,此项时必™åȝš„<br />  <br />  path     指定或者重定向的URI。此™åÒŽ—¶å¿…须的,必须以â€?”开å¤?br />  <br />  redirect   此项是trueåQŒè¡¨½Cºæ˜¯æ‰§è¡Œé‡å®šå‘çš„****作,此项是falseæ—Óž¼Œè¡¨ç¤ºè¯äh±‚转发ã€?br />  <br />  <global-forwards><br />  <forward name="forward1" path="/Action1.do"/><br />  <forward name="forward1" path="/Action2.do"/><br />  </global-forwards><br />  <br />  如果jsp1.jsp把请求è{发给Action1,可以使用以下代码åQ?br />  <br />  <html:link forward=”forward1â€?gt;<br />  <br />  或è€?lt;logic:forward name=”forward1â€?gt;<br />  <br />  如果Action1çš„executeåQˆï¼‰æ–ÒŽ³•把请求è{发给JSP2.jspåQŒå¯ä»¥ä‹É用一下代码:<br />  <br />  return(mapping.findForward(“forward2â€?)<br />  <br />  5<action-mapping>元素<br />  <br />  <action-mapping>元素包含零个或者多ä¸?lt;action>元素ã€?lt;action>元素描述了从特定的请求èµ\径到相应的Action¾cÈš„æ˜ å°„ã€?br />  <br />  6<controller>元素<br />  <br />  <controller>元素用于配置ActionServletã€?br />  <br />  7< message-resources>元素<br />  <br />  <message-resources>元素用于配置Resource BundleåQŒResource Budle用于存放本地化消息文件ã€?br />  <br />  Structs标签<br />  <br />  HTML标签<br />  <br />  标签名        描述<br />  base         包装HTMLçš„base元素<br />  button        包装HTMLçš?button¾cÕdž‹çš„input元素<br />  cancel        包装HTML cancel 按钮<br />  checkbox       包装HTML checkbox ¾cÕdž‹çš„输入域<br />  errors        有条件地昄¡¤ºä¸€äº›error消息åQŒæ˜¾½CºActionErrors信息<br />  file         包装HTMLæ–‡äšg上传输入åŸ?br />  form         定义HTML form 元素<br />  frame        包装HTML frame 元素<br />  hidden        包装HTML hidden 输入åŸ?br />  html         包装 HTML中的 html 元素<br />  image        包装 "image"¾cÕdž‹çš„输入域<br />  img         包装HTMLçš?img 元素<br />  javascript      包装æ ÒŽ®ValidatorPlugIn提供的校验规则所提供的javascript校验脚本<br />  link         包装­‘…链æŽ?br />  messages       有条件地昄¡¤ºä¸€äº›æ½CÞZ¿¡æ¯ï¼Œæ˜„¡¤ºActionMessages信息<br />  multibox       包装多选输入框<br />  option        包装一个选择输入æ¡?br />  options       包装一扚w€‰æ‹©è¾“å…¥æ¡?br />  optionsCollection  包装一扚w€‰æ‹©è¾“入框集<br />  password       包装密文输入æ¡?br />  radio        包装单选输入框<br />  reset        包装“重¾|®â€åŠŸèƒ½çš„æŒ‰é’®<br />  rewrite       包装一个URL<br />  select        包装一个选择输入æ¡?br />  submit        包装一个提交按é’?br />  text         包装一个文本输入框<br />  textarea       包装一个备注输入框<br />  <br />  ActionForm<br />  ActionForm 的要æ±?br />  <br />  创徏一个ActionForm òq¶ä¸å›°éš¾åQŒä½†æ˜¯ä½ çš„类必须½W¦åˆä¸€äº›è¦æ±‚:<br />  <br />  ActionForm 必须扩展自org.apache.struts.ActionForm。基¾c»ActionForm 是不能实例化的ã€?br />  <br />  ActionForm 必须为每个应该从è¯äh±‚中收集的HTML控äšg定义一个公共属性ã€?br />  <br />  (Struts 1.0 要求每个属性都要mutator å’Œaccessor 。Struts 1.1 则没有如此严æ ?<br />  <br />  ActionForm˜q˜å¯èƒ½è¦½W¦åˆä¸€äº›å¯é€‰çš„要求:<br />  <br />  如果你要求ActionForm 在传递属性到Action之前校验它们åQŒä½ ž®±å¿…™åÕd®žçްvalidate<br />  <br />  æ–ÒŽ³•åQ?br />  <br />  如果惛_œ¨¾l„装前初始化属性,必须实现reset , 它在ActionForm ¾l„装前被调用åQ?br />  <br />  动态ActionForm<br />  <br />  ActionForm ä½œäØ“¾cÕdž‹è½¬æ¢å™?br />  <br />  ActionForm的一个强制点是应该ä‹É用String å’Œboolean属性。实际上åQŒè¿™æ„å‘³ç€å±žæ€?br />  <br />  必须得从一¿Uè{换到另一¿Uç±»åž‹ã€‚大部分应用也需要一些属性,比如电话åïL æˆ–者数量,ä»?br />  <br />  一¿Uæ ¼å¼åŒ–的方式出现。核心Java 包提供一些工å…äh¥åšè¿™¿Uäº‹æƒ…,但是要清楚地ž®†ä»–们集<br />  <br />  成到应用中仍然是一个挑战ã€?br />  <br />  Struts 开发äh员经常在ActionForm中包含helperæ–ÒŽ³•åQŒæ¥˜q›è¡Œ¾cÕdž‹è½¬æ¢ã€‚helper æ–ÒŽ³•<br />  <br />  可以有很多种实现方式åQŒè¿™æˆ‘们åœ?.6¿Uå™˜q°ã€?br />  <br />  5.2.6 ActionForm ä½œäØ“é˜²ç«å¢?br />  <br />  当请求提交时åQŒActionServlet 使用一个自动组装机制来从请求参æ•îC¸­è®„¡½®è¯äh±‚çš?br />  <br />  ActionForm属性。这让你可以通过控制哪个ActionForm 属性被暴露来控制哪个请求参æ•?br />  <br />  是可接受的。这也意味着如果你的ActionForm 的粗心设计你可能失去控制哪个参数可以æŽ?br />  <br />  受的能力。ActionForm 一定不能包含看èµäh¥åƒæ˜¯ä¸€ä¸ªJavaBean 属性,但不能从HTTP è¯?br />  <br />  求设¾|®çš„属性方法ã€?br />  <br />  5.3.4 ActionForm 可以嵌套其它bean<br />  <br />ã€€ã€€å› äØ“Struts 标签扩展和自动组装机刉™ƒ½æ”¯æŒç‚¹å·è¯­æ³•来从ActionForm讉K—®å…¶å®ƒ<br />  <br />  bean。这是一个方便的方式åQŒå¯ä»¥é€šè¿‡ActionForm来组装存在的bean。在JSP ™åµé¢, 你可<br />  <br />  以象˜q™æ ·å¼•用一个嵌套的beanåQ?br />  <br />  <html:text<br />  propety="values.telephoneText"<br />  size="14"<br />  maxlength="14"/><br />  <br />  5.7.2 分发åQˆDispatch åQ?br />  <br />  Struts 开发äh员通常使用同一个Action处理相关çš?***作。一个通常做法来选择****作是在HTML表单中ä‹É用隐藏属性。BaseForm çš„dispatch 属性也可用作这个目的:<br />  public void setDispatch(String dispatch);<br />  public String getDispatch();<br />  <br />  Struts 配置提供˜qžä¸ª¾U§åˆ«åµŒå¥—çš„ActionForward:<br />  <br />  Global åQˆå…¨å±€åQ?ActionForwardå¯ÒŽ•´ä¸ªåº”用中的所有Action 对象均有效;<br />  <br />  Local åQˆå±€éƒ¨ï¼‰ ActionForward 则在ActionMapping 元素中定义。仅寚w‚£äº›åœ¨˜q™ä¸ª<br />  <br />  ActionMapping中调用的Action对象有效ã€?br />  <br />  从Action 对象内部来看åQŒforward 通常像这æ äh¥é€‰æ‹©åQ?br />  ActionForward forward = mapping.findForward("continue"); <img src ="http://www.aygfsteel.com/kobe09/aggbug/52749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kobe09/" target="_blank">氧气中毒</a> 2006-06-14 15:12 <a href="http://www.aygfsteel.com/kobe09/archive/2006/06/14/52749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate入门 - 包作用详è§?/title><link>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52747.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Wed, 14 Jun 2006 07:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52747.html</guid><wfw:comment>http://www.aygfsteel.com/kobe09/comments/52747.html</wfw:comment><comments>http://www.aygfsteel.com/kobe09/archive/2006/06/14/52747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kobe09/comments/commentRss/52747.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kobe09/services/trackbacks/52747.html</trackback:ping><description><![CDATA[Hibernate一共包括了23个jar包,令ähçœÆDб¾~­äؕ。本文将详细讲解Hibernate每个jar包的作用åQŒä¾¿äºŽä½ åœ¨åº”用中æ ÒŽ®è‡ªå·±çš„需要进行取舍ã€?<br /><br />  下蝲HibernateåQŒä¾‹å¦?.0.3½E›_®šç‰ˆæœ¬åQŒè§£åŽ‹ç¾ƒåQŒå¯ä»¥çœ‹åˆîC¸€ä¸ªhibernate2.jarå’Œlib目录下有22个jar包: <br /><br />  hibernate2.jar: <br />  Hibernate的库åQŒæ²¡æœ‰ä»€ä¹ˆå¯è¯´çš„åQŒå¿…™åÖM‹É用的jaråŒ?<br /><br />  cglib-asm.jar: <br />  CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库åQŒå¿…™åÖM‹É用的jaråŒ?<br /><br />  dom4j.jar: <br />  dom4j是一个Javaçš„XML APIåQŒç±»ä¼égºŽjdomåQŒç”¨æ¥è¯»å†™XMLæ–‡äšg的。dom4j是一个非帔Ržå¸æ€¼˜¿U€çš„Java XML APIåQŒå…·æœ‰æ€§èƒ½ä¼˜å¼‚、功能强大和极端易用使用的特点,同时它也是一个开放源代码的èÊYä»Óž¼Œå¯ä»¥åœ¨SourceForge上找到它。在IBM developerWorks上面可以扑ֈ°ä¸€½‹‡æ–‡ç« ï¼Œå¯¹ä¸»‹¹çš„Java XML API˜q›è¡Œçš„æ€§èƒ½ã€åŠŸèƒ½å’Œæ˜“ç”¨æ€§çš„è¯„æµ‹åQŒdom4j无论在那个方面都是非常出色的。我早在ž®†è¿‘两年之前ž®±å¼€å§‹ä‹É用dom4jåQŒç›´åˆ°çŽ°åœ¨ã€‚å¦‚ä»Šä½ å¯ä»¥çœ‹åˆ°­‘Šæ¥­‘Šå¤šçš„Java软äšg都在使用dom4j来读写XMLåQŒç‰¹åˆ«å€¼å¾—一提的是连Sunçš„JAXM也在用dom4j。这是必™åÖM‹É用的jar包,Hibernate用它来读写配¾|®æ–‡ä»¶ã€?<br /><br />  odmg.jar: <br />  ODMG是一个ORM的规范,Hibernate实现了ODMG规范åQŒè¿™æ˜¯ä¸€ä¸ªæ ¸å¿ƒçš„库,必须使用的jar包ã€?<br /><br />  commons-collections.jaråQ?<br />  Apache Commons包中的一个,包含了一些Apache开发的集合¾c»ï¼ŒåŠŸèƒ½æ¯”java.util.*强大。必™åÖM‹É用的jar包ã€?<br /><br />  commons-beanutils.jaråQ?<br />  Apache Commons包中的一个,包含了一些Bean工具¾cȝ±»ã€‚å¿…™åÖM‹É用的jar包ã€?<br /><br />  commons-lang.jar: <br />  Apache Commons包中的一个,包含了一些数据类型工å…ïL±»åQŒæ˜¯java.lang.*的扩展。必™åÖM‹É用的jar包ã€?<br /><br />  commons-logging.jar: <br />  Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本èín包含了一个Simple LoggeråQŒä½†æ˜¯åŠŸèƒ½å¾ˆå¼±ã€‚åœ¨˜qè¡Œçš„æ—¶å€™å®ƒä¼šå…ˆåœ¨CLASSPATH找log4jåQŒå¦‚果有åQŒå°±ä½¿ç”¨log4jåQŒå¦‚果没有,ž®±æ‰¾JDK1.4带的java.util.loggingåQŒå¦‚果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾åQŒå½“初Apache极力游说Sun把log4j加入JDK1.4åQŒç„¶è€ŒJDK1.4™å¹ç›®ž®ç»„已经接近发布JDK1.4产品的时间了åQŒå› æ­¤æ‹’¾läº†Apache的要求,使用自己的java.util.loggingåQŒè¿™ä¸ªåŒ…的功能比log4j差的很远åQŒæ€§èƒ½ä¹Ÿä¸€èˆ¬ã€?br /><br />  后来Apachež®±å¼€å‘出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log½E‹åºåQŒåº•层的Logger是可以切换的åQŒä½ å¯ä»¥é€‰æ‹©log4jåQŒjava.util.logging或者它自带的Simple Logger。不˜q‡æˆ‘ä»ç„¶å¼ºçƒˆå»ø™®®ä½¿ç”¨log4jåQŒå› ä¸ºlog4j性能很高åQŒlog输出信息旉™—´å‡ ä¹Ž½{‰äºŽSystem.outåQŒè€Œå¤„理一条logòq›_‡åªéœ€è¦?us。你可以在Hibernateçš„src目录下找到Hibernate已经ä¸ÞZ½ å‡†å¤‡å¥½äº†çš„log4j的配¾|®æ–‡ä»Óž¼Œä½ åªéœ€è¦åˆ°Apache ¾|‘ç«™åŽÖM¸‹è½½log4jž®±å¯ä»¥äº†ã€‚commons-logging.jar也是必须的jar包ã€?<br /><br />  使用Hibernate必须的jar包就是以上的˜q™å‡ ä¸ªï¼Œå‰©ä¸‹çš„都是可选的ã€?<br /><br />  ant.jar: <br />  Ant¾~–译工具的jar包,用来¾~–译Hibernate源代码的。如果你不准备修改和¾~–译Hibernate源代码,那么ž®±æ²¡æœ‰ä»€ä¹ˆç”¨åQŒå¯é€‰çš„jaråŒ?<br /><br />  optional.jaråQ?<br />  Ant的一个辅助包ã€?<br /><br />  c3p0.jaråQ?<br />  C3PO是一个数据库˜qžæŽ¥æ± ï¼ŒHibernate可以配置ä¸ÞZ‹É用C3PO˜qžæŽ¥æ± ã€‚如果你准备用这个连接池åQŒå°±éœ€è¦è¿™ä¸ªjar包ã€?<br /><br />  proxool.jaråQ?<br />  也是一个连接池åQŒåŒä¸Šã€?<br /><br />  commons-pool.jar, commons-dbcp.jar: <br />  DBCP数据库连接池åQŒApacheçš„Jakarta¾l„织开发的åQŒTomcat4的连接池也是DBCPã€?<br /><br />  实际上Hibernate自己也实çŽîCº†ä¸€ä¸ªéžå¸”Ržå¸¸ç®€å•的数据库连接池åQŒåŠ ä¸Šä¸Šé?个,你实际上可以在Hibernate上选择4¿Uä¸åŒçš„æ•°æ®åº“连接池åQŒé€‰æ‹©å“ªä¸€ä¸ªçœ‹ä¸ªäh的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中ä‹É用HibernateåQŒä¸€å®šè¦ç”¨App Server的连接池åQŒä¸è¦ç”¨ä»¥ä¸Š4¿Uè¿žæŽ¥æ± åQŒå¦åˆ™å®¹å™¨ç®¡ç†äº‹åŠ¡ä¸èµ·ä½œç”¨ã€?<br /><br />  connector.jar: <br />  JCA 规范åQŒå¦‚果你在App Server上把Hibernate配置为Connector的话åQŒå°±éœ€è¦è¿™ä¸ªjar。不˜q‡å®žé™…上一般App Server肯定会带上这个包åQŒæ‰€ä»¥å®žé™…上是多余的包ã€?<br /><br />  jaas.jar: <br />  JAAS是用来进行权限验证的åQŒå·²¾låŒ…含在JDK1.4里面了。所以实际上是多余的包ã€?<br /><br />  jcs.jaråQ?<br />  如果你准备在Hibernate中ä‹É用JCS的话åQŒé‚£ä¹ˆå¿…™åÕdŒ…括它åQŒå¦åˆ™å°±ä¸ç”¨ã€?<br /><br />  jdbc2_0-stdext.jar: <br />  JDBC2.0的扩展包åQŒä¸€èˆ¬æ¥è¯´æ•°æ®åº“˜qžæŽ¥æ± ä¼šç”¨ä¸Šå®ƒã€‚不˜q‡App Server都会带上åQŒæ‰€ä»¥ä¹Ÿæ˜¯å¤šä½™çš„ã€?<br /><br />  jta.jaråQ?<br />  JTA规范åQŒå½“Hibernate使用JTA的时候需要,不过App Server都会带上åQŒæ‰€ä»¥ä¹Ÿæ˜¯å¤šä½™çš„ã€?<br /><br />  junit.jar: <br />  Junit包,当你˜qè¡ŒHibernate自带的测试代码的时候需要,否则ž®×ƒ¸ç”¨ã€?<br /><br />  xalan.jar, xerces.jar, xml-apis.jar: <br />  Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上åQŒJDK1.4也包含了解析器,不过不是XercesåQŒæ˜¯CrimsonåQŒæ•ˆçŽ‡æ¯”è¾ƒå·®åQŒä¸˜q‡Hibernate用XML只不˜q‡æ˜¯è¯Õd–配置文äšgåQŒæ€§èƒ½æ²¡ä»€ä¹ˆç´§è¦çš„åQŒæ‰€ä»¥ä¹Ÿæ˜¯å¤šä½™çš„ã€?img src ="http://www.aygfsteel.com/kobe09/aggbug/52747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kobe09/" target="_blank">氧气中毒</a> 2006-06-14 15:11 <a href="http://www.aygfsteel.com/kobe09/archive/2006/06/14/52747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts实践入门http://www.aygfsteel.com/kobe09/archive/2006/06/14/52745.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:09:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52745.htmlhttp://www.aygfsteel.com/kobe09/comments/52745.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52745.html#Feedback1http://www.aygfsteel.com/kobe09/comments/commentRss/52745.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52745.html    Struts是apache Jakarta的一个开攑օƒç çš„™å¹ç›®(
    http://jakarta.apache.org/struts/index.html)åQŒäؓ开发web应用½E‹åºæä¾›äº†ä¸€ä¸ªæ¡†æž?framework)。Sturts廸™®®æˆ‘们使用MVC Model 2 的模式开发web应用½E‹åºã€‚Sturts提供了Controller层组ä»Óž¼Œ˜q™äº›¾l„äšg可以和多¿Uå·²æœ‰Model层和View层技术集成ä‹É用。Sturts也可以帮助你建立一个扩展的开发环境ã€?br />
2、安�br />
2.1.下蝲struts 源代码和支持åº?br />    在本文中使用的是Struts 1.1 beta1 版。下è½?jakarta-struts-1.1-b1-src.zipåQŒjakarta-struts-1.1-b1-lib.zip

2.2.软äšg需æ±?br />
    安装StrutsåQŒå°¤å…¶æ˜¯ä½¿ç”¨æºä»£ç build Strutsæ—‰™œ€è¦å¤§é‡çš„æ”¯æŒè½¯äšgã€?br />    
    安装Struts是所需要的软äšg
    JDKåQ?.2版本或更é«?http://java.sun.com/j2se)
    
    Servlet ContaineråQŒæ”¯æŒservlet规范2.2或更高、jsp规范1.1æˆ–æ›´é«˜ï¼›å»ø™®®æ˜¯ä‹É用Tomcat 3.2(http://jakarta.apache.org/tomcatåQ‰ä»¥ä¸Šã€?br />    
    XML ParseråQŒæ”¯æŒJAXP规范1.1或更高;推荐使用jaxp的参考实玎ͼˆhttp://java.sun.com/xmlåQ‰ã€‚当然也可以是Xercers(http://xml.apache.org/xerces-j)ã€?br />
    以下ä¸ÞZ»Žæºä»£ç build Struts所需要的软äšg
    Ant Build systemåQ?大名鼎鼎的antåQ?.4版本以上。(http://jakarta.apache.org/antåQ‰ã€?br />    Servlet API classesåQ?http://jakarta.apache.org/builds/jakarta-servletapi
    JDBC 2.0 Optional Package Classes åQŒStruts 支持javax.sql.DataSource  åQˆhttp://java.sun.com/products/jdbc/download.htmlåQ?br />    
    Jakarta Commons PackagesåQŒStruts使用了Jakarta Common Project的一些包åQ?br />        Beanutils (Version 1.0 or later)åQŒæä¾›äº†æ˜“用的java反射和内省apiã€?br />        Collections (Version 1.0 or later)åQŒæä¾›äº†ä¸€å¥—与java Collections Framework 兼容和扩展的¾c…R€?br />        DBCP(version 1.0 or later)åQŒæ•°æ®åº“˜qžæŽ¥å’Œå¯¹è±¡æ± .
        Logging(version 1.0 or later)åQŒæ—¥å¿?br />        POOL(version 1.0 or later)åQ?br />        SERVICES(version 1.0 or later)
        VALIDATOR(version 1.0 or later)åQ?br />        Digester (Version 1.0 or later)åQŒxml-java对象映射工具åQŒé€šå¸¸ç”¨äºŽè§£æžxml配置文äšgã€?
    (http://jakarta.apache.org/commons)
    Xalan XSLT Processor åQŒä½ å¯ä»¥ä½¿JAXP 1.1所带的xalan.jaråQŒä¹Ÿå¯ä»¥ä½¿ç”¨Xalan 1.2或更高版本(http://xml.apache.org/xalanåQ‰ã€?br />

2.3用原码build Struts
Â Â Â Â ä»¥å¦‚ä¸‹è¿è¡ŒçŽ¯å¢ƒäØ“ä¾?
        OS:windows2000åQ?br />        jdk:j2sdk1.3åQ?br />
        ant:ant1.4.1åQ?br />        XML Parser:Xalan2.3.1åQ?br />        Xalan XSLT Processor:Xereses2.0.1
        ¼‹®ä¿ant,Xalan,Xereses工作正常
        注意事项:1.ant çš?style½{‰ä“Q务可以运è¡?br />
    2.3.1.解压jakarta-struts-1.1-b1-src.zip到D:\jakarta\struts-1.1-b1-src目录ã€?br />      解压jakarta-struts-1.1-b1-lib.zip到D:\jakarta\struts-1.1-b1-src\lib目录ã€?br />      解压后的目录¾l“构如下åQ?br />        D:\jakarta
        |-struts-1.1-b1-src     -->struts源码根目�br />            |-conf
          |-contrib
          |-doc
          |-legacy
          |-lib            -->struts的支持库
          |-src
          |-target
          |-web
      D:\jakarta\struts-1.1-b1-src是struts源码根目录,下文�struts表示“D:\jakarta\struts-1.1-b1-src"�
      D:\jakarta\struts-1.1-b1-src\lib是struts的支持库目录åQŒä¸‹æ–‡ç”¨$struts_lib表示"D:\jakarta\struts-1.1-b1-src\lib"。该目录下包含commons-beanutils.jar,commons-collection.jar...½{‰java¾cÕdº“åQŒè¿™äº›jar是build Struts所必需的。虽然你可以æŒ?.2中给出的地址下蝲安装˜q™äº›jaråQŒä½†å¯èƒ½ä¼šå¾ˆéºÈƒ¦åQˆæœ‰äº›åªæœ‰srcåQŒä½ ˜q˜éœ€è¦buildåQ‰ã€?br />
    2.3.2建立build.properties
      $struts\build.properties.sample另存�struts\build.properties修改下列属性:
        catalina.home - ä½ çš„tomcat 4.0路径åQˆå½“你希望ä‹É用build中deploy.catalinaçš„target时才需要配¾|®ï¼‰

        
        commons-beanutils.jar - BeanUtils package JAR 路径        commons-beanutils.jar=$struts_lib/commons-beanutils.jar(一定用¾lå¯¹è·¯å¾„åQŒå› ä¸ºåœ¨Struts有多个buildåQŒå¦‚使用相对路径åQŒä¸€äº›build会失败。以下相å?

        commons-collections.jar - Collections package JAR 路径
        commons-collections.jar=$struts_lib/commons-collections.jar

        commons-dbcp.jar - DBCP package JAR 路径
        commons-dbcp.jar=$struts_lib/commons-dbcp.jar

        Digester package JAR 路径
        commons-digester.jar=$struts_lib/commons-digester.jar

        Logging package JAR 路径
        commons-logging.jar=$struts_lib/commons-logging.jar

        POOL package JAR 路径        
        commons-pool.jar=$struts_lib/commons-pool.jar

        SERVICES package JAR 路径
        commons-services.jar=$struts_lib/commons-services.jar

        VALIDATOR package JAR 路径
        commons-validator.jar=$struts_lib/commons-validator.jar

        Jakarta Regexp package JAR 路径
        regexp.jar=D:/jakarta/regexp-1.2/jakarta-regexp-1.2.jaråQˆå¦‚果没有这个jar,可以到http://jakarta.apache.org/下蝲åQ?br />
        JDBC 2.0 Optional Package JAR 路径
        jdbc20ext.jar=$struts_lib/jdbc2_0-stdext.jar

        Servlet API classes (either version 2.2 or 2.3) JAR 路径
        servlet.jar=D:/j2sdkee1.2.1/lib/j2ee.jar        

        tomcat.home - Tomcat 3.2 åQˆå½“你希望ä‹É用build中deploy.tomcatçš„target时才需要配¾|®ï¼‰
        xerces.home - Xerces parser, version 1.2 or 1.3 (reåQˆå½“你希望ä‹É用build中deploy.catalinaçš„target时才需要配¾|®ï¼‰

        2.3.3.build Struts
        在DOS命ä×o½W¦ä¸‹˜qè¡Œ:ant dist
        D:\jakarta\struts-1.1-b1-src>ant dist

        build 成功后得到Struts 1.1 beta1 的二˜q›åˆ¶å‘行版:
        
        D:\jakarta
        |-struts-1.1-b1-src     -->Struts源码根目å½?br />          |-dist                -->Struts 1.1 beta1 的二˜q›åˆ¶å‘行版根目录ã€?br />          | |-lib        -->Struts应用工程的支持库
          | |-webapps        -->Struts的一些应用工½E?br />          |-target    

        lib目录下是一些Struts的应用工½E‹çš„æ”¯æŒåº“æ–‡ä»Óž¼š
        lib/commons-*.jar - Jakarta Commons project jar        
        (weblogc6.1 sp2 下不把commons-logging.jar攑֜¨wl çš?classpath,会出é”?郁闷ingã€?

        lib/jdbc2_0-stdext.jar - The JDBC 2.0 Optional Package API classes        
        lib/struts.jar - This JAR file contains all of the Java classes included in Struts. ä½ å¿…™åÀLŠŠstruts.jar拯‚´åˆ°æ¯ä¸€ä¸ªåŸºäºŽStrutsçš„web applicationçš„WEB-INF/lib目录下。一定不要用讄¡½®classpath的方式包含这些jaråQŒä¼šå‡ºçް ClassNotFoundException的异常ã€?br />        
        lib/struts-*.tld - Struts 标签库描˜q°æ–‡ä»¶ã€‚需要拷贝到web applicationçš„WEB-INF目录下ã€?br />        
        webapps目录下是一些web applicationçš„waræ–‡äšg
        webapps/struts-blank.war - 创徏åŸÞZºŽStruts的应用程序的½Ž€è¦æŒ‡å¯?br />        webapps/struts-documentation.war - Struts 文档。       Â?br />        webapps/struts-example.war - 展示大部分Struts特点的例子。   Â?br />        webapps/struts-exercise-taglib.war - 一些ä‹É用Struts标签库和‹¹‹è¯•ã€?br />        webapps/struts-template.war - Struts 模板标签介绍和示例ã€?br />        webapps/struts-upload.war - 用Struts框架写的文äšg上传ã€?br />
2.4在appserver上发布基于Strutsçš„web应用½E‹åº
    
    如果你的appserver是WebLogic 6.0+åQŒé‚£ä¹ˆä½ å¯ä»¥å‘ä‹É用标准war一样ä‹É用上面的war。我的appserver是WebLogic 6.1 sp2。在其他的appserver上发布Strutsçš„web应用½E‹åºå‚见http://jakarta.apache.org/struts/userGuide/installation.htmlä¸?installing Struts with your servlet container"一节ã€?br />    启动webLogicåQŒè¿›å…¥æŽ§åˆ¶å°åQŒé…¾|®ä¸€ä¸ªæ–°çš„web applicationåQŒèµ\径指å?struts\dist\webapps

]]>
Spring MVC框架的高¾U§é…¾|?http://www.aygfsteel.com/kobe09/archive/2006/06/14/52737.html氧气中毒氧气中毒Wed, 14 Jun 2006 07:05:00 GMThttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52737.htmlhttp://www.aygfsteel.com/kobe09/comments/52737.htmlhttp://www.aygfsteel.com/kobe09/archive/2006/06/14/52737.html#Feedback0http://www.aygfsteel.com/kobe09/comments/commentRss/52737.htmlhttp://www.aygfsteel.com/kobe09/services/trackbacks/52737.html本文ž®†äؓ您提供关于Spring MVC框架的配¾|®æŠ€å·§ï¼Œä»¥å¸®åŠ©ç®¡ç†åŸºäºŽSpringçš„web应用½E‹åºçš„多个实例。本配置½Ž¡ç†ä¸»é¢˜å¸¸è¢«å­¦æœ¯ç•Œæ‰€å¿½ç•¥åQŒä½†æ˜¯ï¼Œ˜q™å¯¹äºŽçŽ°å®žçš„web开发尤为重要。本主题òq¶ä¸ç›´æŽ¥å…Œ™”ä»ÖM½•具体的技术,因此åQŒæˆ‘们将从最基本的概念开始对˜q™ä¸ªé—®é¢˜˜q›è¡Œè¯´æ˜Žã€‚下面,我们ž®†æ ¹æ®Spring MVC框架åQŒäØ“åŸÞZºŽæœ¬æŠ€æœ¯å¼€å‘çš„™å¹ç›®æä¾›ä¸€¾pÕdˆ—的解å†Ïx–¹æ¡ˆã€?/p>

Spring配置

  äºÞZ»¬¾lå¸¸ä¼šåœ¨ä¸€åîC»¥ä¸Šçš„ä¸ÀLœºä¸Šé…¾|®ä¸€¿UWeb应用½E‹åºã€‚例如,在生产中åQŒä¸€ä¸ªç½‘站可能只有一个实例。除了此实例外,开发äh员可以在用于开发的机器上配¾|®å…¶ä»–çš„åQˆå¼€å‘)实例。也可以在公司(机构åQ‰å†…部的本地开发服务器上维护其他应用程序装¾|®ï¼Œ˜q™å°†è®©æ‚¨å—益匪浅。该实例的目的是使Web设计者可以获得有质量保证的材料,òq¶äØ“éœ€è¦äØ“åº”ç”¨½E‹åºæä¾›æ–‡äšg资料的äh提供准入ã€?/p>

  大家都知道,即ä‹É是最½Ž€å•的场景åQŒä¹Ÿéœ€è¦å®‰è£…、配¾|®å’Œ¾l´æŠ¤ä¸‰ä¸ªå®žä¾‹ã€‚而对于位于不同地理位¾|®çš„团队来说åQŒè¦ä»Žäº‹˜q™æ ·çš„项目便更加困难。对于ä“Q何不是特别简单的Web应用½E‹åº™å¹ç›®åQŒéƒ½éœ€è¦å¤šåå¼€å‘äh员来安装™å¹ç›®è£…置和本地设¾|®ä»¥åŠè¿è¡Œå•元测试的装置½{‰ã€?/p>

  很多¾l„ç»‡éƒ½å°†è‡ªå·±å¼€å‘çš„äº§å“ä½œäØ“Web应用½E‹åºã€‚我们可以在很多产品中发现这¿Uæƒ…况,例如电子商务¾pȝ»Ÿã€?a target="_blank">内容½Ž¡ç†¾pȝ»ŸåQˆCMSåQ‰ï¼Œä»¥åŠåšå®¢å‘布òq›_°½{‰ã€‚è¿™¾cÖMñ”品可在多个服务器中进行部¾|ŒÓ€‚对于成功的多用途Web应用½E‹åºæ¥è¯´åQŒä»–们的开发äh员必™å»è¦ä¿è¯ä»–们的应用程序便于安装,òq¶ä¸”能够与其他Web应用½E‹åºå®Œç¾Žé›†æˆã€‚经˜q‡ä¸Š˜q°è®¨è®ÞZ¹‹åŽï¼Œæˆ‘们应该明了åQŒä½œä¸ºæœ¬æ–‡ä¸»é¢˜çš„应用½E‹åºé…ç½®æ˜¯é€šç”¨Web应用½E‹åº™å¹ç›®å¼€å‘äh员所需要解决的重要问题之一ã€?/p>

  诸如CVS或Subversion之类的版本控制系¾lŸæ˜¯å¼€å‘组¾l‡ä‹É用的一¿Uæ ‡å‡†å·¥å…—÷€‚è¿™¿Uå·¥å…·ä»£è¡¨äº†ä¸€äº›ç»„¾l‡çš„中心源代码版本库åQŒå®ƒä»¬è¢«ç”¨äºŽä¿æŒæºä»£ç çš„æœ‰åºã€‚用户可以跟ítªåº”用程序源代码的变化,昄¡¤ºä¸åŒç‰ˆæœ¬çš„区别,òq¶å¯ä»¥ç¡®å®šé¡¹ç›®åˆ†æ”¯ã€‚而且åQŒå®ƒä»¬ä‹É得在应用½E‹åºéƒ¨çÖv中进行部分更新成为可能ã€?/p>

  很明显,版本控制¾pȝ»Ÿè½¯äšg是跟ítªæºä»£ç æ‰€å¿…需的,它对于解军_º”用程序配¾|®é—®é¢˜æœ‰éžå¸¸å¤§çš„帮助。在本文中,我们ž®†ä¸ä¼šæŠŠé‡ç‚¹æ”‘Öœ¨ç‰ˆæœ¬æŽ§åˆ¶¾pȝ»Ÿä¸Šï¼Œå› äØ“˜q™æ–¹é¢å·²¾læœ‰å¾ˆå¤šç›¸å…³çš„ææ–™äº†ã€‚在此,我们ž®†å…³æ³¨ç‰ˆæœ¬æŽ§åˆ‰™—®é¢˜ä¸­çš„一个小话题åQšå¦‚何ä‹ÉWeb应用½E‹åºçš„配¾|®æ›´åŠ ä¾¿æøP¼ˆž®¤å…¶æ˜¯ä‹É用Spring MVC框架¾~–写的Web应用½E‹åºåQ‰ã€?/p>

  问题是:我们在此讨论的是一¿Uä»€ä¹ˆæ ·çš„配¾|®ï¼Ÿä»ÖM½•Web应用½E‹åºéƒ½éœ€è¦ä¸€äº›èµ„源,˜q™äº›èµ„源通常都是其所˜qè¡Œçš„æœåŠ¡å™¨æ‰€ç‰ÒŽœ‰çš„,例如数据库URL、发送电子邮件的SMTP服务器,以及包含专用软äšgæ–‡äšg的文件夹½{‰ã€‚è¿™æ ïLš„讄¡½®åº”该集中åQŒä»Žè€Œä‹É应用½E‹åºé…ç½®æ›´åŠ ½Ž€å•ã€?/p>

  但是åQŒè¿™åªæ˜¯˜q™ä¸ªé—®é¢˜æœ€½Ž€å•的一¿Uç‰ˆæœ¬ã€‚有时候,在应用程序开发中需要更加复杂的配置。这意味着åQŒå¿…™åÕd°†å„次部çÖv中的不同Bean˜qžæŽ¥èµäh¥åQŒè€Œè¿™ä¼šä‹É问题更加复杂ã€?/p>

  ˜q™äº›åº”用½E‹åºé…ç½®é—®é¢˜çš„è§£å†Ïx–¹æ¡ˆæœ‰è¯¸å¤šä¼˜åŠ¿åQŒåŒ…括:½Ž€åŒ–应用程序的安装和配¾|®è¿‡½E‹ï¼Œä½¿æºä»£ç ç‰ˆæœ¬æŽ§åˆ¶æ›´åŠ ½Ž€ä¾¿ï¼Œå‡å°‘源代码版本库中的冲突现象。下面,我们ž®†é€šè¿‡½CÞZ¾‹è¯¦ç»†è®¨è®º˜q™ä¸ªè¯é¢˜ã€?/p>

问题

  我们首先来演½CÞZ¸€ä¸‹ä¸Šæ–‡æ‰€æåˆ°çš„æœ€½Ž€å•的版本。在˜q™ä¸€åœºæ™¯ä¸­ï¼Œæˆ‘们希望在应用程序部¾|²ä¸­æ”¹å˜çš„æ˜¯½Ž€å•的配置参数åQŒä¾‹å¦‚链接、密码等。如果您曄¡»ä½¿ç”¨Spring MVC框架开发过Web应用½E‹åºåQŒé‚£ä¹ˆæ‚¨åº”该知道˜q™é‡Œž®†ç”¨åˆ°çš„两个配置文äšgåQ?/p>

  • /WEB-INF/applicationContext.xmlåQŒå®ƒè®©æ‚¨å¯ä»¥é…ç½®BeanåQŒæˆ–者显½Cºåº”用程序上下文。通过˜q™ä¸ªæ–‡äšgåQŒæ‚¨å¯ä»¥å®šä¹‰è‡ªå·±çš„业务逻辑Bean、资源以及其他可以与Web端口相关联的所有Beanã€?
  • /WEB-INF/[servlet-name]-servlet.xmlåQŒå®ƒè¢«ç”¨äºŽé…¾|®Web层、视图解析器、控制器、校验器以及其他所有MVC框架中必需的Beanã€?strong>[servlet-name]指的是在web.xml部çÖv描述½W¦ä¸­å®šä¹‰çš?strong>Spring dispatcher servlet的名¿U°ã€?

  那么问题在哪儿呢åQŸé—®é¢˜å°±å‡ºåœ¨applicationContext.xml中将包括一些特定于ä¸ÀLœºçš„Bean定义。其中,最明显的一个示例就是包含了JDBC˜qžæŽ¥ä¿¡æ¯çš„beanåQŒä½†æ˜¯ä“Q何一¿Uç¨å¾®å¤æ‚些的应用程序都有十几个¾cÖM¼¼çš„Bean。看一下下面的½CÞZ¾‹åQ?/p>

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName">
       <value>org.postgresql.Driver</value>
   </property>
   <property name="url">
       <value>jdbc:postgresql://localhost/test</value>
   </property>
   <property name="username">
       <value>postgres</value>
   </property>
   <property name="password">
       <value></value>
   </property>
</bean>

  ˜q™ä¸ªè§£å†³æ–ÒŽ¡ˆçš„问题在于对applicationContext.xmlæ–‡äšg的维护。对于初学者来è¯ß_¼Œè®¾æƒ³ä¸€ä¸‹ï¼Œ™å¹ç›®æ”‘Öœ¨æºä»£ç ç‰ˆæœ¬æŽ§åˆ¶ç³»¾lŸä¸­åQŒä¾‹å¦‚CVS。下面,假设您希望在¾|‘站中添加新的功能,那么ž®±éœ€è¦åœ¨åº”用½E‹åºä¸Šä¸‹æ–‡å®šä¹‰ä¸­æ·ÕdŠ é¢å¤–çš„Bean定义。问题是如何在生产服务器上体现这些改变ã€?/p>

  通常情况下,应用½E‹åºçš„æœ¬åœ°å®žä¾‹ä¸ä¼šä¸Ž‹zÕdŠ¨ç«™ç‚¹ä½¿ç”¨åŒæ ·çš„æ•°æ®åº“åQŒå› æ­¤applicationContext.xmlæ–‡äšgž®†åŒ…括让您能够访问本地数据库的设¾|®ã€‚当您想提交在源代码版本库中的改变时åQŒå°±éœ€è¦æ³¨æ„è¿™äº›ç‰¹å®šäºŽä¸ÀLœºå±žæ€§çš„同步性。版本库中的文äšg最¾lˆå¯èƒ½ä‹É用本地设¾|®ä¸­çš„配¾|®ã€‚如果想在生产服务器上更新配¾|®ï¼Œž®±å¿…™åÀL‰‹åŠ¨åŒæ­¥è¿™äº›å±žæ€§çš„å€¹{€‚这是非常枯燥的ä»ÕdŠ¡åQŒè€Œä¸”˜q˜éžå¸¸å®¹æ˜“出错ã€?/p>

  对于应用½E‹åºçš„æ¯ä¸ªå®žä¾‹æ¥è¯ß_¼Œ˜q™ä¸ªé—®é¢˜æ›´åŠ é‡è¦ã€‚å‡å¦‚æœ‰ä¸‰ä½å¼€å‘äh员正在ä‹É用代码段基址åQŒè€Œä¸”他们使用的是本地的数据库。当您提交更改的时候,他们每个人在本地服务器上更新源代码的时候都必须非常谨慎。他们会手动同步˜q™äº›æ›´æ”¹åQŒç„¶åŽæäº¤ä»–们的工作。这样一来,版本控制¾pȝ»Ÿå¯¹äºŽ˜q™äº›é…ç½®æ–‡äšg来说已经毫无用处。如果曾¾lä‹É用过Spring MVCåQŒé‚£ä¹ˆæ‚¨åº”该知道applicationContext.xml是应用程序中的关键组ä»Óž¼Œå› äؓ是它ž®†æ‰€æœ‰çš„东西¾_˜åˆåœ¨ä¸€èµ—÷€‚所以,我们需要一¿Uæœºåˆ¶æ¥å¸®åŠ©ä½¿åº”ç”¨ç¨‹åºä¸­å„é¡¹ä¿æŒæœ‰åºåQŒè¿™ç‚šwžå¸”R‡è¦ã€?/p>

  正如前面所提到的,˜q™æ˜¯æ‚¨å¯èƒ½é‡åˆ°çš„较简单的配置问题。更隄¡š„问题出现在当需要在不同服务器中˜q›è¡Œä¸åŒçš„Bean˜qžæŽ¥çš„æ—¶å€™ã€‚è¿™¾c»é—®é¢˜å¸¸ä¼šå‡ºçŽ°åœ¨æ—¥å¸¸è½¯äšg开发ä“Q务中。例如,假如您的产品有一个客戯‚ín份验证模块,可以å¯ÒŽ¥è‡ªå…³¾pÀL•°æ®åº“或LDAP服务器中的用戯‚¿›è¡Œèín份验证。自ç„Óž¼Œ˜q™ä¸€íw«ä†¾éªŒè¯æ¨¡å—可以使用抽象了特定版本库的Bean˜q›è¡Œé…ç½®ã€‚如果您æƒÏx”¹å˜ä¸åŒåº”用程序部¾|²ä¸­éªŒè¯ç”¨æˆ·çš„æ–¹å¼ï¼Œž®±éœ€è¦åœ¨applicationContext.xmlæ–‡äšg中进行不同的Bean˜qžæŽ¥ã€‚è¿™¿Ué…¾|®é—®é¢˜å¸¸è§äºŽåœ¨éƒ¨¾|²ä¸­æœ‰å¯é…ç½®ç‰ÒŽ€§çš„æ‰€æœ‰åº”用程序ã€?/p>

  在下文中åQŒæˆ‘们将讨论˜q™ä¸¤¿Ué…¾|®é—®é¢˜ã€‚首先我们会å…Ïx³¨åŒæ­¥çš„Bean属性问题及其解å†Ïx–¹æ¡ˆï¼ŒæŽ¥ä¸‹æ¥ï¼Œæˆ‘们会讨论更加复杂的同步Bean˜qžæŽ¥é—®é¢˜ã€?/p>

解决æ–ÒŽ¡ˆ

同步Bean属�/h3>

  ˜q™ä¸ªé—®é¢˜çš„一¿Uå¯è¡Œçš„解决æ–ÒŽ¡ˆæ˜¯å°†æ‰€æœ‰ç‰¹å®šäºŽä¸ÀLœºçš„参数都攑ֈ°æ™®é€šçš„Java属性文件中åQŒä‹É用Springçš„PropertyPlaceHolderConfigurer¾c»ï¼Œž®†è¿™äº›å‚数写入Bean属性中ã€?/p>

  使用˜q™ä¸€è§£å†³æ–ÒŽ¡ˆåQŒæˆ‘们可以生成如下的属性文ä»Óž¼ˆ/WEB-INF/jdbc.propertiesåQ‰ï¼š

jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/test
jdbc.user=postgres
jdbc.password=

  我们的Bean配置如下åQ?/p>

<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
       <value>/WEB-INF/jdbc.properties</value>
    </property>
</bean>

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
         <value>${jdbc.driver}</value>
    </property>
    <property name="url">
         <value>${jdbc.url}</value>
    </property>
    <property name="username">
         <value>${jdbc.user}</value>
    </property>
    <property name="password">
         <value>${jdbc.password}</value>
    </property>
</bean>

  如上所˜qŽÍ¼Œæˆ‘们定义了一个PropertyPlaceholderConfigurer¾cȝš„实例åQŒåƈž®†å…¶ä½ç½®å±žæ€§è®¾¾|®äؓ我们的属性文件。该¾c»è¢«å®žçŽ°ä¸ºBean工厂的后处理器,òq¶å°†ä½¿ç”¨å®šä¹‰åœ¨æ–‡ä»¶ä¸­çš„属性来代替所有的占位½W¦ï¼ˆ${...}valueåQ‰ã€?/p>

  利用˜q™ç§æŠ€æœ¯ï¼Œæˆ‘们可以从applicationContext.xml中移除所有特定于ä¸ÀLœºçš„配¾|®å±žæ€§ã€‚通过˜q™ç§æ–¹å¼åQŒæˆ‘ä»¬å¯ä»¥è‡ªç”±åœ°ä¸ø™¯¥æ–‡äšgæ·ÕdŠ æ–°çš„BeanåQŒè€Œä¸å¿…担心特定于ä¸ÀLœºå±žæ€§çš„同步性。这样可以简化生产部¾|²å’Œ¾l´æŠ¤ã€?/p>

同步性连�/h3>

  上面的技术解决了½W¬ä¸€ä¸ªé—®é¢˜ï¼Œå¯æ˜¯å¦‚果您计划修改不同应用程序部¾|²ä¹‹é—´çš„Bean˜qžæŽ¥åQŒè¿™ä¸€æŠ€æœ¯ä¾¿ä¸å¾ˆé€‚合。针对这一问题的一个解å†Ïx–¹æ¡ˆä¾¿æ˜¯é¢å¤–创å»ÞZ¸€ä¸ªåä¸ºapplicationContext-[hostname].xml çš„XML定义文äšg。其ä¸?strong>[hostname]是部¾|²åº”用程序的ä¸ÀLœºçš„名¿U°ã€‚例如,在本地的机器上,˜q™ä¸ªæ–‡äšgé€šå¸¸åäØ“applicationContext-localhost.xmlåQŒè€Œåœ¨éƒ¨çÖvæ—Óž¼Œå®ƒå¯èƒ½æ›´åäØ“applicationContext-somehost.com.xmlã€?/p>

  可以猜测åQŒè¿™ä¸€æ–‡äšg必须包括特定于某一ä¸ÀLœºçš„æ‰€æœ‰é…¾|®Bean。在本文中,我们ž®†å‡è®¾dataSource bean定义ž®†ä½äºŽè¿™¾cÀL–‡ä»¶ä¸­åQŒè€Œä¸æ˜¯é€šç”¨çš„applicationContext.xml定义。当ç„Óž¼Œ˜q™ç§æœºåˆ¶ä¸Žå‰è€…åÆˆéžå†²½Hï¼Œä½†æ˜¯ä¸ÞZº†æ›´åŠ ½Ž€å•明了,我们ž®†åªå…Ïx³¨˜q™ç§æ–ÒŽ³•ã€?/p>

  既然我们已经有了特定的配¾|®ï¼Œä¸‹é¢æˆ‘们ž®±æ¥è®¨è®ºä¸€ä¸‹å¦‚何将其整合到整个Spring MVC配置概念中。要辑ֈ°˜q™ä¸€ç›®çš„åQŒå¯ä»¥æœ‰è®¸å¤šæ–ÒŽ³•åQŒæˆ‘们将详细åœîC¸€ä¸€è¯´æ˜Žã€‚但首先åQŒæˆ‘们应该注意到åQŒç”±äºŽæœ‰äº›Bean可能位于独立的配¾|®æ–‡ä»¶ä¸­åQŒå› æ­¤åœ¨applicationContext.xml中,所有对它们的局部引用都必须更换成全局名称ã€?/p>

  例如åQŒå¦‚下引用:

 <property name="someProperty">
   <ref local="someBean"/>
</property>

ã€€ã€€åº”æ›´æ”¹äØ“åQ?/p>

 <property name="someProperty">
   <ref bean="someBean"/>
</property>

  在这之后åQŒæˆ‘们有很多可以æ·ÕdŠ é¢å¤–çš„èµ„æºä»¥ç”¨äºŽé…ç½®çš„æ–¹å¼ã€‚å…¶ä¸­æœ€æ˜Žæ˜¾çš„å°±æ˜¯ä‹Éç”?lt;import>标签ž®†è¿™ä¸€é¢å¤–资源包含在applicationContext.xml配置文äšg中。ä‹É用时åQŒè¦ž®†è¯¥æ ‡ç­¾æ”‘Öœ¨applicationContext.xmlæ–‡äšg开头。例如:

				
 <import resource="applicationContext-somehost.com.xml"/>

  现在åQŒåœ¨ç‹¬ç«‹çš„XML定义文äšg和普通的应用½E‹åºä¸Šä¸‹æ–‡å®šä¹‰æ–‡ä»¶ä¸­çš„æ‰€æœ‰é€šç”¨Bean定义都有了特定于ä¸ÀLœºçš„连接。由于大多数的Bean都不是特定于ä¸ÀLœºçš„,因此我们可以像处理Web应用½E‹åºä¸­çš„其他资源一栯‚‡ªç”±åœ°å¤„理applicationContext.xmlæ–‡äšgåQŒåƈ可以通过合适的版本控制¾pȝ»Ÿä¸Žå…¶˜q›è¡ŒåŒæ­¥ã€?/p>

  但是åQŒä¸Š˜q°æ–¹æ³•也有一定的弊端。如果您想保留不同XMLæ–‡äšg的不同配¾|®ï¼Œž®×ƒ»ç„¶å¿…™åÀL‹…心applicationContext.xmlçš„åŒæ­¥æ€§ï¼Œå› äØ“èµ„æºçš„å¿U°å¿…™åÀL ¹æ®ä¸åŒæœåС噍˜q›è¡Œæ›´æ”¹ã€‚虽然与原有的解å†Ïx–¹æ¡ˆç›¸æ¯”有了很大提高,只需更改文äšg名,但是˜q™è¿˜æ˜¯éœ€è¦å¼€å‘äh员的手动协助ã€?/p>

  ç”׃ºŽä¸ŽapplicationContext.xml相比åQŒä¸»æœºé…¾|®ä¸éœ€å¦‚此频繁地进行更改,因此下一步便是将ä¸ÀLœºé…ç½®¿UÕdŠ¨åˆ°web.xmlæ–‡äšg中(如果可能的话åQ‰ã€‚幸˜qçš„æ˜¯ï¼Œæˆ‘们有一个可用的解决æ–ÒŽ¡ˆã€‚看一下下面关于web.xml配置的片断:

 <listener>
   <listener-class>
    org.springframework.web.context.ContextLoaderListener
   </listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/applicationContext.xml
       /WEB-INF/applicationContext-somehost.com.xml
    </param-value>
  </context-param>

  正如您所看到的,除了web.xmlæ–‡äšg中常有的ContextLoaderListener之外åQŒæˆ‘们还æ·ÕdŠ äº†contextConfigLocation上下文参数配¾|®ã€‚这一参数用于指示框架查找˜q™äº›é…ç½®æ–‡äšg的位¾|®ã€‚如果这一参数被省略,则Springž®±åªèƒ½åˆ°applicationContext.xml中查找。这里我们也定义了特定于ä¸ÀLœºçš„配¾|®æ–‡ä»¶æ¥ä½¿ç”¨ã€?/p>

  利用˜q™ç§æ–ÒŽ³•åQŒæˆ‘们将所有特定于ä¸ÀLœºçš„配¾|®ä»ŽapplicationContext.xmlæ–‡äšg中移除,˜q™æ ·ä¾¿å‡è½ÖMº†å…¶åœ¨ä¸åŒåº”用½E‹åºéƒ¨çÖv中的同步性ã€?/p>

  如果˜q™ç§æ–ÒŽ³•æˆäØ“æ‚¨çš„æ–îC¹ æƒ¯ï¼Œæ‚¨è¿˜å¯ä»¥ä½¿å…¶æ›´åŠ ç‰|´»ã€‚通过遵守下列指ä×oåQŒä¹Ÿå¯ä»¥ž®†ç‰¹å®šäºŽä¸ÀLœºçš„配¾|®ä»Žweb.xmlæ–‡äšg中移除ã€?/p>

  为此åQŒéœ€è¦åˆ›å»ºç‰¹å®šäºŽæˆ‘们的应用程序上下文的类åQ?/p>

 package net.nighttale.spring.util;

import java.net.InetAddress;

import org.springframework.web.context.support.XmlWebApplicationContext;

public class PerHostXmlWebApplicationContext
extends XmlWebApplicationContext {
       
    protected String[] getDefaultConfigLocations() {
            String hostname = "localhost";
            try {
                hostname = InetAddress.getLocalHost().getHostName();
            } catch (Exception e) {
            }
           
            String perHostConfiguration = DEFAULT_CONFIG_LOCATION_PREFIX
                 + "applicationContext-"
                 + hostname
                 + DEFAULT_CONFIG_LOCATION_SUFFIX
                 ;
   
            logger.debug(
                 "Adding per host configuration file: "
                 + perHostConfiguration
                 );
           
            if (getNamespace() != null) {
                    return new String[] {
              DEFAULT_CONFIG_LOCATION_PREFIX
                + getNamespace()
                + DEFAULT_CONFIG_LOCATION_SUFFIX
             , perHostConfiguration};
            }
            else {
                    return new String[] {
             DEFAULT_CONFIG_LOCATION
              , perHostConfiguration};
            }
    }
}

  ˜q™ä¸ª¾cÀL‹“展了Spring中常被作为默认å€ég‹É用的XmlWebApplicationContext。XmlWebApplicationContext¾cÕd°†Web应用½E‹åºçš„配¾|®ä»ŽXML定义文äšg中复制过来。默认情况下åQŒå®ƒå¯ä»¥é…ç½®æ¥è‡ªapplicationContext.xmlå’?strong>[servlet-name]-servlet.xmlæ–‡äšg中的应用½E‹åºã€‚这个类执行的惟一一™åšw¢å¤–ä“Q务便是获取它所在的ä¸ÀLœºåç§°åQŒåƈž®†applicationContext-[hostname].xmlæ–‡äšgæ·ÕdŠ åˆ°é…¾|®æ–‡ä»¶åˆ—表中ã€?/p>

  ä¸ÞZº†ä½¿ç”¨˜q™ä¸ª¾c»ï¼Œæˆ‘们需要对其进行编译,ž®†å…¶åŒ…含在类途径中,òq¶æŒ‡½CºSpring框架使用它。前两步非常½Ž€å•,我们ž®×ƒ¸åœ¨æ­¤èµ˜è¿°ã€‚我们可以指½CºSping通过contextClass上下文参数来使用它。除了web.xmlæ–‡äšg中的原有配置åQŒæˆ‘们还可以æ·ÕdŠ ä¸‹åˆ—å†…å®¹åQ?/p>

 <context-param>
   <param-name>contextClass</param-name>
  <param-value>
   net.nighttale.spring.util.PerHostXmlWebApplicationContext
  </param-value>
</context-param>

 如果我们使用˜q™ä¸€é…ç½®ç‰‡æ–­åQŒå°†ä¼šæœ‰ä¸‰ä¸ªæ–‡äšg被用于初始化˜q™ä¸ªæ¡†æž¶åQ?strong>[servlet-name]-servlet.xml、applicationContext-[hostname].xml以及applicationContext.xmlã€?/p>

  正如您所看到的,applicationContext.xmlå’Œweb.xmlæ–‡äšg已经完全摆脱了ä“Q何特定的配置¾l†èŠ‚åQŒè€Œä¸”您也不必担心会在更新应用½E‹åºæ—¶ç ´åé…¾|®ã€?/p>

  但是åQŒè¿™¿Uæ–¹æ³•有一个不­‘³ä¹‹å¤„。因为,不论是否会ä‹É用,都需要在应用½E‹åºéƒ¨çÖv中有½W¬ä¸‰ä¸ªé…¾|®æ–‡ä»¶ã€‚在˜q™ç§æƒ…况下,便不需要特定于ä¸ÀLœºçš„配¾|®ã€‚例如:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans></beans>

  最后,需要知道应用程序上下文¾c»éœ€è¦æŸ¥æ‰„¡š„特定ä¸ÀLœºåã€‚检查主机名¿U°çš„æœ€½Ž€å•çš„æ–ÒŽ³•是在机器上运行下列代码:

 System.out.println(InetAddress.getLocalHost().getHostName())

  可以ž®†å…¶ä½œäØ“Java代码执行åQŒä¹Ÿå¯åœ¨å–œæ¬¢ä½¿ç”¨çš„脚本语­a€åQˆå¦‚BeanShell或GroovyåQ‰ä¸­ä½œäؓ一个具有Java风格语法的脚本执行。在获取了主机的名称之后åQŒåº”该创å»ÞZ¸€ä¸ªé»˜è®¤çš„/WEB-INF/applicationContext-[hostname].xml½Iºæ–‡ä»¶å¤¹åQˆå¦‚我们上面所定义的)åQŒç„¶åŽä¾¿å¯ä»¥å¼€å§‹äº†ã€?/p>

¾l“束è¯?/h3>

  在本文中åQŒæˆ‘们提供了一¾pÕdˆ—的配¾|®æŠ€å·§ï¼Œè®©æ‚¨åœ¨ä‹É用Spring MVC框架完成日常工作的时候更加轻松。如果您希望知道如何¾l´æŠ¤å„种Web应用½E‹åºéƒ¨çÖvåQŒå¯ä»¥è¯•着扑ևºæœ€é€‚合您的开发过½E‹çš„解决æ–ÒŽ¡ˆã€‚您的生‹zÖM¼šæ›´äØ“è½ÀL¾ã€?/p>

]]>Struts学习½W”è®°åQˆä¸€åQ?struts概念和体¾pȝ»“æž?/title><link>http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.html</link><dc:creator>氧气中毒</dc:creator><author>氧气中毒</author><pubDate>Sun, 04 Jun 2006 10:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.html</guid><wfw:comment>http://www.aygfsteel.com/kobe09/comments/50304.html</wfw:comment><comments>http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kobe09/comments/commentRss/50304.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kobe09/services/trackbacks/50304.html</trackback:ping><description><![CDATA[ <p> <font color="#000000"> <strong>一ã€?/strong> </font> <a name="_Toc65638969"> <span lang="EN-US"> <font face="Arial" color="#000000"> <strong>Struts</strong> </font> </span> </a> <span style="mso-bookmark: _Toc65638969"> <font color="#000000"> <strong> <span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">的与</span> <span lang="EN-US"> <font face="Arial">Web App</font> </span> </strong> </font> </span> <span style="mso-bookmark: _Toc65638969"> <span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial"> <font color="#000000"> <strong>的关¾p?br /></strong> </font> </span> </span> <br style="mso-ignore: vglayout" clear="all" /> <span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">     <span lang="EN-US">struts</span>叫做<span lang="EN-US">web framework</span>åQŒå…¶ä¸»è¦åŸÞZºŽ<span lang="EN-US">web</span>层的应用¾pȝ»Ÿå¼€å‘。按ç…?span lang="EN-US">J2EE Architecture</span>的标准,<span lang="EN-US">struts</span>应当å’?span lang="EN-US">jsp/servlet</span>ä¸€æ øP¼Œå­˜åœ¨äº?span lang="EN-US">web container</span>一层ã€?br /></span> </p> <p align="center"> <img title="struts与WebApp的关¾p? height="306" alt="3.jpg" src="http://www.aygfsteel.com/images/blogjava_net/kobe09/Framework/Struts/3.jpg" width="405" border="0" /> </p> <p> <br /> <strong>二ã€?/strong> <a name="_Toc65638970"> <strong> <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Struts</span> <span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的体¾pȝ»“æž?/span> </strong> </a> <br />       <span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font color="#000000">我们è¯?span lang="EN-US">struts framework</span>æ˜?span lang="EN-US">MVC </span>模式的体玎ͼŒä¸‹é¢æˆ‘们ž®×ƒ»Žåˆ†åˆ«ä»Žæ¨¡åž‹ã€è§†å›¾ã€æŽ§åˆ¶æ¥çœ‹çœ‹<span lang="EN-US">struts</span>的体¾pȝ»“构(<span lang="EN-US">Architecture</span>åQ‰ã€‚下图显½CÞZº†<span lang="EN-US">struts framework</span>的体¾pȝ»“构响应客戯‚¯·æ±‚时候,各个部分工作的原理ã€?br /></font></span></p> <p align="center"> <img title="struts体系¾l“æž„" height="216" alt="2.jpg" src="http://www.aygfsteel.com/images/blogjava_net/kobe09/Framework/Struts/2.jpg" width="435" align="center" border="0" /> </p> <p style="MARGIN: 13pt 0cm"> <strong> <font size="2"> <font face="Times New Roman">1ã€?/font> </font> </strong> <a name="_Toc65638971"> <font face="Times New Roman"> <strong> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从视图角度(</span> <span lang="EN-US">View</span> </font> </strong> </font> </a> <span style="mso-bookmark: _Toc65638971"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font face="Times New Roman" size="2"> <strong>åQ?/strong> </font> </span> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 31.5pt"> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先åQ?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">Struts</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供äº?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">Java</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">¾c?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">org. apache.struts.action.ActionForm</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">åQ?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">Java</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发者将该类¾l†åˆ†æ¥åˆ›å»ø™¡¨å?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">bean</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在˜qè¡Œæ—Óž¼Œè¯?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">bean</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有两¿Uç”¨æ³•:<br /></span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">â€?span style="mso-spacerun: yes">  </span></font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">å½?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">JSP</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">准备相关çš?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">HTML</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">åQŒè¡¨å•以˜q›è¡Œæ˜„¡¤ºæ—Óž¼Œ</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">JSP</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">ž®†è®¿é—®è¯¥</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 76.45pt; mso-para-margin-left: 7.28gd"> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">bean(</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它保存要攑օ¥è¡¨å•中的å€?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">)</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。那些值是从业务逻辑或者是从先前的用户输入来提供的ã€?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 78.75pt; TEXT-INDENT: -78.75pt; mso-char-indent-count: -7.5"> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman"> <span style="mso-spacerun: yes">          </span>â€?span style="mso-spacerun: yes">  </span></font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当从</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">Web</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">‹¹è§ˆå™¨ä¸­˜q”回用户输入æ—Óž¼Œè¯?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">bean</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">ž®†éªŒè¯åƈ保存该输入以供业务逻辑æˆ?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">(</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果验证å¤ÞpÓ|的话</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">)</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后箋重新昄¡¤ºä½¿ç”¨ã€?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 31.5pt"> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其次åQ?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">Struts</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了许多定åˆ?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">JSP</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标记åQŒå®ƒä»¬çš„使用½Ž€å•,但是它们在隐藏信息方面功能强大。例如,除了</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">bean</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名称和给å®?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">bean</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中每个段的名¿UîC¹‹å¤–,™åµé¢è®¾è®¡è€…不需要知道有兌™¡¨å?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">bean</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的更多信息ã€?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> <p style="MARGIN: 13pt 0cm"> <strong> <font size="2"> <font face="Times New Roman">2ã€?/font> </font> </strong> <a name="_Toc65638972"> <font face="Times New Roman"> <strong> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从模型角度(</span> <span lang="EN-US">Model</span> </font> </strong> </font> </a> <span style="mso-bookmark: _Toc65638972"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font face="Times New Roman" size="2"> <strong>åQ?/strong> </font> </span> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> <font face="Times New Roman">Struts</font> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然不直接有助于模型开发ã€?/span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">åœ?span lang="EN-US">Struts</span>中,¾pȝ»Ÿ</span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模型</span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">的状态主要由<span lang="EN-US">ActiomForm Bean</span>和值对象体现ã€?span lang="EN-US"><o:p></o:p></span></span> </p> <p style="MARGIN: 13pt 0cm"> <strong> <font size="2"> <font face="Times New Roman">3ã€?/font> </font> </strong> <a name="_Toc65638973"> <font face="Times New Roman"> <strong> <font size="2"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从控制器角度åQ?/span> <span lang="EN-US">Controller</span> </font> </strong> </font> </a> <span style="mso-bookmark: _Toc65638973"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <font face="Times New Roman" size="2"> <strong>åQ?/strong> </font> </span> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"> <span style="mso-tab-count: 1">    </span> </span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">åœ?span lang="EN-US">Struts framework</span>中,<span lang="EN-US"> Controller</span>主要æ˜?span lang="EN-US">ActionServlet</span>åQŒä½†æ˜¯å¯¹äºŽä¸šåŠ¡é€»è¾‘çš„æ“ä½œåˆ™ä¸»è¦ç”?span lang="EN-US">Action</span>ã€?span lang="EN-US">ActionMapping</span>ã€?span lang="EN-US">ActionForward</span>˜q™å‡ ä¸ªç»„件协调完成(也许˜q™å‡ ä¸ªç»„ä»Óž¼Œåº”该划分到模型中的业务逻辑一块)。其中,<span lang="EN-US">Action</span>扮演了真正的控制逻辑的实现者,è€?span lang="EN-US">ActionMapping</span>å’?span lang="EN-US">ActionForward</span>则指定了不同业务逻辑或流½E‹çš„˜qè¡Œæ–¹å‘ã€?span lang="EN-US"><o:p></o:p></span></span> </p> <p> <br /> <br /><strong>三、基本组件包</strong></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">整个<span lang="EN-US">struts</span>大约æœ?span lang="EN-US">15</span>包,˜q?span lang="EN-US">200</span>个类所¾l„成åQŒè€Œä¸”数量˜q˜åœ¨ä¸æ–­çš„æ‰©å±•。在此我们不能一一介绍åQŒåªèƒ½åˆ—丑և ä¸ªä¸»è¦çš„½Ž€è¦çš„介绍一下。下表说明了目前<span lang="EN-US">struts api</span>中基本的几个¾l„äšg包,包括<span lang="EN-US">action,actions,config,util,taglib,validator</span>。下囑ֈ™æ˜„¡Ž°äº†è¿™å‡ ä¸ª¾l„äšg包之间的关系。其ä¸?span lang="EN-US">action</span>是整ä¸?span lang="EN-US">struts framework</span>的核å¿?span lang="EN-US"><o:p></o:p></span></span> </p> <div align="center"> <table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 41.4pt; BORDER-LEFT: medium none; WIDTH: 385pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" width="513" border="1"> <tbody> <tr style="HEIGHT: 7.5pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 7.5pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.action</span> </b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">基本上,控制整个<span lang="EN-US">struts framework</span>的运行的核心¾c…R€ç»„仉™ƒ½åœ¨è¿™ä¸ªåŒ…中,比如我们上面提到的控制器<span lang="EN-US">ActionServlet</span>。已¾l?span lang="EN-US">Action,ActionForm,ActionMapping</span>½{‰ç­‰ã€?span lang="EN-US">struts1.1</span>æ¯?span lang="EN-US">1.0</span>多了<span lang="EN-US"> DynaActionForm </span>¾c…R€‚增加了动态扩展生æˆ?span lang="EN-US">FormBean</span>功能<span lang="EN-US"><o:p></o:p></span></span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.actions</span> </b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">˜q™ä¸ªåŒ…是主要作用是提供客æˆïLš„<span lang="EN-US">http</span>è¯äh±‚和业务逻辑处理之间的特定适配器è{换功能,è€?span lang="EN-US">1.0</span>版本中的部分动态增åˆ?span lang="EN-US">FromBean</span>的类åQŒä¹Ÿåœ?span lang="EN-US">struts1.1</span>中被<span lang="EN-US">Action</span>包的<span lang="EN-US">DynaActionForm</span>¾l„äšg所取代<span lang="EN-US"><o:p></o:p></span></span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.config<o:p></o:p></span> </b> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">提供寚w…¾|®æ–‡ä»?span lang="EN-US">struts-config.xml</span>元素的映ž®„。这也是<span lang="EN-US">sturts1.1</span>中新增的功能<span lang="EN-US"><o:p></o:p></span></span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.util</span> </b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Strtuts</span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">ä¸ÞZº†æ›´å¥½æ”¯æŒ<span lang="EN-US">web application</span>的应用,体统了一个些常用服务的支持,比如<span lang="EN-US">Connection Pool</span>å’?span lang="EN-US">Message Source</span>。详¾l†ä¿¡æ¯è¯·å‚è€?span lang="EN-US"><o:p></o:p></span></span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html<o:p></o:p></span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.taglib</span> </b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">˜q™ä¸æ˜¯ä¸€ä¸ªåŒ…åQŒè€Œæ˜¯æ˜¯ä¸€ä¸ªå®¢æˆäh ‡½{„¡±»çš„集合。下面包æ‹?span lang="EN-US">Bean Tags</span>åQ?span lang="EN-US">HTML Tags</span>åQ?span lang="EN-US">Logic Tags</span>åQ?span lang="EN-US">Nested Tags</span>åQ?span lang="EN-US">Template Tags</span>˜q™å‡ ä¸ªç”¨äºŽæž„建用æˆïL•Œé¢çš„æ ‡ç­¾¾c…R€?span lang="EN-US"><o:p></o:p></span></span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">org.apache.struts.validator</span> </b> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"> <o:p> </o:p> </span> </p> </td> </tr> <tr style="HEIGHT: 15.75pt; mso-yfti-lastrow: yes"> <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 385pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="513"> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">Struts1.1 framework</span> <span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">中增加了<span lang="EN-US">validator framework</span>åQŒç”¨äºŽåŠ¨æ€çš„é…ç½®<span lang="EN-US">from</span>表单的验证。详¾l†ä¿¡æ¯è¯·å‚阅 <span lang="EN-US">http://home.earthlink.net/~dwinterfeldt/<b><o:p></o:p></b></span></span> </p> </td> </tr> </tbody> </table> </div> <p align="center"> <img title="struts基本¾l„äšg关系å›? height="256" alt="1.jpg" src="http://www.aygfsteel.com/images/blogjava_net/kobe09/Framework/Struts/1.jpg" width="358" align="center" border="0" /> </p> <p> <br /> </p> <p> </p> <img src ="http://www.aygfsteel.com/kobe09/aggbug/50304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kobe09/" target="_blank">氧气中毒</a> 2006-06-04 18:00 <a href="http://www.aygfsteel.com/kobe09/archive/2006/06/04/50304.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>