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

JSSH 四框架整合:JSF 1.1 + Struts 2.1 + Spring 2.0 + Hibernate 3.1 完整實戰

     編輯:Java 相關知識

技術棧版本

  • JSF 1.1 (Sun RI / MyFaces)
  • Struts 2.1
  • 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>*.jsf</url-pattern>
  </servlet-mapping>

  <!-- Struts 2 FilterDispatcher -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>struts-cleanup</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts-cleanup</filter-name>    <url-pattern>/*</url-pattern>
  </filter-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 監聽器 -->
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>

  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
</web-app>

faces-config.xml:同 JSH 整合

<faces-config>
  <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>
    <managed-property>
      <property-name>service</property-name>
      <value>#{userService}</value>
    </managed-property>
  </managed-bean>
  <navigation-rule>...</navigation-rule>
</faces-config>

struts.xml:JSF 攔截器整合

<struts>
  <!-- JSF 攔截器堆疊 -->
  <package name="jsf" extends="jsf-default">
    <interceptors>
      <interceptor-stack name="jsfFullStack">
        <interceptor-ref name="params"/>
        <interceptor-ref name="basicStack"/>
        <interceptor-ref name="jsfStack"/>
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="jsfFullStack"/>
  </package>

  <!-- 業務包繼承 jsf 包 -->
  <package name="main" namespace="/" extends="jsf">
    <action name="login" class="loginAction" method="login">
      <result name="input">/input2.jsp</result>
      <result name="error">/error.jsp</result>
      <result name="success">/success.jsp</result>
    </action>
  </package>
</struts>

applicationContext.xml:雙 prototype

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

  <bean id="loginAction" class="com.jsf.beans.User" scope="prototype">
    <property name="service"><ref local="userService"/></property>
  </bean>
</beans>

User.java:雙執行入口

package com.jsf.beans;
public class User extends ActionSupport implements Serializable {
    // 欄位、getter/setter 略
    private UserService service;

    // JSF 入口
    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";
    }

    // Struts 2 入口
    public String login() throws Exception {
        if (service.validate(this.id, this.password)) {
            User u = service.getUser(this.id);
            ActionContext.getContext().put("userBean", u);
            return "success";
        }
        return "error";
    }
}

頁面:JSF vs Struts 標籤混用

input.jsp (純 JSF,表單提交拋異常)

<%@ taglib uri="https://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="https://java.sun.com/jsf/html" prefix="h"%>
<f:view>
  <h:form>
    用戶名:<h:inputText value="#{userBean.id}"/>
    密碼:<h:inputSecret value="#{userBean.password}"/>
    <h:commandButton value="登錄" action="#{userBean.execute}"/>
  </h:form>
</f:view>

input2.jsp (JSF + Struts 混用,Struts 提交正常)

<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib uri="https://java.sun.com/jsf/core" prefix="f"%>
<f:view>
  <s:form action="login" namespace="/">
    <s:textfield name="id" label="用戶名"/>
    <s:password name="password" label="密碼"/>
    <s:submit value="登錄"/>
  </s:form>
</f:view>

整合核心總結

  1. web.xml 同時啟用 JSF FacesServlet、Struts2 FilterDispatcher、Spring ContextLoaderListener、雙 JSF 監聽器
  2. faces-config.xml 配置 DelegatingVariableResolver 打通 JSF-Spring
  3. struts.xml 定義 jsfFullStack 攔截器堆疊,業務包 extends="jsf"
  4. 頁面可混用 JSF/Struts 標籤,但表單必須用 Struts 方式提交,純 JSF 提交會拋異常
  5. Action/Service 皆設 prototype,符合 Request 域生命週期

架構反思

四框架疊加極度複雜、維護成本高。現代架構建議:

  • Web 層:Spring MVC / Spring WebFlux / JSF 2.3+ / Vaadin
  • 業務層:Spring Boot 自動配置 + @Service/@Transactional
  • 持久層:Spring Data JPA / MyBatis / JOOQ
  • 棄用 Struts 1/2、JSF 1.x、手工 XML 配置
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved