| 框架 | 版本 | 說明 |
|---|---|---|
| Spring Framework | 4.3.4.RELEASE | spring-aop, beans, context, core, jdbc, orm, tx, web, webmvc 等模組 |
| AspectJ | 1.8.9 | Spring AOP 依賴,aspectjweaver.jar |
| Hibernate | 4.2.21.Final | 支援 Java 1.6 的最高穩定版,含 core, jpa, javassist 等 |
| SLF4J | 1.7.21 | jcl-over-slf4j, slf4j-api, slf4j-log4j12 |
| Log4j | 1.2.17 | 支援 Java 1.6 / Spring 4.3.4 的最高穩定版 |
| log4jdbc4 | 1.2.1 | SQL 攔截輸出完整語句 |
| Fastjson | 1.2.21 | JSON 處理 |
| MySQL Connector/J | 5.1.40 | JDBC 驅動 |
| Commons Lang3 | 3.5 | 工具庫 |
ims,輸出目錄改為 WebContent/WEB-INF/classesWebContent/WEB-INF/libsrc
└─ com.ims
├─ common
├─ persistence
│ ├─ base
│ ├─ dao
│ │ ├─ xxx
│ │ │ └─ impl
│ │ └─ model
│ │ └─ xxx
├─ service
│ ├─ xxx
│ │ └─ impl
└─ web
└─ controller
└─ xxx
<context:component-scan base-package="com" use-default-filters="false">
<context:include-filter type="aspectj" expression="com.ims.persistence.dao..*.impl.*DaoImpl"/>
<context:include-filter type="aspectj" expression="com.ims.service..*.impl.*BSImpl"/>
</context:component-scan>
<!-- log4jdbc SQL 攔截 -->
<bean id="log4jdbcInterceptor" class="net.sf.log4jdbc.DataSourceSpyInterceptor" />
<bean id="dataSourceLog4jdbcAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames"><list><value>log4jdbcInterceptor</value></list></property>
<property name="beanNames"><list><value>sysDatasource</value><value>mmsDatasource</value></list></property>
</bean>
<bean id="xxxDatasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/xxx?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="xxxSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="dataSource" ref="xxxDatasource"/>
<property name="packagesToScan"><list><value>com.ims.persistence.model.xxx</value></list></property>
</bean>
<bean id="xxxTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="xxxSessionFactory"/>
</bean>
<tx:advice id="xxxTxAdvice" transaction-manager="xxxTransactionManager">
<tx:attributes>
<tx:method name="find*" isolation="READ_COMMITTED" read-only="true"/>
<tx:method name="get*" isolation="READ_COMMITTED" read-only="true"/>
<tx:method name="*" isolation="READ_COMMITTED" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="xxxTxPointcut" expression="execution(* com.ims.service.xxx.impl..*BSImpl.*(..))"/>
<aop:advisor advice-ref="xxxTxAdvice" pointcut-ref="xxxTxPointcut" order="0"/>
</aop:config>
<bean id="xxxBaseDao" class="com.ims.persistence.dao.xxx.impl.XxxBaseDaoImpl">
<property name="sessionFactory" ref="xxxSessionFactory"/>
</bean>
<mvc:annotation-driven />
<context:component-scan base-package="com" use-default-filters="false">
<context:include-filter type="aspectj" expression="com.ims.web.controller..*Controller"/>
</context:component-scan>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/view/"/>
</bean>
<property name="hibernate.order_updates">true</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.c3p0.max_size">30</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">3000</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="c3p0.idle_test_period">121</property>
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.validate">true</property>
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
log4j.rootLogger=WARN,console,roll
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.roll=org.apache.log4j.DailyRollingFileAppender
log4j.appender.roll.File=${catalina.base}/logs/ims/ims.log
log4j.appender.roll.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %p %t %c %m%n
log4j.logger.com.ims=WARN
log4j.logger.jdbc.sqltiming=INFO
BaseController → 子模組 XxxBaseControllerXxxBaseDao → 實現 XxxBaseDaoImpl 注入 xxxSessionFactoryWebContent
├─ common
├─ content (css, images, js)
├─ sql/xxx
├─ view/xxx
└─ viewModel/xxx
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml, classpath:applicationContextXxx.xml</param-value>
</context-param>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
<listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
<init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param><param-name>contextConfigLocation</param-name><param-value>classpath:controllerServlet.xml</param-value></init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>controller</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
部署至 Tomcat,訪問 *.do 請求,觀察控制台 SQL 輸出與日誌文件生成情況。若報缺少 JAR,請核對 WEB-INF/lib 完整性;若編碼亂碼,確認 CharacterEncodingFilter 與資料庫 URL characterEncoding=utf8 一致。
