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

JSF vs Struts 深度對決:事件驅動組件模型與 MVC 範式的本質差異

     編輯:J2EE

核心範式差異:事件粒度與編程模型

維度Struts (MVC)JSF (事件驅動組件)
事件觸發單位整個表單 → Action.execute()(Command 模式)單一組件(輸入框、按鈕)→ Listener 回調
事件粒度粗粒度細粒度
綁定方式ActionForm 對應整張表單組件直接綁定 Bean 屬性 #{bean.prop}
值變更監聽需 JS 繞道或全表單提交<f:valueChangeListener> 原生支援
動作監聽<html:submit> 提交<f:actionListener> 掛載按鈕
編程風格Web 化(HTML 表單思維)語言化(類 Swing 事件模型)

代碼對比:值變更即時響應

JSF:原生組件級事件

<h:inputText id="userId" value="#{login.userId}">
    <f:valueChangeListener type="logindemo.UserLoginChanged" />
</h:inputText>

用戶修改 userId 失焦/提交即觸發 UserLoginChanged.processValueChanged(),無需提交整張表單。

Struts:只能表單級

單純 Struts 無法直接實現字段級事件,需結合 JavaScript/AJAX 繞道實現。

配置結構高度相似:雙 Servlet 入口 + 導航配置

web.xml

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>

與 Struts ActionServlet 映射 *.do 一模一樣。

導航配置 faces-config.xml vs struts-config.xml

<faces-config>
    <navigation-rule>
        <from-view-id>/index.jsp</from-view-id>
        <navigation-case>
            <from-outcome>login</from-outcome>
            <to-view-id>/welcome.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
    <managed-bean>
        <managed-bean-name>user</managed-bean-name>
        <managed-bean-class>com.corejsf.UserBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
        <managed-property>
            <property-name>name</property-name>
            <value>me</value>  <!-- IoC Setter 注入 -->
        </managed-property>
    </managed-bean>
</faces-config>
  • navigation-rule 獨立定義頁面流轉,比 Struts 混雜在 ActionMapping 中更清晰;
  • managed-bean 內建 IoC/依賴注入(Setter 注入),Struts 需外掛 Spring。

Backing Bean:封裝頁面邏輯的門面模式

一個 Backing Bean 聚合多個 Managed Bean,統一 Scope 管理:

<managed-property>
    <property-name>visit</property-name>
    <value>#{sessionScope.visit}</value>  <!-- 引用 Session 級 Bean -->
</managed-property>

程式碼只操作 visit 對象,底層儲存位置(Session/Request/Application)完全由配置決定。

UI 標籤表達力:JSF 更聲明式、更乾淨

Struts:邏輯標籤巢狀地獄

<logic:present name="auth" property="inboxAuthorized">
    <html:link action="inbox">InBox</html:link>
</logic:present>

JSF:單標籤聲明式控制顯隱

<jia:navigatorItem name="inbox" label="InBox"
    icon="/images/inbox.gif" action="inbox"
    disabled="#{!authenticationBean.inboxAuthorized}"/>

disabled 屬性直接綁定 EL 表達式,條件為假自動隱藏/禁用,零邏輯標籤巢狀。

總結與建議

  • Struts:成熟、社區大、適合傳統表單密集型應用、團隊習慣 Web 思維;
  • JSF:組件化、事件驅動、內建 IoC/導航/狀態管理、適合富交互、組件復用率高的應用;
  • 若團隊有 Swing/SWT 桌面開發經驗,JSF 學習曲線更平;
  • JSF 2.x+ 結合 Facelets/AJAX (PrimeFaces/RichFaces) 已成主流選擇。

原文出處:博客園 - 詳細介紹JSF與Struts的異同

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved