Java EE -arkkitehtuuri Lipitsäinen Arvo, HAAGA-HELIA 30.8.2007 1
Sisältö Java EE:n historiaa ja kehitystä Java SE Java Standard Edition Java EE Java Enterprise Edition Java EE -kehittämisen roolit Java EE:n komponentit Java EE-sovellusten kehittäminen Java EE 5.0:n osat 2
Java EE:n historiaa ja kehitystä 1990-luvulla Internet ja Web yleiseen käyttöön puuttui Internet-ohjelmointiin sovelias ohjelmointikieli => Sun Microsystems kehitti Javan v. 1995 Appletin (= Java-ohjelma) liittäminen HTMLsivuun web-palvelimessa ja koodin suorittaminen selaimessa herätti mielenkiintoa 3
Java EE:n historiaa... 1997 Servletti mahdollisti Javaohjelman liittämisen web-palvelimeen, pääsyn tietokantoihin ja HTML-sivun tekemisen dynaamisesti Selain HTTP-pyyntö HTML-tiedosto Web-palvelin Servletti Database 4
Java EE:n historiaa... Servletissä on kuitenkin puutteellisuuksia: ei ole skaalautuva vaikea toteuttaa transaktioiden hallintaa..... => 1998 tällaisiin ongelmiin kehitettiin palvelinpään EJB -komponenttiteknologia (Enterprise JavaBeans) 1999 Erilliset Java-tekniikat yhdistettiin J2EE-arkkitehtuuriksi (Java 2 Platform Enterprise Edition) 5
Java EE:n historiaa... J2EE:n käyttö alkoi yleistyä ja ilmestyi uusia J2EE-versioita: J2EE 1.1 vuonna 1999 J2EE 1.2 vuonna 1999 J2EE 1.3 vuonna 2001 J2EE 1.4 vuonna 2003 (lisätty Web Service) Java EE 5.0 huhtikuu 2006 Annotointi (Java 5.0:sta) EJB 3.0 Persistence API JSF, JSTL, AJAX... 6
Javan kehittäminen Java-teknologian kehittäminen tapahtuu JCPyhteisössä (Java Community Process) JCP-yhteisössä on yli 500 yritys tai yksilöjäsentä. Esim. Nokia, IBM, Sun, Oracle JCP-yhteisö kehittää kuvauksia, joiden perusteella toimittajat kehittävät tuotteita 7
Javan versiot Java SE Java Standard Edition Javan työasemaversio ent. J2SE (Java 2 Standard Edition) Java EE Java Enterprise Edition Javan yritysjärjestelmä versio vaatii toimiakseen Java SE:n ent. J2EE (Java 2 Enterprise Edition) Java ME Java Micro Edition - Javan versio pienlaitteisiin (matkapuhelimet, digi-tv-boxit, ym.) ent. J2ME (Java 2 Micro Edition) Java Card toimi-, siru-, SIM-kortit 8
Java Standard Edition Java SE 9
Java Standard Edition Java SE:n kehittyminen: 1991 Java-projektin aloittaminen 1995 23. toukokuuta Javan julkistus 1996 jdk 1.0 (Java Development Kit) 1997 jdk 1.1 1998 jdk 1.2 tai J2SE 1.2 (Java 2 Standard Edition) 1999 jdk 1.3 tai J2SE 1.3 2002 jdk 1.4 tai J2SE 1.4 Java-kieli on säilynyt muuttumattomana 2004 jdk 5.0 tai J2SE 5.0 muutoksia myös Java-kieleen 2006 jdk 1.6 tai Java SE 6 10
JVM - Javavirtuaalikone Ajettava Java-ohjelma, Java tavukoodi, toimii Java virtuaalikoneessa (JVM), joka sisältää Java-tulkin. Ajettava Java-ohjelma voi tulla omalta levyltä tai verkosta JVM tutkii ohjelman, selvittää, mistä se on peräisin, ja antaa ohjelmalle sen mukaan oikeuksia 11
Javan tietoturvaa Luokkalataaja, tavukoodin tarkastaja ja turvallisuusmanageri varmistavat Javan tietoturvaa Javan ydinluokat lataa vakio bootstrap class loader 12
Java SE 6.0 Java SE 6.0 koostuu jo monista osista: 13
Java SE:n osat JDBC - Java Database Connectivity Javan tietokantayhteys Tietokantaohjelmiston mukana tulee JDBC-ajuri, jonka kautta saadaan yhteys tietokantaan Kaikilla merkittävillä tietokantaohjelmistoilla on JDBCyhteys (DB2, Oracle,... ) JDBC:n avulla voidaan kohdistaa SQL-käskyjä tietokantaan JDBC Javaohjelma JDBCajuri Tietokanta 14
Java SE:n osia RMI Remote Method Invocation Java-ohjelma voi kutsua toisessa koneessa olevan Java-ohjelman metodia Javan hajautusmenetelmä RMI-IIOP RMI - Internet InterORB Protocol Java-ohjelma voi kommunikoida Corba-väylän avulla toisessa koneessa olevan Corba-sopivan ohjelman kanssa (esim. C++, Cobol) kone 1 kone 2 olio1 olio2 + metodix ( ) 15
Java SE:n osia JAXP Java API for XML Prosessing XML-dokumenttien käsittely Java-ohjelmassa DOM, SAX, XSLT XML-parserit Networking Java-ohjelma voi muodostaa Internet-yhteyksiä TCP/IP protokollan avulla Swing Javan graafinen käyttöliittymä 16
Java SE:n osia Java SE:n tietoturvapaketit: JCA (Java Cryptography Architecture) digitaalinen allekirjoitus message digest erilaisia salausalgoritmeja (DSA, MD5, SHA-1,...) PKI - julkisen ja salaisen avainten generointi ja säilytys JCE (Java Cryptography Extension) JAAS (Java Authentication and Authorization Service JSSE (Java Secure Socket Extension) ym. 17
Java Enterprise Edition Java EE (aikaisemmin J2EE) 18
Java EE:n rakenne Tietojärjestelmät esitetään kerros-mallina: 3-kerrosmalli: n-kerrosmalli: Java EE:n kerrosmalli: Käyttöliittymäkerros Liiketoimintakerros Tietokerros xxxxx-kerros yyyyyy-kerros zzzz-kerros Asiakaskerros Web-kerros EJB-kerros (liiketoimintalogiikka) EIS-kerros 19
Java EE:n rakenne Asiakaskerros Web-kerros EJB-kerros EIS-kerros HTML browser WML HTTP(S) mobile phone applet SOAP-yhteys RMI-IIOP Web Server Web Container Servlet JSP Servlet JSP JSP JSP RMI Application Server EJB Container EJB EJB EJB EJB EJB Enterprise Information System (EIS) -Legacy -CICS -ERP -... Database application client SOAP-yhteys usein samassa koneessa 20
Java EE-sovellus Java EE-sovellus muodostuu Webmoduleista, EJB-moduleista ja Java-asiakas - moduleista, joita kutakin voi olla 0 n kappaletta Modulit ja myös sovellus ovat palvelimelle asennuskelpoisia yksiköitä Web-modulin komponentit pakataan warloppuiseen tiedostoon, EJB-modulin komponentit jar-loppuiseen tiedostoon ja asiakasmodulin komponentit jar-loppuiseen tiedostoon Itse Java EE-sovellus on pakattu earloppuiseen tiedostoon 21
Java EE-komponentit Application client Graafisella käyttöliittymällä varustettu työasemassa oleva Java-ohjelma Applet Appletti on selaimessa toimiva, graafisella käyttöliittymällä varustettu Java-ohjelma Servlet, JSP Servletit ja JSP-sivut toimivat web container alustalla, voivat vastata web-asiakkaiden httpkutsuihin ja muodostavat usein käyttöliittymänä toimivan HTML-sivun. Voivat myös tehdä XML-tiedoston ja lähettää sen toiselle sovellukselle. Servletti voi tukea Web Services -palveluja SOAP/HTTP protokollan avulla. EJB EJB-komponentit toimivat transaktioiden käsittelyyn kykenevässä EJB Container alustassa, sisältävät Java EE-sovelluksen liiketoimintalogiikkaa ja voivat tarjota suoraan Web Services palveluja. 22
Java EE-kehittämisen roolit 23
Java EE-kehittämisen roolit Java EE:n modulaarinen luonne tuo esiin Java EE järjestelmien kehittämiseen liittyviä rooleja: Java EE-tuotteen (Java EE-alustan) toimittaja Välinetoimittaja Sovelluskomponentin tekijä Sovelluksen kokoaja Sovelluksen asentaja (käyttöönottaja) Sovelluksen hallinnoija Systeemikomponentin tekijä 24
Java EE-tuotteen toimittaja Java EE-tuotteen (alustan) toimittaja on yritys, joka tarjoaa Java EE-tuotetta, joka sisältää komponenttialustat (containerit) ja Java EE:n määrittämien API-rajapintojen ja muiden piirteiden toteutukset Java EE -tuotteen toimittaja on tavallisesti käyttöjärjestelmän, tietokantatuotteen, sovelluspalvelimen tai web-palvelimen toimittaja 25
Java EE-tuotteen toimittaja Java EE-tuotteen toimittajan täytyy sisällyttää tuotteeseensa sovelluskomponenttien tarvitsemat tietoliikenneprotokollat Java EE-tuoteen mukana pitää olla sovellusten asentamiseen ja hallinointiin tarvittavat työkalut ja välineet 26
Välineen toimittaja Välineen toimittaja on yritys tai henkilö, joka tarjoaa välinettä ohjelmistokomponenttien / sovellusten kehittämiseen, pakkaamiseen, kokoamiseen, asentamiseen tai hallinnoimiseen. Tällaisten toimittajien välineet voivat olla riippumattomia Java EE-alustan toimittajasta 27
Sovelluskomponentin tekijä Sovelluskomponentin tekijä on yritys tai henkilö, joka luo Java EE -sovellukseen sovelluskomponentteja. Komponentit voivat olla: EJB-komponentteja Web-komponentteja Stand alone -asiakasohjelmia 28
Sovelluskomponentin tekijä EJB-komponentin tekijä on jonkin sovellusalueen asiantuntija, joka toteuttaa uudelleenkäytettävän EJB-komponentin. EJB-komponentti sisältää tavallisesti liiketoimintatapahtuman käsittelyn Komponentin tekijän ei tarvitse tuntea komponentin teknistä toimintoympäristöä Komponentin tekijä ohjelmoi ja kääntää Javakoodia ja pakkaa ne jar-tiedostoksi 29
Sovelluskomponentin tekijä Web-komponentin tekijä voi olla: Web-käyttöliittymän tekijä, joka suunnittelee ja toteuttaa web-käyttäliittymän html:n avulla XML-muotoisen liittymän tekijä, esim. Web Service tyypin palvelun tekijä Web- / XML liittymässä tarvittavien Javakomponenttien tekijä (tagi-kirjastot, sivuun liitettävät JavaBean-komponentit, servletit) Web-komponentin tekijä tekee HTML-, XMLja/tai JSP-sivut, Java-koodin, asennuskuvaimen ja pakkaa ne war-tiedostoksi 30
Sovelluskomponentin tekijä Java-asiakasohjelman tekijä koodaa stand alone Java-ohjelman ja sen tarvitsemat luokat, kääntää ne.class loppuisiksi tiedostoiksi, tekee asennuskuvaimen ja pakkaa nämä jar-loppuiseksi tiedostoksi. Java-asiakasohjelmissa on usein graafinen käyttöliittymä, esim. Swing-komponenteilla toteutettuna 31
Sovelluksen kokoaja Sovelluksen kokoaja yhdistää Java EE - komponentteja asennuskelpoiseksi Java EEsovellukseksi Hän on sovellusalueen asiantuntija, jolla on asiakkaan näkemys sovellukseen Hänen ei tarvitse tuntea komponenttien ohjelmakoodia, vaan hän käyttää komponenttien asennuskuvaimia, määrittääkseen, miten komponenteista kootaan sovelluksia Hän käyttää graafista työkalua kootessaan sovelluksia 32
Sovelluksen kokoaja Sovelluksen kokoaja kokoaa EJB-komponenttien jar-tiedostoista ja Webkomponenttien war-tiedostoista sekä itse määrittämästään asennuskuvaimesta ear-loppuisen Java EE-sovelluksen 33
Sovelluksen asentaja Sovelluksen asentaja asentaa Java EE-komponentit ja sovellukset toimintaympäristöönsä: hän tuntee toimintaympäristön: palvelimet,... hän käyttää Java EE-alustan kanssa toimitettua asennustyökalua asennustyössään hän asentaa komponentit ja sovellukset Java EE-palvelimelle hän konfiguroi komponentit ja sovellukset päivittämällä asennuskuvaimia ja toteuttaa näin komponentin tekijän tai sovelluksen kokoajan määrittämät ulkoiset riippuvuudet 34
Systeemin hallinnoija Systeemin hallinnoija vastaa yrityksen tietotekniikan ja tietoliikenteen ylläpidosta hän valvoo ja tarkkailee myös asennettujen Java EEsovellusten ajon aikaista toimintaa tähän hänellä on käytettävissään monitorointi- ja hallintatyökaluja 35
Java EE-alustojen toimittajia IBM - WebSphere-palvelinperhe, WebShere Studio sovelluskehitysväline, DB2, Rational XD BeaSys - WebLogic -palvelinperhe Open source - JBoss sov.palvelin, Apache, Tomcat, Eclipse, NetBeans, Ant, JUnit,... Oracle Sun Borland, HP,... 36
Java EE:n komponentit 37
Java EE:n rakenne Asiakaskerros Web-kerros EJB-kerros EIS-kerros HTML browser WML HTTP(S) mobile phone applet SOAP-yhteys RMI-IIOP Web Server Web Container Servlet JSP Servlet JSP JSP JSP RMI Application Server EJB Container EJB EJB EJB EJB EJB Enterprise Information System (EIS) -Legacy -CICS -ERP -... Database application client SOAP-yhteys usein samassa koneessa 38
Asiakaskerros Java EE-asiakas voi olla: - selain + html-sivu, jolla on http-yhteys webkerrokseen - selain + html + Java-appletti - mobiililaite, jolla on esim. http-yhteys webkerrokseen - Stand alone -asiakasohjelma, jolla voi olla RMI-IIOP (Corba) yhteys liiketoiminta- tai EIS - kerrokseen 39
Web-kerros Web-kerros tekee seuraavia asioita: ottaa vastaan asiakkaalta tulevan pyynnön ja tunnistaa (authentication) pyynnön tehneen käyttäjän tunnistuksen perusteella käyttäjä saa mahdollisesti valtuutuksen käyttää sovelluksen resursseja ja palveluja (authorization) palvelun käytön päätteeksi muodostaa selainkäyttöliittymän ja lähettää sen asiakkaalle Web-kerroksen tulee tuntea erilaisten päätelaitteiden ominaisuuksia ottaa vastaan Web Service -konseptin SOAP-sanomia, suorittaa palvelun ja lähettää vastauksena SOAPsanoman 40
Web-kerros Web-kerros koostuu web-palvelimesta ja web containerista ja palvelimelle asennavista webmoduleista. Web-modulit koostuvat: Java EE:n määrittämistä ja containerin hallinnoimista web-komponenteista JSP-sivut servletit modulikohtaisesta asennuskuvaimesta (web.xml) sekä komponenttien käyttämistä Java-luokista, htmldokumenteista, kuva-tiedostoista, XML-dokumenteista, tyylisivuista ym. Web container on osa Java EE-alustaa 41
Web-kerros Käyttäjän palvelupyyntö voi edetä webkerroksesta EJB-kerrokseen EIS-kerroksen resurssien käyttöön (tietokantaa, taustajärjestelmiä) tai/ja käyttää web-kerroksen resursseja (servletit, JSPsivut, ) Käyttöoikeuksien myöntäminen perustuu sovelluksen käyttäjärooleihin, joihin palvelua pyytävä käyttäjä yhdistetään Web-sovellus voi toimia myös ilman, että on osa Java EE-sovellusta ja -alustaa 42
EJB-kerros EJB-kerroksen muodostaa sovelluspalvelin, siinä oleva EJB Container alusta ja EJB Container alustassa toimivat EJB-komponentit (Enterprise JavaBean) EJB-komponentit sisältävät liiketoimintalogiikkaa Container tarjoaa EJB-komponentille palveluja, esim: - komponentin luominen ja tuhoaminen - komponentin elinkaaren hallinta - tietoturvapalveluja - transaktioiden hallinta - tietokantayhteyksien säilyttäminen - asiakkaan ja EJB-komponentin välisen matalan tason tietoliikenteen - EJB-komponentin rekisteröiminen nimipalveluun 43
EJB-kerros Java EE 5.0:ssa on kahdenlaisia EJBkomponentteja: - Session Bean - Message Driven Bean J2EE 1.4:ssa oli kolmas EJB-laji Entity Bean, jolla kuvattiin tietovarastossa säilytettävää tietoa 44
Session Bean -komponentti esittää toimintoa, työn kulkua, liiketoiminta- logiikkaa tai sääntöä. Esim. tilauksen tekemis-logiikka, pankkitapahtumien tekeminen, tiedoston pakkaamistehtävät asiakasohjelma luo Session Bean-instanssin ja sen elinkaari kestää asiakkaan istunnon ajan Session Bean -instanssilla voi olla vain yksi asiakas kun asiakasohjelman viittaus Session Bean - instanssiin katoaa, Session Bean -olio kuolee on kahdenlaisia Session Bean komponentteja: - tilaton (stateless) - tilansa säilyttävä (statefull) 45
Message Driven Bean EJB-arkkitehtuuri sisältää Message Driven Bean komponentin, joka voi ottaa vastaan JMS-sanomia Message Driven Bean komponentista enemmän JMS:n yhteydessä 46
EJB-komponentin rajapinnat Session Bean -komponentin asiakasohjelma on joko - etäasiakas (remote client) tai - paikallinen asiakas (local client) Etäasiakas on eri JVM-koneessa kuin itse komponentti Paikallinen asiakas on samassa JVM-koneessa kuin itse komponentti Asiakasohjelmat eivät kommunikoi suoraan komponenttiolion kanssa vaan kommunikointi tapahtuu rajapintojen kautta 47
EJB-komponentin rajapinnat EJB Server Remote Client Remote business interface EJB Bean Class EJB Container EJB Server Local Client Local business interface EJB Bean Class EJB Container 48
EJB-komponentin toiminta EJB Container 4 Remote Client 6 9 Remote business interface 7 8 Enterprise Bean Beanclass class Bean 3 2 5 1 JNDI - Java Naming and Directory Service Naming Service 49
EJB-komponentin toiminta 1. Kun Java EE-sovellus ja EJB-komponentti asennetaan EJB Container alustaan, Container rekisteröi komponentin nimipalveluun JNDI:n avulla 2. Kun asiakas haluaa käyttää Java EE-sovelluksen komponenttia, asiakas löytää komponentin nimipalvelusta (JNDI:n avulla). 3. Container luo komponentin ilmentymän (olion) 4. Container luo komponentin liiketoimintarajapinnan ilmentymän 5. Container palauttaa asiakkaalle viittauksen komponentin liiketoimintarajapinnan ilmentymään 6. Asiakas kutsuu komponentin liiketoimintametodia rajapinnankautta 7. Container välittää metodikutsun itse komponentille 8. Metodin koodin suorituksen jälkeen Container valittää metodin paluuarvon rajapinnan ilmentymälle 9. Rajapinta palauttaa paluuarvon asiakasohjelmalle 50
EJB-komponentti EJB-komponentti koostuu: - Remote tai Local business -rajapinnasta - Itse komponentti-luokasta - mahdollisista muista luokista Komponenttiin kuuluvat tiedostot pakataan yhteen jakelukelpoiseksi jar-loppuiseksi tiedostoksi (zip-pakkaus) 51
Asennuskuvain J2EE:ssa EJB-komponenttiin kuului XMLmuotoinen asennuskuvain (deployment description), joka ilmaisee mm: komponentin nimen komponentin rajapintaluokkien nimet komponentin tyypin (Session, Entity, MDB) komponentin transaktioiden käsittelytavan CMP:n tallennettavat kentät ja suhdekentät komponentin tietoturvamääritykset komponentin viittaukset muihin komponentteihin komponentin käyttämät ulkoiset resurssit Java EE 5.0:ssa edelliset tiedot ilmaistaan lähdekoodin annotoinneilla 52
Persistence API Java Persistence API sisältää välineet tietovarastossa säilytettävän, pysyvän tiedon hallitsemiseen (persistence) objekti / relaatio muunnoksen tallennettavaa tietoa voidaan käsitellä Javaolioina (POJO) 53
Persistence API Tallennettavien POJO-olioiden kesken voi olla erilaisia suhteita, joita Persistence API hallinnoi : 1 Tilaus n 1 Asiakas n Tilausrivi n 1 Tuote 54
Session Bean/Entity EJB Container POJO EIS Client Session Bean POJO Database POJO Client EJB Container Session Bean Tilauksen käsittely POJO Asiakas POJO Tilaus EIS Database POJO Tuote 55
EJB:n tietoturva Käyttäjä on tunnistettu web- tai asiakaskerroksessa ja saanut valtuutuksen Valtuutustiedot ovat EJB Containerissa EJB-sovellukseen on yhdistetty erilaisia käyttäjärooleja, jotka ovat tallennettu sovelluskohtaiseen asennuskuvaimeen EJB-komponentin metodiin tai koko komponenttiin on yhdistetty rooleja, jotka voivat kutsua metodia. Metodikutsun yhteydessä EJB Container tai ohjelma tutkii, kuuluuko käyttäjä rooliin, jolla on lupa kutsua metodia 56
Java EE-sovellusten kehittäminen 57
Java EE-sovelluskehitys Liiketoiminta Sovelluskehitys Sovelluksen kehittämisprosessi, iterointi Tekniikat Java Java EE Suunnittelumallit UML.NET 58
Java EE:n suunnittelumallit suunnittelumallit ovat hyväksi havaittuja ratkaisuja yleisiin ongelmiin ohjelmistosuunnittelun uudelleenkäyttöä tarjoavat yhteisen sanaston ohjelmiston suunnitteluun 59
MVC-suunnittelumalli Graafisen käyttöliittymän omaavat sovellukset tehdään MVC mallin mukaan Model-osa esittää järjestelmän tietoa View-osa esittää, miten tieto näkyy käyttäjälle. Controller-osa ottaa vastaan käyttäjän syötteet, ohjaa ohjelman kulkua, päivittää mahdollisesti Model-osaa ja valitsee View-osan View User Model Controller 60
MVC Model 2 malli MVC-malli sovellettuna Web-sovellukseen Controller-osana servletti, modell-osana JavaBean komponentti ja view-osana JSP-sivu BROWSER 1 Request 5 Response (Controller) Servlet 3 (View) JSP instantiate 2 4 (Model) JavaBean Application Server Enterprise Servers/ Data Sources Lähde:JavaWord:Understanding JavaServer Pages Model 2 architecture 61
Lähde: Alur,Crupi,Malks. Core J2EE Patterns: Best Practices and Design Strategies. Prentice Hall / Sun Microsystems Press Web-kerros Liiketoimintakerros 62
Java EE:n plussat Avoimmuus: rajapinnat kaikkien saatavilla Hyvin suunniteltu, monipuolinen sovellusalusta Siirrettävyys: Win, Linux, Unix,... Java kattaa lähes koko ICT-kentän Osaajia löytyy Suuri kehittäjäyhteisö Monenlaisia sovellusalustoja ja välineitä Varteenotettavia ilmaisia, open source - välineitä 63
Java EE 5.0 osat 64
Java EE 5.0 65
Java EE 5.0:n osat JSP JavaServer Pages käyttöliittymäkomponentit Servlet EJB 3.0 Enterprise JavaBeans transaktionaaliset liiketoimintakomponentit Java Persistence API tietojen tallennus relaatiotietokantaan object / relaatio -muunnokset JTA Java Transaction API - Container tai sov.komponentti asettaa JTA:n avulla transaktioiden rajat 66
JSTL Java EE 5.0:n osat Java Standard Tag Library JSF Java ServerFaces Web sovellusten kehitysalusta JDBC Java DataBase Connection 67
Java EE 5.0:n osat RMI-IIOP - mahdollistaa RMI- ja Corba -metodikutsut JNDI Java Naming and Directory Interface - pääsy nimi- ja hakemistopalveluun JavaMail voi lähettää sähköpostia JMS Java Message Services - saadaan yhteys luotettavaan sanoman välitysjärjestelmään JCA - J2EE Connector Architecture - Java EE-yhteydet taustajärjestelmiin (yhteyksien poolaus, transaktioiden hallinta, tietoturva, säikeiden hallinta,...) 68
Java EE 5.0:n osat JAXP Java API for XML Parsing - XML-dokumenttien käsittely Javalla Web Services JAX-WS JAX-RPC SAAJ JAXR JMX Java Management Extension - Jáva EE-palvelinten hallinta 69