Exempel. Föreläsning 6. Innehåll. Fördefinierade variabler. PageContext. Java Server Pages (JSP) DD2390 Internetprogrammering 6 hp

Relevanta dokument
Exempel. Lektion 4. Innehåll. Fördefinierade variabler. PageContext. Java Server Pages (JSP) DD2483 Enterprise Java 6 hp

Innehåll. Föreläsning 3. javax.naming.context. javax.sql.datasource. Vad är JDBC? Java Naming and Directory Interface(JNDI) Viktigaste metoder:

2I1070 Lektion 2 Servlets och databaskopplingar Internetprogrammering 2I1049 Treskiktsarkitektur Klient-server med servlets

F8 Webbteknologier 1. Dynamiska webbsidor

Klientprogrammering mot databaser

Servlets y JSP Fernando Berzal,

Föreläsning 4. Innehåll. Java EE 7 subapi. Java EE. Java EE. DD2390 Internetprogrammering 6 hp

F9 Webbteknologier 1. EDA095 Nätverksprogrammering. Roger Henriksson Datavetenskap Lunds universitet

Internationalisering/lokalisering på webben

FÖRSLAG TILL LÖSNINGAR, TENTAMEN I IKB007 INTERNETPROGRAMMERING MED JAVA, 5p för SY2, , kl

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

Högskolan Dalarna sid 1 av 5 DI-institutionen Hans-Edy Mårtensson Sten Sundin

INTRODUKTION TILL JDBC

Uniform Resource Locator (URL) JavaServer Pages - JSP. Webbklienter. Webbserver. Hypertext Transfer Protocol (HTTP) HTTP Request

Tentamen ITK:P2. Inga hjälpmedel tillåtna förutom penna och papper. Skriv tydligt och texta gärna. 14 st frågor, 70 poäng.

Björn Persson. Komponenter med J2EE. Del 1

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

De ska vara möjligt att separera kod med olika utvecklingsbehov. Det ska vara enkelt att gå från en web-centrerad design till en komponentbaserad

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Tentamen Nätverksprogrammering Lösningsförslag

Vad ska ni göra? ProgramvaruUtveckling för Stora System. Kravförvirring. 9 frågor till prefekten. Christin Lindholm

F10 Webbteknologier. EDA095 Nätverksprogrammering. Roger Henriksson Datavetenskap Lunds universitet

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

DB, DATA, LOGIC, EXPOSURE (WEB)

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

Properties. Användbara metoder som kan anropas i propertychanged:

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

a. Vilka av följande påståenden är riktiga? Observera att felaktigt valda påståenden ger poängavdrag. (4p)

FÖ 07 - JDBC Åtkomst till databaser från applikationer med Java - exempelkod -

Tentamen. DD2385 Programutvecklingsteknik vt Fredagen den 5 juni 2009 kl Inga hjälpmedel utom penna, sudd och linjal

ASP.NET Thomas Mejtoft

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin Micael Karlsson

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Laboration 1 - Grunderna för OOP i Java

ADO.NET Murach Kapitel 17-20

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

ASP.NET MVC. Copyright Mahmud Al Hakim Innehåll

Namn: (Ifylles av student) Personnummer: Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Allmänna anvisningar: Skriv dina svar på svarsblanketten (se nästa sida) Markera och ange alla svar tydligt och entydigt efter instruktionerna.

DAT043 - föreläsning 8

DAT043 - Föreläsning 7

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

DAT043 Objektorienterad Programmering

EDA095 HTML. Per Andersson. April 26, Lund University Innehåll: HTML, CSS, DOM, JavaScript

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Arrayer. results

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

PROV. 13 JSP Standard Tag Library

Tentamen. DD2385 Programutvecklingsteknik vt 2015 Fredagen den 5 juni 2015 kl Hjälpmedel: penna, suddgummi, linjal

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Webbtjänster med API er

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Lösningar för tenta 2 DAT043,

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Laboration 5 - Biblioteksapplikation

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Webbsidor och webbservrar

JAVASCRIPT. Beteende

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Genomgång av tentamen. Databasteknik ITHS 4/3 2016

Föreläsning 14. Filhantering

Sample exam questions. Database exam TIG058

Föreläsnings 9 - Exceptions, I/O

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Objektorienterad programmering med Java, Generics

Exemple på Tentauppgifter Webbprogrammering

Objektorienterad programmering i Java

Föreläsning 2. Länkad lista och iterator

DD2385 Programutvecklingsteknik Några bilder till föreläsning 1 24/ Kursöversikt Javarepetition/Javaintroduktion

Att skriva till och läsa från terminalfönstret

Webbservrar, severskript & webbproduktion

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Transkript:

