Facelets是JavaServer Faces框架的基于XML的视图技术。您不需要在Facelets被“巧合地”用作视图技术的每个JSF问题上使用此标记。仅在您对Facelets自己的<ui:xxx>标记有特定问题时才使用此标记。
javax.faces.view.facelets.TagAttributeException:带有 ui 的无效路径:include
我正在使用 JSF 2.1.4 和 Facelets 一切都工作正常,但突然在我的模板中没有任何更改,我不断收到错误: javax.faces.view.facelets.TagAttributeException:/pages/
我想知道是否可以知道 ui:insert 是否在 ui:composition 中定义。 我知道我可以使用单独的 ui:param 来做到这一点,但只是想不这样做以保持简单......
很多次我都遇到这样的错误: -标签未关闭(xml错误) -xhtml 有重复的 id 我想编写验证器来检查文件中是否存在这些错误。我打赌有一些 Facelets 编译器可以实现
有时我看到 JSF URL 是 *.jsf,有时是 *.xhtml,有时是 /faces/*。为什么?
一直在尝试学习JSF,有时我看到URL是*.jsf,有时是*.xhtml或/faces/*。有人可以补充我的知识吗?当我使用 Facelet 创建 JSF 时,文件扩展名是 .xh...
我的 Facelet 中有以下代码片段: 我的 Facelet 中有以下代码片段: <h:commandLink id="cmdbtn"> <f:ajax event="click" execute="@form" listener="#{screenShotBean.takeScreenshot}" /> </h:commandLink> 它工作得很好,但是当我像这样评论它时, <!-- <h:commandLink id="cmdbtn"> --> <!-- <f:ajax event="click" execute="@form" --> <!-- listener="#{screenShotBean.takeScreenshot}" /> --> <!-- </h:commandLink> --> 然后抛出以下异常: javax.el.PropertyNotFoundException: Property 'takeScreenshot' not found on type monstage.test.com.ScreenShotBean at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237) at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214) at javax.el.BeanELResolver.property(BeanELResolver.java:325) at javax.el.BeanELResolver.getValue(BeanELResolver.java:85) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) at org.apache.el.parser.AstValue.getValue(AstValue.java:169) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) at com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:217) at com.sun.faces.facelets.el.ELText$ELTextComposite.toString(ELText.java:157) at com.sun.faces.facelets.compiler.CommentInstruction.write(CommentInstruction.java:77) at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82) at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183) at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:424) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 当我如下更改带括号的方法表达式时, <!-- <h:commandLink id="cmdbtn"> --> <!-- <f:ajax event="click" execute="@form" --> <!-- listener="#{screenShotBean.takeScreenshot()}" /> --> <!-- </h:commandLink> --> Then 不会抛出异常,但仍然被调用。 这是怎么造成的,如何解决? 仔细查看堆栈跟踪。这是相关部分: ... org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189) com.sun.faces.facelets.el.ELText$ELTextVariable.toString(ELText.java:217) com.sun.faces.facelets.el.ELText$ELTextComposite.toString(ELText.java:157) com.sun.faces.facelets.compiler.CommentInstruction.write(CommentInstruction.java:77) ... 因此它在注释块中评估 EL(可通过 CommentInstruction 识别)。注释块被视为模板文本。默认情况下,Facelets 也会评估模板文本中的 EL #{}。就像您在编写 <p>#{screenShotBean.takeScreenshot}</p> 时没有任何 JSF 标签一样。 您有多种选择: 完全删除评论块。 通过在注释中添加 \ 前缀来转义 EL 表达式,如 所示 \#{screenShotBean.takeScreenshot} 这样他们就不会被评价。 将整个注释块包裹在 <ui:remove> 中,这样它就不会出现在组件树中(也不会出现在生成的 HTML 输出中)。 通过将以下上下文参数添加到 web.xml 来禁用 Facelets 对 all 注释的解析: <context-param> <param-name>jakarta.faces.FACELETS_SKIP_COMMENTS</param-name> <param-value>true</param-value> </context-param> 请注意,通过这种方式生成的 HTML 输出中不会出现任何评论。 除了 BalusC 已经提供的 选项,您还可以将属性 rendered="false" 添加到您的 commandLink。 如果您希望能够快速切换多个组件,您可能需要考虑在 bean 中创建调试属性或使用项目阶段: rendered="#{facesContext.application.projectStage == 'Development'}" 您还可以使用上下文参数来跳过 web.xml 中的注释。 这是参数: javax.faces.FACELETS_SKIP_COMMENTS
如何在 JavaScript 中触发隐藏的 JSF commandLink?
我在此线程上有一个类似的问题,其中我有一个 JavaScript 函数,它将触发隐藏的 commandLink 的单击事件。隐藏命令将触发 Java Bean 中的操作。这...
所以我有一个 JSF 应用程序。如果我提交表单,当我刷新页面时它会重新提交。我当然不希望这样。 索引.xhtml: [...] 所以我有一个 JSF 应用程序。如果我提交表单,当我刷新页面时它会重新提交。当然我不想要这样。 索引.xhtml: [...] <h:form > <h:outputText value="Form"/><br/> <h:inputText label="first" value="#{example.newExample.firstWord}" autocomplete="off"></h:inputText> <h:commandButton value="click" actionListener="#{example.NewExample()}"> </h:commandButton> </h:form> [...] 运行的方法: public void NewExample(){ pfDB.InsertNewExample(NewExample); NewExample.setFirstWord(null); NewExample.setSecondWord(null); } 所以每次我提交表单后刷新index.xhtml,NewExample()就会运行。 问题确实出在重新提交表格上。但浏览器(opera)没有显示警报。 我通过添加修复了它 FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml"); 在我的职能中 尝试通过ajax提交: <h:commandButton value="click" actionListener="#{example.NewExample()}"> <f:ajax /> </h:commandButton> 您可能需要渲染一些组件。
Web 应用程序中有两个页面 page1 和 page2。 页面 page1 是基于 .xhtml 文件的 Facelet,而 page2 由 servlet 生成。 我们假设 page1.xhtml 如下所示: Web 应用程序中有两个页面 page1 和 page2。 页面 page1 是基于 .xhtml 文件的 Facelet,page2 由 servlet 生成。 我们假设 page1.xhtml 看起来像这样: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="jakarta.faces.html" xmlns:f="jakarta.faces.core" > <h:head> <title>TODO supply a title</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> </h:head> <h:body> <h:button outcome="yolo" value="move on"/> </h:body> </html> 为了简单起见,让 page2 从以下 servlet 生成: package tests; import jakarta.inject.Inject; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = "/abc") public class StorageSrv extends HttpServlet { @Inject private Storage storage; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("abc"); } } 我还在faces-config.xml中添加了导航规则,如下: <navigation-rule> <from-view-id> /flexible.xhtml </from-view-id> <navigation-case> <from-outcome> yolo </from-outcome> <to-view-id> /abc </to-view-id> </navigation-case> </navigation-rule> 如何从 page1 重定向到 page2 ? 目前,导航规则添加了 .xhtml 扩展名,因此通过单击 page1 上的“继续”按钮,我得到 404。 显然,只需将 servlet 映射到带有 .xhtml 扩展名的路径即可完成这项工作。 例如: @WebServlet(urlPatterns = "/abc.xhtml")
错误解析/page.xhtml:错误跟踪[行:42]实体“nbsp”被引用,但未声明
我想在 JSF 页面中使用不间断空格。我知道,在纯 HTML 中,我可以使用 来实现此目的,并且效果很好。但是,当我将这些放入 Facelets 页面时,就会出错...
我有一个 MyFaces Facelets 应用程序,其中页面编码有点粗糙。不管怎样,它是用 Eclipse 开发的,用 Ant 构建的,在 Tomcat 2.0.26 中运行得很好。到目前为止,一切都很好。 现在,我会...
我已经在 IntelliJ Idea Ultimate (Maven) 中为 Java Enterprises 的大学项目设置了 Jakarta EE 项目,并且还可以在浏览器中输出 index.xhtml(通过 Tomcat 8.5.87)。我是另一个...
我有一个 id 为 X 的 ,我想从其内容 X_content 中删除填充,为面板内容生成的 HTML 是: 我有一个 <p:panel>,id 为 X,我想从其内容中删除填充 X_content 为面板内容生成的 HTML 是: <div id="X_content" class="ui-panel-content ui-widget-content"> 并且该元素出现在 chrome 开发者工具中以具有填充: padding:0.5em 1em; 我制作了一个嵌入式样式表来覆盖 primefaces 中的样式表,如下所示: <h:head> <style> .ui-panel-content, .ui-widget-content{ padding:0px; } </style> </h:head> 但是我没有工作,填充仍然存在,有人可以帮助我吗? 您的 CSS 选择器 .ui-panel-content, .ui-widget-content { ... } 基本上意味着:“选择具有 ui-panel-content 或 ui-widget-content 类的所有元素”。 但是,填充是通过此 CSS 选择器在 PrimeFaces 默认 CSS 中定义的 .ui-panel .ui-panel-content { ... } 基本上意味着 “选择具有 ui-panel-content 类的所有元素,该类是具有 ui-panel 类的元素的子元素”,这是根据 CSS 级联规则 更强的选择器。因此,它的优先级高于 CSS 选择器。这与样式类的声明顺序无关(仅当选择器具有相同强度时声明顺序才重要)。 当覆盖 PrimeFaces 默认 CSS 时,您应该提供一个“至少”相同强度或更强的选择器。在您的特定情况下,如果您打算全局应用样式,只需使用相同的选择器: .ui-panel .ui-panel-content { padding: 0; } 请注意,当在 <style> 中使用 <h:head> 时,它仍然会被 PrimeFaces 默认 CSS 覆盖,因为它会自动包含在头部末尾。而是将 <style> 移至 <h:body>,或者更好的是,将其放入自己的 CSS 文件中,通过 <h:houtputStylesheet> 将其包含在 <h:body> 内。 另请参阅: 如何使用自定义样式覆盖默认的 PrimeFaces CSS? CSS 选择器语法 我无法真正理解这里的答案,它对我不起作用。 但这有效。 :host { &::ng-deep { .p-panel-content { padding: 0; } } }
我想在交付给最终用户之前从我的 Facelet 中删除所有 HTML 注释。是否存在任何标准方法?
我在使用 JRebel、Spring、JSF Mojarra 2.0.3 和 WebLogic 10.3 热重载 Facelets 文件时遇到了一些问题。 JRebel 成功重新加载 /WebContent 下的常规 Java 类和 js/css 文件,...
我正在开发一个应用程序,我想在其中包含来自流的动态 XHTML 内容。为了处理这个问题,我编写了一个标记处理程序扩展,它将动态 XHTML 内容转储到输出组合...
为什么 <ui:fragment rendered> 没有对 <h:outputStylesheet> 和 <h:outputScript>
我有一个 JSF 2 主模板,如下所示: 我有一个 JSF 2 主模板,如下: <!DOCTYPE html> <html lang="#{localeManager.language}" xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <f:view locale="#{localeManager.locale}"> <h:head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title><ui:insert name="title">Default Title.</ui:insert></title> <!-- Development Stylesheets --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Development'}"> <h:outputStylesheet name="css/bootstrap.css" library="bootstrap" /> <h:outputStylesheet name="css/font-awesome.css" library="fontawesome" /> </ui:fragment> <h:outputStylesheet name="css/main.css" library="core" /> <ui:insert name="header-stylesheet" /> <!-- Production Stylesheets --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Production'}"> <h:outputStylesheet name="css/bootstrap.min.css" library="bootstrap" /> <h:outputStylesheet name="css/font-awesome.min.css" library="fontawesome" /> </ui:fragment> <ui:insert name="header-script" /> </h:head> <h:body> <div id="wrapper"> <div id="header"> <ui:insert name="header">Default content</ui:insert> </div> <div id="body"> <ui:insert name="body">Default body</ui:insert> </div> <div id="footer"> <ui:insert name="footer">Default footer</ui:insert> </div> </div> <!-- Development Scripts --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Development'}"> <h:outputScript name="jquery-2.1.4.js" library="jquery" /> <h:outputScript name="js/bootstrap.js" library="bootstrap" /> </ui:fragment> <!-- Production Scripts --> <ui:fragment rendered="#{facesContext.application.projectStage eq 'Production'}"> <h:outputScript name="jquery-2.1.4.min.js" library="jquery" /> <h:outputScript name="js/bootstrap.min.js" library="bootstrap" /> </ui:fragment> <ui:insert name="body-script" /> </h:body> </f:view> </html> 在 Wildfly 9.0.1 Final 中部署它时,我看到我的所有 <ui:fragment> 属性都被渲染了。这是为什么?我正在使用 JSF 2.2 框架进行开发。 My Faces 项目阶段是 Development。 注意: 在SO中关于这个问题的所有答案中,没有一个是这个问题的解决方案(所以我做了我的作业)。 <h:outputStylesheet>和<h:outputScript>是特殊组件。他们将在视图构建期间通过 UIViewRoot#addComponentResource() 将声明的样式表或脚本资源添加到视图中(请参阅此处的 Mojarra 源代码)。 这与组件或其父组件的 rendered 条件无关。实际上,它们基本上被重新定位到 <h:head> 或 <h:body> 的最末端,具体取决于 target 属性的值,导致它们不再位于 <ui:fragment> 内部。 然后,在渲染过程中,仅考虑它们自己的 rendered 属性(实际上也考虑 <h:head> 的属性,但这毫无意义)。 您有 2 个选择: 使用视图构建时间标签有条件地将它们添加到视图中。项目阶段条件无论如何都是应用范围内的。 <!-- Development Stylesheets --> <c:if test="#{facesContext.application.projectStage eq 'Development'}"> <h:outputStylesheet ... /> <h:outputStylesheet ... /> </c:if> <!-- Production Stylesheets --> <c:if test="#{facesContext.application.projectStage eq 'Production'}"> <h:outputStylesheet ... /> <h:outputStylesheet ... /> </c:if> 检查组件资源自身的rendered属性中的条件。如有必要,请使用 <c:set> 创建一个短 EL 变量。 <c:set var="dev" value="#{facesContext.application.projectStage eq 'Development'}" scope="application" /> <!-- Development Stylesheets --> <h:outputStylesheet ... rendered="#{dev}" /> <h:outputStylesheet ... rendered="#{dev}" /> <!-- Production Stylesheets --> <h:outputStylesheet ... rendered="#{not dev}" /> <h:outputStylesheet ... rendered="#{not dev}" /> 另请参阅: JSF2 Facelets 中的 JSTL...有意义吗?
通过 ui:param 将数组列表发送到 JSF ui:composition 模板
我知道我可以使用 ui:param 从基于模板构建的组合中传递字符串 像这样:http://www.mkyong.com/jsf2/how-to-pass-parameters-to-jsf-2-0-template-file/ 然后我就可以使用参数了...
加载页面时如何获取硬编码值? actionCode f:param 总是返回空值。 如何在页面加载时获取硬编码值? actionCode f:param 总是返回空值。 <f:viewAction action="#{myFaces.onLoad}"> <f:param name="actionCode" value="123" /> </f:viewAction> public void onLoad() { // Unable to get actionCode, always return empty logger.debug("FacesRequestParameterMap: {}", FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()); }