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!