SlideShare une entreprise Scribd logo
1  sur  226
Apache Sling
gjør webutvikling moro igjen
Agenda
1. Hva er Apache Sling?
2. Hva er Java Content Repository (JCR)?
3. Kort om OSGi
4. Kort om REST
5. Sentrale konsepter i Apache Sling
6. Demo: Blogg-applikasjon
7. Er Apache Sling noe for deg?

                     2
vidar@idium.no




      3
vidar@idium.no

• Utvikler i Idium AS



                        3
vidar@idium.no

• Utvikler i Idium AS
• Bygger et produkt basert på Apache Sling


                     3
vidar@idium.no

• Utvikler i Idium AS
• Bygger et produkt basert på Apache Sling
• Committer til Apache Sling-prosjektet

                     3
Hva er Apache Sling?




         4
Hva er Apache Sling?
• “the simplest device for
  delivering content very
  fast”




                     4
Hva er Apache Sling?
• “the simplest device for
  delivering content very
  fast”




                     4
Hva er Apache Sling?
• “the simplest device for
  delivering content very
  fast”
• Web-rammeverk dedikert
  til Java Content Repository
  (JCR)




                     4
Hva er Apache Sling?
• “the simplest device for
  delivering content very
  fast”
• Web-rammeverk dedikert
  til Java Content Repository
  (JCR)
• Open source fra Apache
  Software Foundation

                     4
Sling-plattformen




        5
Sling-plattformen
• bygd på JCR
• basert på REST
• drevet av OSGi



                   5
OSGi         REST




       JCR




        6
OSGi         REST




       JCR




        6
Java Content Repository




           7
Java Content Repository
•   JCR 1.0: JSR-170
    JCR 2.0: JSR-283




                       7
Java Content Repository
•   JCR 1.0: JSR-170
    JCR 2.0: JSR-283




                       7
Java Content Repository
•   JCR 1.0: JSR-170
    JCR 2.0: JSR-283

•   Hierarkisk database




                          7
Java Content Repository
•   JCR 1.0: JSR-170
    JCR 2.0: JSR-283

•   Hierarkisk database

    •   Noder og attributter




                               7
Java Content Repository
•   JCR 1.0: JSR-170
    JCR 2.0: JSR-283

•   Hierarkisk database

    •   Noder og attributter

    •   Rike datatyper




                               7
JCR-implementasjoner
•   Apache Jackrabbit          •   IBM FileNet P8

•   Oracle XML DB              •   Xythos Repository

•   exo Platform               •   Alfresco ECM

•   Microsoft Sharepoint       •   Interwoven Repository

•   OpenText LiveLink          •   IBM CM

•   Day CRX                    •   EMC Documentum



                           8
JCR-implementasjoner
•   Apache Jackrabbit          •   IBM FileNet P8

•   Oracle XML DB              •   Xythos Repository

•   exo Platform               •   Alfresco ECM

•   Microsoft Sharepoint       •   Interwoven Repository

•   OpenText LiveLink          •   IBM CM

•   Day CRX                    •   EMC Documentum

                               •   OpenJCR (java.net)
                           8
JCR-implementasjoner
•   Apache Jackrabbit          •   IBM FileNet P8

•   Oracle XML DB              •   Xythos Repository

•   exo Platform               •   Alfresco ECM

•   Microsoft Sharepoint       •   Interwoven Repository

•   OpenText LiveLink          •   IBM CM

•   Day CRX                    •   EMC Documentum

                               •   OpenJCR (java.net)
                           8
JCR-applikasjoner
•   Oracle Portal     •   Enonic Vertical Site   •   IBM Workplace
                                                     Web Content
•   BEA Portal        •   Hippo CMS                  Management


•   JBoss Portal      •   jLibrary               •   Day Communiqué


•   JBoss DNA         •   Magnolia CMS           •   Apache James


•   Sun OpenPortal    •   Drools                 •   Alfresco ECMS


•   Fast Enterprise   •   BEA WebLogic           •   Idium Web (snart!)
    Search                Portal




                                9
JSR-170

JSR-170


❝    The API should be a standard,
     implementation independent way to
     access content bi-directionally on a
     granular level to a content repository”




                   10
JSR-170

JSR-170


❝    The API should be a standard,
     implementation independent way to
     access content bi-directionally on a
     granular level to a content repository”




                   10
Java Content Repository




           11
Java Content Repository
      Database        Filsystem




                 11
Java Content Repository
      Database                  Filsystem



                      Lese-
                      tilgang



                 Skrive-
                  tilgang




                      11
Java Content Repository
                      Database                      Filsystem


                et              ur
        Integrit      Strukt
                                          Lese-
                                          tilgang



   Spør rin
            g   er
                     Trigger
                            e        Skrive-
                                      tilgang




                                          11
Java Content Repository
                      Database                      Filsystem


                et              ur
        Integrit      Strukt                                       i
                                          Lese-           Hierark              s–
                                                                       Tilgang
                                          tilgang                       kontrol
                                                                                l




   Spør rin
            g   er
                     Trigger
                            e        Skrive-              Låsing        Binær -
                                      tilgang                             data




                                          11
Java Content Repository
                      Database                                 Filsystem


                et              ur
        Integrit      Strukt                                                  i
                                                Lese-                Hierark              s–
                                                                                  Tilgang
                                                tilgang                            kontrol
                                                                                           l




   Spør rin
            g   er
                     Trigger
                            e              Skrive-                   Låsing        Binær -
                                            tilgang                                  data




                                     Java Content Repository


                                                11
Java Content Repository
                      Database                                 Filsystem


                et              ur
        Integrit      Strukt                                                  i
                                                Lese-                Hierark              s–
                                                                                  Tilgang
                                                tilgang                            kontrol
                                                                                           l




   Spør rin
            g   er
                     Trigger
                            e              Skrive-                   Låsing        Binær -
                                            tilgang                                  data




                                     Java Content Repository


                                                12
Java Content Repository
                      Database                                 Filsystem




  But wait,
                et              ur
        Integrit      Strukt                                                  i
                                                Lese-                Hierark              s–
                                                                                  Tilgang
                                                tilgang                            kontrol
                                                                                           l




   Spør rin
            g   er
                     Trigger
                            e              Skrive-                   Låsing        Binær -
                                            tilgang                                  data




there’s more!
                                     Java Content Repository


                                                12
Java Content Repository
                      Database                                 Filsystem


                et              ur
        Integrit      Strukt                                                  i
                                                Lese-                Hierark              s–
                                                                                  Tilgang
                                                tilgang                            kontrol
                                                                                           l




   Spør rin
            g   er
                     Trigger
                            e              Skrive-                   Låsing        Binær -
                                            tilgang                                  data




                                     Java Content Repository


                                                12
Java Content Repository
                      Database                                 Filsystem


                et              ur
        Integrit      Strukt                                                  i
                                                Lese-                Hierark              s–
                                                                                  Tilgang
                                                tilgang                            kontrol
                                                                                           l




   Spør rin
            g   er
                     Trigger
                            e              Skrive-                   Låsing        Binær -
                                            tilgang                                  data




                                     Java Content Repository


                                                13
Java Content Repository
                                 Database                                        Filsystem


                 et                       ur
         Integrit                Strukt                                                               i
                                                                   Lese-                     Hierark                s–
                                                                                                            Tilgang
                                                                   tilgang                                   kontrol
                                                                                                                     l




   Spør rin
            g   er
                               Trigger
                                      e                       Skrive-                        Låsing          Binær -
                                                               tilgang                                         data




          st-
  Fulltek                                                                                                          PI
      søk                                                                                                   Java A
                                                  ne   ring                           ølge
                                           Versjo                            Rekkef

                             uktur
                     Fri str
                                                                 Multi-                         Event-
                                                                                                        r
                                                                  value                         listene



                                                Java Content Repository


                                                                   13
Hvordan ser et repository ut?




              14
Hvordan ser et repository ut?
                                                                             Rotnode
                                                                          Attribute
                                                                          Attribute



                              Name:            Produkter                                      Name:         Nyheter
                              lastUpdate:      09-09-2009                                     lastUpdate:   09-09-2009



Name:     Gressklipper                      Name:              Hurtigmikser                  Name:          Nettsted lansert
                                                                                       ...                                     ...
price:    4600.00                           price:             699.00                        lastUpdate:    09-09-2009
                                            colour:            white                         summary:       Velkommen ...
                                                                                             body:          Sist fredag...
                                                                                                            vidar@idium.no
                                                                                             authors:
                                                                                                            elgar@idium.no
Name:     Bråker mye             Name:                Styr unna                ...
author:   jens@gmail.com         author:              jens@gmail.com
body:     Klipper pent, ...      body:                Denne er ikke ...                       Name:         portrett.jpg
stars:    4                      stars:               1                                       lastUpdate:   09-09-2009
                                                                                              jcr:content   [binærdata]




                                                                  14
Hvordan ser et repository ut?
                                                                             Rotnode
                                                                          Attribute
                                                                          Attribute



                              Name:            Produkter                                      Name:         Nyheter
                              lastUpdate:      09-09-2009                                     lastUpdate:   09-09-2009



Name:     Gressklipper                      Name:              Hurtigmikser                  Name:          Nettsted lansert
                                                                                       ...                                     ...
price:    4600.00                           price:             699.00                        lastUpdate:    09-09-2009
                                            colour:            white                         summary:       Velkommen ...
                                                                                             body:          Sist fredag...
                                                                                                            vidar@idium.no
                                                                                             authors:
                                                                                                            elgar@idium.no
Name:     Bråker mye             Name:                Styr unna                ...
author:   jens@gmail.com         author:              jens@gmail.com
body:     Klipper pent, ...      body:                Denne er ikke ...                       Name:         portrett.jpg
stars:    4                      stars:               1                                       lastUpdate:   09-09-2009
                                                                                              jcr:content   [binærdata]




                                                                  14
Hello, World!




      15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;




                                   15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);




                                    15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);

// Opprette innhold                                        jcr:root
Node root = session.getRootNode();




                                    15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);

// Opprette innhold                                        jcr:root
Node root = session.getRootNode();
Node jz = root.addNode(“javazone”);                        javazone




                                    15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);

// Opprette innhold                                        jcr:root
Node root = session.getRootNode();
Node jz = root.addNode(“javazone”);                        javazone
Node demo = jz.addNode(“demo”);
                                                            demo




                                    15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);

// Opprette innhold                                               jcr:root
Node root = session.getRootNode();
Node jz = root.addNode(“javazone”);                              javazone
Node demo = jz.addNode(“demo”);
demo.setProperty(“message”, “Hello, World!”);                      demo
                                                                     Hello,
                                                           message
                                                                     World!




                                    15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);

// Opprette innhold                                               jcr:root
Node root = session.getRootNode();
Node jz = root.addNode(“javazone”);                              javazone
Node demo = jz.addNode(“demo”);
demo.setProperty(“message”, “Hello, World!”);                      demo
session.save();                                                      Hello,
                                                           message
                                                                     World!




                                    15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);

// Opprette innhold                                               jcr:root
Node root = session.getRootNode();
Node jz = root.addNode(“javazone”);                              javazone
Node demo = jz.addNode(“demo”);
demo.setProperty(“message”, “Hello, World!”);                      demo
session.save();                                                      Hello,
                                                           message
                                                                     World!

// Hente innhold
Node node = root.getNode(“javazone/demo”);




                                    15
Hello, World!
import javax.jcr.*;
import org.apache.jackrabbit.core.TransientRepository;

// Logge inn
Repository repository = new TransientRepository();
Session session = repository.login(brukernavn, passord);

// Opprette innhold                                               jcr:root
Node root = session.getRootNode();
Node jz = root.addNode(“javazone”);                              javazone
Node demo = jz.addNode(“demo”);
demo.setProperty(“message”, “Hello, World!”);                      demo
session.save();                                                      Hello,
                                                           message
                                                                     World!

// Hente innhold
Node node = root.getNode(“javazone/demo”);
print(node.getProperty(“message”).getString());



                                    15
Innhold først,
struktur senere




       16
Innhold først,
          struktur senere
•   JCR gjør det mulig å lagre data fritt strukturert

    •   Trenger ikke sette opp tabeller med felter




                          16
Innhold først,
          struktur senere
•   JCR gjør det mulig å lagre data fritt strukturert

    •   Trenger ikke sette opp tabeller med felter

•   Restriksjoner kan innføres etterhvert




                          16
Innhold først,
          struktur senere
•   JCR gjør det mulig å lagre data fritt strukturert

    •   Trenger ikke sette opp tabeller med felter

•   Restriksjoner kan innføres etterhvert

•   Hierarki vil ofte være tilstrekkelig struktur
    – unngå referanser på tvers av hierarkiet



                          16
Blogg-applikasjon




        17
Blogg-applikasjon
RDBS-modell:
     Blog       Post
   blogId   blogId*
   author   postId
            title
            text
            date




                       17
Blogg-applikasjon
         RDBS-modell:
                   Blog            Post
                 blogId        blogId*
                 author        postId
                               title
                               text
                               date



                              post blog
id        name       author               title          text
                               Id   Id
                                          First        Intet mer
 1    Vidars blogg   Vidar     1     1
                                          post!          å ...

 2        ...         ...      2     1     ...            ...


...       ...         ...     ...   ...    ...            ...




                                                  17
Blogg-applikasjon
         RDBS-modell:
                   Blog            Post
                 blogId        blogId*
                 author        postId
                               title
                               text
                               date
                               image


                              post blog
id        name       author               title          text      image
                               Id   Id
                                          First        Intet mer
 1    Vidars blogg   Vidar     1     1                             NULL
                                          post!          å ...

 2        ...         ...      2     1     ...            ...      NULL


...       ...         ...     ...   ...    ...            ...      NULL




                                                  17
Blogg-applikasjon
         RDBS-modell:
                   Blog            Post                  Attachment
                 blogId        blogId*                  attachmentId
                 author        postId                   postId*
                               title                    filename
                               text
                               date



                              post blog                                attach
id        name       author               title          text                 postId       title
                               Id   Id                                 mentId
                                          First        Intet mer
 1    Vidars blogg   Vidar     1     1                                   1      1      feriebilde.jpg
                                          post!          å ...

 2        ...         ...      2     1     ...            ...            2      1           ...


...       ...         ...     ...   ...    ...            ...           ...    ...          ...




                                                  17
Blogg-applikasjon
JCR-modell:




              18
Blogg-applikasjon
JCR-modell:

                          Vidars blogg
                          author: Vidar


              First post                 Second p..
          text: Intet mer å...        text: ...
          date: 08-09-2009            date: ...




                                 18
Blogg-applikasjon
JCR-modell:

                           Vidars blogg
                           author: Vidar


              First post                 Second p..
          text: Intet mer å...        text: ...
          date: 08-09-2009            date: ...




               feriebilde.jpg
              jcr:data: ...




                                 18
Blogg-applikasjon
JCR-modell:

                           Vidars blogg
                           author: Vidar


              First post                 Second p..
          text: Intet mer å...        text: ...
          date: 08-09-2009            date: ...




               feriebilde.jpg
              jcr:data: ...




                                 18
Blogg-applikasjon
JCR-modell:

                           Vidars blogg
                           author: Vidar


              First post                 Second p..
          text: Intet mer å...        text: ...
          date: 08-09-2009            date: ...




               feriebilde.jpg
              jcr:data: ...




                                 18
Moral
Innhold først,
strukturere
senere



        19
Moral
Innhold først,
strukturere
senere
– kanskje.


        19
OSGi         REST




       JCR




       20
OSGi         REST




       JCR




       20
The Dynamic

OSGi   Module System
          for Java




 21
The Dynamic

                      OSGi             Module System
                                          for Java


•   Open Services Gateway initiative




                            21
The Dynamic

                       OSGi                  Module System
                                                for Java


•   Open Services Gateway initiative

•   Funksjonalitet (kode) pakkes i bundler




                             21
The Dynamic

                       OSGi                      Module System
                                                    for Java


•   Open Services Gateway initiative

•   Funksjonalitet (kode) pakkes i bundler

    •   En bundle kan startes, stoppes, oppgraderes run-time
        (hot-deploy)




                             21
The Dynamic

                       OSGi                      Module System
                                                    for Java


•   Open Services Gateway initiative

•   Funksjonalitet (kode) pakkes i bundler

    •   En bundle kan startes, stoppes, oppgraderes run-time
        (hot-deploy)

    •   Bundler kan ha avhengigheter til andre bundler




                              21
The Dynamic

                        OSGi                       Module System
                                                      for Java


•   Open Services Gateway initiative

•   Funksjonalitet (kode) pakkes i bundler

    •   En bundle kan startes, stoppes, oppgraderes run-time
        (hot-deploy)

    •   Bundler kan ha avhengigheter til andre bundler

    •   En bundle eksporterer gitte java-pakker til andre
        pakker


                               21
Standard Java-pakkemodell



class Package1.ImplClass

private String something;

public getSomething()




                            22
Standard Java-pakkemodell
Package1




class Package1.ImplClass

private String something;

public getSomething()




                            22
Standard Java-pakkemodell
Package1


public class
Package1.ClassB

public void doSomething()
{
   ImplClass some =
    new ImplClass();
   some.getSomething();
}

class Package1.ImplClass

private String something;

public getSomething()




                            22
Standard Java-pakkemodell
Package1


public class
Package1.ClassB

public void doSomething()
{
   ImplClass some =
    new ImplClass();
   some.getSomething();
}

class Package1.ImplClass

private String something;

public getSomething()




                            22
Standard Java-pakkemodell
Package1                    Package2


public class                public class
Package1.ClassB             Package2.ClassA

public void doSomething()
                            public void accessIt()
{
                            {
   ImplClass some =
                            new Package1.PublicClass();
    new ImplClass();
                            new Package1.ImplClass();
   some.getSomething();
}
                            }

class Package1.ImplClass

private String something;

public getSomething()




                                 22
Standard Java-pakkemodell
Package1                    Package2


public class                public class
Package1.ClassB             Package2.ClassA

public void doSomething()
                            public void accessIt()
{
                            {
   ImplClass some =
                            new Package1.PublicClass();
    new ImplClass();
                            new Package1.ImplClass();
   some.getSomething();
}
                            }

class Package1.ImplClass

private String something;

public getSomething()




                                 22
Standard Java-pakkemodell
Package1                    Package2


public class                public class
Package1.ClassB             Package2.ClassA

public void doSomething()
                            public void accessIt()
{
                            {
   ImplClass some =
                            new Package1.PublicClass();
    new ImplClass();
                            new Package1.ImplClass();
   some.getSomething();
}
                            }

class Package1.ImplClass

private String something;

public getSomething()




                                 22
OSGi bundles
Package1                    Package2

public class                public class
Package1.ClassB             Package2.ClassA

public void doSomething()
{
   ImplClass some =         public void accessIt()
    new ImplClass();        {...
   some.getSomething();     }
}


class Package1.ImplClass

private String something;

public getSomething()




                                              23
OSGi bundles
MyBundle.jar
  Package1                     Package2

   public class                public class
   Package1.ClassB             Package2.ClassA

   public void doSomething()
   {
      ImplClass some =         public void accessIt()
       new ImplClass();        {...
      some.getSomething();     }
   }


   class Package1.ImplClass

   private String something;

   public getSomething()




                                                 23
OSGi bundles
MyBundle.jar         [exports Package2]

  Package1                     Package2

   public class                public class
   Package1.ClassB             Package2.ClassA

   public void doSomething()
   {
      ImplClass some =         public void accessIt()
       new ImplClass();        {...
      some.getSomething();     }
   }


   class Package1.ImplClass

   private String something;

   public getSomething()




                                                 23
OSGi bundles
MyBundle.jar         [exports Package2]                 YourBundle
  Package1                     Package2

   public class                public class
   Package1.ClassB             Package2.ClassA

   public void doSomething()
   {
      ImplClass some =         public void accessIt()
       new ImplClass();        {...
      some.getSomething();     }
   }


   class Package1.ImplClass

   private String something;

   public getSomething()




                                                 23
OSGi bundles
MyBundle.jar         [exports Package2]                 YourBundle
  Package1                     Package2                  PackageX

   public class                public class              public class
   Package1.ClassB             Package2.ClassA           PackageX.SomeClass
   public void doSomething()
   {
      ImplClass some =         public void accessIt()
       new ImplClass();        {...                      import Package2;
      some.getSomething();     }                         import Package1;
   }
                                                         public void foo()
   class Package1.ImplClass
                                                         {
                                                         ...
   private String something;                             }

   public getSomething()




                                                 23
OSGi bundles
MyBundle.jar         [exports Package2]                 YourBundle
  Package1                     Package2                  PackageX

   public class                public class              public class
   Package1.ClassB             Package2.ClassA           PackageX.SomeClass
   public void doSomething()
   {
      ImplClass some =         public void accessIt()
       new ImplClass();        {...                      import Package2;
      some.getSomething();     }                         import Package1;
   }
                                                         public void foo()
   class Package1.ImplClass
                                                         {
                                                         ...
   private String something;                             }

   public getSomething()




                                                 23
OSGi bundles
MyBundle.jar         [exports Package2]                 YourBundle
  Package1                     Package2                  PackageX

   public class                public class              public class
   Package1.ClassB             Package2.ClassA           PackageX.SomeClass
   public void doSomething()
   {
      ImplClass some =         public void accessIt()
       new ImplClass();        {...                      import Package2;
      some.getSomething();     }                         import Package1;
   }
                                                         public void foo()
   class Package1.ImplClass
                                                         {
                                                         ...
   private String something;                             }

   public getSomething()




                                                 23
OSGi bundles
MyBundle.jar         [exports Package2]                 YourBundle
  Package1                     Package2                  PackageX

   public class                public class              public class
   Package1.ClassB             Package2.ClassA           PackageX.SomeClass
   public void doSomething()
   {
      ImplClass some =         public void accessIt()
       new ImplClass();        {...                      import Package2;
      some.getSomething();     }                         import Package1;
   }
                                                         public void foo()
   class Package1.ImplClass
                                                         {
                                                         ...
   private String something;                             }

   public getSomething()




                                                 23
OSGi i Apache Sling




         24
OSGi i Apache Sling

• Hele Sling-plattformen er en serie med
  OSGi-bundles




                     24
OSGi i Apache Sling

• Hele Sling-plattformen er en serie med
  OSGi-bundles
• Lett å bytte ut bundles/komponenter med
  egen funksjonalitet




                        24
OSGi i Apache Sling

• Hele Sling-plattformen er en serie med
  OSGi-bundles
• Lett å bytte ut bundles/komponenter med
  egen funksjonalitet
• Lett å utvide med egne bundles

                        24
Behov for egne bundles




          25
Behov for egne bundles

• Egne innholdstilbydere




                    25
Behov for egne bundles

• Egne innholdstilbydere
• Egne servleter som svarer på bestemte
  requester




                    25
Behov for egne bundles

• Egne innholdstilbydere
• Egne servleter som svarer på bestemte
  requester
• Initielt innhold


                     25
Behov for egne bundles

• Egne innholdstilbydere
• Egne servleter som svarer på bestemte
  requester
• Initielt innhold
• Plugin-moduler til Jackrabbit

                      25
OSGi         REST




       JCR




       26
OSGi         REST



       JCR




       26
REST




 27
REST
•   REpresentional State Transfer

    •   All state holdes av klienten




                               27
REST
•   REpresentional State Transfer

    •   All state holdes av klienten

    •   Unngår server-side sessions




                               27
REST
•   REpresentional State Transfer

    •   All state holdes av klienten

    •   Unngår server-side sessions

•   Back-to-basic: Bruke HTTP-verbene som de var ment




                               27
REST
•   REpresentional State Transfer

    •   All state holdes av klienten

    •   Unngår server-side sessions

•   Back-to-basic: Bruke HTTP-verbene som de var ment

    •   GET henter

    •   POST lagrer

    •   PUT oppdaterer

    •   DELETE sletter


                               27
URLer med mening




       28
URLer med mening

• URLen peker til en ressurs, ikke en metode



                         28
URLer med mening

• URLen peker til en ressurs, ikke en metode
 •   http://domain.com/?module=Articles;action=Article.publicShow;ID=8402




                                  28
URLer med mening

• URLen peker til en ressurs, ikke en metode
 •   http://domain.com/?module=Articles;action=Article.publicShow;ID=8402
                                               Article.publicShow




                                  28
URLer med mening

• URLen peker til en ressurs, ikke en metode
 •                                                                   8402
     http://domain.com/?module=Articles;action=Article.publicShow;ID=8402
                                               Article.publicShow




                                  28
URLer med mening

• URLen peker til en ressurs, ikke en metode
 •                                                                   8402
     http://domain.com/?module=Articles;action=Article.publicShow;ID=8402
                                               Article.publicShow

 •   http://domain.com/articles/siste_nytt_fra_javazone




                                   28
Alt kan uttrykkes med
GET, POST, PUT, DELETE




          29
Alt kan uttrykkes med
       GET, POST, PUT, DELETE
           Non-REST
GET /listWebshopOrders
POST /submitWebshopOrder?name=...
Takk, ordren din er registrert.


GET /getWebshopOrderDetail?id=352
POST /cancelWebshopOrder?id=352
POST /updateWebshopOrder?id=352&...




                                      29
Alt kan uttrykkes med
       GET, POST, PUT, DELETE
           Non-REST                                  REST
GET /listWebshopOrders                   GET /webshop/orders
POST /submitWebshopOrder?name=...        POST /webshop/orders/
Takk, ordren din er registrert.          201 Created
                                         Location: /webshop/orders/352

GET /getWebshopOrderDetail?id=352        GET /webshop/orders/352
POST /cancelWebshopOrder?id=352          DELETE /webshop/orders/352
POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352




                                    29
Alt kan uttrykkes med
       GET, POST, PUT, DELETE
           Non-REST                                  REST
GET /listWebshopOrders                   GET /webshop/orders
POST /submitWebshopOrder?name=...        POST /webshop/orders/
Takk, ordren din er registrert.          201 Created
                                         Location: /webshop/orders/352

GET /getWebshopOrderDetail?id=352        GET /webshop/orders/352
POST /cancelWebshopOrder?id=352          DELETE /webshop/orders/352
POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352




                                    29
Alt kan uttrykkes med
       GET, POST, PUT, DELETE
           Non-REST                                  REST
GET /listWebshopOrders                   GET /webshop/orders
POST /submitWebshopOrder?name=...        POST /webshop/orders/
Takk, ordren din er registrert.          201 Created
                                         Location: /webshop/orders/352

GET /getWebshopOrderDetail?id=352        GET /webshop/orders/352
POST /cancelWebshopOrder?id=352          DELETE /webshop/orders/352
POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352




                                    29
Alt kan uttrykkes med
       GET, POST, PUT, DELETE
           Non-REST                                  REST
GET /listWebshopOrders                   GET /webshop/orders
POST /submitWebshopOrder?name=...        POST /webshop/orders/
Takk, ordren din er registrert.          201 Created
                                         Location: /webshop/orders/352

GET /getWebshopOrderDetail?id=352        GET /webshop/orders/352
POST /cancelWebshopOrder?id=352          DELETE /webshop/orders/352
POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352




                                    29
Alt kan uttrykkes med
       GET, POST, PUT, DELETE
           Non-REST                                  REST
GET /listWebshopOrders                   GET /webshop/orders
POST /submitWebshopOrder?name=...        POST /webshop/orders/
Takk, ordren din er registrert.          201 Created
                                         Location: /webshop/orders/352

GET /getWebshopOrderDetail?id=352        GET /webshop/orders/352
POST /cancelWebshopOrder?id=352          DELETE /webshop/orders/352
POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352




                                    29
OSGi         REST




       JCR




       30
OSGi         REST




       JCR




       30
Apache Sling
er et REST-API
    til JCR

   31
Apache Sling
er et REST-API
    til JCR +++

   31
Virtuelt ressurs-tre




         32
Virtuelt ressurs-tre

•   Du kan pode inn andre ressurser i JCR-treet




                         32
Virtuelt ressurs-tre

•   Du kan pode inn andre ressurser i JCR-treet

    •   En servlet




                         32
Virtuelt ressurs-tre

•   Du kan pode inn andre ressurser i JCR-treet

    •   En servlet

    •   En filmappe




                         32
Virtuelt ressurs-tre

•   Du kan pode inn andre ressurser i JCR-treet

    •   En servlet

    •   En filmappe

    •   Din eksisterende database




                          32
Virtuelt ressurs-tre
jcr:root   Vidars blogg               First post
           author: Vidar          text: Intet mer å...
                                  date: 08-09-2009
           UserJsonServlet
                                     Second p..
                                  text: ...
                                  date: ...
               images


               orders


                                                         JCR-node
                                                         Servlet
                                                         Filmappe
                                                         RDBMS
                             33
Ressurser


En ressurs er en abstraksjon av noe som
kan adresseres med en URL




               34
Egenskaper ved en ressurs




            35
Egenskaper ved en ressurs
 • Path
  • f.eks. pathen til en node i JCR




                      35
Egenskaper ved en ressurs
 • Path
  • f.eks. pathen til en node i JCR
 • Type
  • for JCR-noder: sling:resourceType


                     35
Egenskaper ved en ressurs
 • Path
  • f.eks. pathen til en node i JCR
 • Type
  • for JCR-noder: sling:resourceType
 • Metadata
  • f.eks. sist endret-dato
                     35
Resource Resolver




        36
Resource Resolver
•   Sling bruker ressurs-treet som utgangspunkt for
    URL-resolving




                         36
Resource Resolver
•   Sling bruker ressurs-treet som utgangspunkt for
    URL-resolving




                 Vidars blogg             First post          feriebilde.jpg
                 author: Vidar        text: Intet mer å...   jcr:data: ...
                                      date: 08-09-2009

                                         Second p..
                                      text: ...
                                      date: ...


                                 36
Resource Resolver
   •   Sling bruker ressurs-treet som utgangspunkt for
       URL-resolving

http://domain.com/vidars_blogg/first_post.fulltext.html




                    Vidars blogg             First post          feriebilde.jpg
                    author: Vidar        text: Intet mer å...   jcr:data: ...
                                         date: 08-09-2009

                                            Second p..
                                         text: ...
                                         date: ...


                                    36
Resource Resolver
   •   Sling bruker ressurs-treet som utgangspunkt for
       URL-resolving

http://domain.com/vidars_blogg/first_post.fulltext.html




                    Vidars blogg             First post          feriebilde.jpg
                    author: Vidar        text: Intet mer å...   jcr:data: ...
                                         date: 08-09-2009

                                            Second p..
                                         text: ...
                                         date: ...


                                    36
Rendering av ressurser




          37
Rendering av ressurser

• En ressurs kan rendres av en servlet eller
  et skript




                     37
Rendering av ressurser

• En ressurs kan rendres av en servlet eller
  et skript
• Ressursens ressurstype bestemmer hvilken
  servlet/skript som velges




                     37
Rendering av ressurser

• En ressurs kan rendres av en servlet eller
  et skript
• Ressursens ressurstype bestemmer hvilken
  servlet/skript som velges
• Servleter/skript finnes i det samme virtuelle
  ressurstreet


                     37
URL-oppbygging
                /vidars_blog/first_post.fulltext.html
http://domain.com




                             38
URL-oppbygging
                /vidars_blog/first_post.fulltext.html
http://domain.com



                    Ressurs-path




                                   38
URL-oppbygging
                /vidars_blog/first_post.fulltext.html
http://domain.com



                    Ressurs-path


 Vidars blogg                   First post
author: Vidar       text: Intet mer å...
                    date: 08-09-2009
                    sling:resourceType: bloggpost




                                       38
URL-oppbygging
                /vidars_blog/first_post.fulltext.html
http://domain.com



                    Ressurs-path


 Vidars blogg                   First post
author: Vidar       text: Intet mer å...
                    date: 08-09-2009
                    sling:resourceType: bloggpost




                                       38
URL-oppbygging
                /vidars_blog/first_post.fulltext.html
http://domain.com



                    Ressurs-path                    Extension


 Vidars blogg                   First post
author: Vidar       text: Intet mer å...
                    date: 08-09-2009
                    sling:resourceType: bloggpost




                                       38
URL-oppbygging
                /vidars_blog/first_post.fulltext.html
http://domain.com



                    Ressurs-path                    Selector   Extension


 Vidars blogg                   First post
author: Vidar       text: Intet mer å...
                    date: 08-09-2009
                    sling:resourceType: bloggpost




                                       38
URL-oppbygging
                /vidars_blog/first_post.fulltext.html
http://domain.com



                    Ressurs-path                    Selector   Extension


 Vidars blogg                   First post
author: Vidar       text: Intet mer å...
                    date: 08-09-2009
                    sling:resourceType: bloggpost       bloggpost




                                       38
Servlet/Script Resolver
                fulltext    html




                bloggpost




           39
Servlet/Script Resolver

     bloggpost   fulltext   html




                   39
Servlet/Script Resolver

   / apps / bloggpost / fulltext / html




                          39
Servlet/Script Resolver

   / apps / bloggpost / fulltext / html




                          39
Request-prosessering




         40
Request-prosessering
1. Finn fram til ressursen
    Kilde: request-URLen




                      40
Request-prosessering
1. Finn fram til ressursen
    Kilde: request-URLen
2. Frinn fram servlet/script til prosessering
    Kilde: resourceType, selectors og
    extension




                       40
Request-prosessering
1. Finn fram til ressursen
    Kilde: request-URLen
2. Frinn fram servlet/script til prosessering
    Kilde: resourceType, selectors og
    extension
3. Kall evt. servlet-filtere



                        40
Request-prosessering
1. Finn fram til ressursen
    Kilde: request-URLen
2. Frinn fram servlet/script til prosessering
    Kilde: resourceType, selectors og
    extension
3. Kall evt. servlet-filtere
4. Kall servleten/skriptet

                        40
Request-prosessering
1. Finn fram til ressursen     Reso ur
                                      ce-first
                                process
                                        ing
    Kilde: request-URLen
2. Frinn fram servlet/script til prosessering
    Kilde: resourceType, selectors og
    extension
3. Kall evt. servlet-filtere
4. Kall servleten/skriptet

                        40
Hva med min egen kode?




          41
Hva med min egen kode?


 • Java-kode pakkes i OSGi-bundler



                     41
Hva med min egen kode?


 • Java-kode pakkes i OSGi-bundler
 • Bundlen deployes til en kjørende Sling-
   instans (hot-deploy)




                          41
Din egen servlet

public class MyServlet extends HttpServlet {

    doGet(HttpServletRequest req,
          HttpServletResponse res) {

          res.getWriter().println(author);

      }

}




                            42
Din egen servlet
/**
 * @scr.service interface="javax.servlet.Servlet"
 * @scr.property name="sling.servlet.paths"
 *    value="/apps/bloggpost/fulltext/html"
 */
  public class MyServlet extends HttpServlet {

       doGet(HttpServletRequest req,
             HttpServletResponse res) {

             res.getWriter().println(author);

         }

  }




                                 42
Din egen servlet
/**
 * @scr.service interface="javax.servlet.Servlet"
 * @scr.property name="sling.servlet.paths"
 *    value="/apps/bloggpost/fulltext/html"
 */
  public class MyServlet extends SlingSafeMethodsServlet {

        doGet(SlingHttpServletRequest req,
           SlingHttpServletResponse res) {

             res.getWriter().println(author);

         }

  }




                                 42
Din egen servlet
/**
 * @scr.service interface="javax.servlet.Servlet"
 * @scr.property name="sling.servlet.paths"
 *    value="/apps/bloggpost/fulltext/html"
 */
  public class MyServlet extends SlingSafeMethodsServlet {

        doGet(SlingHttpServletRequest req,
           SlingHttpServletResponse res) {

           Resource resource = res.getResource();

           ValueMap values = resource.adaptTo(ValueMap.class);
           String author = values.get(“author”, String.class);
           res.getWriter().println(author);
           }

       }


                                 42
Dependency injection




         43
Dependency injection
/**
 * @scr.service interface="javax.servlet.Servlet"
 * @scr.property name="sling.servlet.paths"
 *    value="/apps/bloggpost/fulltext/html"
 */
  public class MyServlet extends SlingSafeMethodsServlet {



      doGet(SlingHttpServletRequest req,
            SlingHttpServletResponse res) {

            repository.doStuff();

            }

  }



                                 43
Dependency injection
/**
 * @scr.service interface="javax.servlet.Servlet"
 * @scr.property name="sling.servlet.paths"
 *    value="/apps/bloggpost/fulltext/html"
 */
  public class MyServlet extends SlingSafeMethodsServlet {
      /**@scr.reference */
      private SlingRepository repository;
      doGet(SlingHttpServletRequest req,
            SlingHttpServletResponse res) {

            repository.doStuff();

            }

  }



                                 43
Andre komponenter




        44
Andre komponenter

• Servlet-filtre




                  44
Andre komponenter

• Servlet-filtre
• Autentiserings-mekanismer



                   44
Andre komponenter

• Servlet-filtre
• Autentiserings-mekanismer
• Resource-providere


                   44
Andre komponenter

• Servlet-filtre
• Autentiserings-mekanismer
• Resource-providere
• ...

                   44
Andre komponenter

• Servlet-filtre
• Autentiserings-mekanismer    Hot-
                                 ploy!
                              de
• Resource-providere
• ...

                   44
Rendering-scripts




        45
Rendering-scripts
Ressurser kan rendres med scripts.




                            45
Rendering-scripts
Ressurser kan rendres med scripts.
Flere innebygde script- og mal-motorer:


•   ECMAScript        •   XSLT            •   Groovy

•   Ruby              •   Velocity        •   JSR-223

•   Scala             •   JSP             •   ...




                                45
Rendering-scripts
Ressurser kan rendres med scripts.
Flere innebygde script- og mal-motorer:


•   ECMAScript        •   XSLT            •   Groovy

•   Ruby              •   Velocity        •   JSR-223

•   Scala             •   JSP             •   ...




                                45
Rendering-scripts
Ressurser kan rendres med scripts.
Flere innebygde script- og mal-motorer:


•   ECMAScript        •   XSLT            •   Groovy

•   Ruby              •   Velocity        •   JSR-223

•   Scala             •   JSP             •   ...




                                45
Rendering-scripts


• Raskeste måten å utvikle på
• Scripts kan hentes fra repositoriet eller fra
  bundler




                      46
Ressurs-rendering i ESP




           47
Ressurs-rendering i ESP
                            First post
                body: Intet mer å...
                date: 08-09-2009
                sling:resourceType: bloggpost
                author: Vidar
                summary: Alltid drømt om å v..




           47
Ressurs-rendering i ESP
 <h1><%=currentNode.name%></h1>
                                                          First post
 <%                                           body: Intet mer å...
 if (currentNode.author) { %>                 date: 08-09-2009
                                              sling:resourceType: bloggpost
                                              author: Vidar
      Av <%=currentNode.author%>
                                              summary: Alltid drømt om å v..
 <% } %>

 <p style=”font-weight: bold”><%=currentNode.summary%></p>

 <%=currentNode.body%>

 <%
      sling.include(currentNode.path + “images.html”);
 %>




                               47
