 
                                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!