SlideShare a Scribd company logo
1 of 84
Download to read offline
Grails, Trails, and Sails:
Rails Through a Coffee Filter

Matt Hughes
David Esterkin

Chariot Solutions
http://chariotsolutions.com
BOF-9843

                         2007 JavaOneSM Conference | Session BOF-9843 |
Agenda

Brief History of Web Development
Ruby On Rails
Sails
Trails
Grails
The Future of *ails



                 2007 JavaOneSM Conference | Session BOF-9843 |   2
Agenda

Brief History of Web Development
Ruby On Rails
Sails
Trails
Grails
The Future of *ails



                2007 JavaOneSM Conference | Session BOF-9843 |   3
A Brief History of
  Web Application Development

In the beginning there was pain

           ...

then came Ruby on Rails




                 2007 JavaOneSM Conference | Session BOF-9843 |   4
Agenda

Brief History of Web Development
Ruby On Rails
Sails
Trails
Grails
The Future of *ails



                 2007 JavaOneSM Conference | Session BOF-9843 |   5
Rails Screencast




      rails blog_app



               2007 JavaOneSM Conference | Session BOF-9843 |   6
Gives You...




                                A functional CRUD app
                                in 15 minutes
               2007 JavaOneSM Conference | Session BOF-9843 |   7
Ruby on Rails

                                                      Opinionated
 Convention                                            Software
                  MVC
    over
Configuration
                    80/20 Rule
                                                             Test Driven
Don’t Repeat                                                Development
Yourself
         Agile
                                                    Get
                                                    Real

                    2007 JavaOneSM Conference | Session BOF-9843 |   8
Rails Dissected

   ActiveRecord                     Model


   ERB      Ruby                         View



   ActionController                Controller


                      2007 JavaOneSM Conference | Session BOF-9843 |   9
State of Java Web Development
• Coincides with
  •   Disillusioned with EJB 2.x
  •   Code, compile, deploy, restart server cycle
  •   Popularity of dynamic languages on the JVM
  •   Realization that Enterpriseyness != Self-Worth




                        2007 JavaOneSM Conference | Session BOF-9843 |   10
2007 JavaOneSM Conference | Session BOF-9843 |   11
The Contenders


Trail   Domain Driven Design

Sail    Controller-centric

Grail   DDD / Full stack


               2007 JavaOneSM Conference | Session BOF-9843 |   12
Agenda

Brief History of Web Development
Ruby On Rails
Sails
Trails
Grails
The Future of *ails



                 2007 JavaOneSM Conference | Session BOF-9843 |   13
• Started in 2005
• Brings the flavor of Rails development to
  Java
• Viento: custom template engine
• Rigging: custom dependency injection library


                  2007 JavaOneSM Conference | Session BOF-9843 |   14
Similar to *ails
• Generates nice URLs
• Promotes easy testing
• Templates are closest to Rails of the 3 Java
  frameworks




                     2007 JavaOneSM Conference | Session BOF-9843 |   15
Differs from *ails
• Does not provide utilities to generate scaffolding
• No functionality to facilitate Hibernate persistence
  layer




                      2007 JavaOneSM Conference | Session BOF-9843 |   16
Components
• Model: Hibernate
   • Developers don’t think ActiveRecord can be duplicated
     in Java
   • Already comfortable with Hibernate
• View: Viento
   • Custom template engine
   • Supports partials and caching
   • Mixins
• Controller: Rigging
   • Custom dependency injection library
   • Provides convention over configuration defaults
                        2007 JavaOneSM Conference | Session BOF-9843 |   17
Convention over Configuration
• Controllers all go in a specific package
• Action URL contains the controller name, action
  name, and action parameters
   • ‘widget/list’ => WidgetController.list()
• Views all go under the /views webapp directory
• View names match the controller/action names
   • /views/widget/list.vto
• Template engine extensions follow similar pattern
   • View tools are in org.opensails.examples.tools
   • Mixins are in org.opensails.examples.mixins
                         2007 JavaOneSM Conference | Session BOF-9843 |   18
Generate Sample Application
• Download zip file from opensails.org
• Create Eclipse project
  • Import Existing Projects into Workspace
  • Select Archive file (downloaded zip file)
• Configure Server
  • Run as Java Application
  • Main Class org.opensails.example.JettyBoot




                       2007 JavaOneSM Conference | Session BOF-9843 |   19
