首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JSH 整合實戰:JSF 1.1 + Spring 2.0 + Hibernate 3.1 完整配置指南

     編輯:Java 相關知識

技術棧版本

  • JSF 1.1 (Sun RI / MyFaces)
  • Spring 2.0
  • Hibernate 3.1

web.xml 關鍵配置

<web-app>
  <!-- JSF FacesServlet -->
  <servlet>
    <servlet-name>FacesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <!-- Spring ContextLoaderListener -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 編碼過濾器 -->
  <filter>
    <filter-name>CharacterEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>gb2312</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- JSF 配置監聽器(Sun RI 必備)-->
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
  <!-- MyFaces 專用監聽器(可選)-->
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>

  <welcome-file-list>
    <welcome-file>input.faces</welcome-file>
  </welcome-file-list>
</web-app>

faces-config.xml 核心:DelegatingVariableResolver

<faces-config>
  <!-- Spring 整合關鍵:讓 JSF 托管 Bean 可注入 Spring Bean -->
  <application>
    <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
  </application>

  <managed-bean>
    <managed-bean-name>userBean</managed-bean-name>
    <managed-bean-class>com.jsf.beans.User</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <!-- 注入 Spring 定義的 userService -->
    <managed-property>
      <property-name>service</property-name>
      <value>#{userService}</value>
    </managed-property>
  </managed-bean>

  <navigation-rule>
    <from-view-id>/input.jsp</from-view-id>
    <navigation-case>
      <from-outcome>success</from-outcome>
      <to-view-id>/success.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
      <from-outcome>error</from-outcome>
      <to-view-id>/error.jsp</to-view-id>
    </navigation-case>
  </navigation-rule>
</faces-config>

applicationContext.xml:Service 設為 prototype

<beans>
  <bean name="userService" id="userService"
        class="com.jsf.service.UserService"
        factory-method="getInstance"
        lazy-init="false"
        scope="prototype"/>
</beans>

注意:JSF 托管 Bean 為 request 域,注入的 Service 必須同為 prototype,否則線程安全與狀態隔離會出問題。

User.java (JSF Managed Bean)

package com.jsf.beans;
public class User implements Serializable {
    private String id, name, password;
    private Integer age;
    private UserService service; // Spring 注入

    // getter/setter 略

    public String execute() {
        if (service.validate(this.id, this.password)) {
            User u = service.getUser(this.id);
            this.setAge(u.getAge());
            this.setName(u.getName());
            return "success";
        }
        return "error";
    }
}

整合核心總結

  1. faces-config.xml 必須配置 DelegatingVariableResolver,打通 JSF 與 Spring 變數解析
  2. web.xml 採用 Sun RI ConfigureListener(MyFaces 監聽器可選)
  3. Spring Service 設為 prototype,匹配 JSF Request 域 Bean 生命週期
  4. JSF 頁面用 h:commandButton action="#{userBean.execute}" 觸發導航

版本升級建議

  • JSF 1.1 → JSF 2.3+ (Facelets、AJAX、CDI 整合)
  • Spring 2.0 → Spring 5+/Spring Boot 3 (JavaConfig、自動配置、響應式)
  • Hibernate 3.1 → Hibernate 6 / JPA 3 (標準化、效能、模組化)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved