Java EE 6 = Less Code + More Power (Tutorial) [5th IndicThreads Conference On Java, 2010, Pune,...

download Java EE 6 = Less Code + More Power (Tutorial)  [5th IndicThreads Conference On Java, 2010, Pune, India]

If you can't read please download the document

Transcript of Java EE 6 = Less Code + More Power (Tutorial) [5th IndicThreads Conference On Java, 2010, Pune,...

Slide 1

Java EE 6 - Deep Dive

Jagadish Ramu

Sun Microsystems

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 Oracles products remains at the sole discretion of Oracle.

Compatible Java EE 6 Impls

Today:

Announced:

P2A: Can you talk about the ecosystem of compatible implementations? What has been the feedback of various vendors as they have gone through the EE 6 spec lifecycle?

J2EE 1.4 Implementations (17)ApacheBEACAS OnceHitachiIBMJBossKingdeeNECObjectWebOraclePramatiSAPSunSybaseTmaxSoftTongTechTrifork

Goals for the Java EE 6 Platform

Flexible & Light-weightWeb 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

Talk about the introduction of profiles.Eg: Web ProfileEg: Telco Profile with SIP Servlet Specification + few specifications from Java EEShare common features : naming, resource injection, packaging rules, security requirements.

Pruning : Process of making a specification/tech. Optional.Mark as Proposed for Optional in Nth release, Later decide to mark it as Optional in N+1th release or further.

Extensible : Ability to plugin other frameworks eg: web-fragments.xml

Ease of use : annotations, packaging becoming easier (ejbs in war)

Java EE 6 Web Profile 1.0

Fully functional mid-sized profile

Actively discussed in the Java EE 6 Expert Group and outside it

TechnologiesServlets 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

Java EE 6 - Done

Specifications approved by the JCP

Reference Implementation is GlassFish v3

TCK

Dec 2009

Recently (during Java EE 6 timeframe), JCP requires the specification, reference-implementation and TCK need to be submitted together.

Java EE 6 Specifications

The Platform

Java EE 6 Web Profile 1.0

Managed Beans 1.0

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)

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)

*Interceptors has been elevated such that its not just for EJB interception, but for any ManagedBean Interception ?

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)

Servlets in Java EE 5
At least 2 files



MyServlet com.sun.MyServlet MyServlet /myApp/* ...

/* Code in Java Class */

package com.sun;public class MyServlet extends HttpServlet {public void doGet(HttpServletRequest req,HttpServletResponse res) {

...

}

...

}

Standard Java EE 5 way of defining a Servlet with its DD.Refer servlet-name, servlet-mapping

Servlets 3.0 (JSR 315)
Annotations-based @WebServlet

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

