在 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 select
和 option
元素。如果您使用 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
我需要创建一个程序来访问数据库并将值传递给 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 select
和 option
元素。如果您使用 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