亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

direktori cari
前言 簡介 概覽 使用場景 Spring 2.0和 2.5的新特性 簡介 控制反轉(zhuǎn)(IoC)容器 新的bean作用域 更簡單的XML配置 可擴(kuò)展的XML編寫 Annotation(注解)驅(qū)動(dòng)配置 在classpath中自動(dòng)搜索組件 面向切面編程(AOP) 更加簡單的AOP XML配置 對@AspectJ 切面的支持 對bean命名pointcut( bean name pointcut element)的支持 對AspectJ裝載時(shí)織入(AspectJ load-time weaving)的支持 中間層 在XML里更為簡單的聲明性事務(wù)配置 對Websphere 事務(wù)管理的完整支持 JPA 異步的JMS JDBC Web層 Spring MVC合理的默認(rèn)值 Portlet 框架 基于Annotation的控制器 Spring MVC的表單標(biāo)簽庫 對Tiles 2 支持 對JSF 1.2支持 JAX-WS支持 其他 動(dòng)態(tài)語言支持 增強(qiáng)的測試支持 JMX 支持 將Spring 應(yīng)用程序上下文部署為JCA adapter 計(jì)劃任務(wù) 對Java 5 (Tiger) 支持 移植到Spring 2.5 改變 支持的JDK版本 Spring 2.5的Jar打包 XML配置 Deprecated(淘汰)的類和方法 Apache OJB iBATIS Hibernate JDO UrlFilenameViewController 更新的樣例應(yīng)用 改進(jìn)的文檔 核心技術(shù) IoC(控制反轉(zhuǎn))容器 簡介 基本原理 - 容器和bean 容器 配置元數(shù)據(jù) 實(shí)例化容器 XML配置元數(shù)據(jù)的結(jié)構(gòu) 多種bean bean的命名 bean的別名 實(shí)例化bean 用構(gòu)造器來實(shí)例化 使用靜態(tài)工廠方法實(shí)例化 使用實(shí)例工廠方法實(shí)例化 使用容器 依賴 注入依賴 構(gòu)造器注入 構(gòu)造器參數(shù)解析 構(gòu)造器參數(shù)類型匹配 構(gòu)造參數(shù)索引 Setter注入 一些例子 依賴配置詳解 直接變量(基本類型、Strings類型等。) idref元素 引用其它的bean(協(xié)作者) 內(nèi)部bean 集合 集合的合并 強(qiáng)類型集合(僅適用于Java5+) Nulls XML配置文件的簡寫及其他 XML-based configuration metadata shortcuts 使用p名稱空間配置屬性 組合屬性名稱 使用depends-on 延遲初始化bean 自動(dòng)裝配(autowire)協(xié)作者 將bean排除在自動(dòng)裝配之外 依賴檢查 方法注入 Lookup方法注入 自定義方法的替代方案 Bean的作用域 Singleton作用域 Prototype作用域 Singleton beans和prototype-bean的依賴 其他作用域 初始化web配置 Request作用域 Session作用域 global session作用域 作用域bean與依賴 選擇創(chuàng)建代理的類型 自定義作用域 創(chuàng)建自定義作用域 使用自定義作用域 定制bean特性 生命周期回調(diào) 初始化回調(diào) 析構(gòu)回調(diào) 缺省的初始化和析構(gòu)方法 組合生命周期機(jī)制 在非web應(yīng)用中優(yōu)雅地關(guān)閉Spring IoC容器 了解自己 BeanFactoryAware BeanNameAware bean定義的繼承 容器擴(kuò)展點(diǎn) 用BeanPostProcessor定制bean 使用BeanPostProcessor的Hello World示例 RequiredAnnotationBeanPostProcessor示例 用BeanFactoryPostProcessor定制配置元數(shù)據(jù) PropertyPlaceholderConfigurer示例 PropertyOverrideConfigurer示例 使用FactoryBean定制實(shí)例化邏輯 The ApplicationContext BeanFactory 還是 ApplicationContext? 利用MessageSource實(shí)現(xiàn)國際化 事件 底層資源的訪問 ApplicationContext在WEB應(yīng)用中的實(shí)例化 粘合代碼和可怕的singleton 以J2EE RAR文件的形式部署Spring ApplicationContext 基于注解(Annotation-based)的配置 @Autowired 基于注解的自動(dòng)連接微調(diào) CustomAutowireConfigurer @Resource @PostConstruct 與 @PreDestroy 對受管組件的Classpath掃描 @Component和更多典型化注解 自動(dòng)檢測組件 使用過濾器自定義掃描 自動(dòng)檢測組件的命名 為自動(dòng)檢測的組件提供一個(gè)作用域 用注解提供限定符元數(shù)據(jù) 注冊一個(gè)LoadTimeWeaver 資源 簡介 Resource接口 內(nèi)置 Resource 實(shí)現(xiàn) UrlResource ClassPathResource FileSystemResource ServletContextResource InputStreamResource ByteArrayResource ResourceLoader接口 ResourceLoaderAware 接口 把Resource作為屬性來配置 Application context 和Resource 路徑 構(gòu)造application context 創(chuàng)建 ClassPathXmlApplicationContext 實(shí)例 - 簡介 Application context構(gòu)造器中資源路徑的通配符 Ant風(fēng)格的pattern 潛在的可移植性 classpath*: 前綴 其他關(guān)于通配符的說明 FileSystemResource 說明 校驗(yàn),數(shù)據(jù)綁定,BeanWrapper,與屬性編輯器 簡介 使用Spring的Validator接口進(jìn)行校驗(yàn) 從錯(cuò)誤代碼到錯(cuò)誤信息 Bean處理和BeanWrapper 設(shè)置和獲取屬性值以及嵌套屬性 內(nèi)建的PropertyEditor實(shí)現(xiàn) 注冊用戶自定義的PropertyEditor 使用PropertyEditorRegistrars 使用Spring進(jìn)行面向切面編程(AOP) 簡介 AOP概念 Spring AOP的功能和目標(biāo) AOP代理 @AspectJ支持 啟用@AspectJ支持 聲明一個(gè)切面 聲明一個(gè)切入點(diǎn)(pointcut) 切入點(diǎn)指示符(PCD)的支持 組合切入點(diǎn)表達(dá)式 共享通用切入點(diǎn)定義 示例 聲明通知 前置通知 后置通知(After returning advice) 異常通知(After throwing advice) 最終通知(After (finally) advice) 環(huán)繞通知 通知參數(shù)(Advice parameters) 訪問當(dāng)前的連接點(diǎn) 傳遞參數(shù)給通知 確定參數(shù)名 處理參數(shù) 通知順序 引入(Introduction) 切面實(shí)例化模型 例子 基于Schema的AOP支持 聲明一個(gè)切面 聲明一個(gè)切入點(diǎn) 聲明通知 前置通知 后置通知 異常通知 最終通知 環(huán)繞通知 通知參數(shù) 通知順序 引入 切面實(shí)例化模型 Advisor 例子 AOP聲明風(fēng)格的選擇 Spring AOP還是完全用AspectJ? Spring AOP中使用@AspectJ還是XML? 混合切面類型 代理機(jī)制 理解AOP代理 以編程方式創(chuàng)建@AspectJ代理 在Spring應(yīng)用中使用AspectJ 在Spring中使用AspectJ進(jìn)行domain object的依賴注入 @Configurable對象的單元測試 Working with multiple application contexts Spring中其他的AspectJ切面 使用Spring IoC來配置AspectJ的切面 在Spring應(yīng)用中使用AspectJ加載時(shí)織入(LTW) 第一個(gè)例子 切面 'META-INF/aop.xml' 相關(guān)類庫(JARS) Spring配置 特定環(huán)境的配置 通用Java應(yīng)用 Tomcat WebLogic 更多資源 Spring AOP APIs 簡介 Spring中的切入點(diǎn)API 概念 切入點(diǎn)運(yùn)算 AspectJ切入點(diǎn)表達(dá)式 便利的切入點(diǎn)實(shí)現(xiàn) 靜態(tài)切入點(diǎn) 正則表達(dá)式切入點(diǎn) 屬性驅(qū)動(dòng)的切入點(diǎn) 動(dòng)態(tài)切入點(diǎn) 控制流切入點(diǎn) 切入點(diǎn)的超類 自定義切入點(diǎn) Spring的通知API 通知的生命周期 Spring里的通知類型 攔截環(huán)繞通知 前置通知 異常通知 后置通知 引入通知 Spring里的Advisor API 使用ProxyFactoryBean創(chuàng)建AOP代理 基礎(chǔ) JavaBean屬性 基于JDK和CGLIB的代理 對接口進(jìn)行代理 對類進(jìn)行代理 使用“全局”通知器 簡化代理定義 使用ProxyFactory通過編程創(chuàng)建AOP代理 操作被通知對象 使用“自動(dòng)代理(autoproxy)”功能 自動(dòng)代理bean定義 BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator AbstractAdvisorAutoProxyCreator 使用元數(shù)據(jù)驅(qū)動(dòng)的自動(dòng)代理 使用TargetSource 熱交換目標(biāo)源 池化目標(biāo)源 原型目標(biāo)源 ThreadLocal目標(biāo)源 定義新的Advice類型 更多資源 測試 簡介 單元測試 Mock對象 JNDI Servlet API Portlet API 單元測試支持類 通用工具類 Spring MVC 集成測試 概覽 使用哪個(gè)支持框架 通用目標(biāo) 上下文管理及緩存 測試fixtures依賴注入 事務(wù)管理 集成測試支持類 JDBC測試支持 常用注解 JUnit 3.8遺留支持 上下文管理及緩存 測試fixture依賴注入 字段級別(Field Level)注入 事務(wù)管理 JUnit 3.8 遺留支持類 Java 5+ 專有支持 使用注解的事務(wù)相關(guān)測試 JPA支持類 Spring TestContext Framework 主要的抽象 上下文管理和緩存 測試fixture的依賴注入 事務(wù)管理 TestContext支持類 JUnit 3.8支持類 JUnit 4.4支持類 定制JUnit 4.4運(yùn)行器 TestNG支持類 TestContext框架注解支持 PetClinic示例 更多資源 中間層數(shù)據(jù)訪問 事務(wù)管理 簡介 動(dòng)機(jī) 關(guān)鍵抽象 使用資源同步的事務(wù) 高層次方案 低層次方案 TransactionAwareDataSourceProxy 聲明式事務(wù)管理 理解Spring的聲明式事務(wù)管理實(shí)現(xiàn) 第一個(gè)例子 回滾 為不同的bean配置不同的事務(wù)語義 <tx:advice/> 有關(guān)的設(shè)置 使用 @Transactional @Transactional 有關(guān)的設(shè)置 事務(wù)傳播 required RequiresNew Nested 通知事務(wù)操作 結(jié)合AspectJ使用 @Transactional 編程式事務(wù)管理 使用TransactionTemplate 指定事務(wù)設(shè)置 使用PlatformTransactionManager 選擇編程式事務(wù)管理還是聲明式事務(wù)管理 與特定應(yīng)用服務(wù)器集成 IBM WebSphere BEA WebLogic Oracle OC4J 常見問題的解決方法 對一個(gè)特定的 DataSource 使用了錯(cuò)誤的事務(wù)管理器 更多的資源 DAO支持 簡介 一致的異常層次 一致的DAO支持抽象類 使用JDBC進(jìn)行數(shù)據(jù)訪問 簡介 選擇一種工作模式 Spring JDBC包結(jié)構(gòu) 利用JDBC核心類控制JDBC的基本操作和錯(cuò)誤處理 JdbcTemplate類 一些示例 查詢(SELECT) 更新(INSERT/UPDATE/DELETE) 其他操作 JdbcTemplate 的最佳實(shí)踐 NamedParameterJdbcTemplate類 SimpleJdbcTemplate類 DataSource接口 SQLExceptionTranslator接口 執(zhí)行SQL語句 執(zhí)行查詢 更新數(shù)據(jù)庫 獲取自動(dòng)生成的主鍵 控制數(shù)據(jù)庫連接 DataSourceUtils類 SmartDataSource接口 AbstractDataSource類 SingleConnectionDataSource類 DriverManagerDataSource類 TransactionAwareDataSourceProxy類 DataSourceTransactionManager類 NativeJdbcExtractor JDBC批量操作 使用JdbcTemplate進(jìn)行批量操作 使用SimpleJdbcTemplate進(jìn)行批量操作 通過使用SimpleJdbc類簡化JDBC操作 使用SimpleJdbcInsert插入數(shù)據(jù) 使用SimpleJdbcInsert來獲取自動(dòng)生成的主鍵 指定SimpleJdbcInsert所使用的字段 使用SqlParameterSource提供參數(shù)值 使用SimpleJdbcCall調(diào)用存儲(chǔ)過程 聲明SimpleJdbcCall使用的參數(shù) 如何定義SqlParameters 使用SimpleJdbcCall調(diào)用內(nèi)置函數(shù) 使用SimpleJdbcCall返回的ResultSet/REF Cursor 用Java對象來表達(dá)JDBC操作 SqlQuery類 MappingSqlQuery類 SqlUpdate類 StoredProcedure類 SqlFunction類 參數(shù)和數(shù)據(jù)處理的基本原則 為參數(shù)設(shè)置SQL類型信息 處理BLOB 和 CLOB對象 在IN語句中傳入一組參數(shù)值 處理復(fù)雜類型的存儲(chǔ)過程調(diào)用 使用ORM工具進(jìn)行數(shù)據(jù)訪問 簡介 Hibernate 資源管理 在Spring容器中創(chuàng)建 SessionFactory The HibernateTemplate 不使用回調(diào)的基于Spring的DAO實(shí)現(xiàn) 基于Hibernate3的原生API實(shí)現(xiàn)DAO 編程式的事務(wù)劃分 聲明式的事務(wù)劃分 事務(wù)管理策略 容器資源 vs 本地資源 在應(yīng)用服務(wù)器中使用Hibernate的注意事項(xiàng) JDO 建立PersistenceManagerFactory JdoTemplate和JdoDaoSupport 基于原生的JDO API實(shí)現(xiàn)DAO 事務(wù)管理 JdoDialect Oracle TopLink SessionFactory 抽象層 TopLinkTemplate and TopLinkDaoSupport 基于原生的TopLink API的DAO實(shí)現(xiàn) 事務(wù)管理 iBATIS SQL Maps 創(chuàng)建SqlMapClient 使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport 基于原生的iBATIS API的DAO實(shí)現(xiàn) JPA 在Spring環(huán)境中建立JPA LocalEntityManagerFactoryBean 從JNDI中獲取 EntityManagerFactory LocalContainerEntityManagerFactoryBean Tomcat(5.0以上)加載時(shí)的織入配置 使用VM代理的全局加載時(shí)織入 上下文范圍內(nèi)的加載時(shí)織入配置 處理多持久化單元 JpaTemplate 和 JpaDaoSupport 基于原生的JPA實(shí)現(xiàn)DAO 異常轉(zhuǎn)化 事務(wù)管理 JpaDialect The Web Web MVC framework Web框架 概述 與其他MVC實(shí)現(xiàn)框架的集成 Spring Web MVC框架的特點(diǎn) DispatcherServlet 控制器 AbstractController 和 WebContentGenerator 其它的簡單控制器 MultiActionController 命令控制器 處理器映射(handler mapping) BeanNameUrlHandlerMapping SimpleUrlHandlerMapping 攔截器(HandlerInterceptor) 視圖與視圖解析 視圖解析器(ViewResolver) 視圖解析鏈 重定向(Rediret)到另一個(gè)視圖 RedirectView redirect:前綴 forward:前綴 本地化解析器 AcceptHeaderLocaleResolver CookieLocaleResolver SessionLocaleResolver LocaleChangeInterceptor 使用主題 簡介 如何定義主題 主題解析器 Spring對分段文件上傳(multipart file upload)的支持 介紹 使用MultipartResolver 在表單中處理分段文件上傳 使用Spring的表單標(biāo)簽庫 配置 form標(biāo)簽 input標(biāo)簽 checkbox標(biāo)簽 checkboxes標(biāo)簽 radiobutton標(biāo)簽 radiobuttons標(biāo)簽 password標(biāo)簽 select標(biāo)簽 option標(biāo)簽 options標(biāo)簽 textarea標(biāo)簽 hidden標(biāo)簽 errors標(biāo)簽 處理異常 慣例優(yōu)先原則(convention over configuration) 對控制器的支持:ControllerClassNameHandlerMapping 對模型的支持:ModelMap(ModelAndView) 對視圖的支持:RequestToViewNameTranslator 基于注解的控制器配置 建立dispatcher實(shí)現(xiàn)注解支持 使用@Controller定義一個(gè)控制器 使用@RequestMapping映射請求 使用@RequestParam綁定請求參數(shù)到方法參數(shù) 使用@ModelAttribute提供一個(gè)從模型到數(shù)據(jù)的鏈接 使用@SessionAttributes指定存儲(chǔ)在會(huì)話中的屬性 自定義WebDataBinder初始化 使用@InitBinder自定義數(shù)據(jù)綁定 配置一個(gè)定制的WebBindingInitializer 更多資源 集成視圖技術(shù) 簡介 JSP和JSTL 視圖解析器 'Plain-old' JSPs versus JSTL 'Plain-old' JSP與JSTL 幫助簡化開發(fā)的額外的標(biāo)簽 Tiles 需要的資源 如何集成Tiles UrlBasedViewResolver類 ResourceBundleViewResolver類 SimpleSpringPreparerFactory 和 SpringBeanPreparerFactory Velocity和FreeMarker 需要的資源 Context 配置 創(chuàng)建模板 高級配置 velocity.properties FreeMarker 綁定支持和表單處理 用于綁定的宏 簡單綁定 表單輸入生成宏 輸入域 選擇輸入域 重載HTML轉(zhuǎn)碼行為并使你的標(biāo)簽符合XHTML XSLT 寫在段首 Bean 定義 標(biāo)準(zhǔn)MVC控制器代碼 把模型數(shù)據(jù)轉(zhuǎn)化為XML 定義視圖屬性 文檔轉(zhuǎn)換 小結(jié) 文檔視圖(PDF/Excel) 簡介 配置和安裝 文檔視圖定義 Controller 代碼 Excel視圖子類 PDF視圖子類 JasperReports 依賴的資源 配置 配置ViewResolver 配置View 關(guān)于報(bào)表文件 使用 JasperReportsMultiFormatView 構(gòu)造ModelAndView 使用子報(bào)表 配置子報(bào)表文件 配置子報(bào)表數(shù)據(jù)源 配置Exporter的參數(shù) 集成其它Web框架 簡介 通用配置 JavaServer Faces DelegatingVariableResolver FacesContextUtils Struts ContextLoaderPlugin DelegatingRequestProcessor DelegatingActionProxy ActionSupport Classes Tapestry 注入 Spring 托管的 beans 將 Spring Beans 注入到 Tapestry 頁面中 組件定義文件 添加抽象訪問方法 將 Spring Beans 注入到 Tapestry 頁面中 - Tapestry 4.0+ 風(fēng)格 WebWork 更多資源 Portlet MVC框架 介紹 控制器 - MVC中的C 視圖 - MVC中的V Web作用范圍的Bean DispatcherPortlet ViewRendererServlet 控制器 AbstractController 和 PortletContentGenerator 其它簡單的控制器 Command控制器 PortletWrappingController 處理器映射 PortletModeHandlerMapping ParameterHandlerMapping PortletModeParameterHandlerMapping 增加 HandlerInterceptors HandlerInterceptorAdapter ParameterMappingInterceptor 視圖和它們的解析 Multipart文件上傳支持 使用 PortletMultipartResolver 處理表單里的文件上傳 異常處理 Portlet應(yīng)用的部署 整合 使用Spring進(jìn)行遠(yuǎn)程訪問與Web服務(wù) 簡介 使用RMI暴露服務(wù) 使用RmiServiceExporter暴露服務(wù) 在客戶端鏈接服務(wù) 使用Hessian或者Burlap通過HTTP遠(yuǎn)程調(diào)用服務(wù) 為Hessian和co.配置DispatcherServlet 使用HessianServiceExporter暴露你的bean 在客戶端連接服務(wù) 使用Burlap 對通過Hessian或Burlap暴露的服務(wù)使用HTTP Basic認(rèn)證 使用HTTP調(diào)用器暴露服務(wù) Exposing the service object 在客戶端連接服務(wù) Web Services 使用JAX-RPC暴露基于servlet的web服務(wù) 使用JAX-RPC訪問web服務(wù) 注冊JAX-RPC Bean映射 注冊自己的JAX-RPC 處理器 使用JAX-WS暴露基于servlet的web服務(wù) 使用JAX-WS暴露單獨(dú)web服務(wù) 使用Spring支持的JAX-WS RI來暴露服務(wù) 使用JAX-WS訪問web服務(wù) 使用XFire來暴露Web服務(wù) JMS 服務(wù)端配置 客戶端配置 對遠(yuǎn)程接口不提供自動(dòng)探測實(shí)現(xiàn) 在選擇這些技術(shù)時(shí)的一些考慮 Enterprise Java Beans (EJB) 集成 簡介 訪問EJB 概念 訪問本地的無狀態(tài)Session Bean(SLSB) 訪問遠(yuǎn)程SLSB Accessing EJB 2.x SLSBs versus EJB 3 SLSBs 使用Spring提供的輔助類實(shí)現(xiàn)EJB組件 EJB 2.x base classes EJB 3 注入攔截 JMS (Java Message Service) 簡介 使用Spring JMS JmsTemplate 連接工廠 目的地管理 消息偵聽容器 SimpleMessageListenerContainer DefaultMessageListenerContainer ServerSessionMessageListenerContainer 事務(wù)管理 發(fā)送消息 使用消息轉(zhuǎn)換器 SessionCallback 和 ProducerCallback 接收消息 同步接收 異步接收 - 消息驅(qū)動(dòng)的POJO SessionAwareMessageListener接口 MessageListenerAdapter 事務(wù)中的消息處理 JCA消息端點(diǎn)的支持 JMS命名空間支持 JMX 介紹 將Bean暴露為JMX 創(chuàng)建MBeanServer 重用原有的MBeanServer 延遲初始化的MBean MBean的自動(dòng)注冊 控制注冊行為 控制Bean的管理接口 MBeanInfoAssembler接口 使用源碼級元數(shù)據(jù) 使用JDK 5.0的注解 源代碼級的元數(shù)據(jù)類型 AutodetectCapableMBeanInfoAssembler接口 用Java接口定義管理接口 使用MethodNameBasedMBeanInfoAssembler 控制Bean的ObjectName 從Properties讀取Properties 使用MetadataNamingStrategy <context:mbean-export/>元素 JSR-160連接器 服務(wù)器端連接器 客戶端連接器 基于Burlap/Hessian/SOAP的JMX 通過代理訪問MBean 通知 為通知注冊監(jiān)聽器 發(fā)布通知 更多資源 JCA CCI 簡介 配置CCI 連接器配置 在Spring中配置ConnectionFactory 配置CCI連接 使用一個(gè) CCI 單連接 使用Spring的 CCI訪問支持 記錄轉(zhuǎn)換 CciTemplate類 DAO支持 自動(dòng)輸出記錄生成 總結(jié) 直接使用一個(gè)CCI Connection接口和Interaction接口 CciTemplate 使用示例 建模CCI訪問為操作對象 MappingRecordOperation MappingCommAreaOperation 自動(dòng)生成輸出記錄 總結(jié) MappingRecordOperation 使用示例 MappingCommAreaOperation 使用示例 事務(wù) Spring郵件抽象層 簡介 使用Spring郵件抽象 MailSender 和 SimpleMailMessage 的基本用法 使用 JavaMailSender 和 MimeMessagePreparator 使用MimeMessageHelper 發(fā)送附件和嵌入式資源(inline resources) 附件 內(nèi)嵌資源 使用模板來創(chuàng)建郵件內(nèi)容 一個(gè)基于Velocity的示例 Spring中的定時(shí)調(diào)度(Scheduling)和線程池(Thread Pooling) 簡介 使用OpenSymphony Quartz 調(diào)度器 使用JobDetailBean 使用 MethodInvokingJobDetailFactoryBean 使用triggers和SchedulerFactoryBean來包裝任務(wù) 使用JDK Timer支持類 創(chuàng)建定制的timers 使用 MethodInvokingTimerTaskFactoryBean類 最后:使用TimerFactoryBean來設(shè)置任務(wù) SpringTaskExecutor抽象 TaskExecutor接口 TaskExecutor類型 使用TaskExecutor 動(dòng)態(tài)語言支持 介紹 第一個(gè)示例 定義動(dòng)態(tài)語言支持的bean 公共概念 <lang:language/> 元素 Refreshable bean 內(nèi)置動(dòng)態(tài)語言源文件 理解dynamic-language-backed bean上下文中的構(gòu)造器注入 JRuby beans Groovy beans 通過回調(diào)定制Groovy對象 BeanShell beans 場景 Spring MVC控制器的腳本化 Validator的腳本化 Bits and bobs AOP - 通知腳本化bean 作用域 更多的資源 注解和源代碼級的元數(shù)據(jù)支持 簡介 Spring的元數(shù)據(jù)支持 注解 @Required Spring中的其它@Annotations Jakarta Commons Attributes集成 元數(shù)據(jù)和Spring AOP自動(dòng)代理 基本原理 聲明式事務(wù)管理 示例程序 演示案例 介紹 使用動(dòng)態(tài)語言實(shí)現(xiàn)的Spring MVC控制器 構(gòu)建與部署 使用SimpleJdbcTemplate和@Repository實(shí)現(xiàn)DAO 域?qū)ο?/a> Data Access Object 構(gòu)建 XML Schema-based configuration Introduction XML Schema-based configuration Referencing the schemas The util schema <util:constant/> Setting a bean property or constructor arg from a field value <util:property-path/> Using <util:property-path/> to set a bean property or constructor-argument <util:properties/> <util:list/> <util:map/> <util:set/> The jee schema <jee:jndi-lookup/> (simple) <jee:jndi-lookup/> (with single JNDI environment setting) <jee:jndi-lookup/> (with multiple JNDI environment settings) <jee:jndi-lookup/> (complex) <jee:local-slsb/> (simple) <jee:local-slsb/> (complex) <jee:remote-slsb/> The lang schema The jms schema The tx (transaction) schema The aop schema The context schema <property-placeholder/> <annotation-config/> <component-scan/> <load-time-weaver/> <spring-configured/> <mbean-export/> The tool schema The beans schema Setting up your IDE Setting up Eclipse Setting up IntelliJ IDEA Integration issues XML parsing errors in the Resin v.3 application server Extensible XML authoring Introduction Authoring the schema Coding a NamespaceHandler Coding a BeanDefinitionParser Registering the handler and the schema 'META-INF/spring.handlers' 'META-INF/spring.schemas' Using a custom extension in your Spring XML configuration Meatier examples Nesting custom tags within custom tags Custom attributes on 'normal' elements Further Resources spring-beans-2.0.dtd spring.tld Introduction The bind tag The escapeBody tag The hasBindErrors tag The htmlEscape tag The message tag The nestedPath tag The theme tag The transform tag spring-form.tld Introduction The checkbox tag The checkboxes tag The errors tag The form tag The hidden tag The input tag The label tag The option tag The options tag The password tag The radiobutton tag The radiobuttons tag The select tag The textarea tag Spring 2.5開發(fā)手冊中文化項(xiàng)目 聲明 致謝 參與人員 項(xiàng)目歷程
watak

14.4.?Velocity和FreeMarker

Velocity 和FreeMarker 是兩種模板語言,都可以做為view層技術(shù)在Spring MVC 應(yīng)用中使用。 它們的語言風(fēng)格和適用對象都很相似,這里把它們放在一起討論。至于它們語義和語法上的不同,可以參考 FreeMarker站點(diǎn)。

14.4.1.?需要的資源

使用Velocity或FreeMarker需要包含 velocity-1.x.x.jar freemarker-2.x.jar 。另外Velocity還需要 commons-collections.jar 。一般把這些jar包放在 WEB-INF/lib 下,這樣可以保證J2EE Server找到它們并加到web應(yīng)用的classpath下。這里同樣假設(shè)你的 'WEB-INF/lib' 目錄下已有 spring.jar !Spring的發(fā)布包中已經(jīng)提供了最新的穩(wěn)定版本的Velocity、FreeMarker和commons collections,可以從相應(yīng)的 /lib/ 子目錄下得到。如果你想在Velocity中使用Spring的dateToolAttribute或numberToolAttribute,那你還需要 velocity-tools-generic-1.x.jar

14.4.2.?Context 配置

通過在 '*-servlet.xml' 中增加相關(guān)的配置bean,可以初始化相應(yīng)的配置,如下:

				
					<!--
					該bean使用一個(gè)存放模板文件的根路徑來配置Velocity環(huán)境。你也可以通過指定一個(gè)屬性文件來更精細(xì)地控制Velocity,但對基于文件的模板載入來說,默認(rèn)的方式已相當(dāng)健全
					-->
				
				
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
  <property name="resourceLoaderPath" value="/WEB-INF/velocity/"/>
