14.2 Struts 2整合MyFaces
要在Struts框架中整合MyFaces实现,只需要将相关的pluglin插件和相关类库复制到Web应用的lib目录下,增加一些配置内容就可以完整支持MyFaces。
14.2.1 整合步骤
下面介绍Struts 2框架整合MyFaces的详细步骤。
(1)复制MyFaces类库。将下载后的MyFaces压缩包解压,复制lib目录下的所有jar文件到Web应用的WEB-INF/lib目录下。
(2)复制MyFaces插件。Struts 2框架下载包的lib目录下已经包含了JSF的插件,文件名称为struts2-jsf-plugin-x.x.x.jar,x为相应的版本号。需要将该文件复制到Web应用的WEB-INF/lib目录下。
(3)增加web.xml内容。为了整合Myfaces,需要在web.xml文件中增加如下内容:
<!--配置Myfaces-->
<listener>
<listener-class>
org.apache.myfaces.webapp.StartupServletContextListener
</listener-class>
</listener>
<!-- JavaServer Faces Servlet 配置-->
<servlet>
<servlet-name>faces</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- JavaServer Faces Servlet Mapping配置 -->
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
(4)导入MyFaces标签库。为了在JSP视图中使用MyFaces标签,需要在JSP文件中使用如下代码来导入MyFaces标签库:
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
(5)引用JSF拦截器。还需要在Struts 2框架的Action配置文件中引用JSF拦截器,该拦截器默认名称为jsfStack,一个典型的引用拦截器的包配置如下:
<!--定义一个jsf包,该包继承jsf-default,jsf-default在struts-plugin.xml中定义-->
<package name="jsf" extends="jsf-default">
<interceptors>
<!--自定义拦截器栈-->
<interceptor-stack name="jsfFullStack">
<interceptor-ref name="params" />
<interceptor-ref name="basicStack" />
<!--jsf拦截器引用,见struts-plugin.xml中定义-->
<interceptor-ref name="jsfStack" />
</interceptor-stack>
</interceptors>
<!--设置为默认拦截器栈-->
<default-interceptor-ref name="jsfFullStack" />
</package>
<!--继承jsf包,同时继承其默认拦截器,不需要再引用该拦截器-->
<package name="ch14" extends="jsf" namespace="/ch14">
<action name="list" class="ch14.UserAction">
… …
</action>
… …
</package>
14.2.2 整合原理
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的标签库,可以参考相关文档。