Jsf 使用BootsFaces实现自动完成(使用inputText提前键入)

Jsf 使用BootsFaces实现自动完成(使用inputText提前键入),jsf,bootsfaces,Jsf,Bootsfaces,我用JavaEE开发了一个web应用程序,在这个应用程序中有一个inputText,允许根据学生的姓名搜索他。 然而,我面临着一个我找不到解决办法的问题。 我使用带有typeahead(Bootsfaces)的inputText,如果我向它发送一个列表Etudiant(我的列表对象),它会工作,但是当我向它发送一个列表字符串时,不会出现任何建议:/ 在我的控制器(Java)中,我返回一个包含每个学生的姓名和姓氏的列表,我希望能够给出该列表的建议 下面是我的xHtml代码: <b:input

我用JavaEE开发了一个web应用程序,在这个应用程序中有一个inputText,允许根据学生的姓名搜索他。 然而,我面临着一个我找不到解决办法的问题。 我使用带有typeahead(Bootsfaces)的inputText,如果我向它发送一个列表Etudiant(我的列表对象),它会工作,但是当我向它发送一个列表字符串时,不会出现任何建议:/ 在我的控制器(Java)中,我返回一个包含每个学生的姓名和姓氏的列表,我希望能够给出该列表的建议

下面是我的xHtml代码:

<b:inputText style="width:200px" value="" placeholder="Rechercher étudiant" typeahead="true" typeahead-values="#{etudiantController.getEtudiants()}"/>

有我的控制器(etudiantController)代码:

public List getEtudiants(){
etudiants=gestionEtudiant.selectAll();
List listeNomPrenom=new ArrayList();
对于(教育对象e:教育对象){
添加(e.getNom()+“”+e.getPrenom());
}
返回listeNomPrenom;
}

我希望不要打扰我的帖子,提前谢谢;)

这里有几件事需要解决

首先,您需要一个支持bean值,以便组件具有适当的引用值。不设置
可能会自动完成,具体取决于组件的实现方式,但您无法访问用户稍后在控制器中实际输入的内容。对于某些组件,它可能会使组件以不希望的方式运行。因此,您需要将其连接到bean属性

其次,
typeahead值
需要一个直接向上的字符串或bean属性。只有在非常特殊的情况下,您才需要调用bean属性的getter——因此您应该引用该属性

第三,不要返回新的学生列表,而是尝试利用Java内置的
toString()
功能在
typeahead值中使用。然后,您不必创建一个全新的列表,而是可以依靠Java为您进行转换

因此,一个完整的解决方案,模仿你正在尝试做的事情,并翻译成英语,看起来是这样的

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:b="http://bootsfaces.net/ui">
    <h:head>
        <title>Autocomplete test</title>
    </h:head>
    <h:body>
        <h:form>
            <b:inputText value="#{studentBean.studentEntry}" placeholder="Search student"
                         typeahead="true" typeahead-values="#{studentBean.students}"/>
        </h:form>
    </h:body>
</html>

自动完成测试
@数据
@命名
@视域
公共类StudentBean实现了可序列化{
私人名单学生;
私人字符串学生中心;
@施工后
公共void init(){
学生=新数组列表();
添加(新学生(“卡尔”、“萨根”);
添加(新学生(“恩里科”、“费米”);
添加(新学生(“Jay”、“Miner”);
}
@资料
@AllArgsConstructor
公立班学生{
私有字符串名;
私有字符串lastName;
@凌驾
公共字符串toString(){
返回String.format(“%s%s”,lastName,firstName);
}
}
}
请注意,这个示例使用Lombok-so@Data注释为属性创建所需的setter和getter

还要注意
toString()
实际上是如何翻转名称并将姓氏放在第一位的
就像您在代码中所做的那样。

所以这里有几件事需要解决

首先,您需要一个支持bean值,以便组件具有适当的引用值。不设置
可能会自动完成,具体取决于组件的实现方式,但您无法访问用户稍后在控制器中实际输入的内容。对于某些组件,它可能会使组件以不希望的方式运行。因此,您需要将其连接到bean属性

其次,
typeahead值
需要一个直接向上的字符串或bean属性。只有在非常特殊的情况下,您才需要调用bean属性的getter——因此您应该引用该属性

第三,不要返回新的学生列表,而是尝试利用Java内置的
toString()
功能在
typeahead值中使用。然后,您不必创建一个全新的列表,而是可以依靠Java为您进行转换

因此,一个完整的解决方案,模仿你正在尝试做的事情,并翻译成英语,看起来是这样的

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:b="http://bootsfaces.net/ui">
    <h:head>
        <title>Autocomplete test</title>
    </h:head>
    <h:body>
        <h:form>
            <b:inputText value="#{studentBean.studentEntry}" placeholder="Search student"
                         typeahead="true" typeahead-values="#{studentBean.students}"/>
        </h:form>
    </h:body>
</html>

自动完成测试
@数据
@命名
@视域
公共类StudentBean实现了可序列化{
私人名单学生;
私人字符串学生中心;
@施工后
公共void init(){
学生=新数组列表();
添加(新学生(“卡尔”、“萨根”);
添加(新学生(“恩里科”、“费米”);
添加(新学生(“Jay”、“Miner”);
}
@资料
@AllArgsConstructor
公立班学生{
私有字符串名;
私有字符串lastName;
@凌驾
公共字符串toString(){
返回String.format(“%s%s”,lastName,firstName);
}
}
}
请注意,这个示例使用Lombok-so@Data注释为属性创建所需的setter和getter

还要注意
toString()
实际上是如何翻转名称并将姓氏放在第一位的
就像您在代码中所做的一样。

我的错误是因为在我的字符串列表中出现了撇号:/谢谢您提供了非常完整的答案;)我的错误是因为在我的字符串列表中,出现了撇号:/Thanky you you's more complete答案;)
@Data
@Named
@ViewScoped
public class StudentBean implements Serializable {
    private List<Student> students;
    private String studentEntry;

    @PostConstruct
    public void init() {
        students = new ArrayList<>();
        students.add(new Student("Carl", "Sagan"));
        students.add(new Student("Enrico", "Fermi"));
        students.add(new Student("Jay", "Miner"));
    }

    @Data
    @AllArgsConstructor
    public class Student {
        private String firstName;
        private String lastName;

        @Override
        public String toString() {
            return String.format("%s %s", lastName, firstName);
        }
    }
}