<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>
<!-- 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>
<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,否則線程安全與狀態隔離會出問題。
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";
}
}
faces-config.xml 必須配置 DelegatingVariableResolver,打通 JSF 與 Spring 變數解析web.xml 採用 Sun RI ConfigureListener(MyFaces 監聽器可選)prototype,匹配 JSF Request 域 Bean 生命週期h:commandButton action="#{userBean.execute}" 觸發導航