naobe @ ウィキ

SpringWEBアプリケーション適用

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
Springに戻る

検証環境

  • spring-framework-3.0.4(2010/09/11時点の最新バージョン)
  • iBATIS2.3.4

Webコンテナ

別途、TomcatなどのWEBコンテナが必要。

ORMへのアクセス

Hibernate, JPA, JDO(Java Data Object), iBATISへのアクセスをサポートする。

Spring設定ファイル

定義

web.xmlのcontext-paramタグにSpring設定ファイルを設定する。

設定例

  • DataSourceにSpringが提供するDriverManagerDataSourceを使う。このクラスはコネクションプールなしでJDBCに単純にDataSourceインタフェースをかぶせたもの。
  • transactionManagerにSpringが提供するDataSourceTransactionManagerを使う。DriverManagerDataSourceとリンク。
  • iBATISとの連携にSqlMapClientFactoryBeanを使う
  • iBATIS,トランザクションを使うアプリケーションとしてSqlMapClientDaoSupportを継承したEmployeeManagerImplを用いる。
  • AOPとしてTransactionProxyFactoryBeanを使う
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://www.springframework.org/schema/beans
                         classpath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsd">
 
 	<!-- ============= resource ==================== -->
 	<bean id="dataSource"
 		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 		<property name="driverClassName">
 			<value>oracle.jdbc.driver.OracleDriver</value>
 		</property>
 		<property name="url">
 			<value>jdbc:oracle:thin:@192.168.1.1:1521:XE</value>
 		</property>
 		<property name="username">
 			<value>HR</value>
 		</property>
 		<property name="password">
 			<value>HR</value>
 		</property>
 	</bean>
 
 	<bean id="transactionManager"
 		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 		<property name="dataSource">
 			<ref local="dataSource" />
 		</property>
 	</bean>
 
 	<bean id="sqlMapClient"
 		class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
 		<property name="configLocation">
 			<value>WEB-INF/sqlMapConfig.xml</value>
 		</property>
 	</bean>
 
 	<bean id="employeeManager" class="suna.EmployeeManagerImpl">
 		<property name="dataSource">
 			<ref local="dataSource" />
 		</property>
 		<property name="sqlMapClient">
 			<ref local="sqlMapClient" />
 		</property>
 	</bean>
 
 	<!-- ============= transaction ==================== -->
 	<bean id="empManager"
 		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 		<property name="transactionManager">
 			<ref local="transactionManager" />
 		</property>
 		<property name="target">
 			<ref bean="employeeManager" />
 		</property>
 		<property name="transactionAttributes">
 			<props>
 				<prop key="get*">
 					PROPAGATION_REQUIRED,readOnly,-java.lang.Exception
 				</prop>
 				<prop key="add*">
 					PROPAGATION_REQUIRED,-java.lang.Exception
 				</prop>
 				<prop key="update*">
 					PROPAGATION_REQUIRED,-java.lang.Exception
 				</prop>
 			</props>
 		</property>
 	</bean>
 </beans>

iBATISとの接続

iBATISバージョン

iBATIS2.X

SQLマップ設定ファイル

リソースとして配置する(クラスパスに設定しているディレクトリに置く)。
【記述例】sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
 PUBLIC "-//ibatis.apache.org//DTD [[SQL]] Map Config 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
 <sqlMapConfig>
<sqlMap resource="suna/Employee.xml" />
 </sqlMapConfig>
sqlMapタグは複数設定できる。

SQLマップXMLファイル

