You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jakarta Servlet Web应用(非Jakarta Faces应用)中配置Facelets模板

在Jakarta Servlet MVC应用中配置Facelets作为模板引擎

Facelets虽脱胎于Jakarta Faces,但确实可以脱离完整Faces环境,在纯Servlet动作型MVC应用中作为模板引擎使用,以下是具体实现步骤:

1. 添加依赖

通过Maven引入Facelets核心库及必要API(若容器已提供Servlet/JSP API可省略对应依赖):

<dependencies>
    <!-- Facelets核心依赖 -->
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>jakarta.faces</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- 容器未提供时添加Servlet API -->
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Gradle项目可对应调整依赖声明格式。

2. 配置Facelets请求处理器

在web.xml中注册Facelets Servlet并映射.xhtml后缀请求:

<servlet>
    <servlet-name>FaceletsServlet</servlet-name>
    <servlet-class>com.sun.faces.facelets.FaceletViewHandler</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>FaceletsServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

Jakarta EE版本不同时,Servlet类路径可能略有差异,以对应版本官方文档为准。

3. 在Servlet控制器中集成Facelets

手动初始化Facelets上下文、传入模型数据并渲染视图:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 准备业务模型数据
    request.setAttribute("greeting", "Hello from Facelets in Servlet MVC!");
    
    // 初始化Facelets上下文(核心步骤)
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (facesContext == null) {
        facesContext = FacesContextFactory.getCurrentInstance().getFacesContext(
            getServletContext(), request, response, null
        );
        FacesContext.setCurrentInstance(facesContext);
    }
    
    // 加载并渲染指定视图
    String viewPath = "/WEB-INF/templates/home.xhtml";
    Facelet facelet = FaceletFactory.getInstance().getFacelet(viewPath);
    UIViewRoot viewRoot = facesContext.getApplication().getViewHandler().createView(facesContext, viewPath);
    
    facesContext.setViewRoot(viewRoot);
    facelet.apply(facesContext, viewRoot);
    
    // 清理上下文
    facesContext.getResponseComplete();
    FacesContext.setCurrentInstance(null);
}

4. 编写Facelets模板

在WEB-INF/templates/home.xhtml中编写视图,支持EL表达式和基础Facelets标签:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
<head>
    <title>Servlet + Facelets Demo</title>
</head>
<body>
    <h2>#{greeting}</h2>
    <p>当前时间:#{java.util.Date}</p>
</body>
</html>

关键注意事项

  • 无需配置faces-config.xml,不启用完整Jakarta Faces生命周期
  • 依赖Faces生命周期的标签(如h:form、h:commandButton)无法正常工作,仅建议使用模板渲染、EL表达式等基础功能
  • 确保容器支持Jakarta EE 8及以上版本,避免API版本冲突

内容的提问来源于stack exchange,提问作者LHA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:53:16