2I1073 Föreläsning 2 KTH-MI Peter Mozelius Server, servlets och databaskopplingar
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: – –
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 servlet-api.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 servlets – mappning av servlets – CATALINA_HOME\webapps\miwebb\WEB-INF\ server.xml servlet context – 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 Request Header 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() PrintWriter Ö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 Netscape extension Från början en Netscape extension
Cookies Cookies finns i ett flertal språk I Java finns – j avax.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 interoperabilitet En huvudpoäng är interoperabilitet
JDBC Gemensamt API Olika drivrutiner
java.sql metadata 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. Registrera JDBC-drivrutinen 2. Etablera kontakten med databasen 3. Exekvera en SQL-fråga 4. Bearbeta resultatet av SQL-frågan 5. 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 SQL- frå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(" "); out.println(" "+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 – JNLP-filen länkas in från ett XHTML-dokument
Java Web Start En enkel JNLP-fil återfinns på: u2e/u2e.txt u2e/u2e.txt Gör sedan den frivilliga Uppgift2e e/uppgift2e.htm Tack för idag!