jsf - JSF Primefaces:如何对内部项目使用三元运算符呈现 HTML 下拉列表?
问题描述
我正在使用 JSF Primefaces 7.0 呈现 XHTML 文件以在单个 HTML 下拉列表中显示用户列表(连同他们的电子邮件地址)。
pom.xml:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>org.primefaces.extensions</groupId>
<artifactId>primefaces-extensions</artifactId>
<version>7.0.3</version>
</dependency>
用户等级:
package com.myapp.model;
import static org.apache.commons.lang3.StringUtils.isBlank;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class User implements Serializable {
private String firstName;
private String lastName;
// this is their e-mail address
private String username;
public String getName() {
final StringBuilder sb = new StringBuilder();
if (!isBlank(getFirstName())) {
sb.append(getFirstName()).append(' ');
}
if (!isBlank(getLastName())) {
sb.append(getLastName());
}
return sb.toString().trim();
}
}
在 users.xhtml 中:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
>
<f:selectItems
value="#{userReport.users}"
var="user"
itemLabel="#{user.name} (#{user.username})"
itemValue="#{user}"/>
</p:selectOneMenu>
</html>
user.name
如果HTML 下拉列表中的 ( 不为空),这将为单个项目正确呈现:
John Doe (jdoe@email.com)
如果为空字符串或null ,我如何使用条件(<c:if>
带<c:else>
或什至? :
三元运算符)设置itemLabel
属性以仅呈现user.username
不带括号的值?user.name
user.name
因此,如果为 null 或空字符串,则应设置为此(电子邮件地址) :
itemLabel="#{user.username}"
进行显示(如果user.name
为 null 或空字符串):
jdoe@email.com
尝试这样做:
itemLabel="#{not empty user.name ? user.name (user.username) : user.username}"
这给了我以下堆栈跟踪:
javax.servlet.ServletException: Method not found: class com.myapp.model.User.name(java.lang.String)
at javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:749)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:475)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
Caused by: javax.el.MethodNotFoundException: Method not found: class com.myapp.model.User.name(java.lang.String)
at javax.el.Util.findWrapper(Util.java:373)
at javax.el.Util.findMethod(Util.java:219)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:149)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:79)
... 35 more
不明白为什么会这样,因为原始属性确实找到了User.getName()
方法:
itemLabel="#{user.name} (#{user.username})"
有一个更好的方法吗?
解决方案
通过使用+=
连接运算符计算出来:
itemLabel="#{!empty user.name ? user.name += ' (' += user.username += ')' : user.username}"
推荐阅读
- javascript - 使用 Javascript 按字母顺序设置选择
- r - dplyr 解决方案对选定值的出现进行分组和计数
- discord.py - Discord.py:从字符串中设置角色的颜色,报错
- ios - 无法在 Mac Catalyst 中以编程方式关闭警报?
- r - dplyr `pivot_longer()` 对象未找到,但它就在那里?
- firebase - Firebase 函数“httpsCallable”本地主机测试 CORS 错误
- c++ - 另一个类中的类/未识别的指针
- logging - 在 .NET Framework 4.6 控制台应用程序中的控制台中写入日志
- python-3.x - 将存储在 dict 中的多个列表(等长)组合成一个列表列表
- javascript - 在 React 中重构和清理代码 - 处理条件和包装器组件