package com.sun;@WebServlet(name=MyServlet, urlPatterns={/myApp/*})public class MyServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse res) {... }



MyServlet com.sun.MyServlet MyServlet /myApp/* ...

Equivalent of web.xml is available in Dds.@WebServlet, url pattern, explain how the mapping is done automatically.

Classes in WEB-INF/classes or WEB-INF/lib are scanned for all web related annotations

The class must extend HttpServlet

Different instances, per servlet-name in DD (if any)

servlet-name if unspecified becomes fully classified class-name

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 { .... }

*WebInitParam : equivalent of init-param in DD so as to have default values for parameters.

Servlets 3.0
Annotations-based @WebListeners


server.LoginServletListener

package server;

. . .

@WebListener()public class LoginServletListener implements ServletContextListener {

* Web Listener to listen to session, servletContext, request related eventsWhich may be lifecycle related changes or attribute related changes.AsyncListener, Session Migration, Object Binding AsyncListeners can be registered only programmatically

Servlets 3.0
Annotations-based @WebFilter

PaymentFilter server.PaymentFilter param1 value1

PaymentFilter /*

PaymentFilter PaymentServlet REQUEST

package server;. . .@WebFilter(
filterName="PaymentFilter", InitParams={
@WebInitParam(
name="param1",
value="value1")
}
urlPatterns={"/*"},
servletNames={"PaymentServlet"},
dispatcherTypes={DispatcherType.REQUEST}
)public class PaymentFilter implements Filter {. . .

WebFilters to transform (adapt) HTTPRequest, Response to, from a Web Resource. (eg: Servlet).Equivalent annotations are introduced.

Sample filtering : auditing, logging, encyrption, decryption, compression etc.,

RequestDispatcher : to forward processing a request to another servlet / include output from one servlet etc.,

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

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

Servlets 3.0
Extensibility

Plugin libraries using web fragmentsModular 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

Web Fragmentsweb-fragments.xml in META-INF directoryStarts with Order of elements differ from that of web.xml schemaWeb-fragments bundled with the framework library (automatically detected).This way frameworks are made available in a self contained manner and no special plumbing in web.xml per framework is required.Jars in WEB-INF/lib will be detectedPossible to have a web-fragment.xml to define the order ( element) in which web-fragments will be initialized.[It is also possible to have the ordering defined in web.xml using element]



wicket.helloworld
org.apache.wicket.protocol.http.WicketFilter

applicationClassName
...


wicket.helloworld
/*

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

Servlets 3.0
Extensibility

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

EJB 3.1 (JSR 318)
Package & Deploy in a WAR

foo.ear

foo_web.war

WEB-INF/web.xml
WEB-INF/classes
com.sun.FooServlet
com.sun.TickTockfoo_ejb.jar

com.sun.FooBean
com.sun.FooHelperfoo.war
WEB-INF/classes
com.sun.FooServlet
com.sun.TickTock
com.sun.FooBean
com.sun.FooHelperweb.xml ?

Java EE 5

Java EE 6

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

In Java EE 5, In order for a web module to use EJB, there need to be ejb-jarEar : war + ejb-jar

Java EE 6 : Ejbs can be part of .warNo web.xml (as explained before).

EJBs part of WEB-INF/classes

EJB 3.1

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

* Simple POJO annotated with @Stateless makes it an EJB* This is of type no interface view EJB* Components can directly inject the bean, but only a reference is provided and not actual object

EJB 3.1

No interface view one source file per beanOnly for Local and within WAR

Required for Remote

No location transparency

Component initialization in @PostConstructNo assumptions on no-arg ctor

One source per bean makes it easier for development.No interface definedThis mode is supported only for Local Beans and within the WARNo support of location transparency (EJBs can be anywhere, outside the WAR etc.,)

@PostConstruct : Component initialization logic must be in @PostConstruct as the constructor might be called multiple times by the container (eg: for each injection).

Java EE 6 Namespaces

Globaljava:global/..(for all applications)

Application scopedjava: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

Java EE 6 Namespaces

Module Scopedjava:module/.. (visible only for the module)

App-1 has module-1 and module-2Module-1's namespace not accessible by module-2

All components of the module has visibility

Component

EJB 3.1
Portable Global JNDI Name Syntax

Portable

Global

Application/Module-scoped

Derived from metadata such as name, component name etc.

Global jndi name of the ejb defined in vendor specific way (eg: sun-ejb-jar.xml) and thenReferred by clients like application clients.

Instead, exposed globally with a portable naming convention and hence will work in all vendor implementations.

EJB 3.1
Portable Global JNDI Name Syntax

java:global[/]//[!]

Only within EAR
Base name of EAR
(or application.xml)

Base name of ejb-jar/WAR
(or ejb-jar.xml/web.xml)

Unqualified name of the bean class
Annotation/name attribute
Or ejb-jar.xml Until now, only java:comp

Local & Remote business

No-interface

Also in java:app, java:module

App-name is valid only if its an ear

EJB 3.1
Portable Global JNDI Name Syntax

package com.acme;@Statelesspublic class FooBean implements Foo { ... }FooBean is packaged in fooejb.jar

java:global/fooejb/FooBeanjava:global/fooejb/FooBean!com.acme.Foojava:app/fooejb/FooBeanjava:app/fooejb/FooBean!com.acme.Foojava:module/FooBeanjava:module/FooBean!com.acme.Foo

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(); }

EJB 3.1
Embeddable API Deploy the Bean

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

Screencast
JSP, Servlets, EJB

EJB 3.1
Singleton Beans

One instance per app/VM, not pooledUseful 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 {
. . .
}

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

Transaction context does not propagateREQUIRED REQUIRED_NEW

Security principal propagates

EJB 3.1
Asynchronous Session Beans Code Sample

@Stateless
@Asynchronous
public class SimpleAsyncEJB {
public Future 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

@AsynchronousFuture new AsyncResult(T), a wrapper which will provide the appropriate type of FutureAsyncResult is defined in javax.ejb package

EJB 3.1
Timers

Automatically created EJB Timers

Calendar-based Timers cron like semantics

Every 14th minute within the hour, for the hours 1 & 2 am
(minute=*/14, hour=1,2)

Every 10 seconds starting at 30
(second=30/10)

Every 5 minutes of every hour
(minute=*/5, hour=*)

2pm on Last Thur of Nov of every year
(hour=14, dayOfMonth=Last Thu, month=Nov)

Every Mon & Wed midnight @Schedule(dayOfWeek=Mon,Wed)

Timer : Helps running cron jobs like generating reports, sending emails etc.,

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)

