naobe @ ウィキ
SpringWEBアプリケーション適用
最終更新:
Bot(ページ名リンク)
-
view
Springに戻る
検証環境
- spring-framework-3.0.4(2010/09/11時点の最新バージョン)
- iBATIS2.3.4
Webコンテナ
別途、TomcatなどのWEBコンテナが必要。
ORMへのアクセス
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
【記述例】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"。
【記述例】
リソースとして配置する(クラスパスに設定しているディレクトリに置く)。
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)
テストアプリケーションの作成
Strutsとの連携
struts-config.xml
以下を追加。デフォルトでは、Strutsは、RequestProcessorクラスをリクエストプロセッサに使うが、以下の設定を追加するとSpringが用意したAutowiringRequestProcessorがリクエストプロセッサとなる。
サービス層のクラスをDIするのが容易になる。
サービス層のクラスをDIするのが容易になる。
<controller
processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />
