• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Understanding the nuts & bolts of Java EE 6
 

Understanding the nuts & bolts of Java EE 6

on

  • 5,809 views

 

Statistics

Views

Total Views
5,809
Views on SlideShare
5,228
Embed Views
581

Actions

Likes
5
Downloads
226
Comments
0

8 Embeds 581

http://blogs.oracle.com 213
https://blogs.oracle.com 181
http://blogs.sun.com 96
http://blog.arungupta.me 85
http://planets.sun.com 3
http://webcache.googleusercontent.com 1
http://cache.baidu.com 1
http://hghltd.yandex.net 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Understanding the nuts & bolts of Java EE 6 Understanding the nuts & bolts of Java EE 6 Presentation Transcript

    • <Insert Picture Here>Understanding the Nuts & Bolts of Java EE 6Arun Gupta, Java EE & GlassFish Guyblogs.sun.com/arungupta, @arungupta
    • The following/preceding is intended to outline ourgeneral product direction. It is intended forinformation purposes only, and may not beincorporated into any contract. It is not acommitment to deliver any material, code, orfunctionality, and should not be relied upon inmaking purchasing decisions.The development, release, and timing of anyfeatures or functionality described for Oracle’sproducts remains at the sole discretion of Oracle. 2
    • Are you tweeting ? #glassfish #jfokus 3
    • Java EE: Past & Present Flexible Ease of Development Java EE 6 Pruning Java EE 5 Extensibility Web Ease of Services Profiles Development Annotations Ease-of-dev J2EE 1.4 EJB 3.0 EJB Lite Web Services, Persistence API RESTful WS Robustness Management, New and CDI Enterprise Deployment, Updated Java J2EE 1.3 Async. Web Services Platform CMP, Connector Connector Architecture Java EE 6 J2EE 1.2 Servlet, JSP, Web Profile EJB, JMS JPE RMI/IIOPProject Managed Bean 1.0May 1998 Dec 1999 Sep 2001 Nov 2003 May 2006 Dec 2009 10 specs 13 specs 20 specs 23 specs 28 specs 4
    • Compatible Java EE 5 Implhttp://java.sun.com/javaee/overview/compatibility-javaee5.jsp 5
    • Compatible Java EE 6 ImplsToday: Web Profile OnlyAnnounced: 6
    • Light-weight• Java EE 6 Web Profile• Pruning • Pruned today, means • Optional in the next release • Deleted in the subsequent releases • Technologies marked in Javadocs • EJB 2.x Entity Beans, JAX-RPC, JAXR, JSR 88 7
    • • EJB-in-WAR• No-interface EJB• Optional “web.xml”/”faces- config.xml”• Annotation-driven • @Schedule • @Path • @Inject • ... 8
    • <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> 9
    • Java EE 6 - Done 09• Specifications approved by the JCP• Reference Implementation is GlassFish 20 Server Open Source Edition 3• TCK ec D 10
    • Java EE 6 Specifications• The Platform• Java EE 6 Web Profile 1.0• Managed Beans 1.0 11
    • 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) 12
    • 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) 13
    • 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) 14
    • Java EE 6 Specifications As is• JDBC 4.0 API• Java Naming and Directory Interface 1.2• Java Message Service 1.1• Java Transaction API 1.1• Java Transaction Service 1.0• JavaMail API Specification 1.4• JavaBeans Activation Framework 1.1• Java API for XML Processing 1.3• Java API for XML-based RPC 1.1• SOAP with Attachments API for Java 1.3• Java API for XML Registries 1.0• Java EE Management Specification 1.1 (JSR 77)• Java EE Deployment Specification 1.2 (JSR 88)• Java Management Extensions 1.2• Java Authentication and Authorization Service 1.0• Debugging Support for Other Languages (JSR 45)• Standard Tag Library for JSP 1.2 (JSR 52)• Streaming API for XML 1.0 (JSR 173) 15
    • Java EE 6 Web Profile 1.0 Servlets 3.0 JPA 2.0 EJB 3.1 JDBC StAX Interceptors JSF 2.0 JAX-RS JNDI JavaMail 1.1 Bean EJB 3.1 Lite JAXB JMS JACC Validation1.0 JSP 2.2 CDI 1.0 JAX-WS JAXP SAAJ Managed JTA 1.1 JASPIC JAX-RPC ... Beans 1.0 Contributed by RedHat New Updated 16
    • http://blog.eisele.net/2010/12/who-is-afraid-of-java-ee-6-get-rid-of.html 17
    • 18
    • 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 19
    • 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> 20
    • Demo #1Managed Beans 21
    • Managed Beans 1.0 - Sample@javax.annotation.ManagedBean @Resourcepublic class MyManagedBean { MyManagedBean bean; @PostConstruct public void setupResources() { // setup your resources } @Inject @PreDestroy MyManagedBean bean; 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 22
    • 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 23
    • Demo #2Interceptors 24
    • Interceptors – Business Method (Logging)@InterceptorBinding @LoggingInterceptorBinding@Retention(RUNTIME) public class MyManagedBean {@Target({METHOD,TYPE}) . . .public @interface }LoggingInterceptorBinding {}@Interceptor@LoggingInterceptorBindingpublic class @LogInterceptor { @AroundInvoke public Object log(InvocationContext context) { System.out.println(context.getMethod().getName()); System.out.println(context.getParameters()); return context.proceed(); }} 25
    • Why Interceptor Bindings ?• Remove dependency from the interceptor implementation class• Can vary depending upon deployment environment• Allows central ordering of interceptors 26
    • Interceptors – Business Method (Transaction)@InterceptorBinding @Transactional@Retention(RUNTIME) public class ShoppingCart { . . . }@Target({METHOD,TYPE})public @interface Transactional { public class ShoppingCart {} @Transactional public void checkOut() { . . . }@Interceptor@Transactionalpublic class TransactionInterceptor { @Resource UserTransaction tx; @AroundInvoke public Object manageTransaction(InvocationContext context) { tx.begin() context.proceed(); tx.commit(); }} http://blogs.sun.com/arungupta/entry/totd_151_transactional_interceptors_using 27
    • Servlets in Java EE 5 At least 2 files<!--Deployment descriptor /* Code in Java Class */ web.xml --><web-app> package com.sun; <servlet> public class MyServlet extends <servlet-name>MyServlet HttpServlet { </servlet-name> public void <servlet-class> doGet(HttpServletRequest com.sun.MyServlet req,HttpServletResponse res) </servlet-class> { </servlet> ... <servlet-mapping> <servlet-name>MyServlet } </servlet-name> ... <url-pattern>/myApp/* } </url-pattern> </servlet-mapping> ...</web-app> 28
    • Servlets 3.0 (JSR 315) Annotations-based @WebServletpackage 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/screencast_37_java_ee_6 29
    • Demo #3Servlets 30
    • Servlets 3.0 Annotations-based @WebServlet@WebServlet(name="mytest", urlPatterns={"/myurl"}, initParams={ @InitParam(name="n1", value="v1"), @InitParam(name="n2", value="v2") })public class TestServlet extends javax.servlet.http.HttpServlet { ....} 31
    • Servlets 3.0Annotations-based @WebListeners<listener> <listener-class> server.LoginServletListener </listener-class></listener>package server;. . .@WebListener()public class LoginServletListener implementsServletContextListener { 32
    • 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(); http://blogs.sun.com/arungupta/entry/totd_139_asynchronous_request_processing 33
    • 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 34
    • 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 35
    • Servlets 3.0 Extensibility - ServletContainerInitializer• Provided by the apps or container• Discovered using the service provider API• Expresses interest in classes via @HandlesTypes• Who uses it ? • Mojarra (JSF2) is bootstrapped into GlassFish • No “faces-config.xml” or “web.xml” • Jersey (JAX-RS) registers root Application • No (or portable) “web.xml” 36
    • Servlets 3.0Dynamic Registration – Java Server Faces @SuppressWarnings({"UnusedDeclaration"}) @HandlesTypes({ ManagedBean.class, FacesComponent.class, FacesValidator.class, FacesConverter.class, FacesBehaviorRenderer.class, ResourceDependency.class, ResourceDependencies.class, ListenerFor.class, ListenersFor.class, UIComponent.class, Validator.class, Converter.class, Renderer.class }) public class FacesInitializer implements ServletContainerInitializer { // NOTE: Loggins should not be used with this class. private static final String FACES_SERVLET_CLASS = FacesServlet.class.getName(); 37
    • Servlets 3.0Dynamic Registration – Java Server Faces public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException { if (shouldCheckMappings(classes, servletContext)) { Map<String,? extends ServletRegistration> existing =servletContext.getServletRegistrations(); for (ServletRegistration registration : existing.values()) { if (FACES_SERVLET_CLASS.equals(registration.getClassName())) { // FacesServlet has already been defined, so were // not going to add additional mappings; return; } } ServletRegistration reg = servletContext.addServlet("FacesServlet", "javax.faces.webapp.FacesServlet"); reg.addMapping("/faces/*", "*.jsf", "*.faces"); servletContext.setAttribute(RIConstants.FACES_INITIALIZER_MAPPINGS_ADDED,Boolean.TRUE); 38
    • Servlets 3.0Dynamic Registration – Create, Register, LookupServletRegistration.Dynamic dynamic = servletContext.addServlet(“DynamicServlet”, “com.mycom.MyServlet);dynamic.addMapping(“/dynamicServlet”);dynamic.setAsyncSupported(true);ServletRegistration dynamic = servletContext. getServletRegistration(“DynamicServlet”);dynamic.addMapping(“/dynamicServlet”);dynamic.setInitParameter(“param”, “value”); 39
    • 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 40
    • Servlets 3.0 Much more ...• Programmatic authentication, login, logout > HttpServletRequest.authenticate > HttpServletRequest.login > HttpServletRequest.logout• File upload support• Servlet Security <error-page> <error-code>...</error-code> > @ServletSecurity <exception-type>...</exception-type> <location>/404.html</location>• Default Error Page </error-page> > Any HTTP status code > http://blogs.sun.com/arungupta/entry/ totd_136_default_error_page 41
    • Java Persistence API 2 (JSR 317) Sophisticated mapping/modeling options• Collection of basic types@Entitypublic class Person { @Id protected String ssn; protected String name; protected Date birthDate; . . . @ElementCollection @CollectionTable(name=”ALIAS”) protected Set<String> nickNames;} 42
    • 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; . . .} 43
    • 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; ContactInfo contactInfo; . . .} 44
    • 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; . . .} 45
    • Java Persistence API 2 Expanded JPQL• Support for all new modeling/mapping features• Operators and functions in select list• INDEX, KEY/VALUE ENTRY// Inventory is Map<Movie, Integer>SELECT v.location.street, KEY(i).title, VALUE(i),FROM VideoStore v JOIN v.inventory iWHERE KEY(i).director LIKE %Hitchcock% AND VALUE(i) > 0 46
    • Java Persistence API 2Expaded JPQL – CASE ExpressionUPDATE Employee eSET e.salary = CASE e.rating WHEN 1 THEN e.salary * 1.05 WHEN 2 THEN e.salary * 1.02 ELSE e.salary * 0.95 END 47
    • 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 48
    • Demo #4Java Persistence API 49
    • Java Persistence API 2 Metamodel Example@Entitypublic 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;} 50
    • Canonical Metamodel using NetBeans http://blogs.sun.com/arungupta/entry/totd_148_jpa2_metamodel_classes 51
    • Java Persistence API 2Type-safe Criteria APIEntityManager em = …;CriteriaBuilder cb = em.getCriteriaBuilder();CriteriaQuery<ResultType> cquery = cb.createQuery(ResultType.class);Root<MyEntity> e = cquery.from(MyEntity.class);Join<MyEntity, RelatedEntity> j = e.join(…);…cquery.select(…) .where(…) .orderBy(…) .groupBy(…);TypedQuery<ResultType> tq = em.createQuery(cquery);List<ResultType> result = tq.getResultList(); 52
    • 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• Properties for find, refresh, setProperty • CacheRetrieveMode – USE, BYPASS 53
    • 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] 54
    • JPA 2.1 Candidate Features Subject http://jcp.org/en/jsr/detail?id=338 To Change● Converters/Custom types● Fetch groups/plans● Immutable attributes and read-only entities● Support for schema generation● Generated values for non-PKs● Multi-tenancy● UUID generator type● Persistence Context synchronization control● Dynamic definition of PU● Additional event listeners 55
    • Subject JPA 2.1 Candidate Features To Change● Support for stored procedures● Database and vendor function invocation● Update and Delete Criteria queries● Support for mapping between JPQL and Criteria queries● Improved support for result type mapping of native queries● Downcasting● Query by Example 56
    • EJB 3.1 (JSR 318)Package & Deploy in a WAR Java EE 5 Java EE 6 myApp.warmyApp.ear WEB-INF/classes myWeb.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 myBeans.jar com.sun.FooBean web.xml ? com.sun.FooHelper http://blogs.sun.com/arungupta/entry/screencast_37_java_ee_6 57
    • Demo #5EJB 3.1 58
    • 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 59
    • EJB 3.1 Portable Global JNDI Name Syntax• Portable• Global• Application/Module-scoped• Derived from metadata such as name, component name etc. 60
    • 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• Until now, only java:comp Annotation/name attribute Or ejb-jar.xml• Local & Remote business• No-interface• Also in java:app, java:module 61
    • EJB 3.1Embeddable API – Deploy the Beanpublic 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 62
    • 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 • Define initialization ordering using @Depends @Singleton public class MyEJB { . . . } 63
    • EJB 3.1 Asynchronous Session Beans• Light-weight JMS• Control returns to the client before the container dispatches the 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 64
    • EJB 3.1Asynchronous Session Beans – Code Sample@Stateless@Asynchronouspublic 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 65
    • 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 and 2 am (minute=”*/14”, hour=”1,2”) 66
    • EJB 3.1 Timers• Can be chained • @Schedules({ @Schedule(hour=”6”,dayOfWeek=”Tue,Thu,Fri-Sun”), @Schedule(hour=”12”,dayOfWeek=”Mon,Wed”) })• May be associated with a TimeZone• Single persistent timer across JVMs• Non-persistent timer, e.g. Cache • @Schedule(..., persistent=false) 67
    • EJB 3.1 EJB 3.1 LiteA proper subset of the full EJB 3.1 API thatincludes a small, powerful selection of EJBfeatures suitable for writing portabletransactional business logic...suitable for inclusion in a wider rangeof Java products, many of which have muchsmaller installation and runtime footprintsthan a typical full Java EE implementation 68
    • EJB 3.1EJB 3.1 Lite – Feature Comparison 69
    • Contexts & Dependency Injection - CDI (JSR 299)• Type-safe Dependency Injection • No String-based identifiers• Strong typing, Loose coupling • Events, Interceptors, Decorators• Context & Scope management – extensible• Portable Extensions• Bridge EJB and JSF in the platform• Works with Java EE modular and component architecture • Integration with Unified Expression Language (UEL) 70
    • CDI Injection Points• Field, Method, Constructor• 0 or more qualifiers Which one ?• Type (Qualifier) @Inject @LoggedIn User userRequest What ?Injection (Type) 71
    • Basic – Sample Codepublic interface Greeting { public String sayHello(String name);}public class HelloGreeting implements Greeting { public String sayHello(String name) { return “Hello “ + name; }}@Statelesspublic class GreetingService { @Inject Greeting greeting; No String public String sayHello(String name) { return greeting.sayHello(name); identifiers, } All Java} 72
    • CDI – Sample Client Code Field and Method Injectionpublic class CheckoutHandler { @Inject @LoggedIn User user; @Inject PaymentProcessor processor; @Inject void setShoppingCart(@Default Cart cart) { … }} 73
    • CDI – Sample Client Code Constructor Injectionpublic class CheckoutHandler { @Inject CheckoutHandler(@LoggedIn User user, PaymentProcessor processor, @Default Cart cart) { ... }}• Only one constructor can have @Inject 74
    • CDI - Sample Client CodeMultiple Qualifiers and Qualifiers with Argumentspublic class CheckoutHandler { @Inject CheckoutHandler(@LoggedIn User user, @Reliable @PayBy(CREDIT_CARD) PaymentProcessor processor, @Default Cart cart) { ... }} 75
    • CDI - How to configure ? There is none!• Discovers bean in all modules in which CDI is enabled• “beans.xml” • WEB-INF of WAR • META-INF of JAR • META-INF of directory in the classpath• Can enable groups of bean selectively via a descriptor 76
    • Demo #6CDI Qualifiers 77
    • CDI - Scopes• Beans can be declared in a scope • Everywhere: @ApplicationScoped, @RequestScoped • Web app: @SessionScoped • JSF app: @ConversationScoped • 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 78
    • 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}”/> 79
    • Events – More decoupling• Annotation-based event model • Based upon “Observer” pattern• A “producer” bean fires an event• An “observer” bean watches an event• Events can have qualifiers• Transactional event observers • IN_PROGRESS, AFTER_SUCCESS, AFTER_FAILURE, AFTER_COMPLETION, BEFORE_COMPLETION 80
    • Events – Sample Code@Inject @Any Event<PrintEvent> myEvent;void print() { . . . myEvent.fire(new PrintEvent(5));}void onPrint(@Observes PrintEvent event){…}public class PrintEvent { public PrintEvent(int pages) { this.pages = pages; } . . .}void addProduct(@Observes(during = AFTER_SUCCESS) @CreatedProduct product) 81
    • CDI Much more ...• Producer methods and fields• Bridging Java EE resources• Alternatives• Interceptors• Decorators• Stereotypes 82
    • Java Server Faces 2.0 (JSR 314)• 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> </html> 83
    • Demo #7JSF 2.0 84
    • JSF 2 Composite Components 85
    • 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.xhtmlhttp://blogs.sun.com/arungupta/entry/totd_147_java_server_faces 86
    • Java Server Faces 2.0 Integrated Ajax Support• f:ajax <h:commandButton actionListener="#{sakilabean.findActors}" value="submit"> <f:ajax execute="length" render="actorTable totalActors"/> </h:commandButton> http://blogs.sun.com/arungupta/entry/totd_123_f_ajax_bean 87
    • Java Server Faces 2.0• “faces-config.xml” optional in common cases • <managed-bean> → @ManagedBean or @Named • Validator, Renderer, Listener, ... • Default navigation rules – match a view on the disk @Named(“simplebean”) public class SimpleBean { . . . } <h:commandButton action="show" value="submit"/> 88
    • Java Server Faces 2.0 Much more ... <navigation-case> <from-outcome>success</from-outcome>• Runs on Servlet 2.5+ <to-view-id>/page2.xhtml</to-view-id> <!-- Only accept if the following condition• Conditional navigation is true --> <if>#{foo.someCondition}</if> </navigation-case>• Project Stages • Development, UnitTest, SystemTest, Production• Custom Scopes for Managed Beans• Bookmarkable URLs • h:link, h:button <h:link outcome="viewEntry" value="Link"> <f:param name="entry" value="#{aBean.entry}"/> </h:link> <a href="http://localhost:8080/myapp/viewEntry.xhtml? entry=entry1">Link</a> 89
    • 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; 90
    • 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|update| remove] 91
    • 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> 92
    • Demo #8Bean Validation 93
    • JAX-RS 1.1• Java API for building RESTful Web Services• POJO based• Annotation-driven• Server-side API• HTTP-centric 94
    • JAX-RS 1.1Code 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!”; }} 95
    • JAX-RS 1.1Code 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() { . . . } 96
    • Demo #9JAX-RS 97
    • JAX-RS 1.1Code Sample – Specifying Input MIME type@POST@Consumes("text/plain")public String saveMessage() { . . .} 98
    • JAX-RS 1.1Code Sampleimport javax.inject.Inject;import javax.enterprise.context.RequestScoped;@RequestScopedpublic class ActorResource { @Inject DatbaseBean db; public Actor getActor(int id) { return db.findActorById(id); }} 99
    • JAX-RS 1.1Code Sampleimport 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}")@RequestScopedpublic 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 100
    • 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> 101
    • JAX-RS 1.1 Jersey Client-side API• Consume HTTP-based RESTful Services• Easy-to-use • Better than HttpURLConnection!• Reuses JAX-RS API • Resources and URI are first-class citizens• Not part of JAX-RS yet • com.sun.jersey.api.client 102
    • JAX-RS 1.1 Jersey Client API – Code SampleClient client = Client.create();WebResource resource = client.resource(“...”);//curl http://example.com/baseString s = resource.get(String.class);//curl -HAccept:text/plain http://example.com/baseString s = resource. accept(“text/plain”). get(String.class);http://blogs.sun.com/enterprisetechtips/entry/consuming_restful_web_services_with 103
    • JAX-RS 1.1Jersey Client API – NetBeans Code Generation 104
    • JAX-RS 1.1 WADL Representation of Resources• Machine processable description of HTTP-based Applications• Generated OOTB for the application<application xmlns="http://research.sun.com/wadl/2006/10"> <doc xmlns:jersey="http://jersey.dev.java.net/" jersey:generatedBy="Jersey: 1.1.4.1 11/24/2009 01:37 AM"/> <resources base="http://localhost:8080/HelloWADL/resources/"> <resource path="generic"> <method id="getText" name="GET"> <response> <representation mediaType="text/plain"/> </response> </method> <method id="putText" name="PUT"> <request> <representation mediaType="text/plain"/> </request> </method> </resource> </resources></application> 105
    • JAX-RS 1.1 Much more ...• Jersey is the Reference Implementation, included in GlassFish • RESTEasy, Restlet, CXF, Wink• Hypermedia support (only in Jersey)• Integration with Spring, Guice, Atom, …• WADL representation • Complete, Per resource• Jersey 1.2 modules are OSGi compliant 106
    • JAX-RS 2.0 Subject To http://markmail.org/thread/wgm3hj3rrva3j6jo Change● Client API ● Low level using Builder pattern, Higher-level● Hypermedia● MVC Pattern ● Resource controllers, Pluggable viewing technology● Bean Validation ● Form or Query parameter validation● Closer integration with @Inject, etc.● Server-side asynchronous request processing● Server-side content negotiation 107
    • http://blogs.sun.com/arungupta/entry/java_ee_6_twitter_demo 108
    • Demo #10Twitter App 109
    • 110
    • IDE Support for Java EE 6 111
    • 112
    • http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getlppage?page_id=212&path=SADJ 113
    • From the real users ... Jigsaw puzzle, Modular,Developers can concentrate standard, less xml, easy,on business logic, Java EE 6 is easy, have I said easy?providing a standard forthe infrastructure. Standards compliance, vendor independence, milliseconds and kilobyte deploymentHigher integrated specs,simple and annotation driven,single-classloader WARs,next level of industry Faster development, lessstandard frameworks/complexity, more great code shipped http://blogs.sun.com/arungupta/tags/community+feedback 114
    • Avoid “framework explosion” In selecting an application server our main goal was to avoid the framework explosion that happens when you use a "custom" Enterprise stack like Tomcat + Spring + Hibernate + Myfaces +... Java EE 6 had 80% of what we needed out of the box: strong persistence support ( JPA ), inversion of control ( CDI ), and a lightweight component model ( EJB 3.1 )http://blogs.sun.com/stories/entry/egesa_engineering_avoids_framework_explosion 115
    • What is GlassFish ?• A community • Users, Partners, Testers, Developers, ... • Started in 2005 on java.net• Application Server • Open Source (CDDL & GPL v2) • Java EE Reference Implementation 116
    • GlassFish Server Chronology2006 2007 2008 2009 2010 …GlassFish v1Java EE 5, Single Instance GlassFish v2 Java EE 5, High Availability GlassFish Server 3 Java EE 6, Single Instance GlassFish Server 3.1 Java EE 6, High Availability 117
    • GlassFish Server DistributionsDistribution License Features • Java EE 6 compatibilityGlassFish Server Open CDDL & • Web Profile supportSource Edition 3.1 GPLv2 • In-memory replication / clusteringWeb Profile • Centralized Administration • Java EE 6 compatibilityGlassFish Open Source CDDL & • Full Java EE distributionEdition 3.1 GPLv2 • In-memory replication / clustering • Centralized Administration • AddsOracle GlassFish Server 3.1 Commercial • Oracle GlassFish Server ControlWeb Profile • Patches, support, knowledge base • AddsOracle GlassFish Server 3.1 Commercial • Oracle GlassFish Server Control • Patches, support, knowledge base
    • GlassFish 3.1 >= 3.0 + 2.1.1• Main Features • Clustering and Centralized Administration • High Availability• Other ... • OSGi/EE RFCs • Application Versioning • Application-scoped Resources • SSH-based remote management and monitoring • Embedded (extensive) • Admin Console based on RESTful APIhttp://blogs.sun.com/arungupta/entry/glassfish_3_1_glassfish_2 119
    • 120
    • Boost your productivity Retain session across deploymentasadmin redeploy –properties keepSessions=true helloworld.war 121
    • Boost your productivityDeploy-on-Save 122
    • Fusion Middleware Integration Strategy• Commercial version will have integrations with Fusion Middleware • Certification on JRockit • Integration with Coherence and TopLink• Fusion Middleware and Fusion Applications currently not planned to be certified on GlassFish• Initial integrations will be interoperability • Web services, Web services policy, Identity Management (OAM) 123
    • What does Java EE offer to Cloud ?● Containers● Injectable services● Scale to large clusters● Security model● ... 124
    • What can Java EE do for Clouds ?● Tighter requirements for resource/state● Better isolation between applications● Support for multi-tenant applications● Potential standard APIs for NRDBMS, Caching, WebSockets, JSON, HTML5● Common management and monitoring interfaces● Better packaging ● Apps/Data are (multiple) versioned, Upgrades, Expose/Connect to services, QoS attributes, ...● Evolution, not revolution! 125
    • References• glassfish.org• blogs.sun.com/theaquarium• oracle.com/goto/glassfish• youtube.com/user/GlassFishVideos• Follow @glassfish 126
    • <Insert Picture Here>Understanding the Nuts & Bolts of Java EE 6Arun Gupta, Java EE & GlassFish Guyblogs.sun.com/arungupta, @arungupta