Exempel Föreläsning 6 <head><title>hälsning</title></head> <h2>välkomstprogram</h2> <form action="slask.jsp"> <p>vad heter du? <input type=text name="namn"> <p><input type=submit value="skicka"> </form> </html> <head><title>hälsning</title></head> <body> <center> <h2>hej =request.getparameter("namn")!!!</h2> </center> </body> </html> DD2390 Internetprogrammering 6 hp Innehåll Java Server Pages (JSP 2.3) Java DataBase Connectivity (JDBC 4.0) Java Naming and Directory Interface (JNDI 1.2) Model-View-Controller (MVC) Fördefinierade variabler request (HTTPServletRequest) response (HTTPServletResponse) out (PrintWriter) session (HTTPSession) application (ServletContext) pagecontext (PageContext) Java Server Pages (JSP) Består av tre delar Inbäddad jsp-kod JavaBönor Tag-bibliotek (JSTL) En jsp-sida är en html-sida med inbäddad javakod som har.jsp suffix. Den inbäddade koden separeras från html med speciella taggar jsp-kod Man har tillgång till hela javas klassbibliotek Vid körning översätts hela jsp-sidan till en servlet och kompileras, detta sker första gången sidan anropas, därefter anropas servlet:en. Nackdel: Många olika JSP-motorer innebär icke standardiserade felmeddelanden (inget radnummer vanligt) PageContext pagecontext.getout(); pagecontext.getrequest(); pagecontext.getresponse(); getservletcontext() (=application scope) getsession() (=session scope) från JspContext findattribute(); getattribute(); removeattribute(); setattribute();

