Jagadish Ramu
                     Sun Microsystems
Java EE 6 - Deep Dive




                                1
The following/preceding is intended to outline our
general product direction. It is intended for
information purposes only, and may not be
incorporated into any contract. It is not a
commitment to deliver any material, code, or
functionality, and should not be relied upon in
making purchasing decisions.
The development, release, and timing of any
features or functionality described for Oracle’s
products remains at the sole discretion of Oracle.



                                                     2
Compatible Java EE 6 Impls

Today:




Announced:
                             3
Goals for the Java EE 6
    Platform
   Flexible & Light-weight
        Web Profile 1.0
        Pruning: JAX-RPC, EJB 2.x Entity Beans, JAXR, JSR 88
   Extensible
        • Embrace Open Source Frameworks

   Easier to use, develop on
        • Continue on path set by Java EE 5


                                                           4
Java EE 6 Web Profile 1.0
   Fully functional mid-sized profile
    • Actively discussed in the Java EE 6 Expert
      Group and outside it
    • Technologies
      • Servlets 3.0, JSP 2.2, EL 2.2, Debugging Support for Other
        Languages 1.0, JSTL 1.2, JSF 2.0, Common Annotations
        1.1, EJB 3.1 Lite, JTA 1.1, JPA 2.0, Bean Validation 1.0,
        Managed Beans 1.0, Interceptors 1.1, Context &
        Dependency Injection 1.0, Dependency Injection for
        Java 1.0



                                                                     5
Java EE 6 - Done




                    09
   Specifications approved by the JCP
   Reference Implementation is GlassFish v3




                 20
   TCK
           ec
          D

                                          6
Java EE 6 Specifications
   The Platform
   Java EE 6 Web Profile 1.0
   Managed Beans 1.0




                                7
Java EE 6 Specifications
    New

   Contexts and Dependency Injection for
    Java EE (JSR 299)
   Bean Validation 1.0 (JSR 303)
   Java API for RESTful Web Services (JSR 311)
   Dependency Injection for Java (JSR 330)




                                              8
Java EE 6 Specifications
    Extreme Makeover

   Java Server Faces 2.0 (JSR 314)
   Java Servlets 3.0 (JSR 315)
   Java Persistence 2.0 (JSR 317)
   Enterprise Java Beans 3.1 & Interceptors 1.1
    (JSR 318)
   Java EE Connector Architecture 1.6 (JSR 322)


                                            9
Java EE 6 Specifications
     Updates
   Java API for XML-based Web Services 2.2 (JSR 224)
   Java API for XML Binding 2.2 (JSR 222)
   Web Services Metadata MR3 (JSR 181)
   JSP 2.2/EL 2.2 (JSR 245)
   Web Services for Java EE 1.3 (JSR 109)
   Common Annotations 1.1 (JSR 250)
   Java Authorization Contract for Containers 1.3 (JSR 115)
   Java Authentication Service Provider Interface for
    Containers 1.0 (JSR 196)
                                                         10
Servlets in Java EE 5
   At least 2 files
<!--Deployment descriptor     /* Code in Java Class */
  web.xml -->
                              package com.sun;
