Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Java] Aiuto per comprensione codice

    Ciao,

    è da poco che mi diletto in java.

    Sto vedendo questo codice ... ma diverse parti mi sono oscure..


    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    package netsend;
    
    /**
     *
     * @author fabio
     */
    
       
       import java.awt.*;
       import java.awt.event.*;
       import javax.swing.*;
       import java.sql.*;
       import java.util.*;
        
       public class NetSend extends JFrame implements ActionListener
           {
           JComboBox list = new JComboBox();
           JTextField message = new JTextField(20);
           JButton send = new JButton("Send");
           JTextField result = new JTextField(25);
           private static Connection cn = null;
           private static Statement st= null;
           private ResultSet r= null;
           
           public NetSend(String title){
            setTitle(title);
            initialise();
            Container c = getContentPane();
            c.setLayout(new FlowLayout(FlowLayout.CENTER));
            c.add(list);
            c.add(message);
            send.addActionListener(this);
            send.setMnemonic(KeyEvent.VK_S);
            c.add(send);
            result.setEditable(false);
            result.setBackground(Color.yellow);
            result.setForeground(Color.red);
            c.add(result);
           }
      
          public void actionPerformed(ActionEvent ae){
            if(ae.getSource()==send){
            String dest = String.valueOf(list.getSelectedItem());
            String msg = message.getText();
            try{
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
             cn = DriverManager.getConnection("jdbc:odbc:clients","fabio","fab");
             st=cn.createStatement();
             ResultSet r=st.executeQuery("xp_cmdshell 'net send "+dest+" "+msg+"'");
             result.setText("Message Sent");
            }catch(Exception e){result.setText("Error in Sending Message");}
           }
          }
      
          public void initialise(){
           try
           {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            cn = DriverManager.getConnection("jdbc:odbc:clients","fabio","fab");
            st=cn.createStatement();
            r=st.executeQuery("xp_cmdshell 'net view'");
            String temp = new String();
            int i = 1;
            ArrayList machNames = new ArrayList();
            while(r.next())
            {
             machNames.add(r.getString("output"));
            }
            for(int x=3;x<machNames.size()-3;x++){
             temp = String.valueOf(machNames.get(x));
             list.addItem(temp.substring(2,temp.length()));
            }
            result.setText("Type your message and press ALT and S");
           }
           catch(Exception e){result.setText("Not able to retrieve the hosts");}
          }
         }

    1. Ho capito che "public NetSend" si occupa di costruire la finestra...

    2. Posso intendere che "send.addActionListener(this);" è la chiamata a "public void actionPerformed(ActionEvent ae)" ??

    3. Comprendo che le istruzioni
    codice:
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
             cn = DriverManager.getConnection("jdbc:odbc:clients","fabio","fab");
             st=cn.createStatement();
    servono per caricare, aprire e avviare il collegamento al database.

    MA

    4. Ho il buio totale su quello che succede qua:
    "ResultSet r=st.executeQuery("xp_cmdshell 'net send "+dest+" "+msg+"'");"
    Io mi aspetto una Query, come dice il nome... una query sul database..
    Invece si tratta dell'esecuzione di un codice CMD di windows... che è corretto si faccia... ma che non capisco nella fattezza di quella istruzione..


    POI

    5. Ho il buio totale su quel che è la funzione "public void initialise()".
    Comprendo che DEVE esserci una funzione che si occupi di caricare i dati sul combobox.. ma non vedo la chiamata da nessuna parte.. e perchè poi si chiama "initialise()" e non "initialiZe()" ? è solo un fatto di sintassi... o si tratta di una parola chiave di java?

    6. Anche qui io mi aspetto l'esecuzione di una query... dopo le istruzioni:
    codice:
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            cn = DriverManager.getConnection("jdbc:odbc:clients","fabio","fab");
            st=cn.createStatement();
    perchè "r=st.executeQuery("xp_cmdshell 'net view'");" non contiene un istruzione della forma "SELECT * etcetc..." e mette i dati dentro sul combobox??



    Un aiutino per comprendere questi buchi neri....

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Aiuto per comprensione codice

    Originariamente inviato da cagnaluia
    1. Ho capito che "public NetSend" si occupa di costruire la finestra...
    Sì, NetSend estende JFrame quindi è un frame. Non vedo un setVisible(true) per rendere visibile il frame quindi deve essere fatto sicuramente da un'altra parte, presumibilmente nel punto dove viene istanziato un oggetto NetSend.

    Originariamente inviato da cagnaluia
    2. Posso intendere che "send.addActionListener(this);" è la chiamata a "public void actionPerformed(ActionEvent ae)" ??
    No. addActionListener() semplicemente "registra" all'interno del JButton il reference al listener, aggiungendolo in una apposita lista. Quando poi si verificherà l'evento corrispondente (in questo caso: il pulsante è stato premuto), allora il framework si occuperà di invocare actionPerformed() su tutti i listener registrati.

    Originariamente inviato da cagnaluia
    3. Comprendo che le istruzioni
    codice:
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
             cn = DriverManager.getConnection("jdbc:odbc:clients","fabio","fab");
             st=cn.createStatement();
    servono per caricare, aprire e avviare il collegamento al database.
    forName carica la classe del driver, getConnection fornisce una Connection e createStatement permette di creare uno Statement per poter eseguire delle query SQL.

    Originariamente inviato da cagnaluia
    4. Ho il buio totale su quello che succede qua:
    "ResultSet r=st.executeQuery("xp_cmdshell 'net send "+dest+" "+msg+"'");"
    Io mi aspetto una Query, come dice il nome... una query sul database..
    Invece si tratta dell'esecuzione di un codice CMD di windows... che è corretto si faccia... ma che non capisco nella fattezza di quella istruzione..
    Non me ne intendo di driver ODBC e a dire il vero non è nemmeno chiaro a quale tipo di database si collega.
    Ma se il database (forse MS SQL?) "capisce" quel comando, allora non è una cosa poi così tanto strana.

    Originariamente inviato da cagnaluia
    5. Ho il buio totale su quel che è la funzione "public void initialise()".
    Comprendo che DEVE esserci una funzione che si occupi di caricare i dati sul combobox.. ma non vedo la chiamata da nessuna parte..
    La chiamata è nel costruttore di NetSend.

    Originariamente inviato da cagnaluia
    e perchè poi si chiama "initialise()" e non "initialiZe()" ? è solo un fatto di sintassi... o si tratta di una parola chiave di java?
    Hanno voluto chiamarlo così ... non vuol dire nulla. Se l'avesso denominato inizializza(), inizializzazione(), init() o qualunque altra cosa, non cambiava nulla, non per il compilatore almeno.
    Ovviamente in inglese "corretto" si dice "initialize" ... nell'inglese "maccheronico" puoi scrivere quello che vuoi.

    Originariamente inviato da cagnaluia
    6. Anche qui io mi aspetto l'esecuzione di una query... dopo le istruzioni:
    codice:
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            cn = DriverManager.getConnection("jdbc:odbc:clients","fabio","fab");
            st=cn.createStatement();
    perchè "r=st.executeQuery("xp_cmdshell 'net view'");" non contiene un istruzione della forma "SELECT * etcetc..." e mette i dati dentro sul combobox??
    Stessa cosa di sopra. Dipende dal database. SELECT non è certo l'unico comando possibile in un database. Il comando è supportato? Ti ritorna un result-set in forma tabellare? E allora è una query.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: [Java] Aiuto per comprensione codice

    Originariamente inviato da andbin
    Sì, NetSend estende JFrame quindi è un frame. Non vedo un setVisible(true) per rendere visibile il frame quindi deve essere fatto sicuramente da un'altra parte, presumibilmente nel punto dove viene istanziato un oggetto NetSend.
    si, setVisible è sul Main, non l'avevo riportato.

    codice:
    package netsend;
    
    /**
     *
     * @author fabio
     */
    public class Main {
    
        /**
         * @param args the command line arguments
         */
    
          public static void main(String args[])
    
          {
      
          NetSend ns = new NetSend("Send your messages to PC's in LAN");
          ns.setVisible(true);
          ns.setSize(400,400);
          }
          
    }

    No. addActionListener() semplicemente "registra" all'interno del JButton il reference al listener, aggiungendolo in una apposita lista. Quando poi si verificherà l'evento corrispondente (in questo caso: il pulsante è stato premuto), allora il framework si occuperà di invocare actionPerformed() su tutti i listener registrati.
    ho capito...

    forName carica la classe del driver, getConnection fornisce una Connection e createStatement permette di creare uno Statement per poter eseguire delle query SQL.
    si.

    Non me ne intendo di driver ODBC e a dire il vero non è nemmeno chiaro a quale tipo di database si collega.
    Ma se il database (forse MS SQL?) "capisce" quel comando, allora non è una cosa poi così tanto strana.
    Non saprei.. io penso si colleghi semplicemente ad ODBC... poi su ODBC ci sarà un qualsiasi DB collegato con il nome indicato nell istruzione sopra.
    Quel "capire" il comando, mi suona strano però.

    La chiamata è nel costruttore di NetSend.


    Hanno voluto chiamarlo così ... non vuol dire nulla. Se l'avesso denominato inizializza(), inizializzazione(), init() o qualunque altra cosa, non cambiava nulla, non per il compilatore almeno.
    Ovviamente in inglese "corretto" si dice "initialize" ... nell'inglese "maccheronico" puoi scrivere quello che vuoi.
    .... initialise();....
    sono orbo!!



    Stessa cosa di sopra. Dipende dal database. SELECT non è certo l'unico comando possibile in un database. Il comando è supportato? Ti ritorna un result-set in forma tabellare? E allora è una query.
    ah.. si impara sempre.. io ero fermo a SQL inteso come SELECT..
    imamginavo che esistessero altre forme di "dialogo".. ma nn le avevo mai viste.

  4. #4
    Per quanto riguarda xp_cmdshell è un comando di SQL Server...

    Genera una shell dei comandi di Windows e passa una stringa per l'esecuzione. L'eventuale output viene restituito in forma di righe di testo.
    Al mio segnale... scatenate l'inferno!

  5. #5
    si, vero. sto vedendo..

    il fatto è che sembra non collegarsi.

    io ho creato un collegamento ODBC locale ad un server SQL2005....

    nel server sql2005 c'è una tabella vuota collegata, tanto per averla e non generare errori..

    ma il prog java.. non mi riempie la combobox

  6. #6
    codice:
           Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    // fino a qui tutto bene...
            cn = DriverManager.getConnection("jdbc:odbc:clients","fabio","fab");
    // qui, invece nisba....

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Probabilmente per eseguire la connessione ad SQL Server tramite ODBC è necessario specificare altri parametri, da dare in pasto al driver ODBC.

    Ti conviene scaricarti il driver JDBC per SQL Server (lo trovi nel sito Microsoft) e usare quello.

    Se ti può essere utile, la stringa di connessione tramite driver JDBC è la seguente:
    codice:
    db = DriverManager.getConnection("jdbc:microsoft:sqlserver://" + hostDB +
                                         ":" + portaDB +
                                         ";DatabaseName=" + nomeDB +
                                         ";User=" + nomeUtente +
                                         ";password=" + pwdUtente);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    mitiko..

    c'è una cosa però... io scarico il driver.. molto bello.. bel pacchetto con tanto di fiocchetto..

    però.. che ci faccio? dove lo devo piazzare perchè java, ma meglio ancora NetBeans lo comprenda?

  9. #9
    fatto.

    proprietà del progetto, aggiungi libreria

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.