JSF+Spring+Hibernate統合のポイント


最近ずっとこのフレームワークを使っていますが、今、それらの統合のポイントについてまとめてみましょう.jsfとspringを結合するときにserviceレイヤspringでjsfを注入します.次にプロファイルを見てみましょう.
web.xml
<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
	//  jsf
    <listener>
        <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    </listener>
	//  spring
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    //  jsf       
    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>
             /WEB-INF/tiles-faces-config.xml,
            /WEB-INF/conf/jsf/user-faces-config.xml
        </param-value>
	//             
    <context-param>
        <param-name>tiles-definitions</param-name>
        <param-value>
			/WEB-INF/conf/jsf/user-tiles.xml
        </param-value>
    </context-param>
	//  spring    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/conf/spring/*.xml
        </param-value>
    </context-param>
	//             , Faces Servlet    
	<servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

	<welcome-file-list>
        <welcome-file>Login.jsf</welcome-file>
    </welcome-file-list>
</web-app>

  tiles-faces-config.xmlこのファイルの内容はface-configに書かれています.xmlファイルの場合、face-configが1つしかありません.xmlファイルは、face-configに以下の内容を書き込むことができます.xmlファイルでは、複数ある場合、重複するコードを避けるために単独で提案されています.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
 <application>
  <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
 </application>
</faces-config>

 user-tiles.xml
<!DOCTYPE tiles-definitions
        [
                <!ELEMENT component-definitions (definition+)>
                <!ELEMENT tiles-definitions (definition+)>
                <!ELEMENT definition (put*, putList*)>
                <!ATTLIST definition
                        name CDATA #REQUIRED
                        pages CDATA #IMPLIED
                        path CDATA #IMPLIED
                        extends CDATA #IMPLIED
                        role CDATA #IMPLIED
                        template CDATA #IMPLIED
                        controllerClass CDATA #IMPLIED
                        controllerUrl CDATA #IMPLIED>
                <!ELEMENT put (#PCDATA)>
                <!ATTLIST put
                        name CDATA #REQUIRED
                        value CDATA #IMPLIED
                        type (string | pages | template | definition) #IMPLIED
                        content CDATA #IMPLIED
                        direct (true | false) #IMPLIED>
                <!ELEMENT putList ( (add* | item* | bean* | putList*)+) >
                <!ATTLIST putList
                        name CDATA #REQUIRED>
                <!ELEMENT putListElements (add | item | bean)>
                <!ELEMENT add (#PCDATA)>
                <!ATTLIST add
                        value CDATA #IMPLIED
                        type (string | pages | template | definition) #IMPLIED
                        content CDATA #IMPLIED
                        direct (true | false) #IMPLIED>
                <!ELEMENT bean (#PCDATA)>
                <!ATTLIST bean
                        classtype CDATA #REQUIRED>
                <!ELEMENT item (#PCDATA)>
                <!ATTLIST item
                        value CDATA #REQUIRED
                        link CDATA #REQUIRED
                        classtype CDATA #IMPLIED
                        icon CDATA #IMPLIED
                        tooltip CDATA #IMPLIED>
                ]>

<tiles-definitions>//     web.xml  param-name  
    <definition name="/Login.tiles" extends="layout.busitemplateLogin">
        <put name="body" value="/pages/Login.jsp"/>
    </definition>

    <definition name="/user/UserManager.tiles" extends="layout.busitemplate">
        <put name="body" value="/pages/user/UserManager.jsp"/>
    </definition>
   
</tiles-definitions>

 user-faces-config.xmlはこのファイルの中でページとクラスが関連付けられ、ここでjsfとspringの注入統合を実現します.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
        "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
    <managed-bean>
        <managed-bean-name>user_loginBB</managed-bean-name>
        <managed-bean-class>com.user.web.LoginBackingBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>userucc</property-name>
            <value>#{user_userManageUCC}</value>// spring    
        </managed-property>
    </managed-bean>

    <managed-bean>
        <managed-bean-name>user_userManagerBB</managed-bean-name>
        <managed-bean-class>com.user.web.UserManagerBackingBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>usermanageucc</property-name>
            <value>#{user_userManageUCC}</value>// spring      
        </managed-property>
    </managed-bean>
    
    <navigation-rule>
        <from-view-id>/user/UserInfoEdit.jsp</from-view-id>//      
        <navigation-case>
            <from-outcome>userlist</from-outcome>//  bean return           
            <to-view-id>/user/UserManager.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
    
</faces-config>

 user-applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="user_loginlogdao" class="com.user.dao.LoginLogDAO">
        <property name="hibernatetemplate">
            <ref bean="hibernateTemplate"/>
        </property>
    </bean>

    <bean id="user_logservice" class="com.user.service.LoginLogService">
        <property name="loginlogdao">
            <ref bean="user_loginlogdao"/>
        </property>
     </bean>

    <bean id="user_userManageService" class="com.user.service.UserManageService">
        ...             
    </bean>

    <!--ucc-->
    <bean id="user_userManageUccImpl" class="com.user.ucc.impl.UserManageUCC">
        <property name="usermanageservice">
            <ref bean="user_userManageService"/>
        </property>
        <property name="logservice">
            <ref bean="user_logservice"/>
        </property>
    </bean>
       
    <!--proxy-->//    
    <bean id="user_userManageUCC" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="proxyInterfaces">
            <list>
                <value>com.user.ucc.IUserManageUCC</value>
            </list>
        </property>
        <property name="target" ref="user_userManageUccImpl"/>
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributeSource" ref="namingTransactionAttribute"/>
    </bean>
</beans>


関連するクラスとページについてはあまり書かれていませんが、ここでは主にjsfとspringのプロファイルがどのように関連しているかを見てみましょう.