<web-app>                     public class MyServlet extends
  <servlet>                   HttpServlet {
    <servlet-name>MyServlet   public void
                              doGet(HttpServletRequest
       </servlet-name>
                              req,HttpServletResponse res)
       <servlet-class>
         com.sun.MyServlet    {
       </servlet-class>       ...
  </servlet>
  <servlet-mapping>           }
    <servlet-name>MyServlet
       </servlet-name>        ...
    <url-pattern>/myApp/*
       </url-pattern>         }
  </servlet-mapping>
   ...
</web-app>
                                                         11
Servlets 3.0 (JSR 315)
     Annotations-based @WebServlet

package com.sun;
@WebServlet(name=”MyServlet”, urlPatterns={”/myApp/*”})
public class MyServlet extends HttpServlet {
      public void doGet(HttpServletRequest req,
                         HttpServletResponse res)
                          <!--Deployment descriptor web.xml -->
   {
            ...           <web-app>
                             <servlet>
   }                           <servlet-name>MyServlet</servlet-name>

                                                      <servlet-class>
                                                        com.sun.MyServlet
                                                      </servlet-class>
                                                 </servlet>
                                                 <servlet-mapping>
                                                   <servlet-name>MyServlet</servlet-name>
                                                   <url-pattern>/myApp/*</url-pattern>
                                                 </servlet-mapping>
                                                  ...
                                               </web-app>

http://blogs.sun.com/arungupta/entry/totd_81_getting_started_with
                                                                                            12
Servlets 3.0
    Annotations-based @WebServlet

@WebServlet(name="mytest",
       urlPatterns={"/myurl"},
     initParams={
       @WebInitParam(name="n1",
value="v1"),
       @WebInitParam(name="n2", value="v2")

       }
)
public class TestServlet extends
       javax.servlet.http.HttpServlet {
           ....                           13

}
Servlets 3.0
Annotations-based @WebListeners
<listener>
   <listener-class>
      server.LoginServletListener
   </listener-class>
</listener>



package server;

. . .

@WebListener()
public class LoginServletListener implements
ServletContextListener {

                                               14
Servlets 3.0
      Annotations-based @WebFilter
                                <filter>
                                    <filter-name>PaymentFilter</filter-name>
                                    <filter-class>server.PaymentFilter</filter-class>
                                    <init-param>
                                         <param-name>param1</param-name>
                                         <param-value>value1</param-value>
package server;                     </init-param>
. . .                           </filter>
@WebFilter(                     <filter-mapping>
                                    <filter-name>PaymentFilter</filter-name>
  filterName="PaymentFilter",       <url-pattern>/*</url-pattern>
  InitParams={                  </filter-mapping>
    @WebInitParam(              <filter-mapping>
                                    <filter-name>PaymentFilter</filter-name>
       name="param1",               <servlet-name>PaymentServlet</servlet-name>
       value="value1")              <dispatcher>REQUEST</dispatcher>
    }                           </filter-mapping>
  urlPatterns={"/*"},
  servletNames={"PaymentServlet"},
  dispatcherTypes={DispatcherType.REQUEST}
)
public class PaymentFilter implements Filter {
. . .

                                                                            15
Servlets 3.0
     Asynchronous Servlets

     Useful for Comet, long waits
     Must declare
      @WebServlet(asyncSupported=true)
AsyncContext context = request.startAsync();
context.addListener(new AsyncListener() { … });
context.dispatch(“/request.jsp”);
//context.start(Runnable action);
...
context.complete(); //marks completion
                                                                                 16
 http://blogs.sun.com/arungupta/entry/totd_139_asynchronous_request_processing
Servlets 3.0
    Extensibility

   Plugin libraries using web fragments
        Modular web.xml
   Bundled in framework JAR file in META-INF
    directory
   Zero-configuration, drag-and-drop for web
    frameworks
    • Servlets, servlet filters, context listeners for a
      framework get discovered and registered by the
      container
   Only JAR files in WEB-INF/lib are used                 17
Servlets 3.0
       Extensibility


<web-fragment>
    <filter>
          <filter-name>wicket.helloworld</filter-name>
          <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
          <init-param>
               <param-name>applicationClassName</param-name>
               <param-value>...</param-value>
          </init-param>
    </filter>
    <filter-mapping>
          <filter-name>wicket.helloworld</filter-name>
          <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-fragment>
http://blogs.sun.com/arungupta/entry/totd_91_applying_java_ee

                                                                          18
Servlets 3.0      Resource Sharing

   Static and JSP no longer confined to
    document root of the web application
   May be placed in WEB-INF/lib/
    [*.jar]/META-INF/resources
   Resources in document root take
    precedence over those in bundled JAR
myapp.war
  WEB-INF/lib/catalog.jar
             /META-INF/resources/catalog/books.html

http://localhost:8080/myapp/catalog/books.html
                                                  19
EJB 3.1 (JSR 318)
    Package & Deploy in a WAR
          Java EE 5                                        Java EE 6
                                                       foo.war
    foo.ear
                                                       WEB-INF/classes
      foo_web.war                                       com.sun.FooServlet
                                                        com.sun.TickTock
      WEB-INF/web.xml                                   com.sun.FooBean
      WEB-INF/classes                                   com.sun.FooHelper
        com.sun.FooServlet
        com.sun.TickTock

      foo_ejb.jar
      com.sun.FooBean                                      web.xml ?
      com.sun.FooHelper


http://blogs.sun.com/arungupta/entry/totd_95_ejb_3_1
                                                                             20
EJB 3.1

@Stateless
public class App {
    public String sayHello(String name) {
        return "Hello " + name;
    }
}




                                            21
EJB 3.1
   No interface view – one source file per bean
       Only for Local and within WAR
       Required for Remote
       No location transparency
   Component initialization in @PostConstruct
       No assumptions on no-arg ctor




                                            22
Java EE 6 Namespaces
   Global
       java:global/..(for all applications)
   Application scoped
       java:app/.. (visibile only for the app.)
       App-1 binds an Object by name
        “java:app/myObject”, App-2 cannot
        see it.
       All modules of the app has visibility.
           mod-1, mod-2 of app-1 can see “java:app/myObject”
                                                            23
Java EE 6 Namespaces
   Module Scoped
       java:module/.. (visible only for the
        module)
       App-1 has module-1 and module-2
        
            Module-1's namespace not accessible by module-2
       All components of the module has
        visibility
   Component
                                                         24
EJB 3.1
Portable Global JNDI Name Syntax
   Portable
   Global
   Application/Module-scoped
   Derived from metadata such as name,
     component name etc.




                                          25
EJB 3.1
  Portable Global JNDI Name Syntax
                                                  Base name of ejb-jar/WAR
   Only within EAR                                 (or ejb-jar.xml/web.xml)
 Base name of EAR
 (or application.xml)



  java:global[/<app-name>]/<module-name>/<bean-name>
  [!<fully-qualified-interface-name>]



                                  Unqualified name of the bean class
                                     Annotation/name attribute
• Until now, only java:comp                  Or ejb-jar.xml
• Local & Remote business
• No-interface
• Also in java:app, java:module
                                                                       26
EJB 3.1
 Portable Global JNDI Name Syntax

     package com.acme;
     @Stateless
     public class FooBean implements Foo { ... }
    FooBean is packaged in fooejb.jar
java:global/fooejb/FooBean
java:global/fooejb/FooBean!com.acme.Foo
java:app/fooejb/FooBean
java:app/fooejb/FooBean!com.acme.Foo
java:module/FooBean
java:module/FooBean!com.acme.Foo
                                                   27
EJB 3.1
     Embeddable API – Deploy the Bean


     public void testEJB() throws NamingException {
             EJBContainer ejbC =
                  EJBContainer.createEJBContainer();
             Context ctx = ejbC.getContext();
             App app = (App)
                  ctx.lookup("java:global/classes/App");
             assertNotNull(app);
             String NAME = "Duke";
             String greeting = app.sayHello(NAME);
             assertNotNull(greeting);
             assertTrue(greeting.equals("Hello " + NAME));
             ejbC.close();
         }

http://blogs.sun.com/arungupta/entry/totd_128_ejbcontainer_createejbcontainer_embedded

                                                                                         28
Screencast
JSP, Servlets, EJB


                     29
EJB 3.1
    Singleton Beans
   One instance per app/VM, not pooled
       Useful for caching state
       CMT/BMT
       Access to container services for injection, resource
        manager, timers, startup/shutdown callbacks, etc.
       Enable eager initialization using @Startup
       Always supports concurrent access
       Define initialization ordering using @DependsOn
    @Singleton
    public class MyEJB {
      . . .
                                                        30
    }
EJB 3.1
Asynchronous Session Beans
   Control returns to the client before the
     container dispatches invocation to a
     bean instance
   @Asynchronous – method or class
   Return type – void or Future<V>
   Transaction context does not propagate
       REQUIRED → REQUIRED_NEW
   Security principal propagates
                                               31
EJB 3.1
Asynchronous Session Beans – Code Sample
 @Stateless
 @Asynchronous
 public class SimpleAsyncEJB {
     public Future<Integer> addNumbers(int n1, int n2) {
         Integer result;


             result = n1 + n2;
             try {
                 // simulate JPA queries + reading file system
                 Thread.currentThread().sleep(2000);
             } catch (InterruptedException ex) {
                 ex.printStackTrace();
             }

             return new AsyncResult(result);
       }
 }


 http://blogs.sun.com/arungupta/entry/totd_137_asynchronous_ejb_a
                                                                    32
EJB 3.1
Timers
   Automatically created EJB Timers
   Calendar-based Timers – cron like semantics
       Every Mon & Wed midnight
        @Schedule(dayOfWeek=”Mon,Wed”)
       2pm on Last Thur of Nov of every year
        (hour=”14”, dayOfMonth=”Last Thu”,
        month=”Nov”)
       Every 5 minutes of every hour
        (minute=”*/5”, hour=”*”)
       Every 10 seconds starting at 30
        (second=”30/10”)
       Every 14th minute within the hour, for the hours 1 & 2 am
        (minute=”*/14”, hour=”1,2”)
                                                             33
EJB 3.1
 Timers
 Single     persistent timer across JVMs
   Automatically created EJB Timers
       @Schedule(hour=”15”,dayOfWeek=”Fri”)

   Can be chained
       @Schedules({
           @Schedule(hour=”6”,dayOfWeek=”Tue,Thu,Fri-Sun”),
            @Schedule(hour=”12”,dayOfWeek=”Mon,Wed”)
        })

   May be associated with a TimeZone
   Non-persistent timer, e.g. Cache
       @Schedule(..., persistent=false)               34
EJB 3.1
EJB 3.1 Lite – Feature Comparison




                                    35
Managed Beans 1.0


  EJB         CDI      JSF       JAX-WS JAX-RS      JPA       ...


@Stateful
                      @Managed    @Web
@Stateless   @Named                         @Path   @Entity   ...
                       Bean       Service
@Singleton




    @javax.annotation.ManagedBean

                                                                36
Managed Beans 1.0
   POJO as managed component for the Java
    EE container
       JavaBeans component model for Java EE
       Simple and Universally useful
       Advanced concepts in companion specs
   Basic Services
       Resource Injection, Lifecycle Callbacks, Interceptors
   Available as
       @Resource / @Inject
       java:app/<module-name>/<bean-name>
       java:module/<bean-name>                            37
Managed Beans 1.0 - Sample
@javax.annotation.ManagedBean                              @Resource
public class MyManagedBean {                               MyManagedBean bean;
  @PostConstruct
  public void setupResources() {
    // setup your resources
  }                                                        @Inject
                                                           MyManagedBean bean;
    @PreDestroy
    public void cleanupResources() {
       // collect them back here
    }

