1.WEB MVC
C:(1) 處理器映射
* BeanNameUrlHandlerMapping(缺省)
* SimpleUrlHandlerMapping
(2) AbstractController基類
|--- MultiActionController 多個行爲封裝在這個類裏,請求url裏參數method=方法名
|--- AbstractCommandController
它能夠將請求參數綁定到你指定的命令對象,提供驗證功能
AbstractFormController
支持表單提交,用戶輸入綁定到命令對象,驗證表單內容,防止重複提交、表單驗證以及一般的表單處理流程
SimpleFormController
提供更多的支持。你可以爲其指定一個命令對象,顯示錶單的視圖名,當表單提交成功後顯示給用戶的視圖名等等
AbstractWizardFormController
V:
1) 視圖解析器
InternalResourceViewResolver
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
ResourceBundleViewResolver
需要一個屬性文件來定義view名到1) class
2) URL的映射
(2) i18n:
< 資源名 >_< 語言代碼 >_< 國家/ 地區代碼 >.properties
1) jdk裏:
a)ResourceBundle:
ResourceBundle rb1 = ResourceBundle.getBundle("com/baobaotao/i18n/resource", Locale.US);
rb1.getString("greeting.common")
b)格式化
greeting.common=How are you!{0},today is {1}
Object[] params = {"John", new GregorianCalendar().getTime()};
String str1 = new MessageFormat(rb1.getString("greeting.common"),Locale. US).format(params);
2) spring封裝:
a) MessageSource 接口: String getMessage(String code, Object[] args, String defaultMessage, Locale locale)
b) 實現類1: ResourceBundleMessageSource
MessageSource ms = (MessageSource)ctx.getBean("myResource");//返回
ResourceBundleMessageSource
Object[] params = {"John", new GregorianCalendar(). getTime()};
String str1 = ms.getMessage("greeting.common",params,Locale.US);
無須再分別加載不同語言、不同國家/ 地區的本地化資源文件,僅僅通過資源名就可以加載整套的國際化資源文 件。此外,我們無須顯式使用MessageFormat 操作國際化信息,僅通過MessageSource# getMessage() 方法就可以完成操作了
c) 實現類2: ResourceBundleMessageSource 的唯一區別在於它可以定時刷新資源文件
2. IOC
bean.xml
<beans>
<bean id="TheAction" class="net.chen.spring.qs.UpperAction">
<property name="message">
<value>HeLLo</value>
</property>
</bean>
</beans>
public void testQuickStart () {
ApplicationContext ctx=new FileSystemXmlApplicationContext ("bean.xml");
Action a= (Action) ctx.getBean ("TheAction");
System.out.println (a. execute ("Rod Johnson"));
}
3.AOP
每個組件負責 一部分功能,這些組件也經常帶有一些除了核心功能之外的附帶功能 。系統服務如日誌、事務管理和安全經常融入到一些其他功能模塊中。這些系統服務通常叫做交叉業務.
(1)AspectJ( 需要使用到AspectJ 的aspectjweaver.jar)
1) 使用基於Schema 的配置文件配置Spring AOP 。
a) 原有的業務邏輯類
b) 編寫Advice(簡單Aop代碼,例如log輸出,事務處理)
c) 配置
1)配置切入點pointcut
<
aop:pointcut
id
=
"somePointcut"
expression = "execution(* springroad.demo.chap5.exampleB.Component.business*(..))" />
2)將pointcut與advice關聯
< aop:before pointcut-ref = "somePointcut"
method = "beginTransaction" />
< aop:after-returning pointcut-ref = "somePointcut"
method = "endTransaction" />
2)使用anotation
(2) 僅依靠Spring AOP 方面的API (不要使用AspectJ 的aspectjweaver.jar)
1) advice是實現相關Advice
(通知)
接口
,
Spring實現了AOP聯盟接口。在Spring AOP中,存在如下幾種通知(Advice)類型
Before通知:在目標方法被調用前調用,涉及接口org.springframework.aop.MethodBeforeAdvice;
After通知:在目標方法被調用後調用,涉及接口爲org.springframework.aop.AfterReturningAdvice;
Throws通知:目標方法拋出異常時調用,涉及接口org.springframework.aop.MethodBeforeAdvice;
Around通知:攔截對目標對象方法調用,涉及接口爲org.aopalliance.intercept.MethodInterceptor。
例中 SleepHelper實現此接口
2) pointcut: 那將方法要被截獲
<bean id="spleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value=".*sleep"/>
</bean>
3) advicor將pointcut與advice捆綁在一起
<bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="sleepHelper"/>
<property name="pointcut" ref="sleepPointcut"/>
</bean>
4)產生代理對象
<bean id="humanProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="human"/>
<property name="interceptorNames" value="sleepHelperAdvisor" />
<property name="proxyInterfaces" value="test.spring.aop.bean.Sleepable" />
</bean>
(3)自動代理
自動代理的功能,能讓切點跟通知自動進行匹配,修改配置文件如下:
<bean id="sleepHelper" class="test.spring.aop.bean.SleepHelper"></bean>
<bean id="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="sleepHelper"/>
<property name="pattern" value=".*sleep"/>
</bean>
<bean id="human" class="test.spring.aop.bean.Human"> </bean> --target
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
4.事務管理
接口 PlatformTransactionManager
|---DataSourceTransactionManager
|---HibernateTransactionManager
|---JdoTransaction-Manager
|---JtaTransactionManager
public interface PlatformTransactionManager
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
TransactionException是UncheckedException.事務的失敗通常都是致命的錯誤,Spring不強迫您一定要處理,而是讓您自行選擇是否要捕捉異常。
getTransaction()方法根據一個TransactionDefinition對象來回傳一個TransactionStatus對 象,TransactionDefinition接口的實例定義了事務的隔離程度(Isolationlevel)、傳播行爲 (Propagationbehavior)、超時(Timeout)、只讀(Read-only)等,TransactionStatus代表着一個新 的事務發起或已經存在的事務,您可以通過它來控制事務的執行或調查的狀態.
JDBC聲明事務管理
(1) 使用TransactionProxyFactoryBean,指定要介入的事務管理對象及其方法。 需要一個目標對象包裝在事務代理中。這個目標對象一般是一個普通Javabean。當我們定義TransactionProxyFactoryBean 時,必須提供一個相關的 PlatformTransactionManager的引用和事務屬性。事務屬性含有事務定義。
<
bean
id
="personDao"
class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
>
<!--
爲事務代理bean注入事務管理器
-->
<
property
name
="transactionManager"
><
ref
bean
="transactionManager"
/></
property
>
<!--
設置事務屬性
-->
<
property
name
="transactionAttributes"
>
<
props
>
<!--
所有以find開頭的方法,採用required的事務策略,並且只讀
-->
<
prop
key
="find*"
>
PROPAGATION_REQUIRED,readOnly
</
prop
>
<!--
其他方法,採用required的事務策略 ->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
<!-- 爲事務代理bean設置目標bean
-->
<
property
name
="target"
>
<
ref
local
="personDaoTarget"
/>
</
property
>
</
bean
>
(2) BeanNameAutoProxyCreator