Attribute for timezone

EJB 3.1
EJB 3.1 Lite Feature Comparison

Managed Beans 1.0

EJBCDIJPAJAX-WSJAX-RSJSF...@Stateful
@Stateless@Singleton@Named@Entity@Web
Service@Path@Managed
[email protected]

Java EE 6 introduces guidelines for various kinds of Beans in the system.ManagedBeans defines those basic characteristics which can be inherited by other specifications and build more features on top of it.Eg: EJB and CDI beans will be based on ManagedBeans.

ManagedBeans will have : life-cycle callbacks, interceptor, Resource Injection capability.

Managed Beans 1.0

POJO as managed component for the Java EE containerJavaBeans component model for Java EE

Simple and Universally useful

Advanced concepts in companion specs

Basic ServicesResource Injection, Lifecycle Callbacks, Interceptors

Available as@Resource / @Inject

java:app//

java:module/

* Beans are exported in JNDI namespace.App-scoped and module scoped variants are available.


public class MyManagedBean {

public void setupResources() {
// setup your resources
}


public void cleanupResources() {
// collect them back here
}

public String sayHello(String name) {
return "Hello " + name; }}

Managed Beans 1.0 - Sample

@Resource
MyManagedBean bean;

@javax.annotation.ManagedBean

@PostConstruct




@PreDestroy

@Inject
MyManagedBean bean;

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

Collection of basic types

@Entitypublic class Person {
@Id protected String ssn;
protected String name;
protected Date birthDate;
. . .
@ElementCollection
@CollectionTable(name=ALIAS)
protected Set nickNames;}

Java Persistence API 2 (JSR 317)
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 vacationHomes;
. . .
}

Java Persistence API 2
Sophisticated mapping/modeling options

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;
. . .
}

Java Persistence API 2
Sophisticated mapping/modeling options

Improved Map support

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

@Entity public class Movie {
@Id String title;
@String director;
. . .
}

Java Persistence API 2
Metamodel

Abstract schema-level model over managed classes of a Persistence ContextEntities, Mapped classes, Embeddables, ...

Accessed dynamicallyEntityManager or EntityManagerFactory.getMetamodel()

And/or statically materialized as metamodel classesUse annotation processor with javac

import javax.persistence.metamodel.*;

@StaticMetamodel(Customer.class)
public class Customer_ {
public static SingularAttribute custId; public static SingularAttribute name; public static SingularAttribute address; public static SingularAttribute rep;
public static SetAttribute orders;}Java Persistence API 2
Metamodel Example

@Entity
public class Customer {
@Id Integer custId;
String name;
...
Address address;
@ManyToOne SalesRep rep;
@OneToMany Set orders;
}

Java Persistence API 2
Caching

1st-level Cache by PersistenceContextOnly one object instance for any database row

2nd-level by shared-cache-modeALL, NONE

UNSPECIFIED Provider specific defaults

ENABE_SELECTIVE - Only entities with Cacheable(true)

DISABLE_SELECTIVE - All but with Cacheable(false)

Optional feature for PersistenceProvider

Java Persistence API 2
Much more ...

New locking modesPESSIMISTIC_READ grab shared lock

PESSIMISTIC_WRITE grab exclusive lock

PESSIMISTIC_FORCE_INCREMENT update version

em.find(.class, id, LockModeType.XXX)

em.lock(, LockModeType.XXX)

Standard configuration optionsjavax.persistence.jdbc.[driver | url | user | password]

Screencast - JPA

@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 element

Can be defined in Servlet, EJB, Managed Beans, Application Client and their DDs.

Can be defined in 'global', 'app', 'module', 'comp' scopes

Default Interceptors :Invoked first.Invoked in the order in which they are specified

Interceptors on class first followed by Interceptors on methodSuperclass interceptors first.

Interceptors 1.1

Interpose on invocations and lifecycle events on a target class

DefinedUsing annotations or DD

Default Interceptors (only in DD)

Class & Method InterceptorsIn the same transaction & security context

Cross-cutting concerns: logging, auditing, profiling

Default Interceptors :Invoked first.Invoked in the order in which they are specified