Ressurs-rendering i ESP
/apps/bloggpost/fulltext/html.esp
  <h1><%=currentNode.name%></h1>
                                                           First post
  <%                                           body: Intet mer å...
  if (currentNode.author) { %>                 date: 08-09-2009
                                               sling:resourceType: bloggpost
                                               author: Vidar
       Av <%=currentNode.author%>
                                               summary: Alltid drømt om å v..
  <% } %>

  <p style=”font-weight: bold”><%=currentNode.summary%></p>

  <%=currentNode.body%>

  <%
       sling.include(currentNode.path + “images.html”);
  %>




                                47
Arkitektur




    48
Arkitektur



JCR API

 Apache
Jackrabbit




                 48
Arkitektur



JCR API
                          OSGi
 Apache
Jackrabbit            Apache Felix




                 48
Arkitektur


Sling Engine /
    APIer

  JCR API
                              OSGi
  Apache
 Jackrabbit               Apache Felix




                     48
Arkitektur
                              OSGI-bundler

                                                  Scripts
                 Initielt innhold



     Din
  applikasjon

Sling Engine /
    APIer

  JCR API
                                                            OSGi
  Apache
 Jackrabbit                                            Apache Felix




                                             48
Demo
Poste nytt innhold
Demo
           En mini-blogg-applikasjon med 70 linjer kode




  Could you just
twitter me the code
   you’ve written
       today?
1: Opprette nye poster
<form method=”POST”>
  Title:
  <input type=”text” name=”title” />

 Summary:
 <textarea name=”summary”></textarea>

 Body:
 <textarea name=”body”></textarea>

 <button type=”submit”>Lagre</button>

  <input type=”hidden” name=”:redirect” value=”*”/>
</form>
2. Hente eksisterende
<script src=”/system/sling.js”></script>
<form method=”POST”>
...
</form>

<!-- Sett feltverdier fra nodens property-verdier -->
<script>Sling.wizard();</script>
3. Navigasjon
<ul>
  <li>
  <a href="/content/blog/*.html">[Ny post]</a>
  <script>
   var posts = Sling.getContent("/content/blog", 2);
   for(var post in posts) {
     document.write("<li><a href='/content/blog/" + i
     + "'>" + posts[post].title + "</a></li>");
   }
</script>

</ul>




                               Koden er tilgjengelig på http://tinyurl.com/slingblog46
Litt for simpelt for deg?




            54
Litt for simpelt for deg?

• Hva med
 • On-the-fly skalering av bilder
 • RSS-feed
 • Kommentarer
 • Separat admin-grensesnitt
                    54
Hva skjedde her?




Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/




                                           55
Hva skjedde her?
admin.esp                                           ThumbnailGeneratorService.java

edit.esp                                            ThumbnailGeneratorServiceImpl.java

html.esp

list.esp

menu.esp

xml.esp

header.esp




Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/




                                           55
Hva skjedde her?
admin.esp                                           ThumbnailGeneratorService.java

edit.esp                                            ThumbnailGeneratorServiceImpl.java

html.esp

list.esp

menu.esp

xml.esp

header.esp




Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/




                                           55
Hva skjedde her?
admin.esp                                           ThumbnailGeneratorService.java

edit.esp                                            ThumbnailGeneratorServiceImpl.java

html.esp

list.esp

menu.esp

xml.esp

header.esp




Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/




                                           55
Thumbnail-generator: OSGi-komponent
import javax.jcr.*;
import javax.jcr.observation.*;
import org.osgi.service.component.ComponentContext;

/**
* Observerer endringer under /content/espblog, og
* genererer thumbnails for bilder som lastes opp.
* @scr.service
* @scr.component immediate=”true”
*/