JSP-syntax Direktiv Deklarationer Scriptlets Fördefinierade variabler JSP syntax -Scriptlets Scriptlets används till att exekvera javakodblock Exempel på syntax java kod Vilken syntaxriktig javakod som helst! JSP-syntax - Direktiv Placeras i början av JSP-filen. @ include file= filnamn" Inkluderar den angivna sidan utan att den exekveras @ page errorpage= html/jsp filnamn" Returnerar den definierade sidan om ett fel inträffar i JSP-koden Exempel: @ page errorpage= error.html @ page import= package name(s) Definierar paketen som ska importeras för koden Exempel: @ page import= java.io.*,java.util.* Skillnaden mellan! och Sidglobala varibler kan och bör deklareras inom!... taggar dvs:! String s1 = hej ; <HR> = s1 Då JSP-sidor kompileras om till servlets blir kod inom deklarationer till instansvariabler/instansmetoder Scriptlets till lokal kod i doget, dopost etc. JSP syntax - Deklarationer Exempel Deklarationer är till för att definiera instansvariabler och instansmetoder, hela jspsidan kan betraktas som ett objekt. Placeras innanför! taggar <head><title>exempel 1</title></head> <body><center>! public int utfall; public void kasta(){ utfall = 1 + (int)(math.random()*6); <h2>tärningskast</h2> kasta(); Tärningens utfall: =utfall <form><input type=submit value="kasta"></form> </center></body></html> <head><title>exempel 2</title></head> <body><center>! class Dice { public int utfall; public void kasta(){ utfall = 1 + (int)(math.random()*6); <h2>tärningskast</h2> Dice d = new Dice(); d.kasta(); Tärningens utfall: =d.utfall <form><input type=submit value="kasta"></form> </center></body></html>

Javabönor Hitills har vi adderat jsp-kod till html-sidorna vilket har några nackdelar: det blir snabbt oöverskådligt och svårt att felsöka webbdesignern måste kunna Java Man önskar separera presentation (html) från logik (t e x jsp) vilket kan åstadkommas med javabönor. En javaböna är identiskt med en vanlig javaklass men följer JavaBean designmönster: public konstruktor utan argument publika set och get metoder för att sätta/läsa egenskaper Exempel: JSP/JavaBean @ page import="java.util.arraylist" <jsp:usebean class="bean.forum" id="forum" scope="application"/> <jsp:usebean class="bean.user" id="user" scope="session"/> <jsp:usebean class="bean.post" id="post" scope="request"/> <jsp:setproperty name="forum" property="*"/> <jsp:setproperty name="user" property="*"/> <jsp:setproperty name="post" property="*"/> if(session.isnew()){ <h1>ny session!</h1> <form> Nickname<input type="text" name="nickname"><br> Email<input type="text" name="email"> if(request.getparameter("email")!=null){ <h1>ny användare</h1> <form> Text: <input type="text" name="text"> Fördefinierade JavaBean taggar jsp:usebean tag används för att referera till en javabean på en JSPsida, syntax: <jsp:usebean id = valbart namn att referera till bönan scope = page request session application class = namnet på.classfilen /> scope (räckvidd): page/request: bönan är sidglobal session: Om bönan är skapad återanvänds den, om inte skapas den och sparas i HTTP-sessionsobjektet application: webbserverns livscykel För att sätta en egenskap används setproperty <jsp:setproperty name= tidigare valt namn att referera till bönan" property= instansvariabel *"> För att läsa en egenskap används getpropery <jsp:getproperty name="tidigare valt namn att referera till bönan" property= instansvariabel(oftast)"> Exempel: JSP/JavaBean if(request.getparameter("text")!=null){ <h1>nytt inlägg</h1> post.setnickname(user.getnickname()); forum.addpost(post); ArrayList posts = forum.getposts(); for(int i = 0; i < posts.size(); i++){ post = (bean.post)posts.get(i); <b>=post.gettext()</b><br> <i>=post.getnickname()</i><br> <form> Text: <input type="text" name="text"> <head><title>exempel 3</title></head> <body> <center> <jsp:usebean class="bean.dicebean" id="db" scope="session"/> db.kasta(); <h2>tärningskast</h2> Tärningens utfall:<p> <img src="<jsp:getproperty name="db" property="utfall"/>.gif"> <form><input type=submit value="kasta"></form> </center> </body> </html> Exempel package bean; public class DiceBean{ private int utfall; public DiceBean(){ public void kasta(){ utfall = 1 + (int)(math.random()*6); public int getutfall(){ return utfall; JDBC Ett API för att kommunicera med databaser från javaapplikationer JDBC API:t är en del av JDK som arbetar mot den databasdrivrutin som finns konfigurerad sedan tidigare Typer av drivrutiner SimpleDataSource ConnectionPoolDataSource XADataSource Använd inte DriverManager.getConnection() utan slå upp datakällan via JNDI. Relevanta paket: java.sql javax.sql

javax.sql.datasource En abstraktion av DB-drivrutinen, liknande DriverManager men erhåller en referens till DBdrivrutinen via JNDI, p s s slipper man DBspecifik kod. Datasource är ett Interface och implementeras av Driverförsäljaren, finns tre kategorier av dessa Man får normalt tag på ett Datasource objekt genom en JNDI-uppslagning. Är en abstraktion av drivrutinen som placeras under tomcat/lib och konfigureras i tomcat/conf/context.xml JDBC - klasserna Dessa tre klasser är viktigast att känna till i JDBC: Connection Statement (PreparedStatement) ResultSet Typer javax.sql.datasource Vanlig simpel Identisk med DriverManager javax.sql.connectionpooldatasource Stödjer Connection pooling javax.sql.xadatasource Distribuerad och stödjer Connection pooling DatabasURL:er URL:en bidrar med nödvändig information Signalerar att det är en DB-URL Identifierar databasens sub-protokoll Lokaliserar databasen Generell syntax jdbc : <driverns sub-protokoll> : <db sökvägen> JDBC Arkitekturen Java applikation Skapad av Java utvecklaren Alla anrop till databasen enligt JDBC API:t JDBC API Tillhandahållen av JavaSoft Fungerar som länk mellan applikationen och drivrutinen JDBC drivrutinen Tillhandahållen av DB företaget eller tredje part Konverterar JDBC kod till DB specifika databaskommandon Exempel på DatabasURL:er ODBC Datakälla jdbc:odbc:test PostgreSQL Databas jdbc:postgresql://pgsql0.nada.kth.se:5432/stene mysql datakälla (egen db) jdbc:mysql://localhost:3306/test mysql datakälla (nada) jdbc:mysql://mysql-vt2015.csc.kth.se:3306/stene Titta i tomcat/conf/context.xml

Java Naming and Directory Interface(JNDI) För att distribuerade applikationers komponenter skall kunna hitta varandra behövs någon tjänst som hjälper till med detta, en s k namngivningstjänst (Naming Service) JNDI mappar namn mot objekt (jämför med DNS). JNDI är ett interface som är beroende av en underliggande implementation t.ex. LDAP för att fungera JNDI använder ett fåtal objekt, främst Context & InitialContext Ett Context objekt har metoder för att binda namn till objekt, lista existerande namn, ta bort och döpa om package bean; import java.util.arraylist; import java.sql.*; import javax.naming.*; import javax.sql.*; public class ForumDB{ private Connection conn; Exempel: JDBC public ForumDB(){ Context initctx = new InitialContext(); Context envctx = (Context) initctx.lookup("java:comp/env"); DataSource ds = (DataSource)envCtx.lookup("jdbc/db"); Connection conn = ds.getconnection(); catch(namingexception e){ javax.naming.initalcontext root-context som kan innehålla objekt och andra Context Startpunkten för en JNDI-uppslagning Exempel: JDBC public void close(){ conn.close(); javax.naming.context Viktigaste metoder: void bind(string stringname, Object object) void unbind(string name) void rebind(string name, Object obj) void rename(string oldname, String newname) Object lookup(string stringname) NamingEnumeration list(string name) NamingEnumeration listbindings(string name) public void addpost(post p){ Statement stmt = null; ResultSet rs = null; String query = null; int id = 0; stmt = conn.createstatement(); rs = null; query = "select max(id)+1 as id from posts"; rs = stmt.executequery(query); if(rs.next()) id = rs.getint("id"); rs.close(); Exempel: JDBC query = "insert into posts values(?,?,?)"; PreparedStatement pstmt = conn.preparestatement(query); pstmt.setint(1,id); pstmt.setstring(2,p.gettext()); pstmt.setstring(3,p.getnickname()); int tupler = pstmt.executeupdate();

Exempel: JDBC Designmönster public ArrayList getposts(){ ArrayList list = new ArrayList(); Statement stmt = conn.createstatement(); ResultSet rs = null; String query = "select * from posts"; rs = stmt.executequery(query); while(rs.next()){ Post p = new Post(); p.settext(rs.getstring("text")); p.setnickname(rs.getstring("nickname")); list.add(p); return list; Omedvetet eller ej har ni hittils oberoende av designmönster haft ungefär följande 1. Hantera inkommande HTTP-request 2. Instansiera objekt och / eller anropa metoder i dessa / redan befintliga objekt 3. Generera HTTP-response Servlets är bra på (1), JavaBeans på (2) och JSP-sidor är lämpliga för (3) Model - 1 Model 2 (MVC) Den metod vi främst använt hittils I JSP-sidan blandas presentation (View) och validering av input (Control) En eller flera JavaBönor innehåller datastrukturen (Model) Ibland används inte ens JavaBönor och då blir koden mycket rörig. Designmål: Separera Datastruktur (Model) Presentation (View) Validering av input (Control) Designproblem En Servlet är lämplig för att hantera logik men olämplig för att hantera presentation p g a att all HTML läggs inuti Java-kod. En JSP-sida är lämplig för att hantera presentation men olämplig för att hantera logik p g a att all Java-kod hamnar i en HTML-kod. Exempel: MVC Model (JavaBönor) Forum.java (application scope) User.java (session scope) Post.java (request scope / page scope) View (JSP-sidor) forum_index.html forum_view.jsp Controller (Servlet) ForumController.java

ForumController.java import java.io.*; import javax.servlet.servletcontext; import javax.servlet.requestdispatcher;// ny import javax.servlet.servletexception; // ny import javax.servlet.http.*; import java.util.arraylist; public class ForumController extends HttpServlet { public void doget(httpservletrequest request,httpservletresponse response) throws IOException{ PrintWriter out = response.getwriter(); ServletContext sc = getservletcontext(); if(sc.getattribute("forum")==null){ sc.setattribute("forum", new bean.forum()); ForumController.java if(request.getparameter("text")!=null){ bean.user u = (bean.user)session.getattribute("user"); bean.forum f = (bean.forum)sc.getattribute("forum"); bean.post p = new bean.post(); p.settext(request.getparameter("text")); p.setnickname(u.getnickname()); f.addpost(p); RequestDispatcher rd = sc.getrequestdispatcher("/forum_view.jsp"); rd.forward(request, response); catch(servletexception e){ out.println(e.getmessage()); out.close(); ForumController.java HttpSession session = request.getsession(); if(session.isnew()){ session.setattribute("user", new bean.user()); RequestDispatcher rd = sc.getrequestdispatcher("/forum_index.html"); rd.forward(request, response); catch(servletexception e){ out.println(e.getmessage()); Forum_index.html <head><title>forum (inloggning)</title></head> <body> <form action="/forumcontroller"> Nickname<input type="text" name="nickname"><br> Email<input type="text" name="email"><br> </body> </html> ForumController.java if(request.getparameter("email")!=null){ bean.user u = (bean.user)session.getattribute("user"); u.setnickname(request.getparameter("nickname")); u.setemail(request.getparameter("email")); RequestDispatcher rd = sc.getrequestdispatcher("/forum_view.jsp"); rd.forward(request, response); catch(servletexception e){ out.println(e.getmessage()); Forum_view.jsp @ page import="java.util.arraylist" <head><title>forum (visa)</title></head><body> bean.forum f = (bean.forum)pagecontext.getservletcontext().getattribute("forum"); bean.user u = (bean.user)pagecontext.getsession().getattribute("user"); bean.post p; <h4>= u.getnickname() (= u.getemail() )</h4> ArrayList posts = f.getposts(); for(int i = 0; i < posts.size(); i++){ p = (bean.post)posts.get(i); <b> =p.gettext() </b><br> <i> =p.getnickname() </i><br> <form action="/forumcontroller"> Text<input type="text" name="text"><br> </body></html>

web.xml <servlet> <servlet-name>forumcontroller</servlet-name> <servlet-class>forumcontroller</servlet-class> </servlet> <servlet-mapping> <servlet-name>forumcontroller</servlet-name> <url-pattern>/forumcontroller</url-pattern> </servlet-mapping>