Interceptors on class first followed by Interceptors on methodSuperclass interceptors first.

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;
}
. . .
}

Interceptors 1.1 Sample Code

@Interceptors(MyInterceptor.class)
public class MyManagedBean {
. . .
}

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

@Inject
MyManagedBean bean;

Interceptors 1.1 Sample Code

@MyInterceptorBinding
public class MyManagedBean {
. . .
}

public class MyManagedBean {
@Interceptors(MyInterceptor.class)
public String sayHello(String name) {
. . .
}
}

Single instance of Interceptor per target class instanceIn order to decouple interceptor from the bean, bean can be annotated with @MyInterceptorBinding (ie., the binding annotation itself).All @Interceptors having @MyInterceptorBinding will be called

It is possible to have Method level interceptors. There will only one instance of interceptor per target class instance.

Interceptors 1.1 Sample Code

@Named
@Interceptors(MyInterceptor.class)
public class MyManagedBean {
. . .


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

Exclude default interceptors defined in the descriptorExclude class level interceptors (eg: MyInterceptor in this case)

So, the resulting interceptor will be only AnotherInterceptor for this method someMethod

Java Server Faces 2.0

Facelets as templating language for the page

Custom components much easier to develop

Enter Name & Password Enter Name & Password

JSF 2 Composite Components

JSF 2 Composite Components

Enter Name & Password Enter Name & Password

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

. . .
WEB-INF
index.xhtml
resources/
ezcomp/
username-password.xhtml

Screencast - JSF

Contexts & Dependency Injection CDI (JSR 299)

Type-safe Dependency InjectionNo String-based identifiers

Selected at development/deployment time

Strong typing, Loose coupling

Context & Scope management - extensible

Works with Java EE modular and component architectureIntegration with Unified Expression Language (UEL)

Strong typing, loose coupling - A bean specifies only the type and semantics of other beans it depends upon, and that too using typing information available in the the Java object model, and no String-based identifiers. It need not be aware of the actual lifecycle, concrete implementation, threading model or other clients of any bean it interacts with. Even better, the concrete implementation, lifecycle and threading model of a bean may vary according to the deployment scenario, without affecting any client. This loose-coupling makes your code easier to maintain. Events, interceptors and decorators enhance the loose-coupling inherent in this model: event notifications decouple event producers from event consumers, interceptors decouple technical concerns from business logic, and decorators allow business concerns to be compartmentalized.

CDI
Injection Points

Field, Method, Constructor

0 or more qualifiers

Type

@Inject @LoggedIn User user

RequestInjectionWhat ?(Type)Which one ?(Qualifier)@Inject @LoggedIn User user

Inject to Field, Method, ConstructorQualifier : Determines which bean to be injected whenever multiple beans match the request.Inject the currently logged in user.Qualifier : @LoggedInType : User@Inject : requests injection

CDI Sample Client Code
Field and Method Injection

public class CheckoutHandler {

@Inject @LoggedIn User user;

@Inject PaymentProcessor processor;

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

}

* Only One qualifier, @Default as good as not specifying it.

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

To be able to invoke non-default constructor. Use @Inject on the constructor.Can also request injection of its parameters.Only one constructor can have @Inject

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) { ... }

}

Constructor CheckoutHandler requests a loggedin User and a Secure (reliable) credit-card based payment processor

Among multiple PaymentProcessors, get Credit card based payment processor.Among multiple credit card based payment processor, get secure ones. What if multiple secure credit card based payment processors are available in the application ?Deployment will fail. Or Use Alternative in beans.xml

CDI - Scopes

Beans can be declared in a scopeEverywhere: @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

Scope is declared on a bean.AppScoped, SessionScoped, ConversationScoped, Dependent

AppScoped : throughout the application, bean will be active, shared.SessionScoped : throughout the session, bean will be active, sharedConversationScoped : Bean will inject a Conversation and doconversation.begin() and conversation.end()

Dependent : Scope is based on the caller's scope.Eg: Method parameter : methodInstance : till the life of the instance.

More scopes via @Scope

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:

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 myEvent;

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

Events can have qualifiers too

void logPrintJobs(@Observes @LargeFile PrintEvent event){}

@Any : all events of type PrintEvent

CDI
Much more ...

Producer methods and fields

Alternatives

Interceptors

Decorators

Stereotypes

. . .

* Producerprivate Random random = new Random(System.currentTimeMillis());@Produces @Named @Random int getRandomNumber() {return random.nextInt(100);}@Inject @Random int randomNumber;

