我想有条件地输出一些Facelets代码.
为此,JSTL标签似乎工作正常:
<c:if test="${lpc.verbose}">
...
</c:if>
Run Code Online (Sandbox Code Playgroud)
但是,我不确定这是否是最佳做法?还有另一种方法来实现我的目标吗?
作为这个问题的扩展,我试图将Javascript插入到已经呈现ajax表<h:commandButton />
的onclick
属性action
中.
我想做什么:在列表框中获取所选项目并将其转换为要在JSF中使用的参数FileServlet
.即para2=value1¶m=value2¶m=value3
这就是我所拥有的:
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId('myForm:box');
var length = box.options.length;
var paramstring = "";
for (var i = 0; i < length; i++) {
if (i != (length - 1) {
if (box.options[i].selected) {
paramstring = paramstring + "param=" + box.options[i].value + "&";
}
} else {
paramstring = paramstring + "param=" + box.options[i].value;
}
}
if (document.getElementById('myForm:checkbox').checked) {
window.location='fileServlet? + …
Run Code Online (Sandbox Code Playgroud) 以下JSF代码包含两个单独的<c:if></c:if>
.我们来看看吧.
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title>JSF EL</title>
</h:head>
<h:body>
<h:form>
<c:set scope="request" var="row" property="x" value="10"/>
<c:if test="#{row==10}">
<h:outputLabel value="value = 10"/>
</c:if>
<c:if test="#{row==15}">
<h:outputLabel value="value = 15"/>
</c:if>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
它只是在运行时在JSF页面上显示value = 10.我需要<c:if></c:if>
使用以下if-elseif-else(Java上下文)来表示上述内容.
if(row.equals(10))
{
//Do something...(JSF stuff)
}
else if(row.equals(15))
{
//Do something...(JSF stuff)
}
else
{
//Do something...(JSF stuff)
}
Run Code Online (Sandbox Code Playgroud)
如何使用JSF用表达式语言(EL)表示?
所以我找到了一些接近这个的答案,我发现足以解决我遇到的问题.但即使这样,我也很好奇了解这方面的运作方式.让我用一个例子来说明:
我有一个.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)
现在,这种变化可以让一切正常.我对此感到满意......但我想我也在寻求一些理解.有关为什么我必须嵌套这些组件的任何见解?我肯定错过了一些东西!
这似乎不对.我正在清理我的代码,我只是注意到了这一点.每个ajax请求都会触发构造函数和@PostConstruct
我的@ViewScoped
bean.即使是简单的数据库分页也会触发它.
我知道这@ViewScoped
比@RequestScoped
任何请求都要重建并且不应该重建.只有在通过GET重新加载完整页面之后.
我试图在状态结束时<c:if>
有条件地放入一个<h:outputLink>
内部<h:dataTable>
.
<h:dataTable value="#{bean.items}" var="item" width="80%">
<h:column>
<f:facet name="header">
<h:outputText value="State" />
</f:facet>
<c:if test="#{item.state != 'Finish'}">
<h:outputText value="Missing value" />
</c:if>
<c:if test="#{item.state == 'Finish'}">
<h:outputLink value="myLink">
<h:outputText value="Value = #{item.state}" />
</h:outputLink>
</c:if>
</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
但这不起作用,为什么会这样,我该如何解决?
如何根据登录用户的角色呈现JSF组件?我知道外部上下文暴露了主体,但是我应该如何在JSF中正确地进行呈现?在JSP中它会是这样的
<% isUserInRole(Roles.ADMIN) { %>
<button>Edit!</button>
<% } %>
Run Code Online (Sandbox Code Playgroud)
我如何以最好的方式在JSF中编写这个?我最好的猜测是渲染属性绑定到一个返回布尔值的支持bean的方法,但如果我必须只为管理员渲染一些导航项,那将引入一个无关的支持bean ...
Glassfish V3.1,JSF 2.x
如果列表不是null
,它如何显示JSF组件size() > 0
?
我试图有条件地渲染一个<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中渲染整个块?
是否可以div
根据条件隐藏等等(就像你在EL中使用渲染属性一样),而不必将其包装在<h:panelGrid ...>
具有渲染属性的etc中?它破坏了我的布局.我只需要逻辑,而不是布局.
jsf ×10
jsf-2 ×5
facelets ×3
el ×2
jstl ×2
ajax-update ×1
constructor ×1
datatable ×1
html ×1
if-statement ×1
javascript ×1
view-scope ×1
xhtml ×1