Połączenie JSP z MS SQL Server 2000 Łukasz Sak Tomasz Raciborski
Narzędzia: Blazix, serwer WWW obslugujący JSP, servlety, napisany w Javie, wybrany zamiast np. serwera Suna z powodu prostoty obsługi i konfiguracji oraz małej ilości pamięci potrzebnej do instalacji (1.5 MB), wymaga osobno zainstalowanego kompilatora Javy Sterownik Microsoft SQL Server 2000 Driver for JDBC, do ściągnięcia ze stron Microsoftu (2 MB)
JSP JavaServerPages to technologia bazująca na języku Java umożliwiająca szybkie i łatwe tworzenie dynamicznych stron WWW. Pliki JSP są plikami HTML wraz z kodem źródłowym Javy zawartym w specjalnych znacznikach. Dość istotnym jest fakt, iż kod plików JSP nie jest czytany linia po linii (jak ma to miejsce w PHP) lecz najpierw konwertowany do postaci serwletu (postać binarna) i następnie uruchamiany przez silnik serwletów.
Działanie JSP plik *.jsp jest parsowany i tworzony jest plik źródłowy z kodem Javy (tylko przy pierwszym wywołaniu pliku) plik z kodem Javy zostaje skompilowany do postaci binarnej pliku klasy. Powstały w ten sposób plik klasy jest serwletem, a więc jego obsługę przejmuje silnik serwletów Silnik serwletów ładuje i uruchamia serwlet, wyniki przesyła do przeglądarki
Prosty przykład pliku.jsp <% for ( int i = 0; i < 5; i++ ) { %> Liczba <% } %>
Sterownik JDBC Najpierw należy załadować sterownik bazy danych. Chcąc połączyć się z MS SQL Server ściągamy ze stron Microsoftu Microsoft SQL Server 2000 Driver for JDBC, instalujemy go i do zmiennej systemowej classpath dodajemy ścięzki do konkretnych sterowników (msbase.jar, mssqlserver.jar, msutil.jar)
Połączenie z BD //ładowanie sterownika Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver„ ); //parametrem getConnection() są typ protokołu, mechanizm połączenia //z BD, lokalizacja BD i ewentualnie dodatkowe parametry Connection conn = java.sql.DriverManager.getConnection( „jdbc:microsoft:sqlserver://localhost:1433”); //Poniższy interfejs zawiera info o BD i sterowniku DatabaseMetaData dm = conn.getMetaData();
Meta-dane połączenia <% out.println(„ Driver Name: "+ dm.getDriverName()); out.println("\tDriver Version: "+ dm.getDriverVersion ()); out.print("\tDatabase Name: "+ dm.getDatabaseProductName()); out.print("Avalilable DataBases: "); rs = dm.getCatalogs(); while(rs.next()){ out.print("-- "+ rs.getString(1)); } %>
Zapytania Dla wykonania zapytania SQL należy utworzyć obiekt typu Statement (lub PreparedStatement, CallableStatement ): Statement stmt = connect.createStatement(); Polecenie SQL możemy wysłać korzystając z metod klasy Statement: executeUpdate(), executeQuery(), execute(). ResultSet r = stmt.executeQuery(„select*from student”);
ResultSet W obiekcie klasy ResultSet przechowujemy rekordy (krotki) zwrócone z BD po wykonaniu executeQuery(). Do nawigacji służą metody: next(), getXXX(), findColumn(), isLast(), … while(r.next()){ id = r.getString(1); nazwisko = r.getString(2); out.println( id+„ „+ nazwisko); }
Strona.jsp listująca studentów z bazy <% Connection conn = null; String url = "jdbc:microsoft:sqlserver://"; String serverName= "localhost"; String portNumber = "1433"; String databaseName= "II"; String userName = "sa"; String password = ""; String connectionUrl = url+serverName+":"+portNumber+";databaseName="+databaseName+";"; Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); java.sql.DatabaseMetaData dm = null; java.sql.ResultSet rs = null; try{ conn = java.sql.DriverManager.getConnection(connectionUrl,userName,password); if(conn!=null){ Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery("select*from student");
%> Indeks Nazwisko Adres <% while(r.next()){ %> <% } %> <% }else System.out.println("Error: No active Connection"); }catch(Exception e){ e.printStackTrace(); } dm=null; if(conn!=null) conn.close(); %>
PreparedStatement, ResultSetMetaData PreparedStatement pstmt = conn.prepareStatement("select * from student where nazwisko = ?"); pstmt.setString(1, „Abacki"); ResultSet r = pstmt.executeQuery(); ResultSetMetaData rsmd = r.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); boolean b = rsmd.isSearchable(1); String name = rsmd.getColumnLabel(1);