1 2I1073 Föreläsning 2 Klient - server Klient

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