如何在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
相关产品推荐
相关产品推荐

