在 JSF 中创建下拉程序

Creating a dropdown program in JSF

我需要创建一个程序来访问数据库并将值传递给 JSF 中的下拉列表。我想弄清楚如何做到这一点。我让它在第一个下拉菜单中工作,但第二个下拉菜单很棘手,因为它需要一个输入参数才能工作。这是我的 JSF 代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
<head>    
<title>Dropdown List</title>
</head>
<body>
    <select id="mySelect" onchange="myFunction()">
        <h:outputText value="#{helloWorld.getResultSet1()}" escape="false" />    
        <f:attribute name="action" value="1" />
    </select>
    <br />
    <select id="mySelect1">
    </select>
    <script>
        var x1 = document.getElementById("mySelect1");    
        x1.style.display = 'none';
        function myFunction() {
            x1.style.display = 'block';
            x1.innerHtml = '<h:outputText value="#{helloWorld.getResultSet2()}" escape="false" />';
        }
        document.getElementById('myForm:hidden2').value = new_value;
    </script>
</body>
</html>

这是我的 java 代码:

public String id = "1";

    public void print(String name) {
        System.out.println(name);
    }
    public String getResultSet2(String name) {
        String toReturn = "";

        try {
            rs = st.executeQuery("SELECT * FROM CS_EXAMS where name ="+ name);
            System.out.println(name);
            while (rs.next()) {
                toReturn = toReturn + "<option>" + rs.getString("exam_name") + "</option>";
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return toReturn;
    }

    public String getResultSet1() {
        String toReturn = "";

        try {
            rs = st.executeQuery("SELECT * FROM CS_EXAMS");
            System.out.println("name");
            while (rs.next()) {
                toReturn = toReturn + "<option>" + rs.getString("exam_name") + "</option>";
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return toReturn;

    }

字符串应介于 'name' :

之间
rs = st.executeQuery("SELECT * FROM CS_EXAMS where name = '" + name + "'");

但是你必须改用 PreparedStatement :

try (PreparedStatement ps = connection.prepareStatement(
        "SELECT * FROM CS_EXAMS where name = ?"")) {
    ps.setString(1, name));

    rs = ps.executeQuery();

    while (rs.next()) {
         toReturn = toReturn + "<option>" + rs.getString("exam_name") + "</option>";
    }
    //...complete your code
}

这确实不是在 JSF 中制作下拉菜单的方式。我建议阅读一些 JSF 初学者指南,甚至 HTML 初学者指南也可能有所帮助(例如,您的代码中没有 <form>)。

首先,JSF 使用组件来创建用户界面。您无需创建 HTML selectoption 元素。如果您使用 selectOneMenu,它将负责为您创建 HTML。更重要的是,您还将立即获得值绑定、验证、更改侦听器等内容。

因此,尝试通过阅读来创建 selectOneMenu

  • What is the definition of "component" in JSF
  • passing java string variable in mysql query
  • How to populate options of h:selectOneMenu from database?

如果您的下拉列表中需要 POJO 对象,请阅读:

现在,要解决根据第一个下拉列表的选择更新第二个下拉列表的问题,请阅读:

  • How to load and display dependent h:selectOneMenu on change of a h:selectOneMenu
  • Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes