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 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 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 servlet-api.jar I Windows under kontrollpanelen/miljövariabler 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 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); } 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. 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 JDBC Gemensamt API Olika drivrutiner java.sql Genom import java.sql.*; så får ni tillgång till klasser för 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 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"); 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(… 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!