2014-11-16 2 views
-1

Я хочу отобразить все базы данных и таблицы каждой базы данных в древовидном формате. Поэтому я написал код Jsp-страницы в своем коде, который извлекает имена и имена таблиц базы данных и передает их javascript page.But в моем коде страницы Javascript отображает только одно имя базы данных. Может ли кто-нибудь помочь мне выяснить причину? Мой код:Страница Javascript не отображает значения базы данных

LeftFrameset.jsp

<%-- 
Document : LeftFrameset 
Created on : Nov 13, 2014, 1:10:22 PM 
Author  : user 
--%> 
    <%@page import="querywork.DBConnection"%> 
    <%@page import="java.sql.ResultSet"%> 
    <%@page import="java.sql.DatabaseMetaData"%> 
    <%@page import="java.sql.DriverManager"%> 
    <%@page import="java.sql.Connection"%> 
    <%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<HTML> 

<!---------------------------------------------------------------> 
<!-- Copyright (c) 2006 by Conor O'Mahony.      --> 
<!-- For enquiries, please email [email protected]  --> 
<!-- Please keep all copyright notices below.     --> 
<!-- Original author of TreeView script is Marcelino Martins. --> 
<!---------------------------------------------------------------> 
<!-- This document includes the TreeView script. The TreeView --> 
<!-- script can be found at http://www.TreeView.net. The  --> 
<!-- script is Copyright (c) 2006 by Conor O'Mahony.   --> 
<!---------------------------------------------------------------> 
<!-- Instructions:            --> 
<!-- - Through the <STYLE> tag you can change the colors and --> 
<!--  types of fonts to the particular needs of your site. --> 
<!-- - A predefined block with black background has been  --> 
<!--  made for stylish people :-)       --> 
<!---------------------------------------------------------------> 

<HEAD> 

    <!-- This is the <STYLE> block for the default styles. If --> 
    <!-- you want the black background, remove this <STYLE>  --> 
    <!-- block.             --> 
    <STYLE> 
     BODY { 
      background-color: white;} 
     TD { 
      font-size: 10pt; 
      font-family: verdana,helvetica; 
      text-decoration: none; 
      white-space:nowrap;} 
     A { 
      text-decoration: none; 
      color: black;} 
     .specialClass { 
      font-family:garamond; 
      font-size:12pt; 
      color:green; 
      font-weight:bold; 
      text-decoration:underline} 
     </STYLE> 

     <!-- If you want the black background, replace the contents --> 
     <!-- of the <STYLE> tag above with the following... 
      BODY { 
      background-color: black;} 
      TD { 
      font-size: 10pt; 
      font-family: verdana,helvetica; 
      text-decoration: none; 
      white-space:nowrap;} 
      A { 
      text-decoration: none; 
      color: white;} 
     <!-- This is the end of the <STYLE> contents.    --> 

     <!-- Code for browser detection. DO NOT REMOVE.    --> 
     <SCRIPT src="ua.js"></SCRIPT> 

     <!-- Infrastructure code for the TreeView. DO NOT REMOVE. --> 
     <SCRIPT src="ftiens4.js"></SCRIPT> 

     <!-- Scripts that define the tree. DO NOT REMOVE.   
     <SCRIPT src="demoFramesetNodes.js"></SCRIPT> --> 

    </HEAD> 

    <BODY topmargin="16" marginheight="16"> 

     <!-------------------------------------------------------------> 
     <!-- IMPORTANT NOTICE:          --> 
     <!-- Removing the following link will prevent this script --> 
     <!-- from working. Unless you purchase the registered  --> 
     <!-- version of TreeView, you must include this link.  --> 
     <!-- If you make any unauthorized changes to the following --> 
     <!-- code, you will violate the user agreement. If you want --> 
     <!-- to remove the link, see the online FAQ for instructions --> 
     <!-- on how to obtain a version without the link.   --> 
     <!-------------------------------------------------------------> 
     <DIV style="position:absolute; top:0; left:0;"><TABLE border=0><TR><TD><FONT size=-2><A style="font-size:7pt;text-decoration:none;color:silver" href="http://www.treemenu.net/" target=_blank>Javascript Tree Menu</A></FONT></TD></TR> </TABLE></DIV> 

      <% 

     try { 
      String responseText = ""; 

      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/", "root", ""); 

      DatabaseMetaData dbmd = conn.getMetaData(); 

      ResultSet ctlgs = dbmd.getCatalogs(); 
      while (ctlgs.next()) { 
       String text = ""; 
       String db = ctlgs.getString(1); 
       DBConnection dbc = new DBConnection(db); 
       ResultSet rs = dbc.SelectTable(); 
       while (rs.next()) { 

        String tableName = rs.getString("TABLE_NAME"); 
        text += tableName + ","; 
       } 



    %> 
    <!--Scripts that define the tree. DO NOT REMOVE.   --> 
    <input type="hidden" name="value1" id="hiddenvalue1" value=> 
    <input type="hidden" name="value" id="hiddenvalue" value=<%=ctlgs.getString(1)%>> 
    <SCRIPT src="demoFramesetNodes.js"></SCRIPT> 


    <% 
      } 
     } catch (Exception e) { 
      out.println(e); 
    }%> 

    <!-- Build the browser's objects and display default view --> 
    <!-- of the tree.           --> 
    <SCRIPT>initializeDocument()</SCRIPT> 
    <NOSCRIPT> 
    A tree for site navigation will open here if you enable JavaScript in your browser. 
    </NOSCRIPT> 

    </BODY> 

    </HTML> 

