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