N:
1.之前Spring 托管 Mybatis时将配置写在同一个xml中,现在分成三部分dao service spring-mvc
spring-dao中 主要配置连接池、mybatis sqlSessionFactory、dao 包的位置:
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<!--数据库连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
...
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--配置mybatis全局配置文件:mybatis-config.xml-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--扫描entity包,使用别名,多个用;隔开-->
<property name="typeAliasesPackage" value="org.seckill.entity"/>
<!--扫描sql配置文件:mapper需要的xml文件-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.seckill.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
spring-service中配置service,component-scan扫描service包的位置,配置事务:
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<context:component-scan base-package="org.seckill.service"/>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据库的连接池-->
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
spring-mvc中则是配置controller以及相关设置:
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<!--1.开启SpringMvc的注解模式
2.提供一系列的支持,支持日期format xml json的默认支持-->
<mvc:annotation-driven/>
<!--静态资源配置
1.加入静态资源的处理
2.允许使用/做整体映射-->
<mvc:default-servlet-handler />
<context:component-scan base-package="org.seckill.controller"/>
<!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
web.xml中之前是单独写一个content scan,servlet中单独配置 spring-mvc
现在则改为所有的 spring-*.xml都放在servlet中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<display-name>Archetype Created Web Application</display-name>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.log4f使用:Logger logger = LoggerFactory.getLogger(this.getClass());
同时必须有配置文件,默认在resources中,logback.xml或者 logback-test.xml 配置官方说明
N:异常回滚问题
在spring-service中
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据库的连接池-->
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
开启注释事务机制,在service的实现类中需要回滚的方法上添加@Transactional
需要注意的是spring只有捕捉到runtime异常才能回滚这就有两个问题:
(1)要使用回滚机制,第一种方式不能添加try-catch,直接throw抛出,第二种方式是在try-catch中再次将异常抛出:
throw new SeckillException("seckill data(md5) rewrite ");
或者
catch (RepeatKillException e2) {
throw e2;
}
(2)第二个问题就是非runtime问题,如数据库断开连接,这些异常必须转化为runtime异常:
catch (Exception e) {
logger.error(e.getMessage(), e);
/**所有编译期异常(insert超时,数据库连接错误)转化为运行期异常
* 有错误就回滚*/
throw new SeckillException("seckill inner error", e);
}
N:1.AJAX app等需要json,添加一个dto层,存放Json映射对象
2.controller中调用service,进行异常处理。因为出现异常后,程序直接停止运行,因此需要try-catch同时云云这些异常