DemoFramesetNodes.js

var str=document.getElementById("hiddenvalue") .value 
    var str1=document.getElementById("hiddenvalue1") .value 
    alert (str); 
var table=str1 .split(","); 

USETEXTLINKS = 1 

// Configures whether the tree is fully open upgmon loading of the page, or whether 
// only the root node is visible. 
STARTALLOPEN = 0 

// Specify if the images are in a subdirectory; 
    ICONPATH = '' 


foldersTree = gFld("<i>Treeview Demo</i>", "demoFramesetRightFrame.html") 
foldersTree.treeID = "Frameset" 

    aux1 = insFld(foldersTree, gFld("New", "Databases.jsp")) 

    aux2 = insFld(foldersTree, gFld(str, "http://www.treeview.net/treemenu/demopics/beenthere_america.gif")) 
    insDoc(aux2, gLnk("R", "New Table", "CreateTable.jsp?dbname="+str)) 
    for(var i=0;i<table. length;i++) 
    { 
    //  alert ('sessionNameVal' + dbname[i]); 


     insDoc(aux2, gLnk("R", table[i], "http://www.treeview.net/treemenu/demopics/beenthere_america.gif")) 

    } 

DBConnection.java

/* 
    * To change this license header, choose License Headers in Project Properties. 
    * To change this template file, choose Tools | Templates 
    * and open the template in the editor. 
     */ 

    package querywork; 


    import java.sql.Connection; 
    import java.sql.DatabaseMetaData; 
     import java.sql.DriverManager; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Statement; 
    import java.text.SimpleDateFormat; 
    import java.util.ArrayList; 
    import java.util.Date; 
    import java.util.Locale; 
    import java.util.Random; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 
    import javax.swing.JOptionPane; 

