我有一个关于在JSF中输出对象列表作为逗号分隔列表的问题.
让我们说:
public class SomeObj {
private String name;
... constructors, getters and setters ...
}
Run Code Online (Sandbox Code Playgroud)
和列表<SomeObj>:
List<SomeObj> lst = new ArrayList<SomeObj>();
lst.add(new SomeObj("NameA"));
lst.add(new SomeObj("NameB"));
lst.add(new SomeObj("NameC"));
Run Code Online (Sandbox Code Playgroud)
将其作为列表框输出我可以使用此代码:
<h:selectManyListbox id="id1"
value="#{listHolder.selectedList}">
<s:selectItems value="#{listHolder.lst}"
var="someObj"
label="#{someObj.name}"/>
<s:convertEntity />
</h:selectManyListbox>
Run Code Online (Sandbox Code Playgroud)
但输出列表的最简单方法是什么,逗号分隔?像这样:
NameA, NameB, NameC
Run Code Online (Sandbox Code Playgroud)
我应该使用JSTL <c:forEach />还是可以使用<s:selectItems />标签?
我有一个数据表,我想在构建表的数组中将每行的id设置为当前项(具有id字段的对象)的id.
例:
<h:dataTable
value="#{bean.list}"
var="item">
<h:column>
<h:outputText id="#{item.id}" .... />
</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我得到:javax.servlet.ServletException: Empty id attribute is not allowed.
由于JSF如何构建其id,或者我做错了什么,是不可能以这种方式设置id?
我可以从我的JSF2页面访问存储在支持bean中的变量,所以类似于
<h:outputText value="#{myBean.myValue}"/>
Run Code Online (Sandbox Code Playgroud)
工作,价值(这是一个int btw.)打印好.但是,当尝试在c:if和/或c:中的条件表达式中使用此值时,标记它永远不会等于任何东西......所以:
<c:if test="#{myBean.myValue == 1}">
<c:set var="myVar" value="true"/>
</c:if>
<c:choose>
<c:when test="#{myBean.myValue > 1}">
<c:set var="myVar" value="true"/>
</c:when>
</c:choose>
Run Code Online (Sandbox Code Playgroud)
甚至
#{myBean.myValue eq '1'}
Run Code Online (Sandbox Code Playgroud)
要么
#{myBean.myValue == '1'}
Run Code Online (Sandbox Code Playgroud)
永远不会评估为真,即使该值确实为1或> 1.
令人讨厌的是,比较在标签的渲染属性中起作用!所以这:
<h:outputText value="whatever" rendered="#{myBean.myValue == 1}"/>
Run Code Online (Sandbox Code Playgroud)
很好!
到底是怎么回事?
更新:
这有效:
public int getMyValue() {
return 1;
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
@Column(name = "orderstatus")
public int getOrderStatus() {
return orderStatus;
}
Run Code Online (Sandbox Code Playgroud)
int的值打印正确,但1 == 1为false.
实体bean是以特殊方式处理的吗?我可以使用它们在UI上显示它们的价值吗?
UPDATE2:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>
Run Code Online (Sandbox Code Playgroud)
打印java.lang.Integer.
UPDATE3:
这是完整的代码:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html …Run Code Online (Sandbox Code Playgroud) 使用类似的东西时
<h:panelGrid columns="1">
<ui:repeat var="o" value="#{mybean.list}">
<h:outputText value="#{o.text}"/>
</ui:repeat>
</h:panelGrid>
Run Code Online (Sandbox Code Playgroud)
让我们说10个列表条目我只得到1行例如:一个tr与1 td而当我使用c:forEach我得到10(但是c:forEach实际上是邪恶的,它用ajax弄乱了一切)
我使用mojarra 1.2 - 这是一个典型的Mojarra bug,它在MyFaces实现中不存在吗?它会在Mojarra版本的2.x中消失吗?
我试图将JSF ViewScoped bean作为ManagedProperty注入到RequestScoped bean中,该bean实现了javax.faces.validator.Validator.但是总是会注入ViewScoped bean的新副本.
ViewScoped Bean
@ViewScoped
@ManagedBean
public class Bean {
private Integer count = 1;
private String field2;
public String action(){
++count;
return null;
}
public String anotherAction(){
return null;
}
//getter and setter
}
Run Code Online (Sandbox Code Playgroud)
验证器
@RequestScoped
@ManagedBean
public class SomeValidator implements Validator {
public void validate(FacesContext context, UIComponent comp, Object value)
throws ValidatorException {
//logging bean.getCount() is always one here. Even after calling ajax action a few times
}
@ManagedProperty(value = "#{bean}")
private Bean bean;
} …Run Code Online (Sandbox Code Playgroud) 我如何有条件地渲染<ui:define>?
模板中的数据取决于所需的数据<f:viewParam>.
但是如果提供了无效的视图参数,那么<ui:define>不应该渲染,因为应该使用模板的默认内容.
我尝试过使用<c:if>但不起作用.
我在Facelets上使用JSF2.
我<ui:param>在页面中定义了一个:
<ui:composition template="/WEB-INF/templates/ui.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<ui:param name="title" value="OnAir WebDemo" />
...
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
在ui.xhtml模板中我有:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
>
<c:if test="#{not empty title}">
<h1>#{title}</h1>
</c:if>
</html>
Run Code Online (Sandbox Code Playgroud)
但是,<c:if test>似乎总是评估true,如果<ui:param>没有指定.如何更改代码,以便在未指定时<c:if test>实际评估?false<ui:param>
我正在研究JSF应用程序的性能.我注意到即使渲染设置为false,代码仍在执行.例如,拿这段代码:
<h:panelGroup rendered="#{bean.render}">
<my composite component here/>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
即使#{bean.render}返回false,我可以从调试日志中清楚地看到,我的复合组件的代码正在渲染阶段执行.在#{bean.render}被调用之前,它看起来似乎正在执行代码.它不会在返回给客户端的HTML中呈现,但仍然显示服务器正在执行代码.
有谁能解释一下?
谢谢.
我在JSF中完成一项非常简单的任务时遇到了很大的问题.问题:我有一些对象,这些对象具有聚合属性,这些属性的类型可以在不同对象之间变化.根据属性的类型,我想使用一组不同的输入字段.
子类型组件驻留在框架中并按需加载.为此,我使用以下代码:
<h:panelGroup id="zusatzdaten">
<fieldset class="clear">
<legend>#{tickerUI.ticker.tickerDescription.label}
(#{tickerUI.ticker.tickerDescId})
</legend>
<h:panelGroup rendered="#{tickerUI.editComponentName != null}">
<ui:include src="#{tickerUI.editComponentName}"/>
</h:panelGroup>
</fieldset>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
该组件的名称来自TickerUI,它是@SessionScope.现在令人眼花缭乱的一点:首次加载时,会显示正确的子组件.但是,当在导航中使用链接时,应该导致包含不同的组件,内容不会更新!这会导致错误,因为数据现在是不同的子类型,但表单组件仍然来自前一个.
从错误返回并再次单击链接时,将显示正确的组件.我记录了editComponentName的值,并返回了正确的值.这非常令人困惑.当getter将正确的组件名称返回到src属性时,为什么包含错误的内容?
非常感谢.
当我尝试在自身中嵌套复合组件时,使用一些逻辑来结束无限递归,我收到堆栈溢出异常.我的理解是<c:xxx>标签在视图构建时运行,所以我不希望有无限的视图构建,因为我认为是这样的.
这是复合组件 simpleNestable.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:em="http://xmlns.jcp.org/jsf/composite/emcomp"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<h:head>
<title>This content will not be displayed</title>
</h:head>
<h:body>
<composite:interface>
<composite:attribute name="depth" required="true" type="java.lang.Integer"/>
</composite:interface>
<composite:implementation>
<c:if test="#{cc.attrs.depth lt 3}">
#{cc.attrs.depth}
#{cc.attrs.depth+1}
<em:simpleNestable depth="#{cc.attrs.depth+1}" />
</c:if>
</composite:implementation>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
这就是它的用法
<h:head>
<title>Facelet Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<h:outputStylesheet name="./css/default.css"/>
<h:outputStylesheet name="./css/cssLayout.css"/>
</h:head>
<h:body>
<emcomp:simpleNestable depth="1"/>
</h:body>
Run Code Online (Sandbox Code Playgroud)
堆栈溢出异常
java.lang.StackOverflowError
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.UIComponentBase$AttributesMap.get(UIComponentBase.java:2407)
at com.sun.faces.el.CompositeComponentAttributesELResolver$ExpressionEvalMap.get(CompositeComponentAttributesELResolver.java:393)
at javax.el.MapELResolver.getValue(MapELResolver.java:199)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) …Run Code Online (Sandbox Code Playgroud)