</bean>


					<!--
					也可以把ResourceBundle或XML文件配置到視圖解析器中。如果你需要根據(jù)Locale來解析不同的視圖,就需要使用resource bundle解析器。
					-->

				
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
  <property name="cache" value="true"/>
  <property name="prefix" value=""/>
  <property name="suffix" value=".vm"/>
</bean>
				
					<!-- freemarker config -->
				
				
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>


					<!--
					也可以把ResourceBundle或XML文件配置到視圖解析器中。如果你需要根據(jù)Locale來解析不同的視圖,就需要使用resource bundle解析器。
					-->

				
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  <property name="cache" value="true"/>
  <property name="prefix" value=""/>
  <property name="suffix" value=".ftl"/>
</bean>

注意

對于非web應(yīng)用,你需要在application context的配置文件中聲明 VelocityConfigurationFactoryBean 或者 FreeMarkerConfigurationFactoryBean

14.4.3.?創(chuàng)建模板

模板文件需要存放在配置*Configurer bean時(shí)所指定的目錄下,就像上面的例子所示。 這里不準(zhǔn)備詳細(xì)敘述使用這兩種語言創(chuàng)建模板的細(xì)節(jié),你可以參考相應(yīng)的站點(diǎn)獲取那些信息。 如果你用了我們推薦的視圖解析器,你會(huì)發(fā)現(xiàn)從邏輯視圖名到相應(yīng)模板文件的映射方式與使用 InternalResourceViewResolver 處理JSP時(shí)的映射方式類似。比如若你的控制器返回了ModelAndView對象,其中包含一個(gè)叫做“welcome”的視圖名,則視圖解析器將試圖查找 /WEB-INF/freemarker/welcome.ftl/WEB-INF/velocity/welcome.vm作為合適的模板。

