Struts 2框架整合JSF的关键在于Struts 2的plugin插件struts2-jsf-plugin-2.0.11.jar,该插件压缩包的结构如图14.4所示。

图14.4 struts2-jsf-plugin-2.0.11.jar插件目录
该目录下的struts-plugin.xml文件就是插件的配置文件,该文件内容如代码14.1所示。
代码14.1 struts-plugin.xml配置文件
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 定义jsf-default 包 -->
<package name="jsf-default" extends="struts-default">
<!—定义结果类型-->
<result-types>
<result-type name="jsf" class="org.apache.struts2.jsf.FacesResult" />
</result-types>
<interceptors>
<interceptor class="org.apache.struts2.jsf.FacesSetupInterceptor"
name="jsfSetup" />
<interceptor class="org.apache.struts2.jsf.RestoreViewInterceptor"
name="jsfRestore" />
<interceptor class="org.apache.struts2.jsf.ApplyRequestValuesInterceptor"
name="jsfApply" />
<interceptor class="org.apache.struts2.jsf.ProcessValidationsInterceptor"
name="jsfValidate" />
<interceptor class="org.apache.struts2.jsf.UpdateModelValuesInterceptor"
name="jsfUpdate" />
<interceptor class="org.apache.struts2.jsf.InvokeApplicationInterceptor"
name="jsfInvoke" />
<interceptor-stack name="jsfStack">
<interceptor-ref name="jsfSetup">
<param name="variableResolver">
org.apache.struts2.jsf.StrutsVariableResolver</param>
<param name="navigationHandler">
org.apache.struts2.jsf.StrutsNavigationHandler</param>
</interceptor-ref>
<interceptor-ref name="jsfRestore" />
<interceptor-ref name="jsfApply" />
<interceptor-ref name="jsfValidate" />
<interceptor-ref name="jsfUpdate" />
<interceptor-ref name="jsfInvoke" />
</interceptor-stack>
</interceptors>
//定义默认拦截器栈
<default-interceptor-ref name="jsfStack"/>
</package>
</struts>
该配置文件定义定义了包jsf-default,该包中定义了一个名为jsf的结果类型,同时定义了一系列相关的拦截器,并将这些拦截器组成一个拦截器栈jsfStack,最后设置jsfStack作为包的默认拦截器。
★ 注意 ★
开发者在配置Struts 2框架的Action时,需要继承该jsf-default包,就可以同时继承jsf结果类型和默认的拦截器栈。
MyFaces的标签库文件在类库myfaces-impl-x.x.x.jar文件中,读者可以打开该压缩包,在META-INF目录下有两个标签库文件:myfaces_core.tld和myfaces_html.tld,开发者要在JSP页面中使用这两个标签库,则必须首先在页面中导入,导入代码如下所示:
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
代码中的uri为标签库中的指定值,例如在myfaces_core.tld文件中,有如下内容:
… …
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>f</short-name>
<uri>http://java.sun.com/jsf/core</uri>
<display-name>JSF core tag library.</display-name>
<description>
This tag library implements the standard JSF core tags.
</description>
… …
读者可以看到,该标签库文件中的uri定义同JSP导入相同。
★ 说明 ★
要熟练使用MyFaces的标签库,可以参考相关文档。