Add New Controller
public class PostController                                             Maps to /post/* urls
      extends BaseController {                                          Extends BaseController
public void list() {                                                     Maps to /post/list
                                                                         Exposes ‘posts’ to view
    expose("posts", postService.getAllPosts());
}
public void view(int postId) {                                             Maps to /post/view/#id
                                                                           Exposes ‘post’ to view
    expose("post", postService.getPost(postId);
}
public void add() {
                                                                     Exposes the Post model for
    exposeModel(“post”, new Post());
                                                                     a form to use
}
public void save(Post post) {                                        Post is loaded from the form

    // persist post
}
                                 2007 JavaOneSM Conference | Session BOF-9843 |   20
List Posts View (list.vto)
<body>
  ...
  <table>                                      Ruby like each construct
    <tr>
       <th>Date</th>
       <th>Title</th>                        Bean style attribute access
    </tr>
    $posts.each(cur_post) [[
       <tr>
         <td>$cur_post.dateString</td>
         <td>
         <a href="/app/post/view/$cur_post.id">$cur_post.title</a>
         </td>
       </tr>
    ]]
  </table>
  <a href="/app/post/add">New Post</a>
  ...
</body>
                                2007 JavaOneSM Conference | Session BOF-9843 |   21
Add Post view (/post/add.vto)
<html>
  <head><title>Add Post</title></head>
  <body>
    $form.start
    
    $form.text('post.title').label("Title")<br />
    
    $form.textarea('post.body').label("Body")<br />
    
    $form.submit("Post Entry").action(save, [$post])
    $form.end
    </body>
</html>

                                                           Maps to
                                                           PostController.save(post)




                            2007 JavaOneSM Conference | Session BOF-9843 |   22
Viento: Top Level Mixins
In Java:
 public class Mixin {
     public boolean isEven (int i) {
         return (i % 2 == 0);
     }
 }
 ...
 binding.mixin(new Mixin());



In Viento:
 $isEven($row_num)




                                2007 JavaOneSM Conference | Session BOF-9843 |   23
Viento: Type Mixins

 In Java:
  public class EvenMixin {
      public boolean isEven (int i) {
          return (i % 2 == 0);
      }
  }
  ...
  binding.mixin(int.class, new EventMixin());



 In Viento:
  $row_num.isEven
                          2007 JavaOneSM Conference | Session BOF-9843 |   24
Viento: Method Missing
 In Java:
  public class TagTool implements MethodMissing {
      public String methodMissing(String methodName,
                                              Object[] args) {
          return “<” + methodName + “>”;
      }
  }
  ...
  binding.put(“tag”, new TagTool());



 In Viento:
  $tag.div


                          2007 JavaOneSM Conference | Session BOF-9843 |   25
Viento: Custom Method Names
 In Java:
  public class Tool {
    @Name(“?”)
    public String question(String arg) {
        return “do something interesting”;
    }



 In Viento:
  $tool.?(“my string”)




                         2007 JavaOneSM Conference | Session BOF-9843 |   26
Roadmap
• Project is dormant
• Development team is now using Rails!
• Lead developer was very helpful, and would like to
  see Sails continue




                     2007 JavaOneSM Conference | Session BOF-9843 |   27
Agenda

Brief History of Web Development
Ruby On Rails
Sails
Trails
Grails
The Future of *ails



                 2007 JavaOneSM Conference | Session BOF-9843 |   28
• Started in mid 2005
• Currently at 1.0-SNAPSHOT
• Influences
  • Ruby on Rails
  • Naked Objects pattern




                      2007 JavaOneSM Conference | Session BOF-9843 |   29
Rails Influence
• Rapid web application development
• Scaffolding generation
• Convention over configuration




                    2007 JavaOneSM Conference | Session BOF-9843 |   30
Naked Objects Influence
•   http://nakedobjects.org
•   Domain Driven Design
•   Domain objects are behaviorally complete
•   Domain objects have single point of definition




                       2007 JavaOneSM Conference | Session BOF-9843 |   31
Components
•   Tapestry
•   Spring
•   Hibernate
•   Maven




                2007 JavaOneSM Conference | Session BOF-9843 |   32
Getting Started
• Requirements
   • Java 1.5
   • Maven 2
• trails-archetype
   • 1.0-SNAPSHOT: build locally
   • Release will be in maven repository




                       2007 JavaOneSM Conference | Session BOF-9843 |   33
Creating the Application
mvn -U archetype:create 
 -DarchetypeGroupId=org.trailsframework 
 -DarchetypeArtifactId=trails-archetype 
 -DremoteRepositories= 
http://snapshots.repository.codehaus.org/ 
 -DarchetypeVersion=1.0-SNAPSHOT 
 -DgroupId=com.chariotsolutions.trailsdemo 
 -DartifactId=trailsdemo




                  2007 JavaOneSM Conference | Session BOF-9843 |   34
What this generates

                                            Source structure created, and
                                            includes base domain object




                                              JUnit application test


                                             Hibernate configuration
                                             (set for HSQL)




               2007 JavaOneSM Conference | Session BOF-9843 |   35
Running the Application
  mvn tomcat:run or mvn jetty:run


• Create process generates a base domain object
• Initially uses an in-memory HSQL database




                    2007 JavaOneSM Conference | Session BOF-9843 |   36
IDE Support
• Because Trails is built on popular Java libraries,
  there is already pretty good support in the popular
  IDEs
   • mvn eclipse
   • mvn idea
   • Netbeans mevenide?




                      2007 JavaOneSM Conference | Session BOF-9843 |   37
Create Company domain class
@Entity                                                               Define as an entity
@ValidateUniqueness(property="name")                                  Force name to be unique
public class Company {

   private int id;

   private String name;                                               Define Primary Key

   private String website;                                            and generation method


   @Id

   @GeneratedValue(strategy = GenerationType.AUTO)

   public int getId() ...


   @PropertyDescriptor(index=0)

   public getName() ...                                                Set screen display
                                                                        order

   @PropertyDescriptor(index=1)

   public String getWebsite() ...

      // omitted setters
}                           2007 JavaOneSM Conference | Session BOF-9843 |   38
Create Speaker domain class
@Entity
public class Speaker {

   private int id;

   private String name;

   private Date presentationDate;

   private Company employer;                                    Define many to one
                                                                 relationship between
                                                                 speaker and company

    @ManyToOne

    @JoinColumn(name="company_id")

    @PropertyDescriptor(index=3)

    public Company getEmployer() ...

}




                            2007 JavaOneSM Conference | Session BOF-9843 |   39
Ready to Go!
 mvn tomcat:run or mvn jetty:run




                2007 JavaOneSM Conference | Session BOF-9843 |   40
Home page




            2007 JavaOneSM Conference | Session BOF-9843 |   41
List Companies




                 2007 JavaOneSM Conference | Session BOF-9843 |   42
Search Company




             2007 JavaOneSM Conference | Session BOF-9843 |   43
Add/Edit/Delete Company




              2007 JavaOneSM Conference | Session BOF-9843 |   44
List Speakers




                2007 JavaOneSM Conference | Session BOF-9843 |   45
Search Speaker




                 2007 JavaOneSM Conference | Session BOF-9843 |   46
Add/Edit/Delete Speaker




               2007 JavaOneSM Conference | Session BOF-9843 |   47
Customizing View
• Copy the default view to view specific to the
  controller.
   • cp DefaultEdit SpeakerEdit
• Modify like any other Tapestry template




                       2007 JavaOneSM Conference | Session BOF-9843 |   48
Roadmap
• Release version 1.0
• Search refactoring and Lucene integration
• equals() Aspect




                     2007 JavaOneSM Conference | Session BOF-9843 |   49
Agenda

Brief History of Web Development
Ruby On Rails
Sails
Trails
Grails
The Future of *ails



                 2007 JavaOneSM Conference | Session BOF-9843 |   50
• Open-source web framework started in early
  2006
   • Most heavily influenced by Rails
• Built with top of Groovy
  •   Dynamic language
  •   Can compile down to Java bytecode
  •   Interoperability with Java key goal
  •   1.0 released early 2007
                      2007 JavaOneSM Conference | Session BOF-9843 |   51
First Cousin of Rails

• Takes the most inspiration from Rails
• Design really driven by language
   • Ruby drives Rails
   • Groovy drives Grails




                  2007 JavaOneSM Conference | Session BOF-9843 |   52
...But not the Weird Cousin
• All the libraries you already know
  • Hibernate 3.2
  • Spring
  • SiteMesh
  • Quartz
• And access to anything else in the Java
  world
• Calls into Java natural
                  2007 JavaOneSM Conference | Session BOF-9843 |   53
What’s the Same?
•   Project quickstart / artifact generation
•   MVC
•   Convention over Configuration
•   Dynamic finder methods
•   Interactive console
•   Support for development/production mode



                   2007 JavaOneSM Conference | Session BOF-9843 |   54
What’s Different Philosophically?
• Domain Driven Development
  • No class to inherit from
  • Class properties drive DB, not the other way around
• Embrace Legacy
  • Support for more complex relationships with Hibernate
  • Middlegen support in the works
• Go Beyond Crud
  • Grails Services
• Half in Groovy, Half in Java

                        2007 JavaOneSM Conference | Session BOF-9843 |   55
What’s Different Technically?
• Performance
   • Uses native threads
   • Runs on JVM
• Deployment
   • Deploys as a war, hence any servlet
     container including app servers
• These are arguably the motivations behind
  JRuby
                  2007 JavaOneSM Conference | Session BOF-9843 |   56
Up and Running



 grails create-app glogger




             2007 JavaOneSM Conference | Session BOF-9843 |   57
Built-in support for
     Gives you...                                                             internationalization



    Support for
    transactional services




Go under the covers
when you need to                                                              Promotes TDD


                                                                              Your J2EE webapp




                             2007 JavaOneSM Conference | Session BOF-9843 |     58
What Else Can It Do?

                                  create-webtest
create-controller                 generate-all
create-domain-class               generate-controller
create-job                        generate-views
create-plugin                     generate-webtest
create-script                     install-plugin
create-service                    install-templates
create-tag-lib                    run-app
create-test-suite                 run-webtest
                                  shell
                  2007 JavaOneSM Conference | Session BOF-9843 |   59
Dissecting the Domain
    grails create-domain-class Post




groggergrails-appdomainPost.groovy
groggergrails-testsPostTests.groovy



                2007 JavaOneSM Conference | Session BOF-9843 |   60
Further Dissecting the Domain
         class Post {                                                 No super class!

           String title
           String body                                                Simple properties
                                                                      automatically mapped
           String author
           String tags
                                                               Easy definition of
           Date datePosted                                     relationships


              static hasMany = [comments:Comment]
              static constraints = {
Powerful
           
constraints     title(unique:true, length:0..150)
                body(blank:false, maxSize:5000)
                datePosted(nullable:false)
              }
                            2007 JavaOneSM Conference | Session BOF-9843 |   61
Generating the Rest

grails generate-all Post




grails-appcontrollersPostController.groovy
grails-appviewspostlist.gsp
......................show.gsp
......................edit.gsp
......................create.gsp

                  2007 JavaOneSM Conference | Session BOF-9843 |   62
Groovy Views (GSP)
• Groovy Server Pages
• Creation of custom tags couldn’t be easier
   • No TLDs
   • Changes are seen instantly
• Discourages scripting
• Ships with large and growing tag library
   • Includes tags for AJAX




                       2007 JavaOneSM Conference | Session BOF-9843 |   63
Controllers - Generated
class PostController {
  def index = {
    redirect(action:list,params:params)
  }

  def allowedMethods = [delete:'POST',
                        save:'POST',
                        update:'POST']
  def list = { ... }
  def show = { ... }
  def delete = { ... }
  ...
  ...              2007 JavaOneSM Conference | Session BOF-9843 |   64
Controllers - Dynamic



class PostController {
  def scaffold = true
}




          2007 JavaOneSM Conference | Session BOF-9843 |   65
Controllers - Dynamic Override

class PostController {                                            Implement methods to
  def scaffold = true                                             override the default



    def list = {
      if(!params.max)params.max = 10
      [ postList: Post.list( params ).reverse() ]
    }
}



                      2007 JavaOneSM Conference | Session BOF-9843 |   66
Let’s See the App




     2007 JavaOneSM Conference | Session BOF-9843 |   67
Glogger Homepage




2007 JavaOneSM Conference | Session BOF-9843 |   68
Create Post




2007 JavaOneSM Conference | Session BOF-9843 |   69
List Posts




2007 JavaOneSM Conference | Session BOF-9843 |   70
View Post




2007 JavaOneSM Conference | Session BOF-9843 |   71
Edit Post




2007 JavaOneSM Conference | Session BOF-9843 |   72
Dynamic Methods and Properties

Post.findByAuthor("Matt")
Post.findByTitleAndAuthor("Grails", "Matt")
Post.findAll()
Post.listOrderTitle()
Post.hasErrors()
Post.save()




                   2007 JavaOneSM Conference | Session BOF-9843 |   73
Services
• Keeping business logic in the right place
    class PostService {
          boolean transactional = false
    }


• Dependency Inject by Convention (Autowiring)
    class PostService {
        CommentService commentService
    }

                         2007 JavaOneSM Conference | Session BOF-9843 |   74
Builders - Query Criteria

   def c = Post.createCriteria()
   def results = c {
     like("title", "%grails%")
     and {
       eq("author", "Matt")
     }
     maxResults(10)
     order("title", "desc")
   }


                2007 JavaOneSM Conference | Session BOF-9843 |   75
Builders - Configuration

def bb = new grails.spring.BeanBuilder()
bb.beans {
  dataSource(BasicDataSource) {
    driverClassName = "org.hsqldb.jdbcDriver"
    url = "jdbc:hsqldb:mem:grailsDB"
    username = "sa"
    password = ""
  }
  sessionFactory(ConfigurableLocalSessionFactoryBean) {
    dataSource = dataSource
  }
}




                        2007 JavaOneSM Conference | Session BOF-9843 |   76
Builders - XML Generation
import groovy.xml.MarkupBuilder
<blog>
def xmlDoc= new MarkupBuilder()
  <post title="Grails Rocks" author="Matt">
    <body>
xmlDoc.blog {
  post(title:"Grailsreal potential
       Grails has some Rocks") {
    </body>
   body("Grails has some real potential")
    <comment author="anonymous">
   comment("Yeah right", author:"anonymous"))
       Yeah right.
  } </comment>
} </post>
</blog>




                     2007 JavaOneSM Conference | Session BOF-9843 |   77
Grails Roadmap
•   1.0 now targeted for autumn 2007
•   Performance and stability are key
•   Middlegen support
•   JPA support
•   JavaScript templates




                      2007 JavaOneSM Conference | Session BOF-9843 |   78
Agenda

Brief History of Web Development
Ruby On Rails
Sails
Trails
Grails
The Future of *ails



                 2007 JavaOneSM Conference | Session BOF-9843 |   79
Popularity




 2007 JavaOneSM Conference | Session BOF-9843 |   80
Jobs




2007 JavaOneSM Conference | Session BOF-9843 |   81
But...




Room for Growth




2007 JavaOneSM Conference | Session BOF-9843 |   82
Why Aren’t *ails More Popular?
• Haven’t reached critical 1.0 milestone
• Do Trails/Sails solve enough pain points?
• JRuby
   • Are Java developers holding out for JRuby on Rails?
• Inertia?
   • Rails already has huge community, documentation,
     training, etc




                       2007 JavaOneSM Conference | Session BOF-9843 |   83
Q&A



      2007 JavaOneSM Conference | Session XXXX |   84

More Related Content

What's hot

OSGi-enabled Java EE Applications using GlassFish at JCertif 2011
OSGi-enabled Java EE Applications using GlassFish at JCertif 2011OSGi-enabled Java EE Applications using GlassFish at JCertif 2011
OSGi-enabled Java EE Applications using GlassFish at JCertif 2011Arun Gupta
 
GIDS 2012: PaaSing a Java EE Application
GIDS 2012: PaaSing a Java EE ApplicationGIDS 2012: PaaSing a Java EE Application
GIDS 2012: PaaSing a Java EE ApplicationArun Gupta
 
Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...
Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...
Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...Arun Gupta
 
Running your Java EE applications in the Cloud
Running your Java EE applications in the CloudRunning your Java EE applications in the Cloud
Running your Java EE applications in the CloudArun Gupta
 
Java EE 6 and GlassFish v3: Paving the path for future
Java EE 6 and GlassFish v3: Paving the path for futureJava EE 6 and GlassFish v3: Paving the path for future
Java EE 6 and GlassFish v3: Paving the path for futureArun Gupta
 
02.egovFrame Development Environment workshop I
02.egovFrame  Development Environment workshop I02.egovFrame  Development Environment workshop I
02.egovFrame Development Environment workshop IChuong Nguyen
 
02. egovFrame Development Environment workshop II en(nexus&ci)
02. egovFrame Development Environment workshop II en(nexus&ci)02. egovFrame Development Environment workshop II en(nexus&ci)
02. egovFrame Development Environment workshop II en(nexus&ci)Chuong Nguyen
 
03.eGovFrame Runtime Environment Training Book Supplement
03.eGovFrame Runtime Environment Training Book Supplement03.eGovFrame Runtime Environment Training Book Supplement
03.eGovFrame Runtime Environment Training Book SupplementChuong Nguyen
 
Mobyle administrator workshop
Mobyle administrator workshopMobyle administrator workshop
Mobyle administrator workshopbneron
 
The State of Java under Oracle at JCertif 2011
The State of Java under Oracle at JCertif 2011The State of Java under Oracle at JCertif 2011
The State of Java under Oracle at JCertif 2011Arun Gupta
 
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpikeMyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpikeos890
 
Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 javatwo2011
 
Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010
Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010
Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010Arun Gupta
 
5050 dev nation
5050 dev nation5050 dev nation
5050 dev nationArun Gupta
 
Instruction on creating a cluster on jboss eap environment
Instruction on creating a cluster on jboss eap environmentInstruction on creating a cluster on jboss eap environment
Instruction on creating a cluster on jboss eap environmentMadhusudan Pisipati
 
Arun Gupta: London Java Community: Java EE 6 and GlassFish 3
Arun Gupta: London Java Community: Java EE 6 and GlassFish 3 Arun Gupta: London Java Community: Java EE 6 and GlassFish 3
Arun Gupta: London Java Community: Java EE 6 and GlassFish 3 Skills Matter
 
Running your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the CloudRunning your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the CloudArun Gupta
 
WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.
WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.
WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.Dimitris Andreadis
 

What's hot (20)

OSGi-enabled Java EE Applications using GlassFish at JCertif 2011
OSGi-enabled Java EE Applications using GlassFish at JCertif 2011OSGi-enabled Java EE Applications using GlassFish at JCertif 2011
OSGi-enabled Java EE Applications using GlassFish at JCertif 2011
 
GIDS 2012: PaaSing a Java EE Application
GIDS 2012: PaaSing a Java EE ApplicationGIDS 2012: PaaSing a Java EE Application
GIDS 2012: PaaSing a Java EE Application
 
OSGi Blueprint Services
OSGi Blueprint ServicesOSGi Blueprint Services
OSGi Blueprint Services
 
Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...
Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...
Java EE 6 & GlassFish 3: Light-weight, Extensible, and Powerful @ Silicon Val...
 
Running your Java EE applications in the Cloud
Running your Java EE applications in the CloudRunning your Java EE applications in the Cloud
Running your Java EE applications in the Cloud
 
Java EE 6 and GlassFish v3: Paving the path for future
Java EE 6 and GlassFish v3: Paving the path for futureJava EE 6 and GlassFish v3: Paving the path for future
Java EE 6 and GlassFish v3: Paving the path for future
 
Apache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolboxApache DeltaSpike the CDI toolbox
Apache DeltaSpike the CDI toolbox
 
02.egovFrame Development Environment workshop I
02.egovFrame  Development Environment workshop I02.egovFrame  Development Environment workshop I
02.egovFrame Development Environment workshop I
 
02. egovFrame Development Environment workshop II en(nexus&ci)
02. egovFrame Development Environment workshop II en(nexus&ci)02. egovFrame Development Environment workshop II en(nexus&ci)
02. egovFrame Development Environment workshop II en(nexus&ci)
 
03.eGovFrame Runtime Environment Training Book Supplement
03.eGovFrame Runtime Environment Training Book Supplement03.eGovFrame Runtime Environment Training Book Supplement
03.eGovFrame Runtime Environment Training Book Supplement
 
Mobyle administrator workshop
Mobyle administrator workshopMobyle administrator workshop
Mobyle administrator workshop
 
The State of Java under Oracle at JCertif 2011
The State of Java under Oracle at JCertif 2011The State of Java under Oracle at JCertif 2011
The State of Java under Oracle at JCertif 2011
 
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpikeMyFaces CODI and JBoss Seam3 become Apache DeltaSpike
MyFaces CODI and JBoss Seam3 become Apache DeltaSpike
 
Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望 Java EE 與 雲端運算的展望
Java EE 與 雲端運算的展望
 
Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010
Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010
Getting Started with Rails on GlassFish (Hands-on Lab) - Spark IT 2010
 
5050 dev nation
5050 dev nation5050 dev nation
5050 dev nation
 
Instruction on creating a cluster on jboss eap environment
Instruction on creating a cluster on jboss eap environmentInstruction on creating a cluster on jboss eap environment
Instruction on creating a cluster on jboss eap environment
 
Arun Gupta: London Java Community: Java EE 6 and GlassFish 3
Arun Gupta: London Java Community: Java EE 6 and GlassFish 3 Arun Gupta: London Java Community: Java EE 6 and GlassFish 3
Arun Gupta: London Java Community: Java EE 6 and GlassFish 3
 
Running your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the CloudRunning your Java EE 6 applications in the Cloud
Running your Java EE 6 applications in the Cloud
 
WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.
WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.
WildFly v9 - State of the Union Session at Voxxed, Istanbul, May/9th 2015.
 

Viewers also liked

Incomplete contracts allocation eship society. Erik Stam
 Incomplete contracts allocation eship society. Erik Stam Incomplete contracts allocation eship society. Erik Stam
Incomplete contracts allocation eship society. Erik Stamenterpriseresearchcentre
 
Adrian Lursen and Linda Pepe Content Tag Team
Adrian Lursen and Linda Pepe Content Tag TeamAdrian Lursen and Linda Pepe Content Tag Team
Adrian Lursen and Linda Pepe Content Tag TeamAdrian Dayton
 
Evaluation Question4
Evaluation Question4Evaluation Question4
Evaluation Question425423
 
Portifolio adler dare
Portifolio adler darePortifolio adler dare
Portifolio adler dareAdler Daré
 
New Features May 11 2009
New Features May 11 2009New Features May 11 2009
New Features May 11 2009agilebuddy
 
The critical role of the manager in supporting learning at work through coach...
The critical role of the manager in supporting learning at work through coach...The critical role of the manager in supporting learning at work through coach...
The critical role of the manager in supporting learning at work through coach...Acas Comms
 

Viewers also liked (7)

Incomplete contracts allocation eship society. Erik Stam
 Incomplete contracts allocation eship society. Erik Stam Incomplete contracts allocation eship society. Erik Stam
Incomplete contracts allocation eship society. Erik Stam
 
Adrian Lursen and Linda Pepe Content Tag Team
Adrian Lursen and Linda Pepe Content Tag TeamAdrian Lursen and Linda Pepe Content Tag Team
Adrian Lursen and Linda Pepe Content Tag Team
 
Evaluation Question4
Evaluation Question4Evaluation Question4
Evaluation Question4
 
Malware
MalwareMalware
Malware
 
Portifolio adler dare
Portifolio adler darePortifolio adler dare
Portifolio adler dare
 
New Features May 11 2009
New Features May 11 2009New Features May 11 2009
New Features May 11 2009
 
The critical role of the manager in supporting learning at work through coach...
The critical role of the manager in supporting learning at work through coach...The critical role of the manager in supporting learning at work through coach...
The critical role of the manager in supporting learning at work through coach...
 

Similar to Rails, Trails and Sails Through a Coffee Filter

Introduction to java servlet 3.0 api javaone 2008
Introduction to java servlet 3.0 api javaone 2008Introduction to java servlet 3.0 api javaone 2008
Introduction to java servlet 3.0 api javaone 2008JavaEE Trainers
 
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
ZZ BC#7.5 asp.net mvc practice  and guideline refresh! ZZ BC#7.5 asp.net mvc practice  and guideline refresh!
ZZ BC#7.5 asp.net mvc practice and guideline refresh! Chalermpon Areepong
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
blueMarine Or Why You Should Really Ship Swing Applications
blueMarine  Or Why You Should Really Ship Swing  Applications blueMarine  Or Why You Should Really Ship Swing  Applications
blueMarine Or Why You Should Really Ship Swing Applications Fabrizio Giudici
 
SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4Jon Galloway
 
Java Enterprise Edition 6 Overview
Java Enterprise Edition 6 OverviewJava Enterprise Edition 6 Overview
Java Enterprise Edition 6 OverviewEugene Bogaart
 
Play Support in Cloud Foundry
Play Support in Cloud FoundryPlay Support in Cloud Foundry
Play Support in Cloud Foundryrajdeep
 
SpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSunghyouk Bae
 
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvpZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvpChalermpon Areepong
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotationjavatwo2011
 
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010Arun Gupta
 
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyMark Proctor
 
Advanced #6 clean architecture
Advanced #6  clean architectureAdvanced #6  clean architecture
Advanced #6 clean architectureVitali Pekelis
 
PHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodePHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodeSWIFTotter Solutions
 
Struts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web ApplicationsStruts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web Applicationselliando dias
 
JavaOne India 2011 - Servlets 3.0
JavaOne India 2011 - Servlets 3.0JavaOne India 2011 - Servlets 3.0
JavaOne India 2011 - Servlets 3.0Arun Gupta
 
JRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell YouJRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell Youelliando dias
 
JBoss AS7 Webservices
JBoss AS7 WebservicesJBoss AS7 Webservices
JBoss AS7 WebservicesJBug Italy
 

Similar to Rails, Trails and Sails Through a Coffee Filter (20)

Introduction to java servlet 3.0 api javaone 2008
Introduction to java servlet 3.0 api javaone 2008Introduction to java servlet 3.0 api javaone 2008
Introduction to java servlet 3.0 api javaone 2008
 
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
ZZ BC#7.5 asp.net mvc practice  and guideline refresh! ZZ BC#7.5 asp.net mvc practice  and guideline refresh!
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
blueMarine Or Why You Should Really Ship Swing Applications
blueMarine  Or Why You Should Really Ship Swing  Applications blueMarine  Or Why You Should Really Ship Swing  Applications
blueMarine Or Why You Should Really Ship Swing Applications
 
SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4SoCal Code Camp 2011 - ASP.NET MVC 4
SoCal Code Camp 2011 - ASP.NET MVC 4
 
Java Enterprise Edition 6 Overview
Java Enterprise Edition 6 OverviewJava Enterprise Edition 6 Overview
Java Enterprise Edition 6 Overview
 
Play Support in Cloud Foundry
Play Support in Cloud FoundryPlay Support in Cloud Foundry
Play Support in Cloud Foundry
 
SpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSL
 
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvpZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
 
Intro to Laravel 4
Intro to Laravel 4Intro to Laravel 4
Intro to Laravel 4
 
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
 
Liferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for DevelopersLiferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for Developers
 
Advanced #6 clean architecture
Advanced #6  clean architectureAdvanced #6  clean architecture
Advanced #6 clean architecture
 
PHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodePHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better Code
 
Struts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web ApplicationsStruts An Open-source Architecture for Web Applications
Struts An Open-source Architecture for Web Applications
 
JavaOne India 2011 - Servlets 3.0
JavaOne India 2011 - Servlets 3.0JavaOne India 2011 - Servlets 3.0
JavaOne India 2011 - Servlets 3.0
 
JRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell YouJRuby on Rails Deployment: What They Didn't Tell You
JRuby on Rails Deployment: What They Didn't Tell You
 
JBoss AS7 Webservices
JBoss AS7 WebservicesJBoss AS7 Webservices
JBoss AS7 Webservices
 

More from elliando dias

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slideselliando dias
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScriptelliando dias
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structureselliando dias
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de containerelliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agilityelliando dias
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Librarieselliando dias
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!elliando dias
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Webelliando dias
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduinoelliando dias
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorceryelliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Designelliando dias
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makeselliando dias
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.elliando dias
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebookelliando dias
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Studyelliando dias
 

More from elliando dias (20)

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slides
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScript
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de container
 
Geometria Projetiva
Geometria ProjetivaGeometria Projetiva
Geometria Projetiva
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
 
Ragel talk
Ragel talkRagel talk
Ragel talk
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
 
Rango
RangoRango
Rango
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makes
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
 

Recently uploaded

🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 

Recently uploaded (20)

🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 

Rails, Trails and Sails Through a Coffee Filter

  • 1. Grails, Trails, and Sails: Rails Through a Coffee Filter Matt Hughes David Esterkin Chariot Solutions http://chariotsolutions.com BOF-9843 2007 JavaOneSM Conference | Session BOF-9843 |
  • 2. Agenda Brief History of Web Development Ruby On Rails Sails Trails Grails The Future of *ails 2007 JavaOneSM Conference | Session BOF-9843 | 2
  • 3. Agenda Brief History of Web Development Ruby On Rails Sails Trails Grails The Future of *ails 2007 JavaOneSM Conference | Session BOF-9843 | 3
  • 4. A Brief History of Web Application Development In the beginning there was pain ... then came Ruby on Rails 2007 JavaOneSM Conference | Session BOF-9843 | 4
  • 5. Agenda Brief History of Web Development Ruby On Rails Sails Trails Grails The Future of *ails 2007 JavaOneSM Conference | Session BOF-9843 | 5
  • 6. Rails Screencast rails blog_app 2007 JavaOneSM Conference | Session BOF-9843 | 6
  • 7. Gives You... A functional CRUD app in 15 minutes 2007 JavaOneSM Conference | Session BOF-9843 | 7
  • 8. Ruby on Rails Opinionated Convention Software MVC over Configuration 80/20 Rule Test Driven Don’t Repeat Development Yourself Agile Get Real 2007 JavaOneSM Conference | Session BOF-9843 | 8
  • 9. Rails Dissected ActiveRecord Model ERB Ruby View ActionController Controller 2007 JavaOneSM Conference | Session BOF-9843 | 9
  • 10. State of Java Web Development • Coincides with • Disillusioned with EJB 2.x • Code, compile, deploy, restart server cycle • Popularity of dynamic languages on the JVM • Realization that Enterpriseyness != Self-Worth 2007 JavaOneSM Conference | Session BOF-9843 | 10
  • 11. 2007 JavaOneSM Conference | Session BOF-9843 | 11
  • 12. The Contenders Trail Domain Driven Design Sail Controller-centric Grail DDD / Full stack 2007 JavaOneSM Conference | Session BOF-9843 | 12
  • 13. Agenda Brief History of Web Development Ruby On Rails Sails Trails Grails The Future of *ails 2007 JavaOneSM Conference | Session BOF-9843 | 13
  • 14. • Started in 2005 • Brings the flavor of Rails development to Java • Viento: custom template engine • Rigging: custom dependency injection library 2007 JavaOneSM Conference | Session BOF-9843 | 14
  • 15. Similar to *ails • Generates nice URLs • Promotes easy testing • Templates are closest to Rails of the 3 Java frameworks 2007 JavaOneSM Conference | Session BOF-9843 | 15
  • 16. Differs from *ails • Does not provide utilities to generate scaffolding • No functionality to facilitate Hibernate persistence layer 2007 JavaOneSM Conference | Session BOF-9843 | 16
  • 17. Components • Model: Hibernate • Developers don’t think ActiveRecord can be duplicated in Java • Already comfortable with Hibernate • View: Viento • Custom template engine • Supports partials and caching • Mixins • Controller: Rigging • Custom dependency injection library • Provides convention over configuration defaults 2007 JavaOneSM Conference | Session BOF-9843 | 17
  • 18. Convention over Configuration • Controllers all go in a specific package • Action URL contains the controller name, action name, and action parameters • ‘widget/list’ => WidgetController.list() • Views all go under the /views webapp directory • View names match the controller/action names • /views/widget/list.vto • Template engine extensions follow similar pattern • View tools are in org.opensails.examples.tools • Mixins are in org.opensails.examples.mixins 2007 JavaOneSM Conference | Session BOF-9843 | 18
  • 19. Generate Sample Application • Download zip file from opensails.org • Create Eclipse project • Import Existing Projects into Workspace • Select Archive file (downloaded zip file) • Configure Server • Run as Java Application • Main Class org.opensails.example.JettyBoot 2007 JavaOneSM Conference | Session BOF-9843 | 19
  • 20. Add New Controller public class PostController Maps to /post/* urls extends BaseController { Extends BaseController public void list() { Maps to /post/list Exposes ‘posts’ to view expose("posts", postService.getAllPosts()); } public void view(int postId) { Maps to /post/view/#id Exposes ‘post’ to view expose("post", postService.getPost(postId); } public void add() { Exposes the Post model for exposeModel(“post”, new Post()); a form to use } public void save(Post post) { Post is loaded from the form // persist post } 2007 JavaOneSM Conference | Session BOF-9843 | 20
  • 21. List Posts View (list.vto) <body> ... <table> Ruby like each construct <tr> <th>Date</th> <th>Title</th> Bean style attribute access </tr> $posts.each(cur_post) [[ <tr> <td>$cur_post.dateString</td> <td> <a href="/app/post/view/$cur_post.id">$cur_post.title</a> </td> </tr> ]] </table> <a href="/app/post/add">New Post</a> ... </body> 2007 JavaOneSM Conference | Session BOF-9843 | 21
  • 22. Add Post view (/post/add.vto) <html> <head><title>Add Post</title></head> <body> $form.start $form.text('post.title').label("Title")<br /> $form.textarea('post.body').label("Body")<br /> $form.submit("Post Entry").action(save, [$post]) $form.end </body> </html> Maps to PostController.save(post) 2007 JavaOneSM Conference | Session BOF-9843 | 22
  • 23. Viento: Top Level Mixins In Java: public class Mixin { public boolean isEven (int i) { return (i % 2 == 0); } } ... binding.mixin(new Mixin()); In Viento: $isEven($row_num) 2007 JavaOneSM Conference | Session BOF-9843 | 23
  • 24. Viento: Type Mixins In Java: public class EvenMixin { public boolean isEven (int i) { return (i % 2 == 0); } } ... binding.mixin(int.class, new EventMixin()); In Viento: $row_num.isEven 2007 JavaOneSM Conference | Session BOF-9843 | 24
  • 25. Viento: Method Missing In Java: public class TagTool implements MethodMissing { public String methodMissing(String methodName, Object[] args) { return “<” + methodName + “>”; } } ... binding.put(“tag”, new TagTool()); In Viento: $tag.div 2007 JavaOneSM Conference | Session BOF-9843 | 25
  • 26. Viento: Custom Method Names In Java: public class Tool { @Name(“?”) public String question(String arg) { return “do something interesting”; } In Viento: $tool.?(“my string”) 2007 JavaOneSM Conference | Session BOF-9843 | 26
  • 27. Roadmap • Project is dormant • Development team is now using Rails! • Lead developer was very helpful, and would like to see Sails continue 2007 JavaOneSM Conference | Session BOF-9843 | 27
  • 28. Agenda Brief History of Web Development Ruby On Rails Sails Trails Grails The Future of *ails 2007 JavaOneSM Conference | Session BOF-9843 | 28
  • 29. • Started in mid 2005 • Currently at 1.0-SNAPSHOT • Influences • Ruby on Rails • Naked Objects pattern 2007 JavaOneSM Conference | Session BOF-9843 | 29
  • 30. Rails Influence • Rapid web application development • Scaffolding generation • Convention over configuration 2007 JavaOneSM Conference | Session BOF-9843 | 30
  • 31. Naked Objects Influence • http://nakedobjects.org • Domain Driven Design • Domain objects are behaviorally complete • Domain objects have single point of definition 2007 JavaOneSM Conference | Session BOF-9843 | 31
  • 32. Components • Tapestry • Spring • Hibernate • Maven 2007 JavaOneSM Conference | Session BOF-9843 | 32
  • 33. Getting Started • Requirements • Java 1.5 • Maven 2 • trails-archetype • 1.0-SNAPSHOT: build locally • Release will be in maven repository 2007 JavaOneSM Conference | Session BOF-9843 | 33
  • 34. Creating the Application mvn -U archetype:create -DarchetypeGroupId=org.trailsframework -DarchetypeArtifactId=trails-archetype -DremoteRepositories= http://snapshots.repository.codehaus.org/ -DarchetypeVersion=1.0-SNAPSHOT -DgroupId=com.chariotsolutions.trailsdemo -DartifactId=trailsdemo 2007 JavaOneSM Conference | Session BOF-9843 | 34
  • 35. What this generates Source structure created, and includes base domain object JUnit application test Hibernate configuration (set for HSQL) 2007 JavaOneSM Conference | Session BOF-9843 | 35
  • 36. Running the Application mvn tomcat:run or mvn jetty:run • Create process generates a base domain object • Initially uses an in-memory HSQL database 2007 JavaOneSM Conference | Session BOF-9843 | 36
  • 37. IDE Support • Because Trails is built on popular Java libraries, there is already pretty good support in the popular IDEs • mvn eclipse • mvn idea • Netbeans mevenide? 2007 JavaOneSM Conference | Session BOF-9843 | 37
  • 38. Create Company domain class @Entity Define as an entity @ValidateUniqueness(property="name") Force name to be unique public class Company { private int id; private String name; Define Primary Key private String website; and generation method @Id @GeneratedValue(strategy = GenerationType.AUTO) public int getId() ... @PropertyDescriptor(index=0) public getName() ... Set screen display order @PropertyDescriptor(index=1) public String getWebsite() ... // omitted setters } 2007 JavaOneSM Conference | Session BOF-9843 | 38
  • 39. Create Speaker domain class @Entity public class Speaker { private int id; private String name; private Date presentationDate; private Company employer; Define many to one relationship between speaker and company @ManyToOne @JoinColumn(name="company_id") @PropertyDescriptor(index=3) public Company getEmployer() ... } 2007 JavaOneSM Conference | Session BOF-9843 | 39
  • 40. Ready to Go! mvn tomcat:run or mvn jetty:run 2007 JavaOneSM Conference | Session BOF-9843 | 40
  • 41. Home page 2007 JavaOneSM Conference | Session BOF-9843 | 41
  • 42. List Companies 2007 JavaOneSM Conference | Session BOF-9843 | 42
  • 43. Search Company 2007 JavaOneSM Conference | Session BOF-9843 | 43
  • 44. Add/Edit/Delete Company 2007 JavaOneSM Conference | Session BOF-9843 | 44
  • 45. List Speakers 2007 JavaOneSM Conference | Session BOF-9843 | 45
  • 46. Search Speaker 2007 JavaOneSM Conference | Session BOF-9843 | 46
  • 47. Add/Edit/Delete Speaker 2007 JavaOneSM Conference | Session BOF-9843 | 47
  • 48. Customizing View • Copy the default view to view specific to the controller. • cp DefaultEdit SpeakerEdit • Modify like any other Tapestry template 2007 JavaOneSM Conference | Session BOF-9843 | 48
  • 49. Roadmap • Release version 1.0 • Search refactoring and Lucene integration • equals() Aspect 2007 JavaOneSM Conference | Session BOF-9843 | 49
  • 50. Agenda Brief History of Web Development Ruby On Rails Sails Trails Grails The Future of *ails 2007 JavaOneSM Conference | Session BOF-9843 | 50
  • 51. • Open-source web framework started in early 2006 • Most heavily influenced by Rails • Built with top of Groovy • Dynamic language • Can compile down to Java bytecode • Interoperability with Java key goal • 1.0 released early 2007 2007 JavaOneSM Conference | Session BOF-9843 | 51
  • 52. First Cousin of Rails • Takes the most inspiration from Rails • Design really driven by language • Ruby drives Rails • Groovy drives Grails 2007 JavaOneSM Conference | Session BOF-9843 | 52
  • 53. ...But not the Weird Cousin • All the libraries you already know • Hibernate 3.2 • Spring • SiteMesh • Quartz • And access to anything else in the Java world • Calls into Java natural 2007 JavaOneSM Conference | Session BOF-9843 | 53
  • 54. What’s the Same? • Project quickstart / artifact generation • MVC • Convention over Configuration • Dynamic finder methods • Interactive console • Support for development/production mode 2007 JavaOneSM Conference | Session BOF-9843 | 54
  • 55. What’s Different Philosophically? • Domain Driven Development • No class to inherit from • Class properties drive DB, not the other way around • Embrace Legacy • Support for more complex relationships with Hibernate • Middlegen support in the works • Go Beyond Crud • Grails Services • Half in Groovy, Half in Java 2007 JavaOneSM Conference | Session BOF-9843 | 55
  • 56. What’s Different Technically? • Performance • Uses native threads • Runs on JVM • Deployment • Deploys as a war, hence any servlet container including app servers • These are arguably the motivations behind JRuby 2007 JavaOneSM Conference | Session BOF-9843 | 56
  • 57. Up and Running grails create-app glogger 2007 JavaOneSM Conference | Session BOF-9843 | 57
  • 58. Built-in support for Gives you... internationalization Support for transactional services Go under the covers when you need to Promotes TDD Your J2EE webapp 2007 JavaOneSM Conference | Session BOF-9843 | 58
  • 59. What Else Can It Do? create-webtest create-controller generate-all create-domain-class generate-controller create-job generate-views create-plugin generate-webtest create-script install-plugin create-service install-templates create-tag-lib run-app create-test-suite run-webtest shell 2007 JavaOneSM Conference | Session BOF-9843 | 59
  • 60. Dissecting the Domain grails create-domain-class Post groggergrails-appdomainPost.groovy groggergrails-testsPostTests.groovy 2007 JavaOneSM Conference | Session BOF-9843 | 60
  • 61. Further Dissecting the Domain class Post { No super class!   String title   String body Simple properties automatically mapped   String author   String tags Easy definition of   Date datePosted relationships   static hasMany = [comments:Comment]   static constraints = { Powerful   constraints   title(unique:true, length:0..150)     body(blank:false, maxSize:5000)     datePosted(nullable:false)   } 2007 JavaOneSM Conference | Session BOF-9843 | 61
  • 62. Generating the Rest grails generate-all Post grails-appcontrollersPostController.groovy grails-appviewspostlist.gsp ......................show.gsp ......................edit.gsp ......................create.gsp 2007 JavaOneSM Conference | Session BOF-9843 | 62
  • 63. Groovy Views (GSP) • Groovy Server Pages • Creation of custom tags couldn’t be easier • No TLDs • Changes are seen instantly • Discourages scripting • Ships with large and growing tag library • Includes tags for AJAX 2007 JavaOneSM Conference | Session BOF-9843 | 63
  • 64. Controllers - Generated class PostController { def index = { redirect(action:list,params:params) } def allowedMethods = [delete:'POST', save:'POST', update:'POST'] def list = { ... } def show = { ... } def delete = { ... } ... ... 2007 JavaOneSM Conference | Session BOF-9843 | 64
  • 65. Controllers - Dynamic class PostController { def scaffold = true } 2007 JavaOneSM Conference | Session BOF-9843 | 65
  • 66. Controllers - Dynamic Override class PostController { Implement methods to def scaffold = true override the default def list = { if(!params.max)params.max = 10 [ postList: Post.list( params ).reverse() ] } } 2007 JavaOneSM Conference | Session BOF-9843 | 66
  • 67. Let’s See the App 2007 JavaOneSM Conference | Session BOF-9843 | 67
  • 68. Glogger Homepage 2007 JavaOneSM Conference | Session BOF-9843 | 68
  • 69. Create Post 2007 JavaOneSM Conference | Session BOF-9843 | 69
  • 70. List Posts 2007 JavaOneSM Conference | Session BOF-9843 | 70
  • 71. View Post 2007 JavaOneSM Conference | Session BOF-9843 | 71
  • 72. Edit Post 2007 JavaOneSM Conference | Session BOF-9843 | 72
  • 73. Dynamic Methods and Properties Post.findByAuthor("Matt") Post.findByTitleAndAuthor("Grails", "Matt") Post.findAll() Post.listOrderTitle() Post.hasErrors() Post.save() 2007 JavaOneSM Conference | Session BOF-9843 | 73
  • 74. Services • Keeping business logic in the right place class PostService { boolean transactional = false } • Dependency Inject by Convention (Autowiring) class PostService { CommentService commentService } 2007 JavaOneSM Conference | Session BOF-9843 | 74
  • 75. Builders - Query Criteria def c = Post.createCriteria() def results = c { like("title", "%grails%") and { eq("author", "Matt") } maxResults(10) order("title", "desc") } 2007 JavaOneSM Conference | Session BOF-9843 | 75
  • 76. Builders - Configuration def bb = new grails.spring.BeanBuilder() bb.beans { dataSource(BasicDataSource) { driverClassName = "org.hsqldb.jdbcDriver" url = "jdbc:hsqldb:mem:grailsDB" username = "sa" password = "" } sessionFactory(ConfigurableLocalSessionFactoryBean) { dataSource = dataSource } } 2007 JavaOneSM Conference | Session BOF-9843 | 76
  • 77. Builders - XML Generation import groovy.xml.MarkupBuilder <blog> def xmlDoc= new MarkupBuilder() <post title="Grails Rocks" author="Matt"> <body> xmlDoc.blog { post(title:"Grailsreal potential Grails has some Rocks") { </body> body("Grails has some real potential") <comment author="anonymous"> comment("Yeah right", author:"anonymous")) Yeah right. } </comment> } </post> </blog> 2007 JavaOneSM Conference | Session BOF-9843 | 77
  • 78. Grails Roadmap • 1.0 now targeted for autumn 2007 • Performance and stability are key • Middlegen support • JPA support • JavaScript templates 2007 JavaOneSM Conference | Session BOF-9843 | 78
  • 79. Agenda Brief History of Web Development Ruby On Rails Sails Trails Grails The Future of *ails 2007 JavaOneSM Conference | Session BOF-9843 | 79
  • 80. Popularity 2007 JavaOneSM Conference | Session BOF-9843 | 80
  • 81. Jobs 2007 JavaOneSM Conference | Session BOF-9843 | 81
  • 82. But... Room for Growth 2007 JavaOneSM Conference | Session BOF-9843 | 82
  • 83. Why Aren’t *ails More Popular? • Haven’t reached critical 1.0 milestone • Do Trails/Sails solve enough pain points? • JRuby • Are Java developers holding out for JRuby on Rails? • Inertia? • Rails already has huge community, documentation, training, etc 2007 JavaOneSM Conference | Session BOF-9843 | 83
  • 84. Q&A 2007 JavaOneSM Conference | Session XXXX | 84