14.4.4.?高級配置

以上著重介紹的基本配置適合大部分應(yīng)用需求,然而仍然有一些不常見的或高級需求的情況,Spring提供了另外的配置選項(xiàng)來滿足這種需求。

14.4.4.1.?velocity.properties

這個(gè)文件是可選的,不過一旦指定,其所包含的值即影響Velocity運(yùn)行時(shí)狀態(tài)。只有當(dāng)你要做一些高級配置時(shí)才需要這個(gè)文件,這時(shí)你可以在上面定義的 VelocityConfigurer中指定它的位置。

					<bean id="velocityConfig"
					class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
					<property name="configLocation
					value="/WEB-INF/velocity.properties"/>
					</bean>
				

另一種方法,你可以直接在Velocity config bean的定義中指定velocity屬性,來取代“configLocation”屬性。

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
  <property name="velocityProperties">
    <props>
      <prop key="resource.loader">file</prop>
      <prop key="file.resource.loader.class">
        org.apache.velocity.runtime.resource.loader.FileResourceLoader
      </prop>
      <prop key="file.resource.loader.path">${webapp.root}/WEB-INF/velocity</prop>
      <prop key="file.resource.loader.cache">false</prop>
    </props>
  </property>
</bean>

關(guān)于Spring中Velocity的配置請參考 API文檔或者參考Velocity自身文檔中的例子和定義來了解如何配置 'velocity.properties'文件。