* Alternatives : To choose a particular bean when multiple beans will match the requested (even qualified) injection.

Interceptors : cross cutting concerns : orthogonal to business concernsDecorators : Helps separate business related concerns : do extra things.Eg: monitor highValueTransactions alone in all accounts.

Stereotypes : helps to compartmentalize beans.Helps to apply Scope and Interceptor Bindings.

Screencast - CDI

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;

After pre-persist, pre-update, pre-remove are called, validation of JPA entity will be done.

Can be defined on Fields, MethodsCan define multiple constraints on Injection Points

Can extend it to validate combination of multiple attributes

Extensible : eg: @Email to make sure that @ is present etc.,

Bean Validation
Integration with JPA

Managed classes may be configuredEntities, 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 targetedjavax.persistence.validation.group.pre-[persist|update|remove]

Bean Validation
Integration with JSF

Individual validators not required

Integration with ELf:validateBean, f:validateRequired








* validateBean has validateGroups indicating the validation groups that need to be included while validating the bean that it is enclosing.* When the tag is unspecified, default validations will take place

For more advanced use cases, like disabling constraint validation for one or several fields or using a specific group or set of groups instead of the default one, you can use the tag

JAX-RS 1.1

Java API for building RESTful Web Services

POJO based

Annotation-driven

Server-side API

HTTP-centric

JAX-RS 1.1
Code Sample - Simple

public class HelloWorldResource {

public String sayHello() { return "Hello World"; }


public String morning() {
return Good Morning!;
}}

@Path("helloworld")

@Context UriInfo ui;

@GET @Produces("text/plain")

@GET
@Path("morning")

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() { . . .}

JAX-RS 1.1
Code Sample Specifying Input MIME type

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

JAX-RS 1.1
Code Sample

import javax.inject.Inject;import javax.enterprise.context.RequestScoped;

@RequestScopedpublic class ActorResource { @Inject DatbaseBean db;

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

JAX-RS 1.1
Code Sample





import javax.inject.Inject;import javax.enterprise.context.RequestScoped;

@RequestScopedpublic class ActorResource { @Inject DatbaseBean db;

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

import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.PathParam;

@Path("/actor/{id}")


@GET @Produces("application/json") @PathParam("id")

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

JAX-RS 1.1
Integration with Java EE 6 Servlets 3.0

No or Portable web.xml

Jersey Web Application com.sun.jersey.spi.container.servlet.ServletContainer javax.ws.rs.Application com.foo.MyApplication Jersey Web Application /resources/*

public class MyApplication
extends
javax.ws.rs.core.Application {}

@ApplicationPath(resources)

Screencast - JAX-RS

GlassFish Distributions

Distribution

License

Features

GlassFish Open Source Edition 3.0.1

CDDL & GPLv2

Java EE 6 Compatibility

No Clustering

Clustering planned in 3.1

mod_jk for load balancing

GlassFish Open Source Edition 2.1.1

CDDL & GPLv2

Java EE 5 Compatibility

In memory replication

mod_loadbalancer

Oracle GlassFish Server 3.0.1

Commercial

GlassFish Open Source Edition 3.0.1

Oracle GlassFish Server Control

Clustering planned in 3.1

Oracle GlassFish Server 2.1.1

Commercial

GlassFish Open Source Edition 2.1.1

Enterprise Manager

HADB

Clustering Coming Soon!

GlassFish 3 & OSGi

No OSGi APIs are used in GlassFishHK2 provides abstraction layer

All GlassFish modules are OSGi bundles

Felix is default, also runs on Knopflerfish & EquinoxCan run in an existing shell

200+ modules in v3

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

OSGi : Module system and service platform for JavaHelps to define modules, add, remove, update modules to the runtime dynamically, ability to execute multiple versions of same module simultaneously.Modules expose services which can be consumed by other modules dynamically.Security : to allow access to specific packages/ classes alone.

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

Boost your productivity
Retain session across deployment

asadmin redeploy properties keepSessions=true helloworld.war

Boost your productivity
Deploy-on-Save

GlassFish Roadmap Detail

2010 Oracle Corporation

GlassFish 3.1 = 3.0 + 2.1.1

Main FeaturesClustering 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

References & Queries

glassfish.org

blogs.sun.com/theaquarium

oracle.com/goto/glassfish

glassfish.org/roadmap

youtube.com/user/GlassFishVideos

Follow @glassfish

[email protected]

[email protected]

Thank You !

[email protected]

Sun Microsystems

#

12/09/10

#

12/09/10