2I1073 Föreläsning 2 Server, servlets och databaskopplingar KTH-MI Peter Mozelius Klient - server I förra föreläsningen tittade vi en hel del på olika tekniker för klientsidan på Internet Nu går vi över till serversidan Treskiktsarkitektur – – webbklient - webbserver - data XHTML - Java servlets - databas Klient-server med servlets 1 Java servlets Applets på serversidan Ett effektivt alternativ till äldre CGI-lösningar CGI startar en ny process för varje nytt anrop Servlets startar bara en ny tråd CGI avslutar processen efter anropet Servlets ligger kvar i minnet mellan anrop Apache Tomcat Det finns flera sätt att köra servlets Ett mycket vanligt sätt är m h a Tomcat Som alltid när det gäller Apacheprodukter – – helt fri att använda öppen källkod Följer servlet- och JSP-specifikatioerna Det sätt som vi kommer att använda MEN visst finns det kommersiella alternativ Apache Tomcat Det kommer hela tiden nya versioner Ni väljer själva genom uppvärmningsövning2 – ver 4 – ver 5 – ver 6 Men det finns tyvärr en del smådetaljer som skiljer 2 Apache Tomcat Starta Tomcat: – – startup.bat startup.sh Stoppa Tomcat: – – shutdown.bat shutdown.sh Apache Tomcat Anropa Tomcat genom: – – http://127.0.0.1:8080/ http://localhost:8080/index.jsp Apache Tomcat Om du använder SDK standard edition Se till så att servlet.jar finns med i CLASSPATH Exempelvis: SET CLASSPATH= .;E:\tomcat\lib\servlet.jar OBS jar-filen heter fr o m version5 servletservletapi. api.jar 3 Apache Tomcat Om man vill använda JSP så är det också viktigt att sätta miljövariabeln: JAVA_HOME (Exempelvis: C:\jdk.16.x) TOMCAT_HOME heter fr om version 4 CATALINA_HOME Tomcats konfigurationsfiler Tomcat har många konfigurationsfiler Två av dem är: web.xml – – mappning av servlets CATALINA_HOME\webapps\miwebb\WEB-INF\ server.xml – Mappning av servlet context – CATALINA_HOME\conf\ PAUS 15 min Servletanrop När servern får ett anrop från en servlet startas en ny tråd där service-metoden kollar vilken typ av HTTP-förfrågan det rör sig om: – – – – – – GET POST HEAD TRACE PUT DELETE 4 Servletanrop service kallar sedan på en passande metod: – doGet() – doPost() – [ doHead() ] – doTrace() – doPut() – doDelete() GET och POST I 99% så handlar det om GET och POST GET – – – tänkt för att hämta saker från servern jobbar med URL + frågesträng vissa servrar klipper av frågesträngen efter x tecken POST – – – skickar data till servern utan att klienten ser passar bättre för stora mängder data säkrare än GET doGet() och doPost() När du behöver bägge metoderna i en servlet så kan de med fördel kombineras enligt: public void doGet(HttpServletRequest request, HttpServletResponse response) { Här finns koden som gör jobbet; } public void doPost(HttpServletRequest request, HttpServletResponse response) { doGet(request, response); } 5 HttpServletRequest Ett sätt att få tag i viktig information HTTP Request = klientens förfrågan Läs innehållet i Request Header genom: – – – – request.getHeader() request.getHeaderNames() request.getContentType() request.getContentLength() HttpServletRequest Andra användbara metoder är: – – – – – request.getMethod() request.getProtocol() request.getRequestURI() request.getParameter() request.getCookies() Mera om kakor om en liten stund HttpServletResponse HTTP Response = serverns svar Här finns metoder som t ex – response.addCookie() //lägg till en kaka MEN den metod som vi mest ska använda är: response.getWriter() Öppnar en PrintWriter som kan skriva ut det vi vill ha som svar till klienten. 6 Cookies Med kakor så kan besökarnas individuella önskemål registreras och kommas ihåg En vanlig MEN omdiskuterad teknik I en del webbläsare är kakfunktionen avstängd Cookies är inte en del av HTTP utan en bit data som kan bäddas in i en request | response Från början en Netscape extension Cookies Cookies finns i ett flertal språk I Java finns – javax.servlet.http.Cookie Cookie kaka = new Cookie(name, value); allaSessionensKakor = request.getCookies() PAUS 15 min ODBC - JDBC Open Data Base Connectivity Microsoftstandard för databaskopplingar JDBC framtagen av Javasoft Motsvarigheten för koppplingar från Java En huvudpoäng är interoperabilitet 7 JDBC Gemensamt API Olika drivrutiner java.sql Genom import java.sql.*; så får ni tillgång till klasser för metadata: metadata ResultSet resultSet = statement.executeQuery(”SELECT …”); ResultSetMetaData metaData = resultSet.getMetaData(); MySQL En på Internet mycket vanlig relationsdatabas Finns både i kommersiella och gratisversioner Liten, snabb och stabil Det finns andra mer avancerade databaser 8 Databaskoppling i Java En databaskoppling kan ske enligt: 1. 2. 3. 4. 5. Registrera JDBC-drivrutinen Etablera kontakten med databasen Exekvera en SQL-fråga Bearbeta resultatet av SQL-frågan Koppla ner och stäng Registrera drivrutinen Innan JDBC-drivrutinen kan användas så ska den registreras i stil med: try{ Class.forName("org.gjt.mm.mysql.Driver").newInstance(); } catch (ClassNotFoundException cnfe) { out.println("Couldn’t load database driver: " + cnfe.getMessage()); } (En JDBC-drivrutin är en javaklass nåbar via CLASSPATH) Etablera kopplingen När drivrutinen är laddad går det sedan bra att upprätta en koppling till MySQL genom: jdbc:mysql://SERVER/DATABASE_NAME Vilket i en koppling lokalt till den egna datorn kan se ut enligt: Connection connection = DriverManager.getConnection(”jdbc:mysql://localho st/uppg2d?user=rudolf&password=4477x2w32"); 9 Etablera kopplingen En liten KI-databas ligger nåbar via: Andromeda.dsv.su.se Koppla dig dit enligt: Connection connection = DriverManager.getConnection(” jdbc:mysql://Andromeda.dsv.su.se/kilabuser=**** &password=********"); Exekvera en SQL-fråga När det finns en koppling till databasen så går det sedan bra att köra SQLfrågan: Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery( "SELECT * FROM studenter"); Bearbeta resultatet Klassen ResultSet har två användbara metoder: – – next() previous() while ( resultSet.next() ){ out.println("<tr>"); out.println("<td>"+resultSet.getString(… 10 Koppla ner och stäng out.close(); statement.close(); connection.close(); Mer information finns inne i First Class i 2I1073/MySQL där Ken har lagt upp det ni behöver för Uppgift2d och projektet Java Web Start Ett sätt att starta javaapplikationer på serversidan via en webbläsare: Applikationen packas i en jar-fil Tillsammans med en manifest-fil (som vi gjorde på 2I1049 förra året) Startas genom en JNLP-fil – <jar href="u2e.jar"/> JNLP-filen länkas in från ett XHTML-dokument Java Web Start En enkel JNLP-fil återfinns på: http://dsv.su.se/~miwebb/examination/labbar/Del2/ u2e/u2e.txt Gör sedan den frivilliga Uppgift2e http://dsv.su.se/~miwebb/examination/labbar/Del2/u2 e/uppgift2e.htm Tack för idag! 11