public class ThumbnailGeneratorServiceImpl implements
   ThumbnailGeneratorService, EventListener {
Registrere EventListener
/** @scr.reference (settes automatisk av OSGi-rammeverket*/
private SlingRepository repository;

/** kalles av OSGi-rammeverket når komponenten startes */
protected void activate(ComponentContext context) {
  Session s = repository.loginAdministrative();
  // Observer nt:file NODE_ADDED
  ObservationManager m = s.getWorkspace().getObservationManager();
  String[] types = {“nt:file”};
  m.addEventListener(
     this,
     Event.NODE_ADDED,
     “/espblog/posts”, ...
  );
}
Eventhandler
/**
* Kalles av JCR-implementasjonen hver gang det skjer en
* event som vi har registrert oss for
*/
public void onEvent(EventIterator it) {
   while (it.hasNext()) {
     Event event = it.nextEvent();

        String p = event.getPath();
        if (!p.contains(“thumbnails”)) {
          Node n = session.getRootNode().getNode(p);
          createThumbnails(addedNode);
        }
    }
}
En typisk Sling-applikasjon
En typisk Sling-applikasjon
 •   JCR-funksjonalitet

     •   WebDAV

     •   Observation
En typisk Sling-applikasjon
 •   JCR-funksjonalitet

     •   WebDAV

     •   Observation

 •   Sling-snacks

     •   Enkel skript-mapping

     •   REST-grensesnitt

     •   Innholdslasting
En typisk Sling-applikasjon
 •   JCR-funksjonalitet

     •   WebDAV

     •   Observation

 •   Sling-snacks

     •   Enkel skript-mapping

     •   REST-grensesnitt

     •   Innholdslasting

 •   Alt pakket i en OSGi-bundle - deployes til server
Bør du vurdere
Apache Sling / JCR?




         60
Bør du vurdere
   Apache Sling / JCR?
• Behandler du innhold?




                     60
Bør du vurdere
   Apache Sling / JCR?
• Behandler du innhold?
 • Ja, det gjør du.



                     60
Bør du vurdere
   Apache Sling / JCR?
• Behandler du innhold?                   ROA =
                                        Reso ur
                                        Oriente
                                                ce


 • Ja, det gjør du. Alt er innhold!
                                                 d
                                      Archite
                                              cture




                     60
Bør du vurdere
   Apache Sling / JCR?
• Behandler du innhold?                    ROA =
                                         Reso ur
                                         Oriente
                                                 ce


 • Ja, det gjør du. Alt er innhold!
                                                  d
                                       Archite
                                               cture



• Lei av å måtte endre databasestrukturen for
  å innføre ny funksjonalitet?




                      60
Bør du vurdere
    Apache Sling / JCR?
• Behandler du innhold?                          ROA =
                                               Reso ur
                                               Oriente
                                                       ce


 • Ja, det gjør du. Alt er innhold!
                                                        d
                                             Archite
                                                     cture



• Lei av å måtte endre databasestrukturen for
  å innføre ny funksjonalitet?

 Versjonering     Tilgangskontroll   Fulltekst-søk
                                     med Apache
                                     Lucene

                       60
Kom i gang
Kom i gang
Bygg selv:
>   svn checkout http://svn.apache.org/repos/asf/sling/trunk sling
>   cd sling
>   export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m"
>   mvn clean install

> cd launchpad/webapp
> mvn jetty:run
Kom i gang
Bygg selv:
>   svn checkout http://svn.apache.org/repos/asf/sling/trunk sling
>   cd sling
>   export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m"
>   mvn clean install

> cd launchpad/webapp
> mvn jetty:run
Kom i gang
Bygg selv:
>   svn checkout http://svn.apache.org/repos/asf/sling/trunk sling
>   cd sling
>   export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m"
>   mvn clean install

> cd launchpad/webapp
> mvn jetty:run



Eller last ned ferdig bygd kjørbar .jar eller .war
http://sling.apache.org/site/downloads.cgi
Oppsummering




     62
Oppsummering
• Lett å komme i gang
 • Legg til innhold, et par script, og du har
    en applikasjon




                      62
Oppsummering
• Lett å komme i gang
 • Legg til innhold, et par script, og du har
    en applikasjon
• Fleksibelt og dynamisk
 • BYOB (Bring Your Own Bundles)



                      62
Oppsummering
• Lett å komme i gang
 • Legg til innhold, et par script, og du har
    en applikasjon
• Fleksibelt og dynamisk
 • BYOB (Bring Your Own Bundles)
• Fremdeles ungt, stor økning i brukerbase


                      62
Oppsummering
• Lett å komme i gang
 • Legg til innhold, et par script, og du har
    en applikasjon
• Fleksibelt og dynamisk
 • BYOB (Bring Your Own Bundles)
• Fremdeles ungt, stor økning i brukerbase
• Buzzword-compliant
                             Hot-
      REST      JSON                  Script
                            d eploy
                       62
Lesestoff
• http://sling.apache.org
 • .../site/discover-sling-in-15-minutes.html
• dev@sling.apache.org
• http://jackrabbit.apache.org


                       63
vidar@idium.no




      64

Contenu connexe

En vedette

Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Applitools
 

En vedette (20)

Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 

Apache Sling presentation at JavaZone 2009

  • 2. Agenda 1. Hva er Apache Sling? 2. Hva er Java Content Repository (JCR)? 3. Kort om OSGi 4. Kort om REST 5. Sentrale konsepter i Apache Sling 6. Demo: Blogg-applikasjon 7. Er Apache Sling noe for deg? 2
  • 5. vidar@idium.no • Utvikler i Idium AS • Bygger et produkt basert på Apache Sling 3
  • 6. vidar@idium.no • Utvikler i Idium AS • Bygger et produkt basert på Apache Sling • Committer til Apache Sling-prosjektet 3
  • 7. Hva er Apache Sling? 4
  • 8. Hva er Apache Sling? • “the simplest device for delivering content very fast” 4
  • 9. Hva er Apache Sling? • “the simplest device for delivering content very fast” 4
  • 10. Hva er Apache Sling? • “the simplest device for delivering content very fast” • Web-rammeverk dedikert til Java Content Repository (JCR) 4
  • 11. Hva er Apache Sling? • “the simplest device for delivering content very fast” • Web-rammeverk dedikert til Java Content Repository (JCR) • Open source fra Apache Software Foundation 4
  • 13. Sling-plattformen • bygd på JCR • basert på REST • drevet av OSGi 5
  • 14. OSGi REST JCR 6
  • 15. OSGi REST JCR 6
  • 17. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 7
  • 18. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 7
  • 19. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 • Hierarkisk database 7
  • 20. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 • Hierarkisk database • Noder og attributter 7
  • 21. Java Content Repository • JCR 1.0: JSR-170 JCR 2.0: JSR-283 • Hierarkisk database • Noder og attributter • Rike datatyper 7
  • 22. JCR-implementasjoner • Apache Jackrabbit • IBM FileNet P8 • Oracle XML DB • Xythos Repository • exo Platform • Alfresco ECM • Microsoft Sharepoint • Interwoven Repository • OpenText LiveLink • IBM CM • Day CRX • EMC Documentum 8
  • 23. JCR-implementasjoner • Apache Jackrabbit • IBM FileNet P8 • Oracle XML DB • Xythos Repository • exo Platform • Alfresco ECM • Microsoft Sharepoint • Interwoven Repository • OpenText LiveLink • IBM CM • Day CRX • EMC Documentum • OpenJCR (java.net) 8
  • 24. JCR-implementasjoner • Apache Jackrabbit • IBM FileNet P8 • Oracle XML DB • Xythos Repository • exo Platform • Alfresco ECM • Microsoft Sharepoint • Interwoven Repository • OpenText LiveLink • IBM CM • Day CRX • EMC Documentum • OpenJCR (java.net) 8
  • 25. JCR-applikasjoner • Oracle Portal • Enonic Vertical Site • IBM Workplace Web Content • BEA Portal • Hippo CMS Management • JBoss Portal • jLibrary • Day Communiqué • JBoss DNA • Magnolia CMS • Apache James • Sun OpenPortal • Drools • Alfresco ECMS • Fast Enterprise • BEA WebLogic • Idium Web (snart!) Search Portal 9
  • 26. JSR-170 JSR-170 ❝ The API should be a standard, implementation independent way to access content bi-directionally on a granular level to a content repository” 10
  • 27. JSR-170 JSR-170 ❝ The API should be a standard, implementation independent way to access content bi-directionally on a granular level to a content repository” 10
  • 29. Java Content Repository Database Filsystem 11
  • 30. Java Content Repository Database Filsystem Lese- tilgang Skrive- tilgang 11
  • 31. Java Content Repository Database Filsystem et ur Integrit Strukt Lese- tilgang Spør rin g er Trigger e Skrive- tilgang 11
  • 32. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data 11
  • 33. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 11
  • 34. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 12
  • 35. Java Content Repository Database Filsystem But wait, et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data there’s more! Java Content Repository 12
  • 36. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 12
  • 37. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data Java Content Repository 13
  • 38. Java Content Repository Database Filsystem et ur Integrit Strukt i Lese- Hierark s– Tilgang tilgang kontrol l Spør rin g er Trigger e Skrive- Låsing Binær - tilgang data st- Fulltek PI søk Java A ne ring ølge Versjo Rekkef uktur Fri str Multi- Event- r value listene Java Content Repository 13
  • 39. Hvordan ser et repository ut? 14
  • 40. Hvordan ser et repository ut? Rotnode Attribute Attribute Name: Produkter Name: Nyheter lastUpdate: 09-09-2009 lastUpdate: 09-09-2009 Name: Gressklipper Name: Hurtigmikser Name: Nettsted lansert ... ... price: 4600.00 price: 699.00 lastUpdate: 09-09-2009 colour: white summary: Velkommen ... body: Sist fredag... vidar@idium.no authors: elgar@idium.no Name: Bråker mye Name: Styr unna ... author: jens@gmail.com author: jens@gmail.com body: Klipper pent, ... body: Denne er ikke ... Name: portrett.jpg stars: 4 stars: 1 lastUpdate: 09-09-2009 jcr:content [binærdata] 14
  • 41. Hvordan ser et repository ut? Rotnode Attribute Attribute Name: Produkter Name: Nyheter lastUpdate: 09-09-2009 lastUpdate: 09-09-2009 Name: Gressklipper Name: Hurtigmikser Name: Nettsted lansert ... ... price: 4600.00 price: 699.00 lastUpdate: 09-09-2009 colour: white summary: Velkommen ... body: Sist fredag... vidar@idium.no authors: elgar@idium.no Name: Bråker mye Name: Styr unna ... author: jens@gmail.com author: jens@gmail.com body: Klipper pent, ... body: Denne er ikke ... Name: portrett.jpg stars: 4 stars: 1 lastUpdate: 09-09-2009 jcr:content [binærdata] 14
  • 43. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; 15
  • 44. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); 15
  • 45. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); 15
  • 46. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone 15
  • 47. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo 15
  • 48. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo Hello, message World! 15
  • 49. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo session.save(); Hello, message World! 15
  • 50. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo session.save(); Hello, message World! // Hente innhold Node node = root.getNode(“javazone/demo”); 15
  • 51. Hello, World! import javax.jcr.*; import org.apache.jackrabbit.core.TransientRepository; // Logge inn Repository repository = new TransientRepository(); Session session = repository.login(brukernavn, passord); // Opprette innhold jcr:root Node root = session.getRootNode(); Node jz = root.addNode(“javazone”); javazone Node demo = jz.addNode(“demo”); demo.setProperty(“message”, “Hello, World!”); demo session.save(); Hello, message World! // Hente innhold Node node = root.getNode(“javazone/demo”); print(node.getProperty(“message”).getString()); 15
  • 53. Innhold først, struktur senere • JCR gjør det mulig å lagre data fritt strukturert • Trenger ikke sette opp tabeller med felter 16
  • 54. Innhold først, struktur senere • JCR gjør det mulig å lagre data fritt strukturert • Trenger ikke sette opp tabeller med felter • Restriksjoner kan innføres etterhvert 16
  • 55. Innhold først, struktur senere • JCR gjør det mulig å lagre data fritt strukturert • Trenger ikke sette opp tabeller med felter • Restriksjoner kan innføres etterhvert • Hierarki vil ofte være tilstrekkelig struktur – unngå referanser på tvers av hierarkiet 16
  • 57. Blogg-applikasjon RDBS-modell: Blog Post blogId blogId* author postId title text date 17
  • 58. Blogg-applikasjon RDBS-modell: Blog Post blogId blogId* author postId title text date post blog id name author title text Id Id First Intet mer 1 Vidars blogg Vidar 1 1 post! å ... 2 ... ... 2 1 ... ... ... ... ... ... ... ... ... 17
  • 59. Blogg-applikasjon RDBS-modell: Blog Post blogId blogId* author postId title text date image post blog id name author title text image Id Id First Intet mer 1 Vidars blogg Vidar 1 1 NULL post! å ... 2 ... ... 2 1 ... ... NULL ... ... ... ... ... ... ... NULL 17
  • 60. Blogg-applikasjon RDBS-modell: Blog Post Attachment blogId blogId* attachmentId author postId postId* title filename text date post blog attach id name author title text postId title Id Id mentId First Intet mer 1 Vidars blogg Vidar 1 1 1 1 feriebilde.jpg post! å ... 2 ... ... 2 1 ... ... 2 1 ... ... ... ... ... ... ... ... ... ... ... 17
  • 62. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... 18
  • 63. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... feriebilde.jpg jcr:data: ... 18
  • 64. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... feriebilde.jpg jcr:data: ... 18
  • 65. Blogg-applikasjon JCR-modell: Vidars blogg author: Vidar First post Second p.. text: Intet mer å... text: ... date: 08-09-2009 date: ... feriebilde.jpg jcr:data: ... 18
  • 68. OSGi REST JCR 20
  • 69. OSGi REST JCR 20
  • 70. The Dynamic OSGi Module System for Java 21
  • 71. The Dynamic OSGi Module System for Java • Open Services Gateway initiative 21
  • 72. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler 21
  • 73. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler • En bundle kan startes, stoppes, oppgraderes run-time (hot-deploy) 21
  • 74. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler • En bundle kan startes, stoppes, oppgraderes run-time (hot-deploy) • Bundler kan ha avhengigheter til andre bundler 21
  • 75. The Dynamic OSGi Module System for Java • Open Services Gateway initiative • Funksjonalitet (kode) pakkes i bundler • En bundle kan startes, stoppes, oppgraderes run-time (hot-deploy) • Bundler kan ha avhengigheter til andre bundler • En bundle eksporterer gitte java-pakker til andre pakker 21
  • 76. Standard Java-pakkemodell class Package1.ImplClass private String something; public getSomething() 22
  • 77. Standard Java-pakkemodell Package1 class Package1.ImplClass private String something; public getSomething() 22
  • 78. Standard Java-pakkemodell Package1 public class Package1.ClassB public void doSomething() { ImplClass some = new ImplClass(); some.getSomething(); } class Package1.ImplClass private String something; public getSomething() 22
  • 79. Standard Java-pakkemodell Package1 public class Package1.ClassB public void doSomething() { ImplClass some = new ImplClass(); some.getSomething(); } class Package1.ImplClass private String something; public getSomething() 22
  • 80. Standard Java-pakkemodell Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() public void accessIt() { { ImplClass some = new Package1.PublicClass(); new ImplClass(); new Package1.ImplClass(); some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 22
  • 81. Standard Java-pakkemodell Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() public void accessIt() { { ImplClass some = new Package1.PublicClass(); new ImplClass(); new Package1.ImplClass(); some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 22
  • 82. Standard Java-pakkemodell Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() public void accessIt() { { ImplClass some = new Package1.PublicClass(); new ImplClass(); new Package1.ImplClass(); some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 22
  • 83. OSGi bundles Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
  • 84. OSGi bundles MyBundle.jar Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
  • 85. OSGi bundles MyBundle.jar [exports Package2] Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
  • 86. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 public class public class Package1.ClassB Package2.ClassA public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... some.getSomething(); } } class Package1.ImplClass private String something; public getSomething() 23
  • 87. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
  • 88. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
  • 89. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
  • 90. OSGi bundles MyBundle.jar [exports Package2] YourBundle Package1 Package2 PackageX public class public class public class Package1.ClassB Package2.ClassA PackageX.SomeClass public void doSomething() { ImplClass some = public void accessIt() new ImplClass(); {... import Package2; some.getSomething(); } import Package1; } public void foo() class Package1.ImplClass { ... private String something; } public getSomething() 23
  • 91. OSGi i Apache Sling 24
  • 92. OSGi i Apache Sling • Hele Sling-plattformen er en serie med OSGi-bundles 24
  • 93. OSGi i Apache Sling • Hele Sling-plattformen er en serie med OSGi-bundles • Lett å bytte ut bundles/komponenter med egen funksjonalitet 24
  • 94. OSGi i Apache Sling • Hele Sling-plattformen er en serie med OSGi-bundles • Lett å bytte ut bundles/komponenter med egen funksjonalitet • Lett å utvide med egne bundles 24
  • 95. Behov for egne bundles 25
  • 96. Behov for egne bundles • Egne innholdstilbydere 25
  • 97. Behov for egne bundles • Egne innholdstilbydere • Egne servleter som svarer på bestemte requester 25
  • 98. Behov for egne bundles • Egne innholdstilbydere • Egne servleter som svarer på bestemte requester • Initielt innhold 25
  • 99. Behov for egne bundles • Egne innholdstilbydere • Egne servleter som svarer på bestemte requester • Initielt innhold • Plugin-moduler til Jackrabbit 25
  • 100. OSGi REST JCR 26
  • 101. OSGi REST JCR 26
  • 103. REST • REpresentional State Transfer • All state holdes av klienten 27
  • 104. REST • REpresentional State Transfer • All state holdes av klienten • Unngår server-side sessions 27
  • 105. REST • REpresentional State Transfer • All state holdes av klienten • Unngår server-side sessions • Back-to-basic: Bruke HTTP-verbene som de var ment 27
  • 106. REST • REpresentional State Transfer • All state holdes av klienten • Unngår server-side sessions • Back-to-basic: Bruke HTTP-verbene som de var ment • GET henter • POST lagrer • PUT oppdaterer • DELETE sletter 27
  • 108. URLer med mening • URLen peker til en ressurs, ikke en metode 28
  • 109. URLer med mening • URLen peker til en ressurs, ikke en metode • http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 28
  • 110. URLer med mening • URLen peker til en ressurs, ikke en metode • http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 Article.publicShow 28
  • 111. URLer med mening • URLen peker til en ressurs, ikke en metode • 8402 http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 Article.publicShow 28
  • 112. URLer med mening • URLen peker til en ressurs, ikke en metode • 8402 http://domain.com/?module=Articles;action=Article.publicShow;ID=8402 Article.publicShow • http://domain.com/articles/siste_nytt_fra_javazone 28
  • 113. Alt kan uttrykkes med GET, POST, PUT, DELETE 29
  • 114. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST GET /listWebshopOrders POST /submitWebshopOrder?name=... Takk, ordren din er registrert. GET /getWebshopOrderDetail?id=352 POST /cancelWebshopOrder?id=352 POST /updateWebshopOrder?id=352&... 29
  • 115. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
  • 116. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
  • 117. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
  • 118. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
  • 119. Alt kan uttrykkes med GET, POST, PUT, DELETE Non-REST REST GET /listWebshopOrders GET /webshop/orders POST /submitWebshopOrder?name=... POST /webshop/orders/ Takk, ordren din er registrert. 201 Created Location: /webshop/orders/352 GET /getWebshopOrderDetail?id=352 GET /webshop/orders/352 POST /cancelWebshopOrder?id=352 DELETE /webshop/orders/352 POST /updateWebshopOrder?id=352&... PUT /webshop/orders/352 29
  • 120. OSGi REST JCR 30
  • 121. OSGi REST JCR 30
  • 122. Apache Sling er et REST-API til JCR 31
  • 123. Apache Sling er et REST-API til JCR +++ 31
  • 125. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet 32
  • 126. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet • En servlet 32
  • 127. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet • En servlet • En filmappe 32
  • 128. Virtuelt ressurs-tre • Du kan pode inn andre ressurser i JCR-treet • En servlet • En filmappe • Din eksisterende database 32
  • 129. Virtuelt ressurs-tre jcr:root Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 UserJsonServlet Second p.. text: ... date: ... images orders JCR-node Servlet Filmappe RDBMS 33
  • 130. Ressurser En ressurs er en abstraksjon av noe som kan adresseres med en URL 34
  • 131. Egenskaper ved en ressurs 35
  • 132. Egenskaper ved en ressurs • Path • f.eks. pathen til en node i JCR 35
  • 133. Egenskaper ved en ressurs • Path • f.eks. pathen til en node i JCR • Type • for JCR-noder: sling:resourceType 35
  • 134. Egenskaper ved en ressurs • Path • f.eks. pathen til en node i JCR • Type • for JCR-noder: sling:resourceType • Metadata • f.eks. sist endret-dato 35
  • 136. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving 36
  • 137. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving Vidars blogg First post feriebilde.jpg author: Vidar text: Intet mer å... jcr:data: ... date: 08-09-2009 Second p.. text: ... date: ... 36
  • 138. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving http://domain.com/vidars_blogg/first_post.fulltext.html Vidars blogg First post feriebilde.jpg author: Vidar text: Intet mer å... jcr:data: ... date: 08-09-2009 Second p.. text: ... date: ... 36
  • 139. Resource Resolver • Sling bruker ressurs-treet som utgangspunkt for URL-resolving http://domain.com/vidars_blogg/first_post.fulltext.html Vidars blogg First post feriebilde.jpg author: Vidar text: Intet mer å... jcr:data: ... date: 08-09-2009 Second p.. text: ... date: ... 36
  • 141. Rendering av ressurser • En ressurs kan rendres av en servlet eller et skript 37
  • 142. Rendering av ressurser • En ressurs kan rendres av en servlet eller et skript • Ressursens ressurstype bestemmer hvilken servlet/skript som velges 37
  • 143. Rendering av ressurser • En ressurs kan rendres av en servlet eller et skript • Ressursens ressurstype bestemmer hvilken servlet/skript som velges • Servleter/skript finnes i det samme virtuelle ressurstreet 37
  • 144. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com 38
  • 145. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path 38
  • 146. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
  • 147. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
  • 148. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Extension Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
  • 149. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Selector Extension Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost 38
  • 150. URL-oppbygging /vidars_blog/first_post.fulltext.html http://domain.com Ressurs-path Selector Extension Vidars blogg First post author: Vidar text: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost bloggpost 38
  • 151. Servlet/Script Resolver fulltext html bloggpost 39
  • 152. Servlet/Script Resolver bloggpost fulltext html 39
  • 153. Servlet/Script Resolver / apps / bloggpost / fulltext / html 39
  • 154. Servlet/Script Resolver / apps / bloggpost / fulltext / html 39
  • 156. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 40
  • 157. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 40
  • 158. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 3. Kall evt. servlet-filtere 40
  • 159. Request-prosessering 1. Finn fram til ressursen Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 3. Kall evt. servlet-filtere 4. Kall servleten/skriptet 40
  • 160. Request-prosessering 1. Finn fram til ressursen Reso ur ce-first process ing Kilde: request-URLen 2. Frinn fram servlet/script til prosessering Kilde: resourceType, selectors og extension 3. Kall evt. servlet-filtere 4. Kall servleten/skriptet 40
  • 161. Hva med min egen kode? 41
  • 162. Hva med min egen kode? • Java-kode pakkes i OSGi-bundler 41
  • 163. Hva med min egen kode? • Java-kode pakkes i OSGi-bundler • Bundlen deployes til en kjørende Sling- instans (hot-deploy) 41
  • 164. Din egen servlet public class MyServlet extends HttpServlet { doGet(HttpServletRequest req, HttpServletResponse res) { res.getWriter().println(author); } } 42
  • 165. Din egen servlet /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends HttpServlet { doGet(HttpServletRequest req, HttpServletResponse res) { res.getWriter().println(author); } } 42
  • 166. Din egen servlet /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { res.getWriter().println(author); } } 42
  • 167. Din egen servlet /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { Resource resource = res.getResource(); ValueMap values = resource.adaptTo(ValueMap.class); String author = values.get(“author”, String.class); res.getWriter().println(author); } } 42
  • 169. Dependency injection /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { repository.doStuff(); } } 43
  • 170. Dependency injection /** * @scr.service interface="javax.servlet.Servlet" * @scr.property name="sling.servlet.paths" * value="/apps/bloggpost/fulltext/html" */ public class MyServlet extends SlingSafeMethodsServlet { /**@scr.reference */ private SlingRepository repository; doGet(SlingHttpServletRequest req, SlingHttpServletResponse res) { repository.doStuff(); } } 43
  • 173. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer 44
  • 174. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer • Resource-providere 44
  • 175. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer • Resource-providere • ... 44
  • 176. Andre komponenter • Servlet-filtre • Autentiserings-mekanismer Hot- ploy! de • Resource-providere • ... 44
  • 179. Rendering-scripts Ressurser kan rendres med scripts. Flere innebygde script- og mal-motorer: • ECMAScript • XSLT • Groovy • Ruby • Velocity • JSR-223 • Scala • JSP • ... 45
  • 180. Rendering-scripts Ressurser kan rendres med scripts. Flere innebygde script- og mal-motorer: • ECMAScript • XSLT • Groovy • Ruby • Velocity • JSR-223 • Scala • JSP • ... 45
  • 181. Rendering-scripts Ressurser kan rendres med scripts. Flere innebygde script- og mal-motorer: • ECMAScript • XSLT • Groovy • Ruby • Velocity • JSR-223 • Scala • JSP • ... 45
  • 182. Rendering-scripts • Raskeste måten å utvikle på • Scripts kan hentes fra repositoriet eller fra bundler 46
  • 184. Ressurs-rendering i ESP First post body: Intet mer å... date: 08-09-2009 sling:resourceType: bloggpost author: Vidar summary: Alltid drømt om å v.. 47
  • 185. Ressurs-rendering i ESP <h1><%=currentNode.name%></h1> First post <% body: Intet mer å... if (currentNode.author) { %> date: 08-09-2009 sling:resourceType: bloggpost author: Vidar Av <%=currentNode.author%> summary: Alltid drømt om å v.. <% } %> <p style=”font-weight: bold”><%=currentNode.summary%></p> <%=currentNode.body%> <% sling.include(currentNode.path + “images.html”); %> 47
  • 186. Ressurs-rendering i ESP /apps/bloggpost/fulltext/html.esp <h1><%=currentNode.name%></h1> First post <% body: Intet mer å... if (currentNode.author) { %> date: 08-09-2009 sling:resourceType: bloggpost author: Vidar Av <%=currentNode.author%> summary: Alltid drømt om å v.. <% } %> <p style=”font-weight: bold”><%=currentNode.summary%></p> <%=currentNode.body%> <% sling.include(currentNode.path + “images.html”); %> 47
  • 187. Arkitektur 48
  • 189. Arkitektur JCR API OSGi Apache Jackrabbit Apache Felix 48
  • 190. Arkitektur Sling Engine / APIer JCR API OSGi Apache Jackrabbit Apache Felix 48
  • 191. Arkitektur OSGI-bundler Scripts Initielt innhold Din applikasjon Sling Engine / APIer JCR API OSGi Apache Jackrabbit Apache Felix 48
  • 193. Demo En mini-blogg-applikasjon med 70 linjer kode Could you just twitter me the code you’ve written today?
  • 194. 1: Opprette nye poster <form method=”POST”> Title: <input type=”text” name=”title” /> Summary: <textarea name=”summary”></textarea> Body: <textarea name=”body”></textarea> <button type=”submit”>Lagre</button> <input type=”hidden” name=”:redirect” value=”*”/> </form>
  • 195. 2. Hente eksisterende <script src=”/system/sling.js”></script> <form method=”POST”> ... </form> <!-- Sett feltverdier fra nodens property-verdier --> <script>Sling.wizard();</script>
  • 196. 3. Navigasjon <ul> <li> <a href="/content/blog/*.html">[Ny post]</a> <script> var posts = Sling.getContent("/content/blog", 2); for(var post in posts) { document.write("<li><a href='/content/blog/" + i + "'>" + posts[post].title + "</a></li>"); } </script> </ul> Koden er tilgjengelig på http://tinyurl.com/slingblog46
  • 197. Litt for simpelt for deg? 54
  • 198. Litt for simpelt for deg? • Hva med • On-the-fly skalering av bilder • RSS-feed • Kommentarer • Separat admin-grensesnitt 54
  • 199. Hva skjedde her? Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
  • 200. Hva skjedde her? admin.esp ThumbnailGeneratorService.java edit.esp ThumbnailGeneratorServiceImpl.java html.esp list.esp menu.esp xml.esp header.esp Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
  • 201. Hva skjedde her? admin.esp ThumbnailGeneratorService.java edit.esp ThumbnailGeneratorServiceImpl.java html.esp list.esp menu.esp xml.esp header.esp Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
  • 202. Hva skjedde her? admin.esp ThumbnailGeneratorService.java edit.esp ThumbnailGeneratorServiceImpl.java html.esp list.esp menu.esp xml.esp header.esp Koden finnes på http://svn.apache.org/repos/asf/sling/trunk/samples/espblog/ 55
  • 203. Thumbnail-generator: OSGi-komponent import javax.jcr.*; import javax.jcr.observation.*; import org.osgi.service.component.ComponentContext; /** * Observerer endringer under /content/espblog, og * genererer thumbnails for bilder som lastes opp. * @scr.service * @scr.component immediate=”true” */ public class ThumbnailGeneratorServiceImpl implements ThumbnailGeneratorService, EventListener {
  • 204. Registrere EventListener /** @scr.reference (settes automatisk av OSGi-rammeverket*/ private SlingRepository repository; /** kalles av OSGi-rammeverket når komponenten startes */ protected void activate(ComponentContext context) { Session s = repository.loginAdministrative(); // Observer nt:file NODE_ADDED ObservationManager m = s.getWorkspace().getObservationManager(); String[] types = {“nt:file”}; m.addEventListener( this, Event.NODE_ADDED, “/espblog/posts”, ... ); }
  • 205. Eventhandler /** * Kalles av JCR-implementasjonen hver gang det skjer en * event som vi har registrert oss for */ public void onEvent(EventIterator it) { while (it.hasNext()) { Event event = it.nextEvent(); String p = event.getPath(); if (!p.contains(“thumbnails”)) { Node n = session.getRootNode().getNode(p); createThumbnails(addedNode); } } }
  • 207. En typisk Sling-applikasjon • JCR-funksjonalitet • WebDAV • Observation
  • 208. En typisk Sling-applikasjon • JCR-funksjonalitet • WebDAV • Observation • Sling-snacks • Enkel skript-mapping • REST-grensesnitt • Innholdslasting
  • 209. En typisk Sling-applikasjon • JCR-funksjonalitet • WebDAV • Observation • Sling-snacks • Enkel skript-mapping • REST-grensesnitt • Innholdslasting • Alt pakket i en OSGi-bundle - deployes til server
  • 210. Bør du vurdere Apache Sling / JCR? 60
  • 211. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? 60
  • 212. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? • Ja, det gjør du. 60
  • 213. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? ROA = Reso ur Oriente ce • Ja, det gjør du. Alt er innhold! d Archite cture 60
  • 214. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? ROA = Reso ur Oriente ce • Ja, det gjør du. Alt er innhold! d Archite cture • Lei av å måtte endre databasestrukturen for å innføre ny funksjonalitet? 60
  • 215. Bør du vurdere Apache Sling / JCR? • Behandler du innhold? ROA = Reso ur Oriente ce • Ja, det gjør du. Alt er innhold! d Archite cture • Lei av å måtte endre databasestrukturen for å innføre ny funksjonalitet? Versjonering Tilgangskontroll Fulltekst-søk med Apache Lucene 60
  • 217. Kom i gang Bygg selv: > svn checkout http://svn.apache.org/repos/asf/sling/trunk sling > cd sling > export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m" > mvn clean install > cd launchpad/webapp > mvn jetty:run
  • 218. Kom i gang Bygg selv: > svn checkout http://svn.apache.org/repos/asf/sling/trunk sling > cd sling > export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m" > mvn clean install > cd launchpad/webapp > mvn jetty:run
  • 219. Kom i gang Bygg selv: > svn checkout http://svn.apache.org/repos/asf/sling/trunk sling > cd sling > export MAVEN_OPTS="-Xmx256m -XX:MaxPermSize=128m" > mvn clean install > cd launchpad/webapp > mvn jetty:run Eller last ned ferdig bygd kjørbar .jar eller .war http://sling.apache.org/site/downloads.cgi
  • 221. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon 62
  • 222. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon • Fleksibelt og dynamisk • BYOB (Bring Your Own Bundles) 62
  • 223. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon • Fleksibelt og dynamisk • BYOB (Bring Your Own Bundles) • Fremdeles ungt, stor økning i brukerbase 62
  • 224. Oppsummering • Lett å komme i gang • Legg til innhold, et par script, og du har en applikasjon • Fleksibelt og dynamisk • BYOB (Bring Your Own Bundles) • Fremdeles ungt, stor økning i brukerbase • Buzzword-compliant Hot- REST JSON Script d eploy 62
  • 225. Lesestoff • http://sling.apache.org • .../site/discover-sling-in-15-minutes.html • dev@sling.apache.org • http://jackrabbit.apache.org 63

Notes de l'éditeur

  1. 7 pkt DEFINISJON JCR OSGi REST SLING TILF&amp;#xD8;RER DEMO NOE FOR DEG F&amp;#xF8;rst en definisjon av hva Sling er S&amp;#xE5; til Java Content Repository, som Sling bygger p&amp;#xE5; OSGi og REST er ogs&amp;#xE5; viktige begreper S&amp;#xE5; g&amp;#xE5;r vi grundigere inn p&amp;#xE5; hva Sling tilbyr S&amp;#xE5; en demo av en applikasjon Til slutt ser vi p&amp;#xE5; hvilke problemer Sling l&amp;#xF8;ser
  2. Klikk for hver bullet 3 pkt UTVIKLER I IDIUM BASERT P&amp;#xC5; SLING COMMITTER Committer - kan bidra til prosjektet og p&amp;#xE5;virke det
  3. Klikk for hver bullet 3 pkt UTVIKLER I IDIUM BASERT P&amp;#xC5; SLING COMMITTER Committer - kan bidra til prosjektet og p&amp;#xE5;virke det
  4. Klikk for hver bullet 3 pkt UTVIKLER I IDIUM BASERT P&amp;#xC5; SLING COMMITTER Committer - kan bidra til prosjektet og p&amp;#xE5;virke det
  5. Hva er det_ vi skal snakke om [KLIKK] 3pkt &amp;#x201C;the simplest device for delivering content very fast&amp;#x201D; st&amp;#xE5;r det i PR-materiellet 4 pkt ENKELT, RASKT, INNHOLD DEFINERE INNHOLD SEINERE WEB-RAMMEVERK DEDIKERT TIL JCR APACHE LICENSE - det dreier seg alts&amp;#xE5; om *innhold*, definisjon seinere - den raskeste m&amp;#xE5;ten &amp;#xE5; utvikle innholdsbaserte applikasjoner Apache-prosjekt = &amp;#xE5;pen kildekode, Apache License er en av de aller frieste lisensene
  6. Hva er det_ vi skal snakke om [KLIKK] 3pkt &amp;#x201C;the simplest device for delivering content very fast&amp;#x201D; st&amp;#xE5;r det i PR-materiellet 4 pkt ENKELT, RASKT, INNHOLD DEFINERE INNHOLD SEINERE WEB-RAMMEVERK DEDIKERT TIL JCR APACHE LICENSE - det dreier seg alts&amp;#xE5; om *innhold*, definisjon seinere - den raskeste m&amp;#xE5;ten &amp;#xE5; utvikle innholdsbaserte applikasjoner Apache-prosjekt = &amp;#xE5;pen kildekode, Apache License er en av de aller frieste lisensene
  7. Hva er det_ vi skal snakke om [KLIKK] 3pkt &amp;#x201C;the simplest device for delivering content very fast&amp;#x201D; st&amp;#xE5;r det i PR-materiellet 4 pkt ENKELT, RASKT, INNHOLD DEFINERE INNHOLD SEINERE WEB-RAMMEVERK DEDIKERT TIL JCR APACHE LICENSE - det dreier seg alts&amp;#xE5; om *innhold*, definisjon seinere - den raskeste m&amp;#xE5;ten &amp;#xE5; utvikle innholdsbaserte applikasjoner Apache-prosjekt = &amp;#xE5;pen kildekode, Apache License er en av de aller frieste lisensene
  8. Hva er det_ vi skal snakke om [KLIKK] 3pkt &amp;#x201C;the simplest device for delivering content very fast&amp;#x201D; st&amp;#xE5;r det i PR-materiellet 4 pkt ENKELT, RASKT, INNHOLD DEFINERE INNHOLD SEINERE WEB-RAMMEVERK DEDIKERT TIL JCR APACHE LICENSE - det dreier seg alts&amp;#xE5; om *innhold*, definisjon seinere - den raskeste m&amp;#xE5;ten &amp;#xE5; utvikle innholdsbaserte applikasjoner Apache-prosjekt = &amp;#xE5;pen kildekode, Apache License er en av de aller frieste lisensene
  9. Hva er det_ vi skal snakke om [KLIKK] 3pkt &amp;#x201C;the simplest device for delivering content very fast&amp;#x201D; st&amp;#xE5;r det i PR-materiellet 4 pkt ENKELT, RASKT, INNHOLD DEFINERE INNHOLD SEINERE WEB-RAMMEVERK DEDIKERT TIL JCR APACHE LICENSE - det dreier seg alts&amp;#xE5; om *innhold*, definisjon seinere - den raskeste m&amp;#xE5;ten &amp;#xE5; utvikle innholdsbaserte applikasjoner Apache-prosjekt = &amp;#xE5;pen kildekode, Apache License er en av de aller frieste lisensene
  10. Sling er en plattform, som igjen er ... 3pkt BYGD P&amp;#xC5; JCR basert p&amp;#xE5; REST drevet av OSGi ... og vi skal se p&amp;#xE5; disse delene
  11. Sling er en plattform, som igjen er ... 3pkt BYGD P&amp;#xC5; JCR basert p&amp;#xE5; REST drevet av OSGi ... og vi skal se p&amp;#xE5; disse delene
  12. Sling er en plattform, som igjen er ... 3pkt BYGD P&amp;#xC5; JCR basert p&amp;#xE5; REST drevet av OSGi ... og vi skal se p&amp;#xE5; disse delene
  13. Tre standarder som Sling bygger p&amp;#xE5;. F&amp;#xF8;rst: JCR - Java Content Repository
  14. Tre standarder som Sling bygger p&amp;#xE5;. F&amp;#xF8;rst: JCR - Java Content Repository
  15. Tre standarder som Sling bygger p&amp;#xE5;. F&amp;#xF8;rst: JCR - Java Content Repository
  16. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  17. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  18. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  19. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  20. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  21. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  22. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  23. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  24. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  25. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  26. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  27. 5 pkt JSR-170: JCR 1.0 JSR-283: JCR 2.0 - ferd med &amp;#xE5; bli ferdigstilt 5pkt JCR 1.0 og 2.0 STORE FIRMAER ST&amp;#xD8;TTER HIERARKISK DATABASE NODER OG ATTRIBUTTER, ikke TABELLER OG KOLONNER RIKE DATATYPER ... alts&amp;#xE5; vedtatte Java-standarder, med noen store firmaer bak [KLIKK] Hierarki - ikke tabeller / kolonner Kommer tilbake til datatyper/-struktur
  28. 4 pkt FLERE FORSKJELLIGE IMPLEMENTASJONER AV JCR-STANDARDEN NYTT: OpenJCR APACHE JACKRABBIT ER REFERANSEIMPL, og shippes med Sling DE FLESTE BYGD P&amp;#xC5; JACKRABBIT Apache Jackrabbit er referanseimplementasjonen, og den som shippes med Sling Microsoft Sharepoint - via connector fra Day Mange av disse er bygd p&amp;#xE5; Jackrabbit, men utvidet med propriet&amp;#xE6;r funksjonalitet
  29. 4 pkt FLERE FORSKJELLIGE IMPLEMENTASJONER AV JCR-STANDARDEN NYTT: OpenJCR APACHE JACKRABBIT ER REFERANSEIMPL, og shippes med Sling DE FLESTE BYGD P&amp;#xC5; JACKRABBIT Apache Jackrabbit er referanseimplementasjonen, og den som shippes med Sling Microsoft Sharepoint - via connector fra Day Mange av disse er bygd p&amp;#xE5; Jackrabbit, men utvidet med propriet&amp;#xE6;r funksjonalitet
  30. 2pkt NOEN KJENTE NAVN, bl.a. NORSKE MYE ENTERPRISE, men SLING EGNER SEG OGS&amp;#xC5; FOR MINDRE L&amp;#xD8;SNINGER =&gt; ref kolibri Antakelig noen kjente navn her. De fleste bruker Jackrabbit som implementasjon. Mye enterprise-systemer, men med Sling egner JCR seg ogs&amp;#xE5; for mindre l&amp;#xF8;sninger. Derfor Idium Web.
  31. 2pkt JSR-STANDARDER KAN V&amp;#xC6;RE KRYPTISKE N&amp;#xD8;KKELEN ER &amp;#xE5; forst&amp;#xE5; HVA CONTENT REPOSITORY er N&amp;#xE5;r det gjelder JSR-standardene, s&amp;#xE5; kan de v&amp;#xE6;re kryptiske. [KLIKK] N&amp;#xF8;kkelen er &amp;#xE5; forst&amp;#xE5; hva et &amp;#x201C;content repository&amp;#x201D; er
  32. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  33. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  34. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  35. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  36. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  37. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  38. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  39. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  40. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  41. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  42. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  43. 3pkt DB og FILSYSTEM - TO FORSKJELLIGE VERDENER FELLES: LESE- og SKRIVE-TILGANG JCR: BESTE FRA BEGGE VERDENER Database og filsystem - vi er vant til &amp;#xE5; se p&amp;#xE5; det som to forskjellige verdener Men det er et par ting felles: Lese- og skrivetilgang (Til slutt): JCR tar det beste fra begge verdener
  44. MEN DET ER SELVF&amp;#xD8;LGELIG IKKE ALT (Klikk en gang til for &amp;#xE5; f&amp;#xE5; g&amp;#xE5; videre fra plakaten)
  45. MEN DET ER SELVF&amp;#xD8;LGELIG IKKE ALT (Klikk en gang til for &amp;#xE5; f&amp;#xE5; g&amp;#xE5; videre fra plakaten)
  46. I TILLEGG: Fulltekst-s&amp;#xF8;k Fri struktur Versjonering Flerverdi-felt Spesifikk rekkef&amp;#xF8;lge Obervasjon og alt dette er tilgjengelig gjennom et enkelt Java-API
  47. I TILLEGG: Fulltekst-s&amp;#xF8;k Fri struktur Versjonering Flerverdi-felt Spesifikk rekkef&amp;#xF8;lge Obervasjon og alt dette er tilgjengelig gjennom et enkelt Java-API
  48. I TILLEGG: Fulltekst-s&amp;#xF8;k Fri struktur Versjonering Flerverdi-felt Spesifikk rekkef&amp;#xF8;lge Obervasjon og alt dette er tilgjengelig gjennom et enkelt Java-API
  49. I TILLEGG: Fulltekst-s&amp;#xF8;k Fri struktur Versjonering Flerverdi-felt Spesifikk rekkef&amp;#xF8;lge Obervasjon og alt dette er tilgjengelig gjennom et enkelt Java-API
  50. I TILLEGG: Fulltekst-s&amp;#xF8;k Fri struktur Versjonering Flerverdi-felt Spesifikk rekkef&amp;#xF8;lge Obervasjon og alt dette er tilgjengelig gjennom et enkelt Java-API
  51. I TILLEGG: Fulltekst-s&amp;#xF8;k Fri struktur Versjonering Flerverdi-felt Spesifikk rekkef&amp;#xF8;lge Obervasjon og alt dette er tilgjengelig gjennom et enkelt Java-API
  52. I TILLEGG: Fulltekst-s&amp;#xF8;k Fri struktur Versjonering Flerverdi-felt Spesifikk rekkef&amp;#xF8;lge Obervasjon og alt dette er tilgjengelig gjennom et enkelt Java-API
  53. 6pkt SELVF&amp;#xD8;LGELIG HIERARKI - (ET TRE) DYP MAN VIL BRED MAN VIL NEDERST TIL H&amp;#xD8;YRE: FIL IKKE VIST: VERSJONERING, S&amp;#xD8;SKEN MED SAMME NAVN GR&amp;#xD8;NN LEGOGKLOSS = NODE til seinere S&amp;#xE5;, hvordan ser et repository ut? Selvf&amp;#xF8;lgelig et hierarki (et tre) Legg merke til: - Strukturen kan v&amp;#xE6;re s&amp;#xE5; dyp og bred man vil - En node kan ha s&amp;#xE5; mange barn man vil - Noder kan ha forskjellige attributter - Filnoden nederst til h&amp;#xF8;yre - man kan lagre filer rett i repositoriet Mange features ikke demonstrert her, som: - versjonering - s&amp;#xF8;sken med samme navn De gr&amp;#xF8;nne legoklossene betyr &amp;#x201C;node&amp;#x201D; - kommer til &amp;#xE5; bruke det seinere
  54. 6pkt SELVF&amp;#xD8;LGELIG HIERARKI - (ET TRE) DYP MAN VIL BRED MAN VIL NEDERST TIL H&amp;#xD8;YRE: FIL IKKE VIST: VERSJONERING, S&amp;#xD8;SKEN MED SAMME NAVN GR&amp;#xD8;NN LEGOGKLOSS = NODE til seinere S&amp;#xE5;, hvordan ser et repository ut? Selvf&amp;#xF8;lgelig et hierarki (et tre) Legg merke til: - Strukturen kan v&amp;#xE6;re s&amp;#xE5; dyp og bred man vil - En node kan ha s&amp;#xE5; mange barn man vil - Noder kan ha forskjellige attributter - Filnoden nederst til h&amp;#xF8;yre - man kan lagre filer rett i repositoriet Mange features ikke demonstrert her, som: - versjonering - s&amp;#xF8;sken med samme navn De gr&amp;#xF8;nne legoklossene betyr &amp;#x201C;node&amp;#x201D; - kommer til &amp;#xE5; bruke det seinere
  55. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  56. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  57. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  58. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  59. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  60. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  61. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  62. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  63. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  64. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  65. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  66. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  67. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  68. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  69. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  70. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  71. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  72. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  73. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  74. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  75. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  76. javax.jcr er JCR-apiet o.a.j.c.TR er fra JackRabbit-implementasjonen i bl&amp;#xE5;tt session.save() lagrer alle endringer s&amp;#xE5; langt, man jobber alts&amp;#xE5; i sin sandkasse Eksempel p&amp;#xE5; hvordan man henter ut en node. Tar en node man har, og gir en relativ path til denne. Kan ogs&amp;#xE5; gj&amp;#xF8;res med sp&amp;#xF8;rring: XPath eller SQL
  77. 5pkt MANGE APP SKAL LEVE *LENGE* - VANSKELIG &amp;#xC5; TA H&amp;#xD8;YDE FOR FREMTIDIGE TYPER DATA N&amp;#xC5;R MAN IKKE *TRENGER* STRENGE RESTRIKSJONER, B&amp;#xD8;R MAN HELLER IKKE INNF&amp;#xD8;RE DEM KAN INNF&amp;#xD8;RE RESTRIKSJONER ETTERHVERT RULES OF DATABASE AGING - ALLE &amp;#x201C;NOT NULL&amp;#x201D; BLIR BORTE HIERARKI TILSTREKKELIG - MULIG MED KRYSSREFERANSER, MEN UNNG&amp;#xC5; DET Mange applikasjoner skal leve LENGE, og det er vanskelig &amp;#xE5; ta h&amp;#xF8;yde for fremtidige typer data som skal lagres. N&amp;#xE5;r man ikke *trenger* &amp;#xE5; sette opp felter fra start, s&amp;#xE5; b&amp;#xF8;r man heller ikke gj&amp;#xF8;re det Man kan innf&amp;#xF8;re rigide restriksjoner fra start Rules of Database App Aging: Etterhvert som datasettet blir st&amp;#xF8;rre, blir antallet unntakstilfeller st&amp;#xF8;rre. Alle felter blir etterhvert optional - alle NOT NULL blir borte - TRENGER BEDRE EKSEMPEL: f.eks. kan ikke feltet &amp;#x201C;stat&amp;#x201D; fylles ut Et content repository skal leve lenge, og b&amp;#xF8;r kunne h&amp;#xE5;ndtere nye behov etterhvert Hierarki tilstrekkelig struktur: Det er MULIG &amp;#xE5; lage referanser, men ikke n&amp;#xF8;dvendig, og ofte dumt.
  78. 5pkt MANGE APP SKAL LEVE *LENGE* - VANSKELIG &amp;#xC5; TA H&amp;#xD8;YDE FOR FREMTIDIGE TYPER DATA N&amp;#xC5;R MAN IKKE *TRENGER* STRENGE RESTRIKSJONER, B&amp;#xD8;R MAN HELLER IKKE INNF&amp;#xD8;RE DEM KAN INNF&amp;#xD8;RE RESTRIKSJONER ETTERHVERT RULES OF DATABASE AGING - ALLE &amp;#x201C;NOT NULL&amp;#x201D; BLIR BORTE HIERARKI TILSTREKKELIG - MULIG MED KRYSSREFERANSER, MEN UNNG&amp;#xC5; DET Mange applikasjoner skal leve LENGE, og det er vanskelig &amp;#xE5; ta h&amp;#xF8;yde for fremtidige typer data som skal lagres. N&amp;#xE5;r man ikke *trenger* &amp;#xE5; sette opp felter fra start, s&amp;#xE5; b&amp;#xF8;r man heller ikke gj&amp;#xF8;re det Man kan innf&amp;#xF8;re rigide restriksjoner fra start Rules of Database App Aging: Etterhvert som datasettet blir st&amp;#xF8;rre, blir antallet unntakstilfeller st&amp;#xF8;rre. Alle felter blir etterhvert optional - alle NOT NULL blir borte - TRENGER BEDRE EKSEMPEL: f.eks. kan ikke feltet &amp;#x201C;stat&amp;#x201D; fylles ut Et content repository skal leve lenge, og b&amp;#xF8;r kunne h&amp;#xE5;ndtere nye behov etterhvert Hierarki tilstrekkelig struktur: Det er MULIG &amp;#xE5; lage referanser, men ikke n&amp;#xF8;dvendig, og ofte dumt.
  79. 5pkt MANGE APP SKAL LEVE *LENGE* - VANSKELIG &amp;#xC5; TA H&amp;#xD8;YDE FOR FREMTIDIGE TYPER DATA N&amp;#xC5;R MAN IKKE *TRENGER* STRENGE RESTRIKSJONER, B&amp;#xD8;R MAN HELLER IKKE INNF&amp;#xD8;RE DEM KAN INNF&amp;#xD8;RE RESTRIKSJONER ETTERHVERT RULES OF DATABASE AGING - ALLE &amp;#x201C;NOT NULL&amp;#x201D; BLIR BORTE HIERARKI TILSTREKKELIG - MULIG MED KRYSSREFERANSER, MEN UNNG&amp;#xC5; DET Mange applikasjoner skal leve LENGE, og det er vanskelig &amp;#xE5; ta h&amp;#xF8;yde for fremtidige typer data som skal lagres. N&amp;#xE5;r man ikke *trenger* &amp;#xE5; sette opp felter fra start, s&amp;#xE5; b&amp;#xF8;r man heller ikke gj&amp;#xF8;re det Man kan innf&amp;#xF8;re rigide restriksjoner fra start Rules of Database App Aging: Etterhvert som datasettet blir st&amp;#xF8;rre, blir antallet unntakstilfeller st&amp;#xF8;rre. Alle felter blir etterhvert optional - alle NOT NULL blir borte - TRENGER BEDRE EKSEMPEL: f.eks. kan ikke feltet &amp;#x201C;stat&amp;#x201D; fylles ut Et content repository skal leve lenge, og b&amp;#xF8;r kunne h&amp;#xE5;ndtere nye behov etterhvert Hierarki tilstrekkelig struktur: Det er MULIG &amp;#xE5; lage referanser, men ikke n&amp;#xF8;dvendig, og ofte dumt.
  80. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  81. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  82. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  83. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  84. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  85. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  86. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  87. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  88. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  89. Blogg-applikasjon: Webapplikasjon for et bloggsystem. Man skal kunne ha flere blogger. En blogg skal kunne ha flere poster. Hver tabell har en ID-kolonne. En post er linket til en blogg vhja bloggId. Det fungerer fint lenge, man f&amp;#xE5;r mange blogginnlegg i databasen. Etterhvert finner man ut at man vil kunne knytte et bilde til en bloggpost. Ny kolonne i tabellen, men vil bare f&amp;#xE5; verdi for nye blogg-innlegg. Gir masse NULL-verdier i gamle rader - alts&amp;#xE5; upraktisk &amp;#xE5; innf&amp;#xF8;re noe restriksjon p&amp;#xE5; feltet (NOT NULL). Etterhvert finner man ut at man vil kunne ha flere bilder til en bloggpost. Kolonnen droppes, ny tabell innf&amp;#xF8;res, ny relasjon. Legg merke til referansene som opprettholdes av IDer. Dette fungerer sikkert fint en stund, til FOR EKSEMPEL, man finner ut at man skal &amp;#xE5;pne for kommentarer. Da m&amp;#xE5; databasestrukturen endres igjen.
  90. 4pkt INGEN PRIM&amp;#xC6;RN&amp;#xD8;KLER INNF&amp;#xD8;RE VEDLEGG - BARE SLENGE P&amp;#xC5; NY NODE JCR ST&amp;#xD8;TTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE FLERE VEDLEGG - FLERE FILNODER &amp;#x201C;Vidars blogg&amp;#x201D; er en toppniv&amp;#xE5;-node, &amp;#x201C;First post&amp;#x201D; og &amp;#x201C;Second post&amp;#x201D; er noder direkte under denne. Slipper n&amp;#xF8;kler i det hele tatt N&amp;#xE5;r jeg &amp;#xF8;nsker &amp;#xE5; innf&amp;#xF8;re vedlegg, er det bare &amp;#xE5; slenge p&amp;#xE5; en ny node. Og JCR st&amp;#xF8;tter ogs&amp;#xE5; filer som innhold, s&amp;#xE5; jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke v&amp;#xE6;re en referanse til en fil p&amp;#xE5; disk eller et BLOB-felt.
  91. 4pkt INGEN PRIM&amp;#xC6;RN&amp;#xD8;KLER INNF&amp;#xD8;RE VEDLEGG - BARE SLENGE P&amp;#xC5; NY NODE JCR ST&amp;#xD8;TTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE FLERE VEDLEGG - FLERE FILNODER &amp;#x201C;Vidars blogg&amp;#x201D; er en toppniv&amp;#xE5;-node, &amp;#x201C;First post&amp;#x201D; og &amp;#x201C;Second post&amp;#x201D; er noder direkte under denne. Slipper n&amp;#xF8;kler i det hele tatt N&amp;#xE5;r jeg &amp;#xF8;nsker &amp;#xE5; innf&amp;#xF8;re vedlegg, er det bare &amp;#xE5; slenge p&amp;#xE5; en ny node. Og JCR st&amp;#xF8;tter ogs&amp;#xE5; filer som innhold, s&amp;#xE5; jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke v&amp;#xE6;re en referanse til en fil p&amp;#xE5; disk eller et BLOB-felt.
  92. 4pkt INGEN PRIM&amp;#xC6;RN&amp;#xD8;KLER INNF&amp;#xD8;RE VEDLEGG - BARE SLENGE P&amp;#xC5; NY NODE JCR ST&amp;#xD8;TTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE FLERE VEDLEGG - FLERE FILNODER &amp;#x201C;Vidars blogg&amp;#x201D; er en toppniv&amp;#xE5;-node, &amp;#x201C;First post&amp;#x201D; og &amp;#x201C;Second post&amp;#x201D; er noder direkte under denne. Slipper n&amp;#xF8;kler i det hele tatt N&amp;#xE5;r jeg &amp;#xF8;nsker &amp;#xE5; innf&amp;#xF8;re vedlegg, er det bare &amp;#xE5; slenge p&amp;#xE5; en ny node. Og JCR st&amp;#xF8;tter ogs&amp;#xE5; filer som innhold, s&amp;#xE5; jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke v&amp;#xE6;re en referanse til en fil p&amp;#xE5; disk eller et BLOB-felt.
  93. 4pkt INGEN PRIM&amp;#xC6;RN&amp;#xD8;KLER INNF&amp;#xD8;RE VEDLEGG - BARE SLENGE P&amp;#xC5; NY NODE JCR ST&amp;#xD8;TTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE FLERE VEDLEGG - FLERE FILNODER &amp;#x201C;Vidars blogg&amp;#x201D; er en toppniv&amp;#xE5;-node, &amp;#x201C;First post&amp;#x201D; og &amp;#x201C;Second post&amp;#x201D; er noder direkte under denne. Slipper n&amp;#xF8;kler i det hele tatt N&amp;#xE5;r jeg &amp;#xF8;nsker &amp;#xE5; innf&amp;#xF8;re vedlegg, er det bare &amp;#xE5; slenge p&amp;#xE5; en ny node. Og JCR st&amp;#xF8;tter ogs&amp;#xE5; filer som innhold, s&amp;#xE5; jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke v&amp;#xE6;re en referanse til en fil p&amp;#xE5; disk eller et BLOB-felt.
  94. 4pkt INGEN PRIM&amp;#xC6;RN&amp;#xD8;KLER INNF&amp;#xD8;RE VEDLEGG - BARE SLENGE P&amp;#xC5; NY NODE JCR ST&amp;#xD8;TTER FILER SOM INNHOLD - KAN LAGRE FILA DIREKTE FLERE VEDLEGG - FLERE FILNODER &amp;#x201C;Vidars blogg&amp;#x201D; er en toppniv&amp;#xE5;-node, &amp;#x201C;First post&amp;#x201D; og &amp;#x201C;Second post&amp;#x201D; er noder direkte under denne. Slipper n&amp;#xF8;kler i det hele tatt N&amp;#xE5;r jeg &amp;#xF8;nsker &amp;#xE5; innf&amp;#xF8;re vedlegg, er det bare &amp;#xE5; slenge p&amp;#xE5; en ny node. Og JCR st&amp;#xF8;tter ogs&amp;#xE5; filer som innhold, s&amp;#xE5; jeg kan lagre fila direkte sammen med de andre dataene - trenger ikke v&amp;#xE6;re en referanse til en fil p&amp;#xE5; disk eller et BLOB-felt.
  95. 2 pkt HVORDAN UTVIKLE EGEN FUNKSJONALITET TIL SIN SLING-APPLIKASJON OSGi IKKE STRENGT N&amp;#xD8;DVENDIG (MULIG &amp;#xC5; UNNG&amp;#xC5;), MEN KORT SE P&amp;#xC5; DET Hvordan utvikler man egen funksjonalitet til sin Sling-applikasjon? OSGi er ikke n&amp;#xF8;dvendig &amp;#xE5; kunne for &amp;#xE5; lage enkle Sling-applikasjoner, men vi skal se kort p&amp;#xE5; det.
  96. 2 pkt HVORDAN UTVIKLE EGEN FUNKSJONALITET TIL SIN SLING-APPLIKASJON OSGi IKKE STRENGT N&amp;#xD8;DVENDIG (MULIG &amp;#xC5; UNNG&amp;#xC5;), MEN KORT SE P&amp;#xC5; DET Hvordan utvikler man egen funksjonalitet til sin Sling-applikasjon? OSGi er ikke n&amp;#xF8;dvendig &amp;#xE5; kunne for &amp;#xE5; lage enkle Sling-applikasjoner, men vi skal se kort p&amp;#xE5; det.
  97. 2 pkt HVORDAN UTVIKLE EGEN FUNKSJONALITET TIL SIN SLING-APPLIKASJON OSGi IKKE STRENGT N&amp;#xD8;DVENDIG (MULIG &amp;#xC5; UNNG&amp;#xC5;), MEN KORT SE P&amp;#xC5; DET Hvordan utvikler man egen funksjonalitet til sin Sling-applikasjon? OSGi er ikke n&amp;#xF8;dvendig &amp;#xE5; kunne for &amp;#xE5; lage enkle Sling-applikasjoner, men vi skal se kort p&amp;#xE5; det.
  98. Dynamic Module System For Java Open Services Gateway initiative - navnet ikke lenger i bruk [klikk] 4pkt FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY BUNDLER KAN HA AVHENGIGHETER TIL ANDRE BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER Funksjonalitet pakkes i bundles - skal straks se hva en bundle er Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  99. Dynamic Module System For Java Open Services Gateway initiative - navnet ikke lenger i bruk [klikk] 4pkt FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY BUNDLER KAN HA AVHENGIGHETER TIL ANDRE BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER Funksjonalitet pakkes i bundles - skal straks se hva en bundle er Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  100. Dynamic Module System For Java Open Services Gateway initiative - navnet ikke lenger i bruk [klikk] 4pkt FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY BUNDLER KAN HA AVHENGIGHETER TIL ANDRE BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER Funksjonalitet pakkes i bundles - skal straks se hva en bundle er Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  101. Dynamic Module System For Java Open Services Gateway initiative - navnet ikke lenger i bruk [klikk] 4pkt FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY BUNDLER KAN HA AVHENGIGHETER TIL ANDRE BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER Funksjonalitet pakkes i bundles - skal straks se hva en bundle er Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  102. Dynamic Module System For Java Open Services Gateway initiative - navnet ikke lenger i bruk [klikk] 4pkt FUNKSJONALITET PAKKES I BUNDLES - SKAL SE HVA EN BUNDLE ER KAN STARTES, STOPPES, OPPGRADERES - HOT-DEPLOY BUNDLER KAN HA AVHENGIGHETER TIL ANDRE BUNDLER EKSPORTERER PAKKER TIL ANDRE BUNDLER Funksjonalitet pakkes i bundles - skal straks se hva en bundle er Bundle med JCR-innhold: i tillegg til kode - Sling-spesifikt
  103. EN VANLIG JAVA-KLASSE PR DEF DEL AV EN PAKKE HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE I EN ANNEN PAKKE HAR VI CLASS A DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1 MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC 1 pkt DETTE KAN VI FRA F&amp;#xD8;R, DET ER VANLIG INNKAPSLING I JAVA Jeg kan endre implementasjonen i ImplClass s&amp;#xE5; mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er alts&amp;#xE5; en enhet med et interface.
  104. EN VANLIG JAVA-KLASSE PR DEF DEL AV EN PAKKE HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE I EN ANNEN PAKKE HAR VI CLASS A DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1 MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC 1 pkt DETTE KAN VI FRA F&amp;#xD8;R, DET ER VANLIG INNKAPSLING I JAVA Jeg kan endre implementasjonen i ImplClass s&amp;#xE5; mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er alts&amp;#xE5; en enhet med et interface.
  105. EN VANLIG JAVA-KLASSE PR DEF DEL AV EN PAKKE HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE I EN ANNEN PAKKE HAR VI CLASS A DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1 MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC 1 pkt DETTE KAN VI FRA F&amp;#xD8;R, DET ER VANLIG INNKAPSLING I JAVA Jeg kan endre implementasjonen i ImplClass s&amp;#xE5; mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er alts&amp;#xE5; en enhet med et interface.
  106. EN VANLIG JAVA-KLASSE PR DEF DEL AV EN PAKKE HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE I EN ANNEN PAKKE HAR VI CLASS A DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1 MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC 1 pkt DETTE KAN VI FRA F&amp;#xD8;R, DET ER VANLIG INNKAPSLING I JAVA Jeg kan endre implementasjonen i ImplClass s&amp;#xE5; mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er alts&amp;#xE5; en enhet med et interface.
  107. EN VANLIG JAVA-KLASSE PR DEF DEL AV EN PAKKE HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE I EN ANNEN PAKKE HAR VI CLASS A DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1 MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC 1 pkt DETTE KAN VI FRA F&amp;#xD8;R, DET ER VANLIG INNKAPSLING I JAVA Jeg kan endre implementasjonen i ImplClass s&amp;#xE5; mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er alts&amp;#xE5; en enhet med et interface.
  108. EN VANLIG JAVA-KLASSE PR DEF DEL AV EN PAKKE HVOR DET FINNES EN ANNEN KLASSE SOM ER PUBLIC CLASSB HAR TILGANG TIL IMPLCLASS FORDI DE ER I SAMME PAKKE I EN ANNEN PAKKE HAR VI CLASS A DENNE HAR TILGANG TIL PUBLIC-KLASSENE I PACKAGE1 MEN IKKE TIL KLASSER SOM IKKE ER PUBLIC 1 pkt DETTE KAN VI FRA F&amp;#xD8;R, DET ER VANLIG INNKAPSLING I JAVA Jeg kan endre implementasjonen i ImplClass s&amp;#xE5; mye jeg vil, fordi den ikke er tilgjengelig utenfor pakka. Package1 er alts&amp;#xE5; en enhet med et interface.
  109. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  110. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  111. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  112. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  113. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  114. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  115. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  116. I EN OSGi-BUNDLE HAR VI FREMDELES KLASSER OG PAKKER MEN VI PAKKER DISSE I EN BUNDLE EN BUNDLE *EKSPORTERER* PAKKER VI INNF&amp;#xD8;RER EN NY BUNDLE MED EN KLASSE VI HAR IKKE TILGANG TIL PAKKER I ANDRE BUNDLER BARE DE SOM EKSPLISITT ER EKSPORTERT DVS AT PACKAGE1 ER USYNLIG FOR OMVERDENEN 3 pkt OG AT PACKAGE2 FUNGERER SOM ET INTERFACE FOR HELE MyBundle VI F&amp;#xC5;R ET LAG TIL MED INNKAPSLING KAN HERJE MED PACKAGE1 UTEN &amp;#xC5; BRYTE ANNEN KODE Betyr at jeg kan herje s&amp;#xE5; mye jeg vil med implementasjonen i Package1, og v&amp;#xE6;re sikker p&amp;#xE5; at det er bakoverkompatibelt Package1 er usynlig for andre bundler - m.a.o vi kan ha private klasser Package2 fungerer som et interface for hele bundle&amp;#x2019;n Dette betyr at mye kode kan skjules, og man f&amp;#xE5;r veldig rene grensesnitt mellom komponenter.
  117. 3pkt HELE SLING-PLATTFORMEN ER EN SERIE BUNDLES LETT &amp;#xC5; BYTTE UT: PGA RENE GRENSESNITT EGNE BUNDLES: DEPENDENCY INJECTION - KOMMER SENERE Lett &amp;#xE5; bytte ut: Fordi det er s&amp;#xE5; rene grensesnitt Lett &amp;#xE5; utvide pga komponentmodellen og dependency injection (kommer senere)
  118. 3pkt HELE SLING-PLATTFORMEN ER EN SERIE BUNDLES LETT &amp;#xC5; BYTTE UT: PGA RENE GRENSESNITT EGNE BUNDLES: DEPENDENCY INJECTION - KOMMER SENERE Lett &amp;#xE5; bytte ut: Fordi det er s&amp;#xE5; rene grensesnitt Lett &amp;#xE5; utvide pga komponentmodellen og dependency injection (kommer senere)
  119. 3pkt HELE SLING-PLATTFORMEN ER EN SERIE BUNDLES LETT &amp;#xC5; BYTTE UT: PGA RENE GRENSESNITT EGNE BUNDLES: DEPENDENCY INJECTION - KOMMER SENERE Lett &amp;#xE5; bytte ut: Fordi det er s&amp;#xE5; rene grensesnitt Lett &amp;#xE5; utvide pga komponentmodellen og dependency injection (kommer senere)
  120. 4pkt EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE EGNE SERVLETER INNHOLD JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  121. 4pkt EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE EGNE SERVLETER INNHOLD JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  122. 4pkt EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE EGNE SERVLETER INNHOLD JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  123. 4pkt EGNE INNHOLDSTILBYDERE - VIRTUELT RESSURSTRE, SENERE EGNE SERVLETER INNHOLD JACKRABBIT-PLUGIN-MODULER, f.eks. TILGANGSKONTROLL Egne innholdstilbydere - ref. til virtuelt ressurstre, kommer senere Plugin-moduler til Jackrabbit: F.eks. tilgangskontroll
  124. REST
  125. REST
  126. REST
  127. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  128. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  129. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  130. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  131. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  132. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  133. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  134. 5pkt MANGE VET REPRESENTIONAL STATE TRANSFER ALL STATE HOLDER AV KLIENTEN - SAMME GET-REQUEST GIR SAMME RESULTAT HVER GANG INGEN SERVER-SIDE SESSIONS - INGEN SESSION-ID-COOKIE - ENKEL CLUSTERING ENKLE HTTP-METODER (les opp hvert punkt) Sikkert mange som vet hva REST er og st&amp;#xE5;r for All state holdes av klienten: Den samme GET-requesten skal gi samme resultat hver gang - uavhengig av hva klienten har foretatt seg tidligere i sesjonen Det eneste som er STATE, er egentlig URLen Unng&amp;#xE5;r server-side sessions: Ingen cookie med sessionId Lettere &amp;#xE5; implementere clustering
  135. 4pkt ++ URL PEKER TIL *RESSURS* IKKE METODE EKSEMPEL: URL besudlet med METODENAVN VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE STYGT ID-FELT 6pkt ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSP&amp;#xD8;RRES METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE INGEN QUERY-STRING - INFORMASJON i SELVE URLen URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen I det f&amp;#xF8;rste eksempelet er URLen besudlet med metodenavn (&amp;#x201C;Article.publicShow&amp;#x201D;) Man vil ha forskjellige metodenavn etter hva som skal gj&amp;#xF8;res, f.eks. slette en artikkel, eller oppdatere den. Stygt ID-felt I det andre eksempelet er URLen en adresse til ressursen som ettersp&amp;#xF8;rres Metoden er HTTP GET Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse Man ser at query-stringen er borte, informasjonen flyttet inn i URLen Vi har plutselig f&amp;#xE5;tt en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  136. 4pkt ++ URL PEKER TIL *RESSURS* IKKE METODE EKSEMPEL: URL besudlet med METODENAVN VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE STYGT ID-FELT 6pkt ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSP&amp;#xD8;RRES METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE INGEN QUERY-STRING - INFORMASJON i SELVE URLen URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen I det f&amp;#xF8;rste eksempelet er URLen besudlet med metodenavn (&amp;#x201C;Article.publicShow&amp;#x201D;) Man vil ha forskjellige metodenavn etter hva som skal gj&amp;#xF8;res, f.eks. slette en artikkel, eller oppdatere den. Stygt ID-felt I det andre eksempelet er URLen en adresse til ressursen som ettersp&amp;#xF8;rres Metoden er HTTP GET Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse Man ser at query-stringen er borte, informasjonen flyttet inn i URLen Vi har plutselig f&amp;#xE5;tt en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  137. 4pkt ++ URL PEKER TIL *RESSURS* IKKE METODE EKSEMPEL: URL besudlet med METODENAVN VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE STYGT ID-FELT 6pkt ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSP&amp;#xD8;RRES METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE INGEN QUERY-STRING - INFORMASJON i SELVE URLen URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen I det f&amp;#xF8;rste eksempelet er URLen besudlet med metodenavn (&amp;#x201C;Article.publicShow&amp;#x201D;) Man vil ha forskjellige metodenavn etter hva som skal gj&amp;#xF8;res, f.eks. slette en artikkel, eller oppdatere den. Stygt ID-felt I det andre eksempelet er URLen en adresse til ressursen som ettersp&amp;#xF8;rres Metoden er HTTP GET Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse Man ser at query-stringen er borte, informasjonen flyttet inn i URLen Vi har plutselig f&amp;#xE5;tt en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  138. 4pkt ++ URL PEKER TIL *RESSURS* IKKE METODE EKSEMPEL: URL besudlet med METODENAVN VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE STYGT ID-FELT 6pkt ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSP&amp;#xD8;RRES METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE INGEN QUERY-STRING - INFORMASJON i SELVE URLen URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen I det f&amp;#xF8;rste eksempelet er URLen besudlet med metodenavn (&amp;#x201C;Article.publicShow&amp;#x201D;) Man vil ha forskjellige metodenavn etter hva som skal gj&amp;#xF8;res, f.eks. slette en artikkel, eller oppdatere den. Stygt ID-felt I det andre eksempelet er URLen en adresse til ressursen som ettersp&amp;#xF8;rres Metoden er HTTP GET Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse Man ser at query-stringen er borte, informasjonen flyttet inn i URLen Vi har plutselig f&amp;#xE5;tt en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  139. 4pkt ++ URL PEKER TIL *RESSURS* IKKE METODE EKSEMPEL: URL besudlet med METODENAVN VIL HA FORSKJELLIGE METODENAVN TIL F.EKS. SLETTE ARTIKKEL ELLER OPPDATERE STYGT ID-FELT 6pkt ANDRE EKSEMPEL: URL er ADRESSE TIL RESSURS SOM ETTERSP&amp;#xD8;RRES METODEN ER HTTP GET - PUBLICSHOW er IMPLISITT OPPDATERE RESSURS: HTTP PUT til SAMME ADRESSE INGEN QUERY-STRING - INFORMASJON i SELVE URLen URLen er MENNESKELIG LESBAR - INNBYR TIL TOLKNING og NAVIGASJON KAN FINNE ARTIKKELENS KATEGORI UTFRA URLen I det f&amp;#xF8;rste eksempelet er URLen besudlet med metodenavn (&amp;#x201C;Article.publicShow&amp;#x201D;) Man vil ha forskjellige metodenavn etter hva som skal gj&amp;#xF8;res, f.eks. slette en artikkel, eller oppdatere den. Stygt ID-felt I det andre eksempelet er URLen en adresse til ressursen som ettersp&amp;#xF8;rres Metoden er HTTP GET Hvis ressursen skal oppdateres, sender man en HTTP PUT til samme adresse Man ser at query-stringen er borte, informasjonen flyttet inn i URLen Vi har plutselig f&amp;#xE5;tt en menneskelig lesbar URL, som innbyr til tolking og navigasjon
  140. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  141. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  142. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  143. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  144. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  145. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  146. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  147. 2pkt ++ P&amp;#xC5;STAND: ALT KAN UTTRYKKES MED HTTP-METODER BEVIS 4 pkt ++ LISTE MED OPERASJONER i et IKKE-REST-BASERT WEBSHOP HVER OPERASJON = EGEN SERVLET GET liste med ordre til en webshop POST ny ordre, SERVEREN SVARER 8pkt REST-BASERT SYSTEM GET til en PATH hvor ORDRE ER LAGRET POST til SAMME URL (men med &amp;#x201C;/&amp;#x201D; til slutt) SERVEREN SVARER 201 CREATED - OFFISIELL HTTP-RESPONS-KODE - SML 500 LOCATION for &amp;#xE5; vise HVOR ORDREN ER OPPRETTET HENTE DETALJER med GET DELETE for &amp;#xE5; SLETTE, PUT for &amp;#xE5; OPPDATERE SAMME URL HELE VEIEN, BRUKER HTTP-METODER FOR &amp;#xC5; VISE HVA VI VIL N&amp;#xF8;kkelen er &amp;#xE5; ha et fornuftig sted &amp;#xE5; poste det til 201 Created - offisiell HTTP-response-kode (s&amp;#xE5;nn som den mer kjente 404, eller 500 Internal Server Error) Sender ogs&amp;#xE5; en Location-header, som ved redirect, for &amp;#xE5; fortelle hvor ordren finnes
  148. N&amp;#xE5; har vi v&amp;#xE6;rt gjennom disse grunnprinsippene, s&amp;#xE5; skal vi se hvordan Sling bygger p&amp;#xE5; dem.
  149. N&amp;#xE5; har vi v&amp;#xE6;rt gjennom disse grunnprinsippene, s&amp;#xE5; skal vi se hvordan Sling bygger p&amp;#xE5; dem.
  150. N&amp;#xE5; har vi v&amp;#xE6;rt gjennom disse grunnprinsippene, s&amp;#xE5; skal vi se hvordan Sling bygger p&amp;#xE5; dem.
  151. N&amp;#xE5; har vi v&amp;#xE6;rt gjennom disse grunnprinsippene, s&amp;#xE5; skal vi se hvordan Sling bygger p&amp;#xE5; dem.
  152. N&amp;#xE5; har vi v&amp;#xE6;rt gjennom disse grunnprinsippene, s&amp;#xE5; skal vi se hvordan Sling bygger p&amp;#xE5; dem.
  153. N&amp;#xE5; har vi v&amp;#xE6;rt gjennom disse grunnprinsippene, s&amp;#xE5; skal vi se hvordan Sling bygger p&amp;#xE5; dem.
  154. N&amp;#xE5; har vi v&amp;#xE6;rt gjennom disse grunnprinsippene, s&amp;#xE5; skal vi se hvordan Sling bygger p&amp;#xE5; dem.
  155. 3 pkt G&amp;#xC5;TT OPP FOR DERE AT SLING ER ET HTTP-REST-API til JCR ET HTTP-API i TILLEGG til JAVA-APIET MEN DET ER IKKE ALT Det har kanskje g&amp;#xE5;tt opp for dere at Sling gir oss et HTTP-REST-API til JCR ... s&amp;#xE5; vi f&amp;#xE5;r et HTTP-API, i tillegg til JCR-java-APIet. ... men det er ikke alt
  156. 4pkt IKKE BEGRENSA TIL JCR-REPOSITORIET KAN PODE INN EGEN SERVLET FILMAPPE DATABASE-SYSTEM Vi er ikke begrensa til JCR-repositoriet
  157. 4pkt IKKE BEGRENSA TIL JCR-REPOSITORIET KAN PODE INN EGEN SERVLET FILMAPPE DATABASE-SYSTEM Vi er ikke begrensa til JCR-repositoriet
  158. 4pkt IKKE BEGRENSA TIL JCR-REPOSITORIET KAN PODE INN EGEN SERVLET FILMAPPE DATABASE-SYSTEM Vi er ikke begrensa til JCR-repositoriet
  159. 4pkt IKKE BEGRENSA TIL JCR-REPOSITORIET KAN PODE INN EGEN SERVLET FILMAPPE DATABASE-SYSTEM Vi er ikke begrensa til JCR-repositoriet
  160. 3pkt KAN ALTS&amp;#xC5; HA DETTE ET TRE HVOR JCR-noder, SERVLETer, FILMAPPER, og ANNET lever som GODE NABOER KAN PLUGGE INN SIN EGEN LEGACY DB-APP ved &amp;#xE5; IMPLEMENTERE ET INTERFACE Man kan alts&amp;#xE5; ha dette - et tre hvor JCR-noder, servleter, filmapper og annet lever som gode naboer Ved &amp;#xE5; implementere Resource-interfacet kan man ogs&amp;#xE5; plugge inn sin egen legacy database-applikasjon.
  161. 1pkt VI BRUKER BEGREPET &amp;#x201C;RESSURS&amp;#x201D; - DEFINISJON Hva er en &amp;#x201C;ressurs&amp;#x201D;?
  162. 4pkt EN RESSURS HAR NOEN GITTE EGENSKAPER PATH - for JCR-noder: pathen til noden TYPE - for JCR-noder: en bestemt property METADATA
  163. 4pkt EN RESSURS HAR NOEN GITTE EGENSKAPER PATH - for JCR-noder: pathen til noden TYPE - for JCR-noder: en bestemt property METADATA
  164. 4pkt EN RESSURS HAR NOEN GITTE EGENSKAPER PATH - for JCR-noder: pathen til noden TYPE - for JCR-noder: en bestemt property METADATA
  165. 5pkt ENKELT &amp;#xC5; RESOLVE EN URL til en JCR-NODE URLen er PATH til NODEN REPOSITORIET fra BLOGG-eksempelet DENNE REQUESTEN RESOLVES TIL DENNE NODEN Det er enkelt &amp;#xE5; resolve en URL til en JCR-node URLen er i virkeligheten en path til noden Vi tar fram mini-repositoriet fra blogg-eksempelet S&amp;#xE5; f&amp;#xE5;r vi inn denne requesten ... som resolves til denne noden
  166. 5pkt ENKELT &amp;#xC5; RESOLVE EN URL til en JCR-NODE URLen er PATH til NODEN REPOSITORIET fra BLOGG-eksempelet DENNE REQUESTEN RESOLVES TIL DENNE NODEN Det er enkelt &amp;#xE5; resolve en URL til en JCR-node URLen er i virkeligheten en path til noden Vi tar fram mini-repositoriet fra blogg-eksempelet S&amp;#xE5; f&amp;#xE5;r vi inn denne requesten ... som resolves til denne noden
  167. 5pkt ENKELT &amp;#xC5; RESOLVE EN URL til en JCR-NODE URLen er PATH til NODEN REPOSITORIET fra BLOGG-eksempelet DENNE REQUESTEN RESOLVES TIL DENNE NODEN Det er enkelt &amp;#xE5; resolve en URL til en JCR-node URLen er i virkeligheten en path til noden Vi tar fram mini-repositoriet fra blogg-eksempelet S&amp;#xE5; f&amp;#xE5;r vi inn denne requesten ... som resolves til denne noden
  168. 5pkt ENKELT &amp;#xC5; RESOLVE EN URL til en JCR-NODE URLen er PATH til NODEN REPOSITORIET fra BLOGG-eksempelet DENNE REQUESTEN RESOLVES TIL DENNE NODEN Det er enkelt &amp;#xE5; resolve en URL til en JCR-node URLen er i virkeligheten en path til noden Vi tar fram mini-repositoriet fra blogg-eksempelet S&amp;#xE5; f&amp;#xE5;r vi inn denne requesten ... som resolves til denne noden
  169. 5pkt ENKELT &amp;#xC5; RESOLVE EN URL til en JCR-NODE URLen er PATH til NODEN REPOSITORIET fra BLOGG-eksempelet DENNE REQUESTEN RESOLVES TIL DENNE NODEN Det er enkelt &amp;#xE5; resolve en URL til en JCR-node URLen er i virkeligheten en path til noden Vi tar fram mini-repositoriet fra blogg-eksempelet S&amp;#xE5; f&amp;#xE5;r vi inn denne requesten ... som resolves til denne noden
  170. 5pkt ENKELT &amp;#xC5; RESOLVE EN URL til en JCR-NODE URLen er PATH til NODEN REPOSITORIET fra BLOGG-eksempelet DENNE REQUESTEN RESOLVES TIL DENNE NODEN Det er enkelt &amp;#xE5; resolve en URL til en JCR-node URLen er i virkeligheten en path til noden Vi tar fram mini-repositoriet fra blogg-eksempelet S&amp;#xE5; f&amp;#xE5;r vi inn denne requesten ... som resolves til denne noden
  171. 2pkt ++ DET VAR RESSURSER MEN RESSURSER IKKE TIL NYTTE HVIS DEN IKKE KAN VISES FRAM - f.eks. p&amp;#xE5; en WEBSIDE 3pkt KAN RENDRE EN RESSURS MED EN SERVLET eller SCRIPT RESSURSTYPEN BESTEMMER HVILKEN SERVLET/SCRIPT SOM VELGES SERVLETER/SCRIPTS finnes i SAMME VIRTUELLE RESSURSTRE som INNHOLDET Det var ressurser. Men en ressurs er ikke s&amp;#xE6;rlig til nytte hvis den ikke kan vises - vises p&amp;#xE5; en webside.
  172. 2pkt ++ DET VAR RESSURSER MEN RESSURSER IKKE TIL NYTTE HVIS DEN IKKE KAN VISES FRAM - f.eks. p&amp;#xE5; en WEBSIDE 3pkt KAN RENDRE EN RESSURS MED EN SERVLET eller SCRIPT RESSURSTYPEN BESTEMMER HVILKEN SERVLET/SCRIPT SOM VELGES SERVLETER/SCRIPTS finnes i SAMME VIRTUELLE RESSURSTRE som INNHOLDET Det var ressurser. Men en ressurs er ikke s&amp;#xE6;rlig til nytte hvis den ikke kan vises - vises p&amp;#xE5; en webside.
  173. 2pkt ++ DET VAR RESSURSER MEN RESSURSER IKKE TIL NYTTE HVIS DEN IKKE KAN VISES FRAM - f.eks. p&amp;#xE5; en WEBSIDE 3pkt KAN RENDRE EN RESSURS MED EN SERVLET eller SCRIPT RESSURSTYPEN BESTEMMER HVILKEN SERVLET/SCRIPT SOM VELGES SERVLETER/SCRIPTS finnes i SAMME VIRTUELLE RESSURSTRE som INNHOLDET Det var ressurser. Men en ressurs er ikke s&amp;#xE6;rlig til nytte hvis den ikke kan vises - vises p&amp;#xE5; en webside.
  174. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  175. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  176. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  177. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  178. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  179. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  180. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  181. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  182. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  183. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  184. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  185. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  186. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  187. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  188. EN SLING-URL ser S&amp;#xC5;NN UT PATH til RESSURSEN LEGG MERKE TIL PROPERTYEN NEDERST EXTENSION MELLOM PATH og EXTENSION: SELECTOR (hvis vi vil)
  189. /apps er standard-plasssering
  190. /apps er standard-plasssering
  191. /apps er standard-plasssering
  192. /apps er standard-plasssering
  193. /apps er standard-plasssering
  194. /apps er standard-plasssering
  195. Ressursen prosesseres f&amp;#xF8;rst - gj&amp;#xF8;r evt. tilgangsbegrensninger tidlig http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  196. Ressursen prosesseres f&amp;#xF8;rst - gj&amp;#xF8;r evt. tilgangsbegrensninger tidlig http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  197. Ressursen prosesseres f&amp;#xF8;rst - gj&amp;#xF8;r evt. tilgangsbegrensninger tidlig http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  198. Ressursen prosesseres f&amp;#xF8;rst - gj&amp;#xF8;r evt. tilgangsbegrensninger tidlig http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  199. Ressursen prosesseres f&amp;#xF8;rst - gj&amp;#xF8;r evt. tilgangsbegrensninger tidlig http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  200. Ressursen prosesseres f&amp;#xF8;rst - gj&amp;#xF8;r evt. tilgangsbegrensninger tidlig http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  201. Ressursen prosesseres f&amp;#xF8;rst - gj&amp;#xF8;r evt. tilgangsbegrensninger tidlig http://www.slideshare.net/cziegeler/apache-sling-jcr-osgi-scripting-and-rest slide 27
  202. 4 pkt EN PLATTFORM ER VEL OG BRA VIL GJERNE BYGGE EGEN FUNKSJONALITET OPP&amp;#xC5; OSGi-BUNDLER ER JAR-filer med NOGO ATT&amp;#xC5;T S&amp;#xC5;: HOT-DEPLOY til en SLING-INSTANS INN: En plattform er vel og bra, men det er jo bare nettopp en plattform. Du vil gjerne bygge din egen funksjonalitet opp&amp;#xE5;. OSGi-bundler er .jar-filer med noggo att&amp;#xE5;t
  203. 4 pkt EN PLATTFORM ER VEL OG BRA VIL GJERNE BYGGE EGEN FUNKSJONALITET OPP&amp;#xC5; OSGi-BUNDLER ER JAR-filer med NOGO ATT&amp;#xC5;T S&amp;#xC5;: HOT-DEPLOY til en SLING-INSTANS INN: En plattform er vel og bra, men det er jo bare nettopp en plattform. Du vil gjerne bygge din egen funksjonalitet opp&amp;#xE5;. OSGi-bundler er .jar-filer med noggo att&amp;#xE5;t
  204. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  205. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  206. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  207. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  208. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  209. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  210. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  211. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  212. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  213. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  214. 3pkt++ HVORDAN DEPLOYE EGEN SERVLET DETTE: VANLIG SERVLET som IKKE GJ&amp;#xD8;R STORT SLING m&amp;#xE5; vite HVOR I TREET servleten SKAL PLASSERES [KLIKK] 5pkt++ &amp;#x201C;ANNOTATIONS&amp;#x201D; PROSESSERES av en MAVEN-plugin TIL EN XML-fil KAN SKRIVE XML SELV hvis man ikke vil ENDRE KILDEKODEN JAVADOC-NESERYNK VI ANGIR EN PATH LEGG MERKE TIL pathS [KLIKK] 3pkt++ VED &amp;#xE5; IMPLEMENTERE SlingHttpSafeMethodsServlet F&amp;#xC5;R WRAPPET request-objekt TILGANG TIL Resource 2pkt SERVLETen HOT-DEPLOY til SLING - oppdatere, deaktivere etc uten omstart ANNOTASJONER brukes ogs&amp;#xE5; til DEPENDENCY INJECTION [NESTE SLIDE] S&amp;#xE5; hva gj&amp;#xF8;r du hvis du vil skrive din egen servlet? Dette er en helt vanlig servlet som ikke gj&amp;#xF8;r stort. For at Sling skal kunne vite hvor servleten skal plasseres i treet, trengs litt ekstra informasjon. [KLIKK] Her angir vi path&amp;#x2019;en til hvor servleten skal registreres i ressurs-treet. Vi husker at Sling ser under /apps for &amp;#xE5; finne servlet&amp;#x2019;er til rendering. Legg merke til &amp;#x201C;pathS&amp;#x201D; - en servlet kan registreres p&amp;#xE5; flere pather. Noen rynker nok litt p&amp;#xE5; nesa av at man setter disse propertiene i en javadoc-kommentar, men javadoc-annotasjonene blir prosessert av en Maven-plugin ved kompilering. Dette genererer en xml-fil (IKKE web.xml) som pakkes i jar-en, og plukkes opp av OSGi-rammeverket. Hvis man ikke vil endre p&amp;#xE5; koden i en gammel servlet, kan man skrive den xml-fila selv. Det jobbes ogs&amp;#xE5; med &amp;#x201C;ordentlige&amp;#x201D; annotasjoner man kan bruke, men er ikke sikker p&amp;#xE5; om det er ferdig enn&amp;#xE5;. [KLIKK] Eller vi kan gj&amp;#xF8;re det p&amp;#xE5; denne m&amp;#xE5;ten: Ved &amp;#xE5; angi noen bestemte properties, blir serveren registrert p&amp;#xE5; passende steder. N&amp;#xE5;r bundlen med servlet&amp;#x2019;en deployes, dvs lastes opp til en Sling-instans, s&amp;#xE5; startes den automatisk, og begynner &amp;#xE5; svare p&amp;#xE5; requester. Man kan ogs&amp;#xE5; un-deploye bundelen, oppdatere den med en ny versjon, osv, uten &amp;#xE5; starte applikasjonen p&amp;#xE5; nytt - takket v&amp;#xE6;re OSGi. [KLIKK] Hvis man vil operere p&amp;#xE5; ressursen som requesten g&amp;#xE5;r til, s&amp;#xE5; kan man i stedet extende SlingSafeMethodsServlet. Da f&amp;#xE5;r man et request-objekt med tilgang til ressursen. Med de samme type annotasjonene kan man lage komponenter, som kan brukes i dependency injection
  215. [KLIKK] 3pkt SCR.REFERENCE gir tilgang til KJ&amp;#xD8;RENDE KOMPONENTER NOK &amp;#xE5; deklarere VARIABLEN - Maven-plugin&amp;#x2019;en GJ&amp;#xD8;R RESTEN N&amp;#xC5;R SERVLETen KJ&amp;#xD8;RER, er REPOSITORY-variabelen tilgjengelig Man kan f&amp;#xE5; instanser av kj&amp;#xF8;rende komponenter ved &amp;#xE5; bruke scr.reference Det er nok &amp;#xE5; deklarere variabelen. Maven-SCR-plugin&amp;#x2019;en tar seg av resten. N&amp;#xE5;r servleten kj&amp;#xF8;rer, er repository tilgjengelig.
  216. [KLIKK] 3pkt SCR.REFERENCE gir tilgang til KJ&amp;#xD8;RENDE KOMPONENTER NOK &amp;#xE5; deklarere VARIABLEN - Maven-plugin&amp;#x2019;en GJ&amp;#xD8;R RESTEN N&amp;#xC5;R SERVLETen KJ&amp;#xD8;RER, er REPOSITORY-variabelen tilgjengelig Man kan f&amp;#xE5; instanser av kj&amp;#xF8;rende komponenter ved &amp;#xE5; bruke scr.reference Det er nok &amp;#xE5; deklarere variabelen. Maven-SCR-plugin&amp;#x2019;en tar seg av resten. N&amp;#xE5;r servleten kj&amp;#xF8;rer, er repository tilgjengelig.
  217. [KLIKK] 3pkt SCR.REFERENCE gir tilgang til KJ&amp;#xD8;RENDE KOMPONENTER NOK &amp;#xE5; deklarere VARIABLEN - Maven-plugin&amp;#x2019;en GJ&amp;#xD8;R RESTEN N&amp;#xC5;R SERVLETen KJ&amp;#xD8;RER, er REPOSITORY-variabelen tilgjengelig Man kan f&amp;#xE5; instanser av kj&amp;#xF8;rende komponenter ved &amp;#xE5; bruke scr.reference Det er nok &amp;#xE5; deklarere variabelen. Maven-SCR-plugin&amp;#x2019;en tar seg av resten. N&amp;#xE5;r servleten kj&amp;#xF8;rer, er repository tilgjengelig.
  218. 1pkt ++ ANDRE KOMPONENTER man vil TENKES &amp;#xC5; UTVIKLE 3pkt++ [KLIKK FOR HVER BULLET] SERVLET-FILTRE AUTENTISERINGS-MEKANISMER feks. OpenID RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON 1pkt [KLIKK] UANSETT: HOT-DEPLOY Andre komponenter man kan tenkes &amp;#xE5; ville utvikle [KLIKK FOR HVER BULLET] Autentiserings-mekanismer: F.eks. OpenID Resource providere: Gj&amp;#xF8;r ressurser tilgjengelig, f.eks. det legacy database-systemet Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren. Hot-deploy, start, stopp, oppdatering ... Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen v&amp;#xE5;r. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten &amp;#xE5; ta ned serveren. Vi bare deployer ny kode.
  219. 1pkt ++ ANDRE KOMPONENTER man vil TENKES &amp;#xC5; UTVIKLE 3pkt++ [KLIKK FOR HVER BULLET] SERVLET-FILTRE AUTENTISERINGS-MEKANISMER feks. OpenID RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON 1pkt [KLIKK] UANSETT: HOT-DEPLOY Andre komponenter man kan tenkes &amp;#xE5; ville utvikle [KLIKK FOR HVER BULLET] Autentiserings-mekanismer: F.eks. OpenID Resource providere: Gj&amp;#xF8;r ressurser tilgjengelig, f.eks. det legacy database-systemet Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren. Hot-deploy, start, stopp, oppdatering ... Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen v&amp;#xE5;r. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten &amp;#xE5; ta ned serveren. Vi bare deployer ny kode.
  220. 1pkt ++ ANDRE KOMPONENTER man vil TENKES &amp;#xC5; UTVIKLE 3pkt++ [KLIKK FOR HVER BULLET] SERVLET-FILTRE AUTENTISERINGS-MEKANISMER feks. OpenID RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON 1pkt [KLIKK] UANSETT: HOT-DEPLOY Andre komponenter man kan tenkes &amp;#xE5; ville utvikle [KLIKK FOR HVER BULLET] Autentiserings-mekanismer: F.eks. OpenID Resource providere: Gj&amp;#xF8;r ressurser tilgjengelig, f.eks. det legacy database-systemet Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren. Hot-deploy, start, stopp, oppdatering ... Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen v&amp;#xE5;r. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten &amp;#xE5; ta ned serveren. Vi bare deployer ny kode.
  221. 1pkt ++ ANDRE KOMPONENTER man vil TENKES &amp;#xC5; UTVIKLE 3pkt++ [KLIKK FOR HVER BULLET] SERVLET-FILTRE AUTENTISERINGS-MEKANISMER feks. OpenID RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON 1pkt [KLIKK] UANSETT: HOT-DEPLOY Andre komponenter man kan tenkes &amp;#xE5; ville utvikle [KLIKK FOR HVER BULLET] Autentiserings-mekanismer: F.eks. OpenID Resource providere: Gj&amp;#xF8;r ressurser tilgjengelig, f.eks. det legacy database-systemet Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren. Hot-deploy, start, stopp, oppdatering ... Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen v&amp;#xE5;r. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten &amp;#xE5; ta ned serveren. Vi bare deployer ny kode.
  222. 1pkt ++ ANDRE KOMPONENTER man vil TENKES &amp;#xC5; UTVIKLE 3pkt++ [KLIKK FOR HVER BULLET] SERVLET-FILTRE AUTENTISERINGS-MEKANISMER feks. OpenID RESOURCE PROVIDERE - f.eks. data fra ANNEN APPLIKASJON 1pkt [KLIKK] UANSETT: HOT-DEPLOY Andre komponenter man kan tenkes &amp;#xE5; ville utvikle [KLIKK FOR HVER BULLET] Autentiserings-mekanismer: F.eks. OpenID Resource providere: Gj&amp;#xF8;r ressurser tilgjengelig, f.eks. det legacy database-systemet Uansett hva man lager, pakker man dem som OSGi-bundler og deployer til serveren. Hot-deploy, start, stopp, oppdatering ... Prikk-prikk-prikk: Vi har f.eks. noe data som skal caches i applikasjonen v&amp;#xE5;r. Cachen er implementert som en OSGi-komponent. Det betyr at vi kan bytte cache-implementasjon uten &amp;#xE5; ta ned serveren. Vi bare deployer ny kode.
  223. 2pkt ++ SCRIPTS i stedet for SERVLETer RASKERE &amp;#xE5; UTVIKLE [KLIKK] 4pkt SLING har mange INNEBYGDE SCRIPT-motorer [KLIKK] ECMA-Script = Server-side JAVASCRIPT [KLIKK] JSR-223 - JAVA SCRIPTING fra JAVA 6 KAN PLUGGE INN EGNE ... scripts i stedet for servlet&amp;#x2019;er ECMAScript bedre kjent som JavaScript, men n&amp;#xE5; snakker vi om server-side JSR-223: Alle scriptspr&amp;#xE5;k som st&amp;#xF8;ttes gjennom Java Scripting
  224. 2pkt ++ SCRIPTS i stedet for SERVLETer RASKERE &amp;#xE5; UTVIKLE [KLIKK] 4pkt SLING har mange INNEBYGDE SCRIPT-motorer [KLIKK] ECMA-Script = Server-side JAVASCRIPT [KLIKK] JSR-223 - JAVA SCRIPTING fra JAVA 6 KAN PLUGGE INN EGNE ... scripts i stedet for servlet&amp;#x2019;er ECMAScript bedre kjent som JavaScript, men n&amp;#xE5; snakker vi om server-side JSR-223: Alle scriptspr&amp;#xE5;k som st&amp;#xF8;ttes gjennom Java Scripting
  225. 2pkt ++ SCRIPTS i stedet for SERVLETer RASKERE &amp;#xE5; UTVIKLE [KLIKK] 4pkt SLING har mange INNEBYGDE SCRIPT-motorer [KLIKK] ECMA-Script = Server-side JAVASCRIPT [KLIKK] JSR-223 - JAVA SCRIPTING fra JAVA 6 KAN PLUGGE INN EGNE ... scripts i stedet for servlet&amp;#x2019;er ECMAScript bedre kjent som JavaScript, men n&amp;#xE5; snakker vi om server-side JSR-223: Alle scriptspr&amp;#xE5;k som st&amp;#xF8;ttes gjennom Java Scripting
  226. 2pkt ++ SCRIPTS i stedet for SERVLETer RASKERE &amp;#xE5; UTVIKLE [KLIKK] 4pkt SLING har mange INNEBYGDE SCRIPT-motorer [KLIKK] ECMA-Script = Server-side JAVASCRIPT [KLIKK] JSR-223 - JAVA SCRIPTING fra JAVA 6 KAN PLUGGE INN EGNE ... scripts i stedet for servlet&amp;#x2019;er ECMAScript bedre kjent som JavaScript, men n&amp;#xE5; snakker vi om server-side JSR-223: Alle scriptspr&amp;#xE5;k som st&amp;#xF8;ttes gjennom Java Scripting
  227. 2pkt ++ SCRIPTS i stedet for SERVLETer RASKERE &amp;#xE5; UTVIKLE [KLIKK] 4pkt SLING har mange INNEBYGDE SCRIPT-motorer [KLIKK] ECMA-Script = Server-side JAVASCRIPT [KLIKK] JSR-223 - JAVA SCRIPTING fra JAVA 6 KAN PLUGGE INN EGNE ... scripts i stedet for servlet&amp;#x2019;er ECMAScript bedre kjent som JavaScript, men n&amp;#xE5; snakker vi om server-side JSR-223: Alle scriptspr&amp;#xE5;k som st&amp;#xF8;ttes gjennom Java Scripting
  228. 2pkt RASKEST UTVIKLING - INGEN KOMPILERING, DEPLOYING SCRIPTs lagres i REPOSITORIET Raskeste - slipper &amp;#xE5; kompilere, deploye etc - man lagrer rett i repositoriet. Kort roundtrip.
  229. 5pkt BLOGGPOST-NODE EKSEMPEL-SCRIPT i ESP - SERVER SIDE JAVASCRIPT CURRENTNODE SKRIV UT PROPERTIES med mindre-enn-prosent-erlik SLING.INCLUDE Dette er noden som er forespurt i requesten Vi plasserer Forklar ESP currentNode er noden som er spurt etter i requesten Skriver ut enkelt-properties - med mindre-enn-prosent-erlik sling.include - inkluderer resultatet av en annen request. Gj&amp;#xF8;r det mulig &amp;#xE5; dele opp kode i flere skriptfiler.
  230. 5pkt BLOGGPOST-NODE EKSEMPEL-SCRIPT i ESP - SERVER SIDE JAVASCRIPT CURRENTNODE SKRIV UT PROPERTIES med mindre-enn-prosent-erlik SLING.INCLUDE Dette er noden som er forespurt i requesten Vi plasserer Forklar ESP currentNode er noden som er spurt etter i requesten Skriver ut enkelt-properties - med mindre-enn-prosent-erlik sling.include - inkluderer resultatet av en annen request. Gj&amp;#xF8;r det mulig &amp;#xE5; dele opp kode i flere skriptfiler.
  231. 5pkt BLOGGPOST-NODE EKSEMPEL-SCRIPT i ESP - SERVER SIDE JAVASCRIPT CURRENTNODE SKRIV UT PROPERTIES med mindre-enn-prosent-erlik SLING.INCLUDE Dette er noden som er forespurt i requesten Vi plasserer Forklar ESP currentNode er noden som er spurt etter i requesten Skriver ut enkelt-properties - med mindre-enn-prosent-erlik sling.include - inkluderer resultatet av en annen request. Gj&amp;#xF8;r det mulig &amp;#xE5; dele opp kode i flere skriptfiler.
  232. BYTT TIL TERMINAL For &amp;#xE5; demonstrere tydelig skal vi bruke tekst-http-klienten curl Vis hvordan man oppretter og henter en node: -F angir et parameter man poster curl -F title=hello http://admin:admin@localhost:8888/foo =&gt; 200 OK curl http://admin:admin@localhost:8888/foo.tidy.json
  233. NESTEN s&amp;#xE5; hele koden kan TWITRES
  234. 4 pkt HTTP-metode POST FELTNAVN blir PROPERTIES p&amp;#xE5; NODEN TITLE-feltet BEHANDLES SPESIELT, BLIR NAVN :REDIRECT POST - HTTP-metode for &amp;#xE5; lagre nytt innhold Feltnavnene blir properties p&amp;#xE5; noden TITLE-feltet behandles spesielt, og blir node-navnet :redirect forteller Post-servleten at vi skal redirectes til den ny-opprettede noden
  235. 2pkt SLING.JS - JAVASCRIPT-BIBLIOTEK som f&amp;#xF8;lger med SLING SLING.WIZARD() POPULERER skjemafeltene via JSON sling.js er et javascript-bibliotek som f&amp;#xF8;lger med Sling Sling.wizard() s&amp;#xF8;rger for &amp;#xE5; populere skjemafeltene med verdier fra noden via JSON
  236. 2 pkt SLING.GETCONTENT henter noder fra ANGITT NODE og 2 NIV&amp;#xC5;ER NED DOCUMENT.WRITE skriver ut TITTEL fra NODER hentet fra JSON BYTT TIL TextWrangler Sling.getContent henter noder fra angitt node og 2 niv&amp;#xE5;er ned Vis at fila ligger i webdav, &amp;#xE5;pne den G&amp;#xE5; til http://localhost:8888/content/blog/*.html Fyll ut skjemaet Lagre
  237. 5pkt NOEN F&amp;#xD8;LER SEG SNYTT? BILDESKALERING RSS-FEED KOMMENTARER ADMINISTRASJONS-GRENSESNITT BYTT TIL Firefox Synes du dette var for simpelt? OK, da legger vi til dette:
  238. 5pkt NOEN F&amp;#xD8;LER SEG SNYTT? BILDESKALERING RSS-FEED KOMMENTARER ADMINISTRASJONS-GRENSESNITT BYTT TIL Firefox Synes du dette var for simpelt? OK, da legger vi til dette:
  239. 5pkt NOEN F&amp;#xD8;LER SEG SNYTT? BILDESKALERING RSS-FEED KOMMENTARER ADMINISTRASJONS-GRENSESNITT BYTT TIL Firefox Synes du dette var for simpelt? OK, da legger vi til dette:
  240. 5pkt NOEN F&amp;#xD8;LER SEG SNYTT? BILDESKALERING RSS-FEED KOMMENTARER ADMINISTRASJONS-GRENSESNITT BYTT TIL Firefox Synes du dette var for simpelt? OK, da legger vi til dette:
  241. 5pkt NOEN F&amp;#xD8;LER SEG SNYTT? BILDESKALERING RSS-FEED KOMMENTARER ADMINISTRASJONS-GRENSESNITT BYTT TIL Firefox Synes du dette var for simpelt? OK, da legger vi til dette:
  242. 5pkt HVA SKJEDDE HER? DISSE SCRIPTENE og ET PAR JAVAKLASSER SCRIPTENE ligger i REPOSITORIET Java-klassene I EN BUNDLE SE N&amp;#xC6;RMERE p&amp;#xE5; JAVA-klassene
  243. 5pkt HVA SKJEDDE HER? DISSE SCRIPTENE og ET PAR JAVAKLASSER SCRIPTENE ligger i REPOSITORIET Java-klassene I EN BUNDLE SE N&amp;#xC6;RMERE p&amp;#xE5; JAVA-klassene
  244. 5pkt HVA SKJEDDE HER? DISSE SCRIPTENE og ET PAR JAVAKLASSER SCRIPTENE ligger i REPOSITORIET Java-klassene I EN BUNDLE SE N&amp;#xC6;RMERE p&amp;#xE5; JAVA-klassene
  245. 1 pkt BRUKER JCR-feature OBSERVATION = EventListener
  246. 5 pkt N&amp;#xC5;R KOMPONENTEN AKTIVERES HENTE OBSERVATIONMANAGER LEGGE OSS TIL SOM EVENTLISTENER FOR Event.NODE_ADDED UNDER en bestemt PATH
  247. 4 pkt IMPLEMENTERE METODE onEvent F&amp;#xC5; PATH til NY NODE LAG THUMBNAILS (createThumbnails) UNNG&amp;#xC5; EVIG L&amp;#xD8;KKE med !event.getPath(&amp;#x201C;thumbnails&amp;#x201D;) Event-listeneren er registrert p&amp;#xE5; repository-niv&amp;#xE5;et Dvs den vil trigge uansett hvordan noder blir opprettet, trenger ikke v&amp;#xE6;re fra web-grensesnittet (f.eks. WebDav)
  248. JCR-FUNKSJONALITET: WebDAV, OBSERVATION SLING-SNACKS: Script-MAPPING, REST Pakk koden i en bundle og deploy til serveren - applikasjonen kj&amp;#xF8;rer
  249. JCR-FUNKSJONALITET: WebDAV, OBSERVATION SLING-SNACKS: Script-MAPPING, REST Pakk koden i en bundle og deploy til serveren - applikasjonen kj&amp;#xF8;rer
  250. JCR-FUNKSJONALITET: WebDAV, OBSERVATION SLING-SNACKS: Script-MAPPING, REST Pakk koden i en bundle og deploy til serveren - applikasjonen kj&amp;#xF8;rer
  251. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  252. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  253. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  254. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  255. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  256. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  257. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  258. ER DETTE NOE FOR DEG? 6 pkt++ N&amp;#xD8;KKELSP&amp;#xD8;RSM&amp;#xC5;L: Behandler du INNHOLD? P&amp;#xC5;STAND: [KLIKK] JA INNHOLD = Data som lagres for &amp;#xE5; kunne hentes fram igjen I REST er fokus p&amp;#xE5; RESSURSEN, ikke METODEn. RESSURS = INNHOLD. Alts&amp;#xE5;: [KLIKK] ALT ER INNHOLD - NODER, FILER, SERVLETER [KLIKK] 2 pkt++ VANT TIL &amp;#xE5; definere TABELLER og KOLONNER - gir UN&amp;#xD8;DVENDIGE RESTRIKSJONER BONUS-FEATURES FULLTEKST-S&amp;#xD8;K: Alt blir automatisk s&amp;#xF8;kbart [NESTE SLIDE] F&amp;#xE5; fokus vekk fra SOA-metoder, innf&amp;#xF8;r ROA. Nei til SOA, ja til ROA! Hvis du stadig m&amp;#xE5; finne p&amp;#xE5; kreative metodenavn i Etter at vi hadde snakket om hierarki i stedet for RDBMS: Diskusjon om forretningslogikk - hva med f.eks. forumtr&amp;#xE5;der? (H&amp;#xE5;kon) Man er s&amp;#xE5; vant til &amp;#xE5; m&amp;#xE5;tte definere felter og kolonner at det er vanskelig &amp;#xE5; tenke anderledes. RDBMS bare fordelaktig hvis man absolutt M&amp;#xC5; ha strenge restriksjoner. Et annet foredrag p&amp;#xE5; JavaZone: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? Ja! CouchDB - Amazon SimpleDB - eksempler p&amp;#xE5; at det fins behov for snillere databaser. Tar gjerne utfordring - gi meg eksempler p&amp;#xE5; data som ikke er innhold. Hierarki - har du noen gang laget en s&amp;#xE5;nn tabell? Hva n&amp;#xE5;r en mappe skal ha flere foreldre? Hadde det ikke v&amp;#xE6;rt fint med en plattform hvor dette er gjennomtenkt og implementert? Annet foredrag: P&amp;#xE5; tide &amp;#xE5; kaste ut relasjonsdatabasen? JA! Bli hierarkisk!
  259. (Forutsatt at man har Maven installert) SJEKKE UT SETT MINNE (trenger ofte mer minne for &amp;#xE5; bygge, ikke for &amp;#xE5; kj&amp;#xF8;re) BYGG (kan ogs&amp;#xE5; bygge uten Maven) TILGJENGELIG UNDER HELE JAVAZONE - SP&amp;#xD8;R OM HJELP
  260. (Forutsatt at man har Maven installert) SJEKKE UT SETT MINNE (trenger ofte mer minne for &amp;#xE5; bygge, ikke for &amp;#xE5; kj&amp;#xF8;re) BYGG (kan ogs&amp;#xE5; bygge uten Maven) TILGJENGELIG UNDER HELE JAVAZONE - SP&amp;#xD8;R OM HJELP
  261. (Forutsatt at man har Maven installert) SJEKKE UT SETT MINNE (trenger ofte mer minne for &amp;#xE5; bygge, ikke for &amp;#xE5; kj&amp;#xF8;re) BYGG (kan ogs&amp;#xE5; bygge uten Maven) TILGJENGELIG UNDER HELE JAVAZONE - SP&amp;#xD8;R OM HJELP
  262. (Forutsatt at man har Maven installert) SJEKKE UT SETT MINNE (trenger ofte mer minne for &amp;#xE5; bygge, ikke for &amp;#xE5; kj&amp;#xF8;re) BYGG (kan ogs&amp;#xE5; bygge uten Maven) TILGJENGELIG UNDER HELE JAVAZONE - SP&amp;#xD8;R OM HJELP
  263. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  264. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  265. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  266. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  267. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  268. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  269. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  270. 5 pkt SLING ER LETT &amp;#xC5; KOMME I GANG MED - et par SCRIPTS PLUGG INN egne BUNDLER UNGT PROSJEKT, men STABILT - brukes I KOMMERSIELLE PRODUKTER ET AV DE MEST BUZZWORD-KOMPATIBLE RAMMEVERKENE SOM FINS!
  271. AVSLUTTER med LINKER til de som vil VITE MER 4 pkt HJEMMESIDE til PROSJEKTET 15-MINUTTERS INTRO MAILINGLISTE HJEMMESIDE for JACKRABBIT jcr-IMPLEMENTASJON SP&amp;#xD8;RSM&amp;#xC5;L? For de som har lyst til &amp;#xE5; vite mer: Wiki&amp;#x2019;en - et slags springbrett til hjemmesida, men med mye bra halvferdig stoff Veldig bra mailingliste - aktive deltakere, f&amp;#xE5;r raskt svar