/** 
* 
    * @author ash 
    */ 
    public class DBConnection { 
Connection conn; 
Statement st; 
ResultSet rs; 
PreparedStatement ps,ps1; 
String dbname; 
public DBConnection(String dbname){ 
    try{ 
     this.dbname=dbname; 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     conn=DriverManager.getConnection("jdbc:mysql://localhost/"+dbname,"root",""); 
     System.out.println("connected to the DB"); 
    }catch(Exception e){ 
     e.printStackTrace(); 

    } 
    } 
    public ResultSet SelectTable() 
    { 


      ResultSet rs1 = null; 
    boolean flg=true; 

    try{ 


DatabaseMetaData meta = conn.getMetaData(); 
rs1 = meta.getTables(null, null, null, new String[]{"TABLE"}); 




    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return rs1; 
} 
} 
+0

Я бы сказал, что ошибка, вероятно, будет в классе 'DBConnection'. Я не узнаю имя, поэтому я предполагаю, что это один из твоих - это правильно? Нам сложно помочь вам найти какие-либо проблемы с этим классом, если вы не поделились с нами своим кодом. –

+0

Я отредактировал вопрос с моим DBConnection.java. Но я не думаю, что проблема связана с этим кодом. В любом случае PLZ тоже проходит этот код. – Ash

+0

Является ли ваше приложение бросающим исключение во время одной итерации цикла while (ctlgs.next()) в вашем JSP? Выписывается ли контент на странице после имени одной базы данных или заканчивается ли страница одним именем таблицы? Что произойдет, если вы замените содержимое цикла while (ctlgs.next()) в JSP на строку, которая просто записывает имя базы данных? –

ответ

0

OK, после того, как ваши комментарии, я начинаю думать, что я понимаю, твоя проблема.

Давайте поговорим с базой данных из картинки, так как это не проблема. В конечном счете, JSP генерирует HTML похож на это:

<input type="hidden" name="value1" id="hiddenvalue1" value=> 
<input type="hidden" name="value" id="hiddenvalue" value=information_schema> 
<SCRIPT src="demoFramesetNodes.js"></SCRIPT> 
<input type="hidden" name="value1" id="hiddenvalue1" value=> 
<input type="hidden" name="value" id="hiddenvalue" value=mysql> 
<SCRIPT src="demoFramesetNodes.js"></SCRIPT> 
<input type="hidden" name="value1" id="hiddenvalue1" value=> 
<input type="hidden" name="value" id="hiddenvalue" value=user> 
<SCRIPT src="demoFramesetNodes.js"></SCRIPT> 
<input type="hidden" name="value1" id="hiddenvalue1" value=> 
<input type="hidden" name="value" id="hiddenvalue" value=test> 
<SCRIPT src="demoFramesetNodes.js"></SCRIPT> 

(. Имена баз данных могут различаться)

Проблема здесь состоит в том, что каждый раз, когда вы загружаете demoFramesetNodes.js, браузер запускает следующую строку:

var str = document.getElementById("hiddenvalue").value 

В вашем случае у вас есть 7 элементов с ID hiddenvalue. Идентификаторы должны быть уникальными на странице HTML. Я не знаю какой-либо спецификации JavaScript, в которой говорится, что должно произойти, если вы вызываете document.getElementById с идентификатором, который не является уникальным, но я не удивлюсь, если это неопределенное поведение. Если бы это было неопределенное поведение, браузеры были бы в пределах своих прав, чтобы вернуть первый элемент с данным идентификатором, последний такой элемент, произвольный один из этих элементов или даже null. В вашем случае похоже, что ваш браузер возвращает первый элемент. Следовательно, вы получаете information_schema семь раз.

Один из способов обойти эту проблему, чтобы выписать присвоения str и str1 в JSP, вместо того, чтобы положить их в скрытых входах формы и чтение их в начале demoFramesetNodes.js. Таким образом, вместо <input type="hidden" ...> линий, ваш JSP будет содержать следующее:

<SCRIPT type="text/javascript"> 
var str = "<%= ctlgs.getString(1) %>"; 
var str1 = "<%= text %>"; 
</SCRIPT> 

(. Вы также должны удалить присвоения str и str1 от demoFramesetNodes.js)

Присмотревшись на demoFramesetNodes.js, в этом сценарии есть несколько вещей, которые должны выполняться только один раз, например, объявление констант и создание узла верхнего уровня дерева, а другие вещи должны выполняться один раз на узел второго уровня (т.е. базы данных). Я бы рекомендовал:

  • переместив вещи, которые нужно сделать один раз для каждого узла второго уровня в функцию,
  • вызывая функцию внутри цикла while вместо присваивания str и str1 каждый раз,
  • loading demoFramesetNodes.js только один раз, в HEAD элемент.

Я оставлю это вам как упражнение.


Имена баз данных и таблиц могут содержать только буквы, цифры и символы подчеркивания, так что вы бы хорошо просто писать свои имена прямо в строку JavaScript, как указано выше. Однако, в общем, это вообще небезопасно. Предположим, к примеру, кто-то удалось создать таблицу или базу данных с именем, например, как

x";document.location='http://www.evil.com/';// 

Это вызывает бы выход, такие как

var str = "x";document.location='http://www.evil.com/';//"; 

которые могли бы привести браузер, чтобы перейти к www.evil.com.

Очевидно, что это нежелательно, и это случай использования безопасности, известного как Cross-Site Scripting (XSS). Эта проблема безопасности может быть устранена escaping the value before writing it into JavaScript.

+0

Это работает .. Спасибо большое .. :) – Ash

Смежные вопросы