SQLと、SELECT結果のカラムとJava Beanとの関係を設定する。
リソースとして配置する(クラスパスに設定しているディレクトリに置く)。
SQLマップ設定ファイルの記述例では、"suna/Employee.xml"。
【記述例】
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE sqlMap
 PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-2.dtd">
 <sqlMap namespace="Employee" >
 	<typeAlias alias="employee" type="suna.Employee" />
 	<resultMap id="employeeResult" class="employee">
 		<result property="employeeId" column="EMPLOYEEID" />
 		<result property="firstName" column="FIRSTNAME" />
 		<result property="lastName" column="LASTNAME" />
 		<result property="phoneNumber" column="PHONENUMBER" />
 		<result property="hireDate" column="HIREDATE" />
 		<result property="managerName" column="MANAGERNAME" />
 	</resultMap>
     <insert id="insertEmployee" parameterClass="employee" >
         insert into EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, PHONE_NUMBER, HIRE_DATE, MANAGE  R_ID,
                                JOB_ID, DEPARTMENT_ID, EMAIL, SALARY) 
                         values(#employeeId#, #firstName#, #lastName#, #phoneNumber#, TO_DATE(#hire  Date#, 'YYYY/MM/DD'), #managerId#,
                                #jobId#, #departmentId#, #email#, #salary#)
     </insert>
 
     <delete id="deleteEmployee" parameterClass="java.lang.Integer" >
         delete from EMPLOYEES where EMPLOYEE_ID = #value#
     </delete>
 
     <delete id="updateEmployee" parameterClass="employee" >
         update EMPLOYEES set FIRST_NAME = #firstName#, LAST_NAME = #lastName#, PHONE_NUMBER = #pho  neNumber#,
                              HIRE_DATE = TO_DATE(#hireDate#, 'YYYY/MM/DD')
                          where EMPLOYEE_ID = #employeeId#     
     </delete>
 	
 	<statement id="getAllEmployee" resultMap="employeeResult"
 		>
 		select d.EMPLOYEE_ID as EMPLOYEEID, d.FIRST_NAME as FIRSTNAME, d.LAST_NAME as LASTNAME, 
 		       d.PHONE_NUMBER as PHONENUMBER, TO_CHAR(d.HIRE_DATE, 'YYYY/MM/DD') as HIREDATE, e.FIRS  T_NAME as MANAGERNAME
 		        from EMPLOYEES d LEFT OUTER JOIN EMPLOYEES e on (d.MANAGER_ID = e.EMPLOYEE_ID)
 	</statement>
 	
 	<statement id="getEmployeeById" parameterClass="java.lang.String" resultMap="employeeResult"
 		>
 		select d.EMPLOYEE_ID as EMPLOYEEID, d.FIRST_NAME as FIRSTNAME, d.LAST_NAME as LASTNAME, 
 		       d.PHONE_NUMBER as PHONENUMBER, TO_CHAR(d.HIRE_DATE, 'YYYY/MM/DD') as HIREDATE, e.FIRS  T_NAME as MANAGERNAME
 		        from EMPLOYEES d LEFT OUTER JOIN EMPLOYEES e on (d.MANAGER_ID = e.EMPLOYEE_ID) 
 		        where d.EMPLOYEE_ID = #value#
 	</statement>
 	
     <statement id="getEmployeeByDate" parameterClass="java.util.Map" resultMap="employeeResult"
         >
         select d.EMPLOYEE_ID as EMPLOYEEID, d.FIRST_NAME as FIRSTNAME, d.LAST_NAME as LASTNAME, 
                d.PHONE_NUMBER as PHONENUMBER, TO_CHAR(d.HIRE_DATE, 'YYYY/MM/DD') as HIREDATE, e.FI  RST_NAME as MANAGERNAME
                 from EMPLOYEES d LEFT OUTER JOIN EMPLOYEES e on (d.MANAGER_ID = e.EMPLOYEE_ID)
                 <dynamic prepend="where">
                     <isNotNull prepend="and" property="startDate" >
                         d.HIRE_DATE >= TO_DATE(#startDate#, 'YYYY/MM/DD') 
                     </isNotNull>
                     <isNotNull prepend="and" property="endDate" >
                         d.HIRE_DATE <![CDATA[ <= ]]> TO_DATE(#endDate#, 'YYYY/MM/DD') 
                     </isNotNull>
                 </dynamic> 
     </statement>
 </sqlMap>

Java Beanの作成

sqlMapClientの使用

SqlMapClientDaoSupportを継承したクラスを作成する。getSqlMapClientTemplate()メソッドを呼んで、SqlMapClientTemplateインスタンスを呼び出し、SQLマップXMLファイルで定義したメソッド(<statement>タグ)を呼び出す。
【記述例】
*/
 public class EmployeeManagerImpl extends SqlMapClientDaoSupport implements EmployeeManager {
 	public List<Employee> getAllEmployees() {
 		return getSqlMapClientTemplate().queryForList("getAllEmployee");
     }

JSFとの接続

  • JSF1.1. JSF1.2をサポート
  • Apache MyFace, MyFaces Orchestraなど。WebSphere Sun RI 1.2で試してみたが問題なく動作した。

web.xmlの修正

以下のタグを追加。ContextLoaderListenerは、サーブレットが立ち上がったときに、Springをロードするために使う。context-paramタグには、Springの設定ファイルを指定する。
 <listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 
 <context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/applicationContext*.xml</param-value>
 </context-param>

faces-config.xmlの修正

以下のタグを追加。このタグを追加するとバッキングビーンのプロパティにクラスを注入する。
<application>
	<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
</application>
バッキングビーン定義にmanaged-propertyタグを追加して、applicaioConfig.xmlで設定したビーン(ビジネスロジック)を注入する。
<!-- main -->
<managed-bean>
	<managed-bean-name>main</managed-bean-name>
	<managed-bean-class>suna.MainBean</managed-bean-class>
	<managed-bean-scope>session</managed-bean-scope>
	<!-- SpringによってEmployeeManagerを注入する -->
	<managed-property>
		<property-name>empMgr</property-name>
		<value>#{empManager}</value>
	</managed-property>
</managed-bean>

トランザクション

以下の項目を試験する。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (spring_tran.xls)

テストアプリケーションの作成

Spring + iBATIS + JSF + ORACLEで簡単なアプリケーションを作成してみる。
画面は、WebSphereの検証で作成したものを使う。


Strutsとの連携


struts-config.xml

以下を追加。デフォルトでは、Strutsは、RequestProcessorクラスをリクエストプロセッサに使うが、以下の設定を追加するとSpringが用意したAutowiringRequestProcessorがリクエストプロセッサとなる。
サービス層のクラスをDIするのが容易になる。

 <controller
     processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />
人気記事ランキング
ウィキ募集バナー