    public String sayHello(String name) {
      return "Hello " + name;
    }
}
http://blogs.sun.com/arungupta/entry/totd_129_managed_beans_1
                                                                             38
Java Persistence API 2 (JSR
     317)
     Sophisticated mapping/modeling options
   Collection of basic types

@Entity
public class Person {
    @Id protected String ssn;
    protected String name;
    protected Date birthDate;
    . . .
    @ElementCollection
    @CollectionTable(name=”ALIAS”)
    protected Set<String> nickNames;
}
                                              39
Java Persistence API 2
    Sophisticated mapping/modeling options

   Collection of embeddables

@Embeddable public class Address {
    String street;
    String city;
    String state;
    . . .
}

@Entity public class RichPerson extends Person {
    . . .
    @ElementCollection
    protected Set<Address> vacationHomes;
    . . .
}                                                  40
Java Persistence API 2
    Sophisticated mapping/modeling options

   Multiple levels of embedding

@Embeddable public class ContactInfo {
    @Embedded Address address;
    . . .
}


@Entity public class Employee {
    @Id int empId;
    String name;
      @Embedded
      ContactInfo contactInfo;
      . . .                                  41
}
Java Persistence API 2
     Sophisticated mapping/modeling options

   Improved Map support

    @Entity public class VideoStore {
        @Id Integer storeId;
        Address location;
        . . .
        @ElementCollection
        Map<Movie, Integer> inventory;
    }

    @Entity public class Movie {
        @Id String title;
        @String director;
        . . .
    }
                                              42
Java Persistence API 2
    Metamodel

   Abstract “schema-level” model over
    managed classes of a Persistence Context
       Entities, Mapped classes, Embeddables, ...
   Accessed dynamically
       EntityManager or
        EntityManagerFactory.getMetamodel()
   And/or statically materialized as
    metamodel classes
       Use annotation processor with javac
                                                     43
Java Persistence API 2
    Metamodel Example
@Entity
public class Customer {
  @Id Integer custId;
  String name;
  ...
  Address address;
  @ManyToOne SalesRep rep;
  @OneToMany Set<Order> orders;
}
import javax.persistence.metamodel.*;

@StaticMetamodel(Customer.class)
public class Customer_ {
  public static SingularAttribute<Customer, Integer> custId;
  public static SingularAttribute<Customer, String> name;
  public static SingularAttribute<Customer, Address> address;
  public static SingularAttribute<Customer, SalesRep> rep;
  public static SetAttribute<Customer, Order> orders;
}
                                                                44
Java Persistence API 2
    Caching

   1st-level Cache by PersistenceContext
        Only one object instance for any database row
   2nd-level by “shared-cache-mode”
        ALL, NONE
        UNSPECIFIED – Provider specific defaults
        ENABE_SELECTIVE - Only entities with Cacheable(true)
        DISABLE_SELECTIVE - All but with Cacheable(false)
        Optional feature for PersistenceProvider

                                                         45
Java Persistence API 2
    Much more ...

   New locking modes
        PESSIMISTIC_READ – grab shared lock
        PESSIMISTIC_WRITE – grab exclusive lock
        PESSIMISTIC_FORCE_INCREMENT – update version
        em.find(<entity>.class, id,
         LockModeType.XXX)
        em.lock(<entity>, LockModeType.XXX)
   Standard configuration options
        javax.persistence.jdbc.[driver | url | user | password]
                                                           46
Screencast - JPA


                   47
@DataSourceDefinition
@DataSourceDefinition(
name="java:global/MyApp/MyDataSource",
className="org.apache.derby.jdbc.ClientDataSource"
databaseName=”testdb”,
serverName=”localhost”,
portNumber=”1527”,
user="dbuser",
password="dbpassword" )

• Equivalents in DDs as <datasource-definition> element
• Can be defined in Servlet, EJB, Managed Beans,
Application Client and their DDs.
• Can be defined in 'global', 'app', 'module', 'comp'
scopes
                                                          48
Interceptors 1.1
   Interpose on invocations and lifecycle
    events on a target class
   Defined
       Using annotations or DD
       Default Interceptors (only in DD)
   Class & Method Interceptors
       In the same transaction & security context
   Cross-cutting concerns: logging, auditing,
    profiling
                                                     49
Interceptors 1.1 - Code
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyInterceptorBinding {
}


@Interceptor
@MyInterceptorBinding
public class MyInterceptor {
  @AroundInvoke
  public Object intercept(InvocationContext context) {
    System.out.println(context.getMethod.getName());
    System.out.println(context.getParameters());
    Object result = context.proceed();

      return result;
  }                                               50
 . . .
Interceptors 1.1 – Sample
  Code
@Interceptors(MyInterceptor.class)
public class MyManagedBean {
  . . .
}

@Inject
MyManagedBean bean;




http://blogs.sun.com/arungupta/entry/totd_134_interceptors_1_1
                                                                 51
Interceptors 1.1 – Sample
 Code
@MyInterceptorBinding
public class MyManagedBean {
  . . .
}
                                   Single instance of
                                    Interceptor per
                                 target class instance
public class MyManagedBean {
  @Interceptors(MyInterceptor.class)
  public String sayHello(String name) {
    . . .
  }
}



                                                  52
Interceptors 1.1 – Sample
    Code
@Named
@Interceptors(MyInterceptor.class)
public class MyManagedBean {
  . . .


    @Interceptors(AnotherInterceptor.class)
    @ExcludeDefaultInterceptors
    @ExcludeClassInterceptors
    public void someMethod() {
      . . .
    }
}



                                              53
Java Server Faces 2.0
   Facelets as “templating language” for the
    page
    • Custom components much easier to develop
      <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html">
        <h:head>
          <title>Enter Name &amp; Password</title>
        </h:head>
        <h:body>
          <h1>Enter Name &amp; Password</h1>
          <h:form>
            <h:panelGrid columns="2">
              <h:outputText value="Name:"/>
              <h:inputText value="#{simplebean.name}" title="name"
                           id="name" required="true"/>
              <h:outputText value="Password:"/>
              <h:inputText value="#{simplebean.password}" title="password"
                           id="password" required="true"/>
            </h:panelGrid>
            <h:commandButton action="show" value="submit"/>
          </h:form>
        </h:body>                                                            54
      </html>
JSF 2 Composite Components




                         55
JSF 2 Composite Components
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ez="http://java.sun.com/jsf/composite/ezcomp">
  <h:head>
    <title>Enter Name &amp; Password</title>
  </h:head>
  <h:body>
    <h1>Enter Name &amp; Password</h1>
    <h:form>
      <ez:username-password/>
      <h:commandButton action="show" value="submit"/>
    </h:form>
                                     . . .
  </h:body>
                                     WEB-INF
</html>
                                     index.xhtml
                                     resources/
                                       ezcomp/
                                         username-password.xhtml

http://blogs.sun.com/arungupta/entry/totd_135_jsf2_custom_components
                                                                       56
Screencast - JSF


                   57
Contexts & Dependency
    Injection – CDI (JSR 299)
   Type-safe Dependency Injection
       No String-based identifiers
       Selected at development/deployment time
   Strong typing, Loose coupling
   Context & Scope management - extensible
   Works with Java EE modular and
    component architecture
       Integration with Unified Expression Language (UEL)
                                                        58
CDI
Injection Points
   Field, Method, Constructor
   0 or more qualifiers
   Type                      Which one ?
                               (Qualifier)




