第十章. 使用其他 Web 框架
41. Spring 提供了兩種與 Struts 集成的方式
1) 讓你的 Action 繼承 org.springframework.web.struts.ActionSupport
2) 將請求委托給作為 Spring Bean 管理的 Struts action 來自理(P312)
42. 為了讓 Struts 能訪問 Spring 管理的 Bean,必須在 struts-config.xml 中注冊一個知道 Spring 上下文的 ContextLoaderPlugIn,用的是 WebApplicationContext:(P312)
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-propertyset-property="contextConfigLocation" value="/WEB-INF/training- servlet.xml,/WEB-INF/..."/>
</plugin-in>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set- property="contextConfigLocation" value="/WEB-INF/training-servlet.xml,/WEB- INF/..."/>
</plugin-in>
43. ActionSupport 重載了 setServlet()方法,獲取bean的方式為調用 ActionSupport 的 getWebApplicationContext().getBean() (P313)
44. 繼承 Spring 提供的 ActionSupport 讓 Struts與Spring 緊密耦合,而且 Action 還負責查找 Bean,這也違背了IoC原則(P313)
45. 使用委托 Action:struts-config.xml 中每個 path 都指定 type 為 org.springframework.web.struts.DelegatingActionProxy,實際的 Action 實例由Spring 來管理,即 所有的 Action 實例是配置在 Spring 上下文文件中,它們之間用 path<->name 來映射,這種方 式並不好看(P315)
46. 使用請求委托,只在 struts-config.xml 中配置 DelegatingRequestProcess 或 DelegatingTilesRequestProcessor 作為控制器,其余配置不變,如<action path="/listCourses" type="com.unmi.MyCoursesAction"/> 其實 type 屬性是被所配置的 controller 忽略掉了,所以可 省去 type屬性,真正的Action也是由Spring來配置裝配,也是通過 path--name 來對應。這種做法就是 不需要為每一個 <action .../> 指定 org.springframework.web.struts.DelegatingActionProxy 。(P315)
47. 感覺 Spring 與 Struts 的搭配總有些牽強,沒有一種更完美的方式。個人覺得使用請求委托更 合適些,一方面是不需要讓 Struts 與 Spring 緊密耦合,其次是不需要為每一個 <action .../> 配置一個重復的 DelegatingActionProxy。
48. Spring 集成 Tapestry 的關鍵用一個知曉 Spring 的引擎替換掉 Tapestry 的缺省引擎。Spring 未提供這個東西,要自己實現,繼承自 org.apache.tapestry.engine.BaseEngine,在引擎的 setupForRequest() 方法中,把 Spring 上下文放到 getGlobal() 對象中 讓 Tapestry 隨時可用。最後 用 engine-class 把這個引擎指定給 Tapestry 應用。(P316)
49. Spring 在集成 Struts/Tapestyr/JSF/WebWork 都需要在 web.xml 中配置 ContextLoaderListener。會對 JSF 有一個獨立的項目 JSF-Spring (http://jsfspring.sourceforget.net)。集成 WebWork 1,要在 webwork.properties 中配置屬性
webwork.action.factory=webwork.action.factory.SpringActionFactory。集成 WebWork 2 也有一 個 XWork/Spring 集成包(http://www.ryandaigle.com/pebble/images/webwork2-spring.jar),在 xwork.xml 中的 <package .../> 中配置屬性
externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver" ,再加一個攔截器
class="xwork.interceptor.ExtenalReferenceInterceptor"。---這些真要用到時再細究吧 (P325)
50. HibernateDaoSupport 有 getSession() 和closeSessionIfNecessary(),可取得Session作更自 由的操作
51. DaoSupport有以下實現類:CciDaoSupport, HibernateDaoSupport, JdbcDaoSupport, JdoDaoSupport, PersistenceBrokerDaoSupport, SqlMapClientDaoSupport, SqlMapDaoSupport, TopLinkDaoSupport,據此了解支持哪些類型DB操作
第五章. 事物管理
52. 要用聲明式事物,需要用到 TransactionProxyFactoryBean 來包括你的 Service(用 proxyInterfaces 屬性指定接口) 類。(P163)
53. 能夠簡單配置被代理的Service的 transactionAttributes 屬性聲明事物,如下對方法名稱為 addStudent(可能是多個重載方法)啟用事物<property name="transactionAttributes">
<props>
<prop key="addStudent">
PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
</prop>
</props>
</property>
<property name="transactionAttributes">
<props>
<prop key="addStudent">
PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
</prop>
</props>
</property>
如果沒為某個 service 方法配置事物,它是能自動提交的。
54. 配置屬性 transactionAttributeSource為 MatchAlwaysTransactionAttributeSource 實例,將 使 TransactionProxyFactoryBean 的目標類代理的方法都被執行在一個事務環境中了,默認為 PROGAGATION_REQUIRED,ISOLATION_DEFAULT(P168)
55. 可配置 DefaultTransactionAttribute 給 MatchAlwaysTransactionAtributeSoure 的 transactionAttribute 屬性,改變 MatchAlwaysTransactionAtributeSoure 的默認事物屬性(P169)
56. 使用 NameMatchTransactionAttributeSource 可能實現像在 CMT 中那樣的事物屬性配置。可設 定事物回滾規則:默認情況下,發生 Runtime 異常回滾;發生checked exception 不回滾(這也是EJB的 行為),可定制,用正(+)或負(+)號寫在異常類名前,正異常表示事務仍可提交,負異常表示觸發回 滾(P170)
57. NameMatchTransactionAttributeSource 應該能想像到,支持方法名的通配符形式,如 key="get*",應用到所有以get開始的方法(P172)
58. NameMatchTransactionAttributeSource 的簡潔配置,直接配置給 TransactionProxyFactoryBean 的 transactionProperties 屬性,形式如它的 properties 屬性配置, 內部實現是會幫你構造 NameMatchTransactionAttributeSource 實例。在 Spring 1.2.8 中的 TransactionProxyFactoryBean 都沒有 transactionProperties 屬性,不知哪個版本的有(P173)
59. 可以用元數據來書寫事物屬性,JDK1.5 版以下需借助於 Jakarta Commons Attributes,而且還 需要結合 ANT 預編譯,麻煩,如果是JDK1.5以上就方便多了。要使用到 AttributesTransactionAttributeSource(P174)
60. 使用 Bean 繼承可以在父 bean (TransactionProxyFactoryBean)中定義公共的東西,如 transactionManager,transactionAttributeSource 等,子 bean 中只需要定義自己的 target 屬性, 這樣做可以省卻很多 XML 配置。注意父 Bean 當抽象類使用,不需要用到它的實例,所以設置 lazy- init="true" 告訴容器不要初始化它