我最近开始使用带有Facelets的JSF 2.0,并且对于了解<ui:include>Facelets 1.x提供的现有和其他模板技术的新复合组件感到困惑.
这些方法有什么区别?从功能上看,它们似乎提供了相同的:<ui:param>vs <cc:attribute>,<ui:insert>+ <ui:define>vs标记文件,重用现有模板.除了复合组件的语法和清晰的接口规范之外还有什么吗?性能会有所不同?
我正在尝试ajax更新有条件渲染的组件.
<h:form>
...
<h:commandButton value="Login" action="#{login.submit}">
<f:ajax execute="@form" render=":text" />
</h:commandButton>
</h:form>
<h:outputText id="text" value="You're logged in!" rendered="#{not empty user}" />
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.我可以保证这#{user}实际上是可用的.这是怎么造成的,我该如何解决?
jsf rendered-attribute jsf-2 conditional-rendering ajax-update
所以我找到了一些接近这个的答案,我发现足以解决我遇到的问题.但即使这样,我也很好奇了解这方面的运作方式.让我用一个例子来说明:
我有一个.xhtml看起来像这样(缩短)的facelet 页面.
<h:form id="resultForm">
<h:panelGroup class="search_form" layout="block">
<h:inputText id="lastname" value="#{search.lastname}"/>
<h:commandButton action="#{search.find}" value="Find">
<f:ajax execute="lastname" render="resultDisplay"/>
</h:commandButton>
</h:panelGroup>
<h:dataTable value="#{search.searchResults}" var="results" id="resultDisplay"
rendered="#{!empty search.searchResults}">
<h:column>
#{results.field}
</h:column>
</h:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)
现在,为了突破性,我不会发布所有的支持bean代码,但我有这样的东西:
public void find() {
searchResults = setResults(true);
}
Run Code Online (Sandbox Code Playgroud)
哪里searchResults是ArrayList<Objects>.在搜索之后,它不是null - 在多个测试中检查(可以为null,但不在我正在进行的测试中).
现在.这不起作用.
但是,如果我将dataTable内部嵌套在另一个内部panelGroup,那么它会起作用.
<h:panelGroup id="resultDisplay">
<h:dataTable value="#{search.searchResults}" var="results"
rendered="#{!empty search.searchResults}">
<h:column>
#{results.field}
</h:column>
</h:dataTable>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
现在,这种变化可以让一切正常.我对此感到满意......但我想我也在寻求一些理解.有关为什么我必须嵌套这些组件的任何见解?我肯定错过了一些东西!
我正在搜索一种支持的方式来渲染JSF中的一段代码,我通常使用这种方法:
<ui:fragment rendered="#{condition}">
<h:outputText value="text 1"/>
<h:outputText value="text 2"/>
<h:outputText value="text 3"/>
</ui:fragment>
Run Code Online (Sandbox Code Playgroud)
由于ui:fragment不支持渲染大部分IDE(如netbeans将其标记为错误但是它可以工作,因为在JSF参数中是继承的.
解决此问题的一种方法是使用另一种结构(例如,如果您使用SEAM)
<s:div rendered="#{condition}">
....
</s:div>
Run Code Online (Sandbox Code Playgroud)
另一种方法是在所有内部内容中设置渲染,如下所示:
<h:outputText value="text 1" rendered="#{condition}"/>
<h:outputText value="text 2" rendered="#{condition}"/>
<h:outputText value="text 3" rendered="#{condition}"/>
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种方式,因为你必须将渲染添加到每个元素.
另一种方法是使用<c:if test="#{condtion}">BUT c:如果从JSF树中删除元素,而不是你总是想要做的,特别是如果你使用AJAX.
所以你们有另一种解决方案吗?
是否可以更新我的页面中不是JSF组件的部分?
例如,我可以更新纯HTML,<div>还是需要将其包装在JSF组件中?
我试图有条件地渲染一个<tr>因此我不能使用<h:panelGroup>,因为它将渲染<span> or <div>
我目前的(工作)方法如下:
<h:outputFormat rendered="#{negotiator.maySend}">
<tr> my tr stuff </tr>
</h:outputFormat>
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我不确定这是否是滥用的方式<h:outputFormat>- 在我使用之前,<h:outputLabel>但这是<label>在IE 中呈现的.
我也已经阅读了这个问题的答案,但如上所述,它们不会对我有用,因为<tr>:如何不在JSF中渲染整个块?
我想从JSF页面中的链接重定向,我该怎么办?
在HTML中我可以使用<a>标签.但是在JSF中我使用<h:outputLink>或者<h:commandLink>可以有条件地渲染它们.我希望将链接重定向到同一应用程序中的其他页面或外部URL.我怎么能用JSF做到这一点?如何使用action在<h:commandLink>此?
我不明白为什么这段代码工作正常:
<h:link value="Login" rendered="#{sessionBean.userInSessionBean == null}" />
Run Code Online (Sandbox Code Playgroud)
而这段代码不起作用:
<a jsf:rendered="#{sessionBean.userInSessionBean == null}">Login</a>
Run Code Online (Sandbox Code Playgroud) 我正在将旧项目从 JSF 1.1 升级到 JSF 2.2。具体来说,我将 JSF 实现从 MyFaces 1.1 升级到 MyFaces 2.2.12,用 Facelets 替换 JSP 并升级/替换过时的标签库。我主要使用从 JSF 1.2 迁移到 JSF 2.0作为指南。
该项目使用了一些在其 JSP 页面中htmLib使用命名空间调用的标记库http://jsftutorials.net/htmLib。我再也找不到关于这个标签库的任何文档,无论是在 jsftutorials 网页还是其他地方,但显然它被用来包含像JSP 页面<div>或<table>在 JSP 页面中的纯 HTML 标签。
由于现在可以在带有 JSF2 的 XML Facelets 中使用纯 HTML 标记,因此我现在正在从htmLibtaglib 中删除所有出现的标记,<htm:div>...</htm:div>例如<div>...</div>.
但是,从使用的一些标签htmLib包含render用于条件渲染的属性,如下所示:
<htmLib:h4 render="someCondition">
...
</htmLib:h4>
Run Code Online (Sandbox Code Playgroud)
因为纯 HTML 标签没有render用于此目的的属性,所以我正在寻找一种有条件地呈现纯 HTML 标签的替代方法,并在 SO 上偶然发现了这个答案:如何有条件地呈现像 <div> 这样的纯 HTML 元素? …
我想知道如何在EL中组合多个布尔条件.我有以下示例,它不起作用.
<x:someComponent rendered="#{bean.condition1} or #{bean.condition2}">
Run Code Online (Sandbox Code Playgroud)
如何在EL中使用"OR"和"AND"逻辑运算符?
jsf ×9
jsf-2 ×4
facelets ×3
ajax-update ×2
html ×2
jsf-2.2 ×2
ajax ×1
and-operator ×1
commandlink ×1
el ×1
java ×1
or-operator ×1
redirect ×1
tagfile ×1
taglib ×1