14.4.4.2.?FreeMarker

FreeMarker的'Settings'和'SharedVariables'配置可以通過直接設(shè)置 FreeMarkerConfigurer 的相應(yīng)屬性來傳遞給Spring管理的FreeMarker Configuration對象,其中 freemarkerSettings 屬性需要一個(gè)java.util.Properties類型對象, freemarkerVariables需要一個(gè) java.util.Map類型對象。

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
  <property name="freemarkerVariables">
    <map>
      <entry key="xml_escape" value-ref="fmXmlEscape"/>
    </map>
  </property>
</bean>

<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>

關(guān)于settings和variables如何影響 Configuration 對象的細(xì)節(jié)信息,請參考FreeMarker的文檔。

14.4.5.?綁定支持和表單處理

Spring提供了一個(gè)在JSP中使用的標(biāo)簽庫,其中包含一個(gè) <spring:bind/> 標(biāo)簽,它主要用來在表單中顯示支持對象(譯者注:即表單數(shù)據(jù)傳輸對象)的數(shù)據(jù),并在一個(gè) Validator (工作在Web層或業(yè)務(wù)邏輯層)校驗(yàn)失敗時(shí)顯示失敗信息。 從1.1版本開始,Spring為Velocity和FreeMarker也提供了同樣的功能,而且還另外提供了便于使用的宏,用來生成表單輸入元素。