                @Inject @LoggedIn User user
    Request                             What ?
    Injection                           (Type)
                                                 59
CDI – Sample Client Code
    Field and Method Injection

public class CheckoutHandler {

    @Inject @LoggedIn User user;

    @Inject PaymentProcessor processor;

    @Inject void setShoppingCart(@Default Cart cart) {
       …
    }

}




                                                    60
CDI – Sample Client Code
 Constructor Injection

public class CheckoutHandler {

    @Inject
    CheckoutHandler(@LoggedIn User user,
                    PaymentProcessor processor,
                    @Default Cart cart) {
      ...
    }

}




• Only one constructor can have @Inject
                                                  61
CDI - Sample Client Code
Multiple Qualifiers and Qualifiers with Arguments

public class CheckoutHandler {

    @Inject
    CheckoutHandler(@LoggedIn User user,
                    @Reliable
                    @PayBy(CREDIT_CARD)
                    PaymentProcessor processor,
                    @Default Cart cart) {
      ...
    }

}



                                                    62
CDI - Scopes
   Beans can be declared in a scope
       Everywhere: @ApplicationScoped, @RequestScoped
       Web app: @SessionScoped
       JSF app: @ConversationScoped : begin(), end()
         
             Transient and long-running
       Pseudo-scope (default): @Dependent
       Custom scopes via @Scope
   CDI runtime makes sure the right bean is
    created at the right time
   Client do NOT have to be scope-aware
                                                        63
CDI - Named Beans
    Built-in support for the Unified EL

   Beans give themselves a name with
    @Named(“cart”)
   Then refer to it from a JSF or JSP page
    using the EL:
     <h:commandButton
                  value=”Checkout”
                  action=“#{cart.checkout}”/>



                                                64
CDI - Events
    Even more decoupling
   Annotation-based event model
   A bean observes an event
void logPrintJobs(@Observes PrintEvent event){…}

   Another bean fires an event
    @Inject @Any Event<PrintEvent> myEvent;

    void doPrint() {
      . . .
      myEvent.fire(new PrintEvent());
    }

   Events can have qualifiers too
void logPrintJobs(@Observes @LargeFile PrintEvent event){…}
                                                       65
CDI
    Much more ...
   Producer methods and fields
   Alternatives
   Interceptors
   Decorators
   Stereotypes
   ...


                                  66
Screencast - CDI


                   67
Bean Validation (JSR 303)
   Tier-independent mechanism to define
    constraints for data validation
    • Represented by annotations
    • javax.validation.* package
   Integrated with JSF and JPA
    • JSF: f:validateRequired, f:validateRegexp
    • JPA: pre-persist, pre-update, and pre-remove
   @NotNull(message=”...”), @Max, @Min,
    @Size
   Fully Extensible        @Email String recipient;
                                                       68
Bean Validation
    Integration with JPA
   Managed classes may be configured
        Entities, Mapped superclasses, Embeddable classes
   Applied during pre-persist, pre-update,
    pre-remove lifecycle events
   How to enable ?
        “validation-mode” in persistence.xml
        “javax.persistence.validation.mode” key in
         Persistence.createEntityManagerFactory
   Specific set of classes can be targeted
        javax.persistence.validation.group.pre-[persist|
                                                            69
         update|remove]
Bean Validation
    Integration with JSF
   Individual validators not required
   Integration with EL
        f:validateBean, f:validateRequired
         <h:form>
           <f:validateBean>
             <h:inputText value=”#{model.property}” />
             <h:selectOneRadio value=”#{model.radioProperty}” > …
             </h:selectOneRadio>
             <!-- other input components here -->
           </f:validateBean>
         </h:form>




                                                                    70
JAX-RS 1.1

   Java API for building RESTful Web Services
   POJO based
   Annotation-driven
   Server-side API
   HTTP-centric



                                           71
JAX-RS 1.1
    Code Sample - Simple
@Path("helloworld")
public class HelloWorldResource {
    @Context UriInfo ui;

      @GET
      @Produces("text/plain")
      public String sayHello() {
          return "Hello World";
      }

      @GET
      @Path("morning")
      public String morning() {
           return “Good Morning!”;
      }
}

                                     72
JAX-RS 1.1
    Code Sample – Specifying Output MIME type
@Path("/helloworld")
@Produces("text/plain")
public class HelloWorldResource {
    @GET
    public String doGetAsPlainText() {
      . . .
    }

      @GET
      @Produces("text/html")
      public String doGetAsHtml() {
        . . .
      }                           @GET
}                                 @Produces({
                                    "application/xml",
                                    "application/json"})
                                  public String doGetAsXmlOrJson() {
                                    . . .
                                  }
                                                              73
JAX-RS 1.1
 Code Sample – Specifying Input MIME type

@POST
@Consumes("text/plain")
public String saveMessage() {
    . . .
}




                                            74
JAX-RS 1.1
    Code Sample
import javax.inject.Inject;
import javax.enterprise.context.RequestScoped;

@RequestScoped
public class ActorResource {
    @Inject DatbaseBean db;

      public Actor getActor(int id) {
          return db.findActorById(id);
      }
}




                                                 75
JAX-RS 1.1
    Code Sample
import   javax.ws.rs.GET;
import   javax.ws.rs.Path;
import   javax.ws.rs.Produces;
import   javax.ws.rs.PathParam;
import   javax.inject.Inject;
import   javax.enterprise.context.RequestScoped;

@Path("/actor/{id}")
@RequestScoped
public class ActorResource {
    @Inject DatbaseBean db;

      @GET
      @Produces("application/json")
      public Actor getActor(@PathParam("id") int id) {
           return db.findActorById(id);
      }
}                      http://blogs.sun.com/arungupta/entry/totd_124_using_cdi_jpa
                                                                            76
JAX-RS 1.1
          Integration with Java EE 6 – Servlets 3.0

         No or Portable “web.xml”
<web-app>                                                     @ApplicationPath(“resources”
  <servlet>
    <servlet-name>Jersey Web Application</servlet-name>
                                                              )
                                                              public class MyApplication
    <servlet-class>                                              extends
      com.sun.jersey.spi.container.servlet.ServletContainer      javax.ws.rs.core.Application {
    </servlet-class>
    <init-param>                                              }
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.foo.MyApplication</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/resources/*</url-pattern>
  </servlet-mapping>
</web-app>




                                                                                          77
Screencast - JAX-RS


                      78
GlassFish Distributions
Distribution              License      Features

GlassFish Open Source     CDDL &       • Java EE 6 Compatibility
Edition 3.0.1             GPLv2        • No Clustering
                                       • Clustering planned in 3.1
                                       • mod_jk for load balancing
GlassFish Open Source     CDDL &       • Java EE 5 Compatibility
Edition 2.1.1             GPLv2        • In memory replication
                                       • mod_loadbalancer
Oracle GlassFish Server   Commercial   • GlassFish Open Source Edition 3.0.1
                                                                             Clustering
3.0.1                                  • Oracle GlassFish Server Control      Coming
                                       • Clustering planned in 3.1             Soon!
Oracle GlassFish Server   Commercial   • GlassFish Open Source Edition 2.1.1
2.1.1                                  • Enterprise Manager
                                       • HADB




                                                                                 79
GlassFish 3 & OSGi
   No OSGi APIs are used in GlassFish
         HK2 provides abstraction layer
   All GlassFish modules are OSGi bundles
   Felix is default, also runs on Knopflerfish & Equinox
         Can run in an existing shell
         200+ modules in v3




    http://blogs.sun.com/arungupta/entry/totd_103_glassfish_v3_with

                                                                      80
Light Weight & On-demand
     Monitoring
   Event-driven light-weight and non-intrusive
    monitoring
   Modules provide domain specific probes
    (monitoring events)
    • EJB, Web, Connector, JPA, Jersey, Orb, Ruby
   End-to-end monitoring on Solaris using
    DTrace
   3rd party scripting clients
    • JavaScript to begin with                      81
Boost your productivity
    Retain session across deployment
asadmin redeploy –properties keepSessions=true helloworld.war




                                                                82
Boost your productivity
Deploy-on-Save




                          83
GlassFish Roadmap Detail




                                            84
  84
©2010 Oracle Corporation
GlassFish 3.1 = 3.0 + 2.1.1
   Main Features
       Clustering and Centralized Administration
       High Availability
   Other ...
       Application Versioning
       Application-scoped Resources
       SSH-based remote management and monitoring
       Embedded (extensive)
       Admin Console based on RESTful API

     http://wikis.sun.com/display/glassfish/GlassFishv3.1
                                                            85
References & Queries
   download.oracle.com/javaee/6/tutorial/doc
   glassfish.org
   blogs.sun.com/theaquarium
   oracle.com/goto/glassfish
   glassfish.org/roadmap
   youtube.com/user/GlassFishVideos
   Follow @glassfish
   users@glassfish.java.net
   dev@glassfish.java.net
                                                86
Jagadish.Ramu@Sun.COM
                       Sun Microsystems
Thank You !




                                  87

Java EE 6 - Deep Dive - Indic Threads, Pune - 2010

  • 1.
    Jagadish Ramu Sun Microsystems Java EE 6 - Deep Dive 1
  • 2.
    The following/preceding isintended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 2
  • 3.
    Compatible Java EE6 Impls Today: Announced: 3
  • 4.
    Goals for theJava EE 6 Platform  Flexible & Light-weight  Web Profile 1.0  Pruning: JAX-RPC, EJB 2.x Entity Beans, JAXR, JSR 88  Extensible • Embrace Open Source Frameworks  Easier to use, develop on • Continue on path set by Java EE 5 4
  • 5.
    Java EE 6Web Profile 1.0  Fully functional mid-sized profile • Actively discussed in the Java EE 6 Expert Group and outside it • Technologies • Servlets 3.0, JSP 2.2, EL 2.2, Debugging Support for Other Languages 1.0, JSTL 1.2, JSF 2.0, Common Annotations 1.1, EJB 3.1 Lite, JTA 1.1, JPA 2.0, Bean Validation 1.0, Managed Beans 1.0, Interceptors 1.1, Context & Dependency Injection 1.0, Dependency Injection for Java 1.0 5
  • 6.
    Java EE 6- Done 09  Specifications approved by the JCP  Reference Implementation is GlassFish v3 20  TCK ec D 6
  • 7.
    Java EE 6Specifications  The Platform  Java EE 6 Web Profile 1.0  Managed Beans 1.0 7
  • 8.
    Java EE 6Specifications New  Contexts and Dependency Injection for Java EE (JSR 299)  Bean Validation 1.0 (JSR 303)  Java API for RESTful Web Services (JSR 311)  Dependency Injection for Java (JSR 330) 8
  • 9.
    Java EE 6Specifications Extreme Makeover  Java Server Faces 2.0 (JSR 314)  Java Servlets 3.0 (JSR 315)  Java Persistence 2.0 (JSR 317)  Enterprise Java Beans 3.1 & Interceptors 1.1 (JSR 318)  Java EE Connector Architecture 1.6 (JSR 322) 9
  • 10.
    Java EE 6Specifications Updates  Java API for XML-based Web Services 2.2 (JSR 224)  Java API for XML Binding 2.2 (JSR 222)  Web Services Metadata MR3 (JSR 181)  JSP 2.2/EL 2.2 (JSR 245)  Web Services for Java EE 1.3 (JSR 109)  Common Annotations 1.1 (JSR 250)  Java Authorization Contract for Containers 1.3 (JSR 115)  Java Authentication Service Provider Interface for Containers 1.0 (JSR 196) 10
  • 11.
    Servlets in JavaEE 5 At least 2 files <!--Deployment descriptor /* Code in Java Class */ web.xml --> package com.sun; <web-app> public class MyServlet extends <servlet> HttpServlet { <servlet-name>MyServlet public void doGet(HttpServletRequest </servlet-name> req,HttpServletResponse res) <servlet-class> com.sun.MyServlet { </servlet-class> ... </servlet> <servlet-mapping> } <servlet-name>MyServlet </servlet-name> ... <url-pattern>/myApp/* </url-pattern> } </servlet-mapping> ... </web-app> 11
  • 12.
    Servlets 3.0 (JSR315) Annotations-based @WebServlet package com.sun; @WebServlet(name=”MyServlet”, urlPatterns={”/myApp/*”}) public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) <!--Deployment descriptor web.xml --> { ... <web-app> <servlet> } <servlet-name>MyServlet</servlet-name> <servlet-class> com.sun.MyServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myApp/*</url-pattern> </servlet-mapping> ... </web-app> http://blogs.sun.com/arungupta/entry/totd_81_getting_started_with 12
  • 13.
    Servlets 3.0 Annotations-based @WebServlet @WebServlet(name="mytest", urlPatterns={"/myurl"}, initParams={ @WebInitParam(name="n1", value="v1"), @WebInitParam(name="n2", value="v2") } ) public class TestServlet extends javax.servlet.http.HttpServlet { .... 13 }
  • 14.
    Servlets 3.0 Annotations-based @WebListeners <listener> <listener-class> server.LoginServletListener </listener-class> </listener> package server; . . . @WebListener() public class LoginServletListener implements ServletContextListener { 14
  • 15.
    Servlets 3.0 Annotations-based @WebFilter <filter> <filter-name>PaymentFilter</filter-name> <filter-class>server.PaymentFilter</filter-class> <init-param> <param-name>param1</param-name> <param-value>value1</param-value> package server; </init-param> . . . </filter> @WebFilter( <filter-mapping> <filter-name>PaymentFilter</filter-name> filterName="PaymentFilter", <url-pattern>/*</url-pattern> InitParams={ </filter-mapping> @WebInitParam( <filter-mapping> <filter-name>PaymentFilter</filter-name> name="param1", <servlet-name>PaymentServlet</servlet-name> value="value1") <dispatcher>REQUEST</dispatcher> } </filter-mapping> urlPatterns={"/*"}, servletNames={"PaymentServlet"}, dispatcherTypes={DispatcherType.REQUEST} ) public class PaymentFilter implements Filter { . . . 15
  • 16.
    Servlets 3.0 Asynchronous Servlets  Useful for Comet, long waits  Must declare @WebServlet(asyncSupported=true) AsyncContext context = request.startAsync(); context.addListener(new AsyncListener() { … }); context.dispatch(“/request.jsp”); //context.start(Runnable action); ... context.complete(); //marks completion 16 http://blogs.sun.com/arungupta/entry/totd_139_asynchronous_request_processing
  • 17.
    Servlets 3.0 Extensibility  Plugin libraries using web fragments  Modular web.xml  Bundled in framework JAR file in META-INF directory  Zero-configuration, drag-and-drop for web frameworks • Servlets, servlet filters, context listeners for a framework get discovered and registered by the container  Only JAR files in WEB-INF/lib are used 17
  • 18.
    Servlets 3.0 Extensibility <web-fragment> <filter> <filter-name>wicket.helloworld</filter-name> <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>...</param-value> </init-param> </filter> <filter-mapping> <filter-name>wicket.helloworld</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-fragment> http://blogs.sun.com/arungupta/entry/totd_91_applying_java_ee 18
  • 19.
    Servlets 3.0 Resource Sharing  Static and JSP no longer confined to document root of the web application  May be placed in WEB-INF/lib/ [*.jar]/META-INF/resources  Resources in document root take precedence over those in bundled JAR myapp.war WEB-INF/lib/catalog.jar /META-INF/resources/catalog/books.html http://localhost:8080/myapp/catalog/books.html 19
  • 20.
    EJB 3.1 (JSR318) Package & Deploy in a WAR Java EE 5 Java EE 6 foo.war foo.ear WEB-INF/classes foo_web.war com.sun.FooServlet com.sun.TickTock WEB-INF/web.xml com.sun.FooBean WEB-INF/classes com.sun.FooHelper com.sun.FooServlet com.sun.TickTock foo_ejb.jar com.sun.FooBean web.xml ? com.sun.FooHelper http://blogs.sun.com/arungupta/entry/totd_95_ejb_3_1 20
  • 21.
    EJB 3.1 @Stateless public classApp { public String sayHello(String name) { return "Hello " + name; } } 21
  • 22.
    EJB 3.1  No interface view – one source file per bean  Only for Local and within WAR  Required for Remote  No location transparency  Component initialization in @PostConstruct  No assumptions on no-arg ctor 22
  • 23.
    Java EE 6Namespaces  Global  java:global/..(for all applications)  Application scoped  java:app/.. (visibile only for the app.)  App-1 binds an Object by name “java:app/myObject”, App-2 cannot see it.  All modules of the app has visibility.  mod-1, mod-2 of app-1 can see “java:app/myObject” 23
  • 24.
    Java EE 6Namespaces  Module Scoped  java:module/.. (visible only for the module)  App-1 has module-1 and module-2  Module-1's namespace not accessible by module-2  All components of the module has visibility  Component 24
  • 25.
    EJB 3.1 Portable GlobalJNDI Name Syntax  Portable  Global  Application/Module-scoped  Derived from metadata such as name, component name etc. 25
  • 26.
    EJB 3.1 Portable Global JNDI Name Syntax Base name of ejb-jar/WAR Only within EAR (or ejb-jar.xml/web.xml) Base name of EAR (or application.xml) java:global[/<app-name>]/<module-name>/<bean-name> [!<fully-qualified-interface-name>] Unqualified name of the bean class Annotation/name attribute • Until now, only java:comp Or ejb-jar.xml • Local & Remote business • No-interface • Also in java:app, java:module 26
  • 27.
    EJB 3.1 PortableGlobal JNDI Name Syntax package com.acme; @Stateless public class FooBean implements Foo { ... }  FooBean is packaged in fooejb.jar java:global/fooejb/FooBean java:global/fooejb/FooBean!com.acme.Foo java:app/fooejb/FooBean java:app/fooejb/FooBean!com.acme.Foo java:module/FooBean java:module/FooBean!com.acme.Foo 27
  • 28.
    EJB 3.1 Embeddable API – Deploy the Bean public void testEJB() throws NamingException { EJBContainer ejbC = EJBContainer.createEJBContainer(); Context ctx = ejbC.getContext(); App app = (App) ctx.lookup("java:global/classes/App"); assertNotNull(app); String NAME = "Duke"; String greeting = app.sayHello(NAME); assertNotNull(greeting); assertTrue(greeting.equals("Hello " + NAME)); ejbC.close(); } http://blogs.sun.com/arungupta/entry/totd_128_ejbcontainer_createejbcontainer_embedded 28
  • 29.
  • 30.
    EJB 3.1 Singleton Beans  One instance per app/VM, not pooled  Useful for caching state  CMT/BMT  Access to container services for injection, resource manager, timers, startup/shutdown callbacks, etc.  Enable eager initialization using @Startup  Always supports concurrent access  Define initialization ordering using @DependsOn @Singleton public class MyEJB { . . . 30 }
  • 31.
    EJB 3.1 Asynchronous SessionBeans  Control returns to the client before the container dispatches invocation to a bean instance  @Asynchronous – method or class  Return type – void or Future<V>  Transaction context does not propagate  REQUIRED → REQUIRED_NEW  Security principal propagates 31
  • 32.
    EJB 3.1 Asynchronous SessionBeans – Code Sample @Stateless @Asynchronous public class SimpleAsyncEJB { public Future<Integer> addNumbers(int n1, int n2) { Integer result; result = n1 + n2; try { // simulate JPA queries + reading file system Thread.currentThread().sleep(2000); } catch (InterruptedException ex) { ex.printStackTrace(); } return new AsyncResult(result); } } http://blogs.sun.com/arungupta/entry/totd_137_asynchronous_ejb_a 32
  • 33.
    EJB 3.1 Timers  Automatically created EJB Timers  Calendar-based Timers – cron like semantics  Every Mon & Wed midnight @Schedule(dayOfWeek=”Mon,Wed”)  2pm on Last Thur of Nov of every year (hour=”14”, dayOfMonth=”Last Thu”, month=”Nov”)  Every 5 minutes of every hour (minute=”*/5”, hour=”*”)  Every 10 seconds starting at 30 (second=”30/10”)  Every 14th minute within the hour, for the hours 1 & 2 am (minute=”*/14”, hour=”1,2”) 33
  • 34.
    EJB 3.1 Timers Single persistent timer across JVMs  Automatically created EJB Timers  @Schedule(hour=”15”,dayOfWeek=”Fri”)  Can be chained  @Schedules({ @Schedule(hour=”6”,dayOfWeek=”Tue,Thu,Fri-Sun”), @Schedule(hour=”12”,dayOfWeek=”Mon,Wed”) })  May be associated with a TimeZone  Non-persistent timer, e.g. Cache  @Schedule(..., persistent=false) 34
  • 35.
    EJB 3.1 EJB 3.1Lite – Feature Comparison 35
  • 36.
    Managed Beans 1.0 EJB CDI JSF JAX-WS JAX-RS JPA ... @Stateful @Managed @Web @Stateless @Named @Path @Entity ... Bean Service @Singleton @javax.annotation.ManagedBean 36
  • 37.
    Managed Beans 1.0  POJO as managed component for the Java EE container  JavaBeans component model for Java EE  Simple and Universally useful  Advanced concepts in companion specs  Basic Services  Resource Injection, Lifecycle Callbacks, Interceptors  Available as  @Resource / @Inject  java:app/<module-name>/<bean-name>  java:module/<bean-name> 37
  • 38.
    Managed Beans 1.0- Sample @javax.annotation.ManagedBean @Resource public class MyManagedBean { MyManagedBean bean; @PostConstruct public void setupResources() { // setup your resources } @Inject MyManagedBean bean; @PreDestroy public void cleanupResources() { // collect them back here } public String sayHello(String name) { return "Hello " + name; } } http://blogs.sun.com/arungupta/entry/totd_129_managed_beans_1 38
  • 39.
    Java Persistence API2 (JSR 317) Sophisticated mapping/modeling options  Collection of basic types @Entity public class Person { @Id protected String ssn; protected String name; protected Date birthDate; . . . @ElementCollection @CollectionTable(name=”ALIAS”) protected Set<String> nickNames; } 39
  • 40.
    Java Persistence API2 Sophisticated mapping/modeling options  Collection of embeddables @Embeddable public class Address { String street; String city; String state; . . . } @Entity public class RichPerson extends Person { . . . @ElementCollection protected Set<Address> vacationHomes; . . . } 40
  • 41.
    Java Persistence API2 Sophisticated mapping/modeling options  Multiple levels of embedding @Embeddable public class ContactInfo { @Embedded Address address; . . . } @Entity public class Employee { @Id int empId; String name; @Embedded ContactInfo contactInfo; . . . 41 }
  • 42.
    Java Persistence API2 Sophisticated mapping/modeling options  Improved Map support @Entity public class VideoStore { @Id Integer storeId; Address location; . . . @ElementCollection Map<Movie, Integer> inventory; } @Entity public class Movie { @Id String title; @String director; . . . } 42
  • 43.
    Java Persistence API2 Metamodel  Abstract “schema-level” model over managed classes of a Persistence Context  Entities, Mapped classes, Embeddables, ...  Accessed dynamically  EntityManager or EntityManagerFactory.getMetamodel()  And/or statically materialized as metamodel classes  Use annotation processor with javac 43
  • 44.
    Java Persistence API2 Metamodel Example @Entity public class Customer { @Id Integer custId; String name; ... Address address; @ManyToOne SalesRep rep; @OneToMany Set<Order> orders; } import javax.persistence.metamodel.*; @StaticMetamodel(Customer.class) public class Customer_ { public static SingularAttribute<Customer, Integer> custId; public static SingularAttribute<Customer, String> name; public static SingularAttribute<Customer, Address> address; public static SingularAttribute<Customer, SalesRep> rep; public static SetAttribute<Customer, Order> orders; } 44
  • 45.
    Java Persistence API2 Caching  1st-level Cache by PersistenceContext  Only one object instance for any database row  2nd-level by “shared-cache-mode”  ALL, NONE  UNSPECIFIED – Provider specific defaults  ENABE_SELECTIVE - Only entities with Cacheable(true)  DISABLE_SELECTIVE - All but with Cacheable(false)  Optional feature for PersistenceProvider 45
  • 46.
    Java Persistence API2 Much more ...  New locking modes  PESSIMISTIC_READ – grab shared lock  PESSIMISTIC_WRITE – grab exclusive lock  PESSIMISTIC_FORCE_INCREMENT – update version  em.find(<entity>.class, id, LockModeType.XXX)  em.lock(<entity>, LockModeType.XXX)  Standard configuration options  javax.persistence.jdbc.[driver | url | user | password] 46
  • 47.
  • 48.
    @DataSourceDefinition @DataSourceDefinition( name="java:global/MyApp/MyDataSource", className="org.apache.derby.jdbc.ClientDataSource" databaseName=”testdb”, serverName=”localhost”, portNumber=”1527”, user="dbuser", password="dbpassword" ) • Equivalentsin DDs as <datasource-definition> element • Can be defined in Servlet, EJB, Managed Beans, Application Client and their DDs. • Can be defined in 'global', 'app', 'module', 'comp' scopes 48
  • 49.
    Interceptors 1.1  Interpose on invocations and lifecycle events on a target class  Defined  Using annotations or DD  Default Interceptors (only in DD)  Class & Method Interceptors  In the same transaction & security context  Cross-cutting concerns: logging, auditing, profiling 49
  • 50.
    Interceptors 1.1 -Code @InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface MyInterceptorBinding { } @Interceptor @MyInterceptorBinding public class MyInterceptor { @AroundInvoke public Object intercept(InvocationContext context) { System.out.println(context.getMethod.getName()); System.out.println(context.getParameters()); Object result = context.proceed(); return result; } 50 . . .
  • 51.
    Interceptors 1.1 –Sample Code @Interceptors(MyInterceptor.class) public class MyManagedBean { . . . } @Inject MyManagedBean bean; http://blogs.sun.com/arungupta/entry/totd_134_interceptors_1_1 51
  • 52.
    Interceptors 1.1 –Sample Code @MyInterceptorBinding public class MyManagedBean { . . . } Single instance of Interceptor per target class instance public class MyManagedBean { @Interceptors(MyInterceptor.class) public String sayHello(String name) { . . . } } 52
  • 53.
    Interceptors 1.1 –Sample Code @Named @Interceptors(MyInterceptor.class) public class MyManagedBean { . . . @Interceptors(AnotherInterceptor.class) @ExcludeDefaultInterceptors @ExcludeClassInterceptors public void someMethod() { . . . } } 53
  • 54.
    Java Server Faces2.0  Facelets as “templating language” for the page • Custom components much easier to develop <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Enter Name &amp; Password</title> </h:head> <h:body> <h1>Enter Name &amp; Password</h1> <h:form> <h:panelGrid columns="2"> <h:outputText value="Name:"/> <h:inputText value="#{simplebean.name}" title="name" id="name" required="true"/> <h:outputText value="Password:"/> <h:inputText value="#{simplebean.password}" title="password" id="password" required="true"/> </h:panelGrid> <h:commandButton action="show" value="submit"/> </h:form> </h:body> 54 </html>
  • 55.
    JSF 2 CompositeComponents 55
  • 56.
    JSF 2 CompositeComponents <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:ez="http://java.sun.com/jsf/composite/ezcomp"> <h:head> <title>Enter Name &amp; Password</title> </h:head> <h:body> <h1>Enter Name &amp; Password</h1> <h:form> <ez:username-password/> <h:commandButton action="show" value="submit"/> </h:form> . . . </h:body> WEB-INF </html> index.xhtml resources/ ezcomp/ username-password.xhtml http://blogs.sun.com/arungupta/entry/totd_135_jsf2_custom_components 56
  • 57.
  • 58.
    Contexts & Dependency Injection – CDI (JSR 299)  Type-safe Dependency Injection  No String-based identifiers  Selected at development/deployment time  Strong typing, Loose coupling  Context & Scope management - extensible  Works with Java EE modular and component architecture  Integration with Unified Expression Language (UEL) 58
  • 59.
    CDI Injection Points  Field, Method, Constructor  0 or more qualifiers  Type Which one ? (Qualifier) @Inject @LoggedIn User user Request What ? Injection (Type) 59
  • 60.
    CDI – SampleClient Code Field and Method Injection public class CheckoutHandler { @Inject @LoggedIn User user; @Inject PaymentProcessor processor; @Inject void setShoppingCart(@Default Cart cart) { … } } 60
  • 61.
    CDI – SampleClient Code Constructor Injection public class CheckoutHandler { @Inject CheckoutHandler(@LoggedIn User user, PaymentProcessor processor, @Default Cart cart) { ... } } • Only one constructor can have @Inject 61
  • 62.
    CDI - SampleClient Code Multiple Qualifiers and Qualifiers with Arguments public class CheckoutHandler { @Inject CheckoutHandler(@LoggedIn User user, @Reliable @PayBy(CREDIT_CARD) PaymentProcessor processor, @Default Cart cart) { ... } } 62
  • 63.
    CDI - Scopes  Beans can be declared in a scope  Everywhere: @ApplicationScoped, @RequestScoped  Web app: @SessionScoped  JSF app: @ConversationScoped : begin(), end()  Transient and long-running  Pseudo-scope (default): @Dependent  Custom scopes via @Scope  CDI runtime makes sure the right bean is created at the right time  Client do NOT have to be scope-aware 63
  • 64.
    CDI - NamedBeans Built-in support for the Unified EL  Beans give themselves a name with @Named(“cart”)  Then refer to it from a JSF or JSP page using the EL: <h:commandButton value=”Checkout” action=“#{cart.checkout}”/> 64
  • 65.
    CDI - Events Even more decoupling  Annotation-based event model  A bean observes an event void logPrintJobs(@Observes PrintEvent event){…}  Another bean fires an event @Inject @Any Event<PrintEvent> myEvent; void doPrint() { . . . myEvent.fire(new PrintEvent()); }  Events can have qualifiers too void logPrintJobs(@Observes @LargeFile PrintEvent event){…} 65
  • 66.
    CDI Much more ...  Producer methods and fields  Alternatives  Interceptors  Decorators  Stereotypes  ... 66
  • 67.
  • 68.
    Bean Validation (JSR303)  Tier-independent mechanism to define constraints for data validation • Represented by annotations • javax.validation.* package  Integrated with JSF and JPA • JSF: f:validateRequired, f:validateRegexp • JPA: pre-persist, pre-update, and pre-remove  @NotNull(message=”...”), @Max, @Min, @Size  Fully Extensible @Email String recipient; 68
  • 69.
    Bean Validation Integration with JPA  Managed classes may be configured  Entities, Mapped superclasses, Embeddable classes  Applied during pre-persist, pre-update, pre-remove lifecycle events  How to enable ?  “validation-mode” in persistence.xml  “javax.persistence.validation.mode” key in Persistence.createEntityManagerFactory  Specific set of classes can be targeted  javax.persistence.validation.group.pre-[persist| 69 update|remove]
  • 70.
    Bean Validation Integration with JSF  Individual validators not required  Integration with EL  f:validateBean, f:validateRequired <h:form> <f:validateBean> <h:inputText value=”#{model.property}” /> <h:selectOneRadio value=”#{model.radioProperty}” > … </h:selectOneRadio> <!-- other input components here --> </f:validateBean> </h:form> 70
  • 71.
    JAX-RS 1.1  Java API for building RESTful Web Services  POJO based  Annotation-driven  Server-side API  HTTP-centric 71
  • 72.
    JAX-RS 1.1 Code Sample - Simple @Path("helloworld") public class HelloWorldResource { @Context UriInfo ui; @GET @Produces("text/plain") public String sayHello() { return "Hello World"; } @GET @Path("morning") public String morning() { return “Good Morning!”; } } 72
  • 73.
    JAX-RS 1.1 Code Sample – Specifying Output MIME type @Path("/helloworld") @Produces("text/plain") public class HelloWorldResource { @GET public String doGetAsPlainText() { . . . } @GET @Produces("text/html") public String doGetAsHtml() { . . . } @GET } @Produces({ "application/xml", "application/json"}) public String doGetAsXmlOrJson() { . . . } 73
  • 74.
    JAX-RS 1.1 CodeSample – Specifying Input MIME type @POST @Consumes("text/plain") public String saveMessage() { . . . } 74
  • 75.
    JAX-RS 1.1 Code Sample import javax.inject.Inject; import javax.enterprise.context.RequestScoped; @RequestScoped public class ActorResource { @Inject DatbaseBean db; public Actor getActor(int id) { return db.findActorById(id); } } 75
  • 76.
    JAX-RS 1.1 Code Sample import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.PathParam; import javax.inject.Inject; import javax.enterprise.context.RequestScoped; @Path("/actor/{id}") @RequestScoped public class ActorResource { @Inject DatbaseBean db; @GET @Produces("application/json") public Actor getActor(@PathParam("id") int id) { return db.findActorById(id); } } http://blogs.sun.com/arungupta/entry/totd_124_using_cdi_jpa 76
  • 77.
    JAX-RS 1.1 Integration with Java EE 6 – Servlets 3.0  No or Portable “web.xml” <web-app> @ApplicationPath(“resources” <servlet> <servlet-name>Jersey Web Application</servlet-name> ) public class MyApplication <servlet-class> extends com.sun.jersey.spi.container.servlet.ServletContainer javax.ws.rs.core.Application { </servlet-class> <init-param> } <param-name>javax.ws.rs.Application</param-name> <param-value>com.foo.MyApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>Jersey Web Application</servlet-name> <url-pattern>/resources/*</url-pattern> </servlet-mapping> </web-app> 77
  • 78.
  • 79.
    GlassFish Distributions Distribution License Features GlassFish Open Source CDDL & • Java EE 6 Compatibility Edition 3.0.1 GPLv2 • No Clustering • Clustering planned in 3.1 • mod_jk for load balancing GlassFish Open Source CDDL & • Java EE 5 Compatibility Edition 2.1.1 GPLv2 • In memory replication • mod_loadbalancer Oracle GlassFish Server Commercial • GlassFish Open Source Edition 3.0.1 Clustering 3.0.1 • Oracle GlassFish Server Control Coming • Clustering planned in 3.1 Soon! Oracle GlassFish Server Commercial • GlassFish Open Source Edition 2.1.1 2.1.1 • Enterprise Manager • HADB 79
  • 80.
    GlassFish 3 &OSGi  No OSGi APIs are used in GlassFish  HK2 provides abstraction layer  All GlassFish modules are OSGi bundles  Felix is default, also runs on Knopflerfish & Equinox  Can run in an existing shell  200+ modules in v3 http://blogs.sun.com/arungupta/entry/totd_103_glassfish_v3_with 80
  • 81.
    Light Weight &On-demand Monitoring  Event-driven light-weight and non-intrusive monitoring  Modules provide domain specific probes (monitoring events) • EJB, Web, Connector, JPA, Jersey, Orb, Ruby  End-to-end monitoring on Solaris using DTrace  3rd party scripting clients • JavaScript to begin with 81
  • 82.
    Boost your productivity Retain session across deployment asadmin redeploy –properties keepSessions=true helloworld.war 82
  • 83.
  • 84.
    GlassFish Roadmap Detail 84 84 ©2010 Oracle Corporation
  • 85.
    GlassFish 3.1 =3.0 + 2.1.1  Main Features  Clustering and Centralized Administration  High Availability  Other ...  Application Versioning  Application-scoped Resources  SSH-based remote management and monitoring  Embedded (extensive)  Admin Console based on RESTful API http://wikis.sun.com/display/glassfish/GlassFishv3.1 85
  • 86.
    References & Queries  download.oracle.com/javaee/6/tutorial/doc  glassfish.org  blogs.sun.com/theaquarium  oracle.com/goto/glassfish  glassfish.org/roadmap  youtube.com/user/GlassFishVideos  Follow @glassfish  users@glassfish.java.net  dev@glassfish.java.net 86
  • 87.
    Jagadish.Ramu@Sun.COM Sun Microsystems Thank You ! 87