【问题标题】:Local variable cannot be resolved?局部变量无法解析?
【发布时间】:2016-04-05 20:31:43
【问题描述】:

在这段代码中,我将 MySQL 数据库的值放入数据库表中行的 String array(list[count])count=number 中。当我应用for-loop 在javascript 的下拉列表中打印这些值时,使用j 变量,编译器无法识别j。我无法理解为什么。请帮帮我。

<%@page import="java.sql.DriverManager"%>
<%@page import="com.mysql.jdbc.Driver"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.ResultSet"%>
<html>
<body>
<br/>
<br/>
<div align="center"><h1>Task Assignment</h1></div>
<form name="taskassignment"><div align="center"><table>
<tr><td><font size="5">Person(s)</font></td><td><select id="person"></select></td></tr>
<tr><td><font size="5">Task(s)</font></td><td><select name="task"></select></td></tr>
<tr><td></td><td><input type="submit" value="Assign" name="assigntask"/></td></tr></div></table></form>
<%
DriverManager.registerDriver(new Driver());
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/BI","root","mayur");
String query = "select name from records";
PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
int count =0;
while(rs.next())
{
count++;    
}

String[] list = new String[count];
int i=0;
rs.beforeFirst();
while(rs.next())
{

list[i] = rs.getString(1);
out.println(list[i]);
i++;

}

%>

<script>
function myFunction()
{
for(var j=1;j<=<%=list.length%>;j++)
{
    var x = document.getElementById("person");
    var opt =  document.createElement("option");
    opt.text = '<%=list[j]%>';
    opt.value = '<%=list[j]%>'; 
    x.add(opt);

}
}
window.onload = myFunction;
</script>
</body>
</html>

【问题讨论】:

  • 您正在混合客户端和服务器端代码。
  • 你对服务器端代码和客户端代码感到困惑...... j是在javascript中定义的,但是页面已经无法加载,因为服务器端不知道j是什么
  • 先生,请建议我如何从数据库中检索值并将它们放入脚本的下拉列表中???

标签: javascript java mysql jsp for-loop


【解决方案1】:

考虑使用这个 jsp 脚本来填充您的选择。我使用评论来突出注意事项。完成这项工作后,请务必阅读 JSTL - Scriplets 非常老派。

<select id="person">
<%
//no longer needed for 99% of jdbc drivers
DriverManager.registerDriver(new Driver());

//Dont EVER post realusernames/passwords!
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/BI","root","mayur");
String query = "select name from records";
PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();

while(rs.next()) {
   String item = rs.getString(1);
   //now produce html select
%><option value='<%= item %>'><%= item %></option><%
}
rs.close ();
stmt.close ();
conn.close ();
%>
</select>

更多注释:

  • 考虑使用连接池。建立连接很昂贵
  • try-with-resource 可以帮助最大限度地减少捕获/关闭代码开销
  • 检查jstl

【讨论】:

    【解决方案2】:

    嗨 Mayur,我根据我的表格和一些代码更改了查询。请根据需要进行修改。我在本地进行了测试,它正在添加所有字段。它会起作用,但正如 Jan 建议的那样,也可以参考 JSTL,因为 scriptlet 很难维护

        <%@page import="java.sql.DriverManager"%>
        <%@page import="com.mysql.jdbc.Driver"%>
        <%@page import="java.sql.Connection"%>
        <%@page import="java.sql.PreparedStatement"%>
    <%@page import="java.sql.ResultSet"%>
    <%@page import="java.util.*"%>
    <html>
    <body>
    <br/>
    <br/>
    <div align="center"><h1>Task Assignment</h1></div>
    <%
    
    String hiddenResult = "";
    DriverManager.registerDriver(new Driver());
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/wiprodb","root","1234");
    String query = "select state from state_tb";
    PreparedStatement stmt = conn.prepareStatement(query);
    ResultSet rs = stmt.executeQuery();
    int count =0;
    while(rs.next())
    {
    
        hiddenResult = hiddenResult+ (rs.getString(1))+",";   
    }
    
    hiddenResult = hiddenResult.substring(0, hiddenResult.length()-1);
    
    %>
    
    <form name="taskassignment">
    
    <input type="hidden" id="hiddenDDResult" name="hiddenDDResult" value="<%=hiddenResult%>" />
    <div align="center">
    <table>
    <tr>
        <td><font size="5">Person(s)</font></td>
        <td><select id="person"></select></td>
    </tr>
    <tr>
        <td><font size="5">Task(s)</font></td>
        <td><select name="task"></select></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit" value="Assign" name="assigntask"/></td>
    </tr>
    
    </table>
    </div>
    </form>
    
    <script>
    function myFunction()
    {
    
        var ddResult = document.getElementById("hiddenDDResult").value;
        var ddElement = document.getElementById("person");
    
        var tempValue = ddResult.split(",");
        //alert('ddResult'+ddResult);
    for(var i=0;i<tempValue.length;i++)
    {
        var opt =  document.createElement("option");
        opt.text = tempValue[i];
        opt.value = tempValue[i];  
        ddElement.add(opt);
    
    }
    }
    myFunction();
    </script>
    </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      未经测试,但类似下面的东西应该可以工作

      <%@page import="java.sql.DriverManager"%>
      <%@page import="com.mysql.jdbc.Driver"%>
      <%@page import="java.sql.Connection"%>
      <%@page import="java.sql.PreparedStatement"%>
      <%@page import="java.sql.ResultSet"%>
      <html>
      <body>
      <br/>
      <br/>
      <div align="center"><h1>Task Assignment</h1></div>
      <form name="taskassignment"><div align="center"><table>
      <tr><td><font size="5">Person(s)</font></td><td>
      
      <select id="person">
      
      
      <%
      DriverManager.registerDriver(new Driver());
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/BI","root","mayur");
      String query = "select name from records";
      PreparedStatement stmt = conn.prepareStatement(query);
      ResultSet rs = stmt.executeQuery();
      int count =0;
      while(rs.next())
      {
      count++;    
      }
      
      String[] list = new String[count];
      int i=0;
      rs.beforeFirst();
      while(rs.next())
      {
      
      list[i] = rs.getString(1);
      out.println(list[i]);
      %>
      <option value='<%=list[i]%>'><%=list[i]%></option>
      <% 
      i++;
      }
      %>
      
      </select>
      
      </td></tr>
      <tr><td><font size="5">Task(s)</font></td><td><select name="task"></select></td></tr>
      <tr><td></td><td><input type="submit" value="Assign" name="assigntask"/></td></tr></div></table></form>
      </body>
      </html>
      

      【讨论】:

      • 谢谢先生,但我必须输入多个值,这段代码只会打印一个数组值?
      • 它应该打印多个值,如&lt;option value='&lt;%=list[i]%&gt;'&gt;&lt;%=list[i]%&gt;&lt;/option&gt; in while循环
      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2020-01-17
      相关资源
      最近更新 更多