14.4.5.1.?用于綁定的宏

spring.jar文件為這兩種語言維護(hù)了一套標(biāo)準(zhǔn)宏,對于正確配置的應(yīng)用,它們總是可用的。

在Spring庫中定義的一些宏被認(rèn)為是內(nèi)部的(私有的),但當(dāng)宏定義中不存在這樣的范圍界定時(shí), 會(huì)使得所有的宏均是可見的,能夠任意調(diào)用代碼和用戶模板。下面的一節(jié)將集中討論模板中可以直接調(diào)用的宏。 如果希望直接查看宏的代碼,它們分別是 org.springframework.web.servlet.view.velocity 包中的spring.vm文件和 org.springframework.web.servlet.view.freemarker 包中的spring.ftl文件。

14.4.5.2.?簡單綁定

在扮演Spring表單控制器對應(yīng)視圖的html表單(或vm/ftl模板)里, 你可以模仿下面的代碼來綁定表單數(shù)據(jù)并顯示錯(cuò)誤信息(和JSP的形式非常相似)。 注意默認(rèn)情況下命令對象的名字是“command”,你可以在配置自己的表單控制器時(shí)通過設(shè)置'commandName'屬性來覆蓋默認(rèn)值。 例子代碼如下(其中的personFormVpersonFormF是前面定義的視圖):

					<!-- velocity宏自動(dòng)可用 --> <html> ...
					<form action="" method="POST"> Name:
					#springBind( "command.name" ) <input type="text"
					name="${status.expression}" value="$!status.value"
					/><br> #foreach($error in
					$status.errorMessages) <b>$error</b>
					<br> #end <br> ... <input
					type="submit" value="submit"/> </form> ...
					</html>
				
					<!-- FreeMarker宏必須導(dǎo)入到一個(gè)名稱空間,這里推薦你定義為'spring'空間
					--> <#import "spring.ftl" as spring />
					<html> ... <form action=""
					method="POST"> Name: <@spring.bind
					"command.name" /> <input type="text"
					name="${spring.status.expression}"
					value="${spring.status.value?default("")}"
					/><br> <#list
					spring.status.errorMessages as error>
					<b>${error}</b> <br>
					</#list> <br> ... <input
					type="submit" value="submit"/> </form> ...
					</html>
				

#springBind / <@spring.bind> 需要一個(gè)'path'屬性,格式為命令對象的名字(默認(rèn)值為'command', 除非你在配置FormController的屬性時(shí)改變它)后跟圓點(diǎn)再加上你希望綁定到的命令對象的屬性名。 你也可以使用類似“command.address.street”的格式來處理嵌套對象。使用 bind宏時(shí),HTML轉(zhuǎn)碼行為由web.xml中名為 defaultHtmlEscape的ServletContext參數(shù)指定。

上述宏的另一種可選形式是 #springBindEscaped / <@spring.bindEscaped> ,它另外接受一個(gè)布爾型參數(shù),顯式指定了輸出值或錯(cuò)誤信息這些狀態(tài)信息時(shí)是否使用HTML轉(zhuǎn)碼。 附加的表單處理宏簡化了HTML轉(zhuǎn)碼的使用,只要有可能,你就應(yīng)該使用它們。關(guān)于它們的細(xì)節(jié)將在下節(jié)講述。

14.4.5.3.?表單輸入生成宏

為這兩種語言附加的一些很方便的宏同時(shí)簡化了表單綁定和表單生成(包括顯示校驗(yàn)錯(cuò)誤信息)。 不需要使用這些宏來生成表單輸入域,它們可以被混雜并匹配到簡單HTML,或者直接調(diào)用前面講過的spring綁定宏。

下表展示了可用的宏的VTL定義和FTL定義,以及它們需要的參數(shù)。

表?14.1.?宏定義表

macro VTL definition FTL definition
message (輸出一個(gè)根據(jù)code參數(shù)選擇的資源綁定字符串) #springMessage($code) <@spring.message code/>
messageText (輸出一個(gè)根據(jù)code參數(shù)選擇的資源綁定字符串,找不到的話輸出default參數(shù)的值) #springMessageText($code $text) <@spring.messageText code, text/>
url (在URL相對路徑前面添加應(yīng)用上下文根路徑application context root) #springUrl($relativeUrl) <@spring.url relativeUrl/>
formInput (標(biāo)準(zhǔn)表單輸入域) #springFormInput($path $attributes) <@spring.formInput path, attributes, fieldType/>
formHiddenInput * (表單隱藏輸入域) #springFormHiddenInput($path $attributes) <@spring.formHiddenInput path, attributes/>
formPasswordInput *(標(biāo)準(zhǔn)表單密碼輸入域;注意不會(huì)為這種類型的輸入域裝配數(shù)據(jù)) #springFormPasswordInput($path $attributes) <@spring.formPasswordInput path, attributes/>
formTextarea (大型文本(自由格式)輸入域) #springFormTextarea($path $attributes) <@spring.formTextarea path, attributes/>
formSingleSelect (單選列表框) #springFormSingleSelect( $path $options $attributes) <@spring.formSingleSelect path, options, attributes/>
formMultiSelect (多選列表框) #springFormMultiSelect($path $options $attributes) <@spring.formMultiSelect path, options, attributes/>
formRadioButtons (單選框) #springFormRadioButtons($path $options $separator $attributes) <@spring.formRadioButtons path, options separator, attributes/>
formCheckboxes (復(fù)選框) #springFormCheckboxes($path $options $separator $attributes) <@spring.formCheckboxes path, options, separator, attributes/>
showErrors (簡化針對所綁定輸入域的校驗(yàn)錯(cuò)誤信息輸出) #springShowErrors($separator $classOrStyle) <@spring.showErrors separator, classOrStyle/>

* 在FTL(FreeMarker)中,這二種宏實(shí)際上并不是必需的,因?yàn)槟憧梢允褂闷胀ǖ? formInput 宏,指定fieldType 參數(shù)的值為 'hidden ' 或 'password'即可 。

上面列出的所有宏的參數(shù)都具有一致的含義,如下述:

  • path:待綁定屬性的名字(如:command.name)

  • 選項(xiàng):一個(gè)Map,其中保存了所有可從輸入域中選擇的值。map中的鍵值(keys)代表將從表單綁定到命令對象然后提交到后臺(tái)的實(shí)值(values)。存儲(chǔ)在Map中的與相應(yīng)鍵值對應(yīng)的對象就是那些在表單上顯示給用戶的標(biāo)簽,它們可能與提交到后臺(tái)的值不同。通常這樣的map由控制器以引用數(shù)據(jù)的方式提供。你可以根據(jù)需求的行為選擇一種Map實(shí)現(xiàn)。比如對順序要求嚴(yán)格時(shí),可使用一個(gè) SortedMap ,如一個(gè)TreeMap 加上適當(dāng)?shù)腃omparator;對要求按插入順序返回的情況,可以使用commons-collections提供的 LinkedHashMapLinkedMap。

  • 分隔符:當(dāng)使用多選的時(shí)候(radio buttons 或者 checkboxes),用于在列表中分隔彼此的字符序列(如 "<br>")。

  • 屬性:一個(gè)附加的以任意標(biāo)簽或文本構(gòu)成的字符串,出現(xiàn)在HTML標(biāo)簽內(nèi)。該字符串被宏照原樣輸出。例如:在一個(gè)textarea標(biāo)簽內(nèi)你可能會(huì)提供'rows="5" cols="60"'這樣的屬性,或者你會(huì)傳遞'style="border:1px solid silver"'這樣的樣式信息。

  • classOrStyle:供showErrors宏用來以這種樣式顯示錯(cuò)誤信息,其中錯(cuò)誤信息嵌套于使用該CSS類名的span標(biāo)簽內(nèi)。如果不提供或內(nèi)容為空,則錯(cuò)誤信息嵌套于<b></b>標(biāo)簽內(nèi)。

宏的例子在下面描述,其中一些是FTL的,一些是VTL的。兩種語言之間的用法差別在旁注中解釋。

14.4.5.3.1.?輸入域

							<!-- 上面提到的Name域的例子,使用VTL中定義的表單宏 -->
							... Name: #springFormInput("command.name"
							"")<br> #springShowErrors("<br>"
							"")<br>
						

formInput宏接受一個(gè)path參數(shù)(command.name)和一個(gè)附加的屬性參數(shù)(在上例中為空)。該宏與所有其他表單生成宏一樣,對path參數(shù)代表的屬性實(shí)施一種隱式綁定,這種綁定保持有效狀態(tài)直到一次新的綁定開始,所以showErrors宏不再需要傳遞path參數(shù)――它簡單地操作最近一次綁定的屬性(field)。

showErrors宏接受兩個(gè)參數(shù):分隔符(用于分隔多條錯(cuò)誤信息的字符串)和CSS類名或樣式屬性。注意在FreeMarker中可以為屬性參數(shù)指定默認(rèn)值(這點(diǎn)兒Velocity做不到)。上面的兩個(gè)宏調(diào)用在FTL中可以這么表達(dá):

						<@spring.formInput "command.name"/>
						<@spring.showErrors "<br>"/>
					

上面展示的用于生成name表單輸入域的代碼片斷產(chǎn)生的輸出如下,同時(shí)還顯示了輸入值為空的情況下提交表單后產(chǎn)生的校驗(yàn)錯(cuò)誤信息(校驗(yàn)過程由Spring的驗(yàn)證框架提供)。

生成的HTML如下:

						Name: <input type="text" name="name" value=""
						> <br> <b>required</b>
						<br> <br>
					

參數(shù)(屬性)用來向textarea傳遞樣式信息或行列數(shù)屬性。

14.4.5.3.2.?選擇輸入域

有四種用于在HTML表單中生成通用選擇輸入框的宏。

  • formSingleSelect

  • formMultiSelect

  • formRadioButtons

  • formCheckboxes

每個(gè)宏都將接受一個(gè)由選項(xiàng)值和選項(xiàng)標(biāo)簽的集合構(gòu)成的Map,其中選項(xiàng)值和其標(biāo)簽可以相同。

下面展示了一個(gè)在FTL中使用radio按鈕的例子。表單支撐對象(form backing object)提供了一個(gè)默認(rèn)值'London',所以該域不需要校驗(yàn)。當(dāng)渲染表單時(shí),整個(gè)待展現(xiàn)的城市列表由模型對象的'cityMap'屬性以引用數(shù)據(jù)的方式提供。

						... Town: <@spring.formRadioButtons
						"command.address.town", cityMap, ""
						/><br><br>
					

這將產(chǎn)生一行radio按鈕―― cityMap 中一個(gè)值對應(yīng)一個(gè)按鈕,并以""分隔。沒有額外的屬性,因?yàn)楹甑淖詈笠粋€(gè)參數(shù)不存在。cityMap中所有的key-value都使用String類型值。map中的key用作輸入域的值(將被作為請求參數(shù)值提交到后臺(tái)),value用作顯示給用戶的標(biāo)簽。上述示例中,表單支撐對象提供了一個(gè)默認(rèn)值以及三個(gè)著名城市作為可選值,它產(chǎn)生的HTML代碼如下:

						Town: <input type="radio" name="address.town"
						value="London"> London <input type="radio"
						name="address.town" value="Paris"
						checked="checked"> Paris <input
						type="radio" name="address.town" value="New
						York"> New York
					

如果你希望在應(yīng)用中按照內(nèi)部代碼來處理城市,你得以適當(dāng)?shù)逆I值創(chuàng)建map,如下:

						protected Map referenceData(HttpServletRequest
						request) throws Exception { Map cityMap = new
						LinkedHashMap(); cityMap.put("LDN", "London");
						cityMap.put("PRS", "Paris"); cityMap.put("NYC",
						"New York");

						Map m = new HashMap(); m.put("cityMap",
						cityMap); return m; }
					

現(xiàn)在上述代碼將產(chǎn)生出以相關(guān)代碼為值的radio按鈕,同時(shí)你的用戶仍能看到對他們顯示友好的城市名。

						Town: <input type="radio" name="address.town"
						value="LDN"> London <input type="radio"
						name="address.town" value="PRS"
						checked="checked"> Paris <input
						type="radio" name="address.town" value="NYC">
						New York
					

14.4.5.4.?重載HTML轉(zhuǎn)碼行為并使你的標(biāo)簽符合XHTML

缺省情況下使用上面這些宏將產(chǎn)生符合HTML 4.01標(biāo)準(zhǔn)的標(biāo)簽,并且Spring的綁定支持使用web.xml中定義的HTML轉(zhuǎn)碼行為。為了產(chǎn)生符合XHTML標(biāo)準(zhǔn)的標(biāo)簽以及覆蓋默認(rèn)的HTML轉(zhuǎn)碼行為,你可以在你的模板(或者模板可見的模型對象)中指定兩個(gè)變量。在模板中指定的好處是稍后的模板處理中可以為表單中不同的域指定不同的行為。

要切換到符合XHTML的輸出,你可以設(shè)置model/context變量xhtmlCompliant的值為true:

					## for Velocity.. #set($springXhtmlCompliant = true)

					<#-- for FreeMarker --> <#assign
					xhtmlCompliant = true in spring>
				

在進(jìn)行完這些處理之后,由Spring宏產(chǎn)生的所有標(biāo)簽都符合XHTML標(biāo)準(zhǔn)了。

類似地,可以為每個(gè)輸入域指定HTML轉(zhuǎn)碼行為:

					<#-- 該句覆蓋默認(rèn)HTML轉(zhuǎn)碼行為 -->

					<#assign htmlEscape = true in spring> <#--
					next field will use HTML escaping -->
					<@spring.formInput "command.name" />

					<#assign htmlEscape = false in spring> <#--
					all future fields will be bound with HTML escaping
					off -->
				
Artikel sebelumnya: Artikel seterusnya: