Download Guida galattica per JEE6

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Guida galattica per JEE6
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Profiles
Java EE 6
Ease of
Development
Web Services
Robust
Scalable
Enterprise
Application
Java EE 5
Pruning
Embeddable
Container
JAX-RS
Bean Validation
J2EE 1.4
J2EE 1.3
J2EE 1.2
Project JPE
Maggio 1998
Servlet
JSP
EJB
JMS
RMI/IIOP
EJB CMP
JCA
Web Services
Management
Deployment
Servlet
Annotation
Injection
JPA
WS-*
JSF
Web Profile
Dicembre 1999
Settembre 2001
Novembre 2003
Maggio 2006
EoF 2009
10 spec.
13 spec.
20 spec.
23 spec.
28 spec.
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Extensibility
This mechanism provides a way to include additional technologies and
frameworks that are not part of the standard platform.
Profiles
For building small- to medium-sized enterprise applications, the entire stack
of Java EE APIs may be overkill. Like in Java ME, where profiles are
applied to specific device .
Pruning
Technologies that are outdated and have been replaced by new.
Technologies that are not well supported.
Technologies that are not widely deployed.
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Web Profile
JSR
Version
Java Platform Enterprise Edition
316
6
Managed Beans
316
1.0
Java API RESTful Web Services
311
1.1
Servlet
315
3.0
x
Java Server Faces
314
2.0
x
Java Context & Dependency Injection
299
1.0
x
Bean Validation
303
1.0
x
Enteprise Java Bean
318
3.1
3.1lite
Java Persistence API
317
2.0
2.0
Java EE Connector Architecture
322
1.6
Java API for XML-Based Web Services
224
2.2
x
And many more........
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Dependency injection
●
What's Dependency injection?
●
Mechanism to resolve Class dependencies
●
Aims at a major flexibility through loose coupling to
the dependence types
●
Already in place in Java environment through the JSR
330 specification (with annotations @Inject,
@Qualifier,@Named and @ScopeType)
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Context and dependency injection
In the following examples you see a Pojo that retrieves
dependencies (a list of username/passwords) the “usual”
way (by depenedency look up) being injected to a
window to handle login logic
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
An example a pojo
@Singleton
public class FileLogin implements Login
{
private static Properties properties = null;
static
{
properties = new Properties();
try
{
properties.load(FileLogin.class.getResourceAsStream("/login.properties"));
}
catch (IOException e)
{
e.printStackTrace();
}
}
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
A client using the pojo
public class LoginPanel extends JPanel
{
private static final long serialVersionUID = 1234567890L;
@Inject @FileLoginBinding Login loginManager;
private JLabel myUserName;
private JLabel myPassword;
private JTextField myUserName;
private JPasswordField myPassword;
private JButton btnLogin;
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Client code exam
By means of the JSR-330 annotations we define Injection
point lists by using the keyword @Inject that let specify
constructor, fields, or method inside a class. The injected
instance is always a type and its definition is always
checked by the compiler
• Not string-based (as in an xml file)!
• Extensible!
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Multiple qualifiers and qualifiers with arguments
●
I want to make sure that the appropriate Bean is
being injected
●
Define a qualifier
FileLoginBinding
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target(
{
ElementType.FIELD,
ElementType.METHOD, ElementType.TYPE,
ElementType.PARAMETER })
public @interface FileLoginBinding
{
}
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
How Qualifier works
●
The specific type of the qualifier enforeces the
correct injection
LoginWindow
@Inject @FileLoginBinding Login
loginManager;
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Qualifiers are meta-annotations
Define your own annotation types and annotate them with @Qualifier
• E.g.
@Qualifier
@Retention(RUNTIME)
@Target({FIELD,TYPE})
public @interface FileLoginBinding { }
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
So far the annotation mechanism
●
Where CDI fits in the whole mechanism
CDI defines an annotation to identify a
“bean” whose lifecycle is managed by the
container.You can consider this as an
implicit dependency of the container
•EJB beans are already managed
•POJO are now with @ManagedBean
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
ManagedBean
@Reliable
@SecuredBy(LDAP_MODULE)
@ManagedBean
public class ReliableLogin
implements LoginProcessor {
@Override
public boolean login(String username,char[] password)
throws LoginException {
...
}
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
A stateless bean is already managed
@Reliable
@SecuredBy(LDAP_MODULE)
@Stateless
public class ReliableLogin
implements LoginProcessor {
@Override
public boolean login(String username,char[] password)
throws LoginException {
...
}
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Beans can be declared in a
scope
The CDI runtime will make sure the right bean is created
at the right time
• Extends the @Singleton annotation from the JSR-330
with more annotations
• Introduces @Dependent pseudo-scope as default to set
the context of dependency to the caller's lifecycle
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Managed Bean can be scoped
@Reliable
@SecuredBy(LDAP_MODULE)
@RequestScoped
@ManagedBean
public class ReliableLogin
implements LoginProcessor {
@Override
public boolean login(String username,char[] password)
throws LoginException {
...
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Built in Scopes
You can use the
• @ApplicationScoped
Everywhere in a JEE application
In a web app: @SessionScoped ,@RequestScoped
With JSF:
• @ConversationScoped
• Pseudo-scope: @Dependent
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Benefits of a ManagedBean
Annotation-based event model
• A bean @Observes an event
void onLogin(@Observes
LoginEvent event) { … }
• Another bean fires an event
using the Event.fire(T event)
method
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
OTHER CDI benefits
Producer methods and fields
• Alternatives
• Interceptors
• Decorators
• Stereotypes
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Known CDI Containers
1Weld, the JBoss reference implementation for JSR 299:
http://seamframework.org/Weld.
2. CanDI, the JSR 299 implementation for Caucho Resin,
http://caucho.com/projects/candi/.
3 OpenWebBeans, Apache implementation of JSR 299,
http://apache.org/openwebbeans/.
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Version 3.0 of the Servlet API
●
web-fragment.xml
Web framework pluggability
–
Web Fragments
●
–
Frameworks such Struts and JavaServer Faces
can have their own piece of information added
in the JAR file
Dinamic Registration
TestServletContextListener.java
public void contextInitialized(ServletContextEvent sce) {
<web-fragment version="3.0">
<name>A</name>
<filter>
<icon/>
<filter-name>testFilter</filter-name>
<filter-class>it.javac.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
</web-fragment>
ServletContext sc = sce.getServletContext();
ServletRegistration sr = sc.addServlet("DynaServlet","it.javac.TestServlet");
sr.setInitParameter("servletInitName", "servletInitValue");
sr.addMapping("/*");
FilterRegistration fr = sc.addFilter("DynaFilter","it.javac.TestFilter");
sc.addListener("it.javac.TestRequestListener");
.....
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Version 3.0 of the Servlet API
●
Web framework pluggability
●
Improve support for annotations and generics (optional web.xml)
@WebServlet(name="testServlet", urlPatterns={"/"},
initParams={ @WebInitParam(name="simpleParam", value="paramValue") } )
public class TestServlet extends HttpServlet { ............
SimpleServlet.java
SimpleFilter.java
@WebFilter(urlPatterns={"/"},
initParams={ @WebInitParam(name="simpleParam", value="paramValue") })
public class TestFilter implements Filter {............
SimpleListener.java
@javax.servlet.annotation.WebListener
public class TestServletContextListener implements ServletContextListener {............
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Version 3.0 of the Servlet API
●
Web framework pluggability
●
Improve annotations and generics (web.xml)
●
Asynchronous support (Comet) non-blocking Input/Output
AsyncServlet.java
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
final AsyncContext ac = req.startAsync();
ac.setTimeout(10 * 60 * 1000);
ac.addListener(new AsyncListener() {
public void onComplete(AsyncEvent event) throws IOException {
queue.remove(ac);
}
public void onTimeout(AsyncEvent event) throws IOException {
queue.remove(ac);
}
.....................
});
queue.add(ac);
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Version 3.0 of the Servlet API
●
Web framework pluggability
●
Improve annotations and generics (web.xml)
●
Asynchronous support (Comet) non-blocking Input/Output
●
Security capabilities login/logout servlet self-registration
SampleLoginServlet.java
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("txtUserName");
String password = request.getParameter("txtPassword");
try {
request.login(userName, password);
// request.authenticate(response)
// request.logout();
.....
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Enterprise JavaBeans 3.1
●
Optional local business interface
–
developers can write session beans
without business interfaces
●
War Packaging
●
EJB Lite profile
–
●
provides vendors the option to
implement a subset of the EJB APIs
within their products
SimpleStatelessSessionBean.java
@Stateless
public class SimpleStatelessSessionBean implements
StatelessSession {
@Schedule(second="*/3", minute="*/15", hour="*", ,
dayOfMonth="", dayOfWeek="Mon-Fri", month="",
timezone="", year="2009,2010", info="Test Automatic
Timer")
public void callback_timer(Timer t) {
t.getSchedule();
t.getInfo();
......
Automatic Timer Creation
–
timer service uses calendar-based
syntax
–
calendar syntax is used also for
programmatic timer creation using
the ScheduleExpression
Every other hour within the day starting at noon
on the second Tuesday of every month
hour="12/2", dayOfMonth="2nd Tue"
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Enterprise JavaBeans 3.1
●
Optional local business interface
●
War Packaging
●
EJB Lite profile
●
Automatic Timer Creation
●
Singleton
–
Singleton beans are transactional and thread safe by default
SimpleSingletonEJB.java
@Singleton
public class SimpleSingletonEJB implements SimpleSingletonEJBLocal {
private static int x=0;
public int getUniqueCounter() {
x++;
return x;
}
.....
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Enterprise JavaBeans 3.1
@Stateless
@Asynchronous
public class AsyncTestEJB {
●
Optional local business interface
●
War Packaging
●
EJB Lite profile
●
Automatic Timer Creation
●
Singleton
●
Asynchronous Session Bean
–
Bean methods annotated with
@Asynchronous are invoked
asynchronously
–
Future objects allow you to obtain a
return value from a method executed
in a separate thread.
private Future<Integer> sendOrderToWorkflow(Order order)
{
Integer status = 0;
if (ctx.wasCancelCalled()) {
return new AsyncResult<Integer>(2);
....;
AsyncTestEJB.java
SimpleEjbAsyncClient.java
Future<Integer> status =
orderEJB.sendOrderToWorkflow (order);
Integer statusValue = status.get();
....;
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Enterprise JavaBeans 3.1
●
Optional local business interface
●
War Packaging
●
EJB Lite profile
●
Automatic Timer Creation
●
Singleton
●
Asynchronous Session Bean
●
EJB Embedded Container
public static void main(String args[]) {
try {
Map<String, Object> p = new HashMap<String, Object>();
p.put(EJBContainer.APP_NAME, "sample");
EJBContainer c = EJBContainer.createEJBContainer(p);
Context ic = c.getContext();
SimpleEjb ejb = (SimpleEjb)
ic.lookup("java:global/sample/SimpleEjb");
ejb.insert(5);
int res = ejb.verify();
c.close();
System.out.println("finished embedded test");
} catch (Exception e) {
.....
MainTestClass.java
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Java Persistence API: Version 2.0
●
Expanding the object/relational mapping
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
–
@OrderColumn (Maintaining a persistent
ordering)
private String title;
–
Map with key and value:
@ElementCollection(fetch = FetchType.LAZY)
–
●
Basic Type
●
Entities
●
Embeddables
@CollectionTable(name = "Tag")
@Column(name = "Value")
private ArrayList<String> tags;
Entity: Book.java
Collection of basic type and embeddable javax.persistence.Cache implemented by Persistence Providers
objects can now be mapped in separate tables
●
Pessimistic locking
●
Support Caching
public interface Cache {
// Whether the cache contains data for the given entity.
public boolean contains(Class cls, Object primaryKey);
// Remove the data for the given entity from the cache.
public void evict(Class cls, Object primaryKey);
// Remove the data for entities of the specified class from the cache.
public void evict(Class cls);
// Clear the
cache.
[email protected]
[email protected]
public void evictAll();
Javaday IV – Roma – 30 gennaio 2010
JavaServer Faces 2.0
●
Annotations support against faces XML config
●
Automatic generation of JSP tag handlers
●
Additional scope “View” e “Component”
●
Improve AJAX support
–
changing the request processing life cycle and allowing partial updates of views
@ManagedBean
@RequestScoped
public class BookController {
@EJB
private BookEJB book;
@Inject
Private MyPojo myPojo;
public String doNew() {
return "newBook.xhtml";
BookController.java
FormJSF.xhtml
<tr>
<td>
<h:outputLabel value="Price : "/>
</td>
<td>
<h:inputText
value="#{bookController.myPojo.price}"/>
</td>
...
<h:commandButton value="Create a book"
action="#{bookController.doNew}"/>
</h:form>
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
JEE Specifications Benefits
●
Enterprise Systems diversification
●
Facilitate Cloud Computing Infra:
SaaS
– PaaS
Improve Time to Prod.
–
●
–
–
Raw Application-Generation
Available Skills
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
JAX-RS 1.1: JEE RESTful Services
<?xml version="1.0" encoding="UTF-8"?>
<application
xmlns:xsi="https://wadl.dev.java.net/wadl20061109.xsd">
@GET
<grammars/>
@Path(value = "person/view/
<resources{pid}")
public String getPersonByPath(@PathParam(value
= "pid") String
base="http://localhost:32989/TestRest/resources/res">
pid) {
<resource path="person">
return "Hello " + pid;
<param name="pid" type="xsd:string" style="query"
default=""
}
@Path("res") fixed=""/>
<method id="view" name="GET">
@Produces("application/json")
<request/>
@GET
@Singleton
<response>
@Path(value = "person/view")
public class SimpleRestService
{ mediaType="application/xml"/
<representation
public String getPersonByQuery(@QueryParam(value
= "pid") String
>
pid) {
@Context
</response>
return "Hello " + pid;
private UriInfo</method>
context;
}
</resource>
TestRest.WADL
</resources>
public SimpleRestService()
{}
@POST
</application>
●
Owned Definition Language “WADL”
●
POJOs or EJB that have at least one
method annotated with
@javax.ws.rs.Path
●
Native support for:
●
–
text/html text/plain
–
image/gif image/jpg image/png
–
text/xml application/xml
–
application/json
Annotation supports:
–
Header Values
–
Query & Form Params
–
Path Params
@Consumes("application/x-www-form-urlencoded")
@GET
@Path(value = "person/form")
@Path(value="person/view")
public String getPersonByPost(@FormParam("pid") String pid) {
("application/xml")
return@Produces
"Hello " + pid;
public String getPerson(){
}
..........
SimpleRestService.java
@GET
@Path(value = "person/view")
public String getPersonByHeaders(@Context HttpHeaders hh) {
MultivaluedMap<String, String> headerParams =
[email protected]
[email protected]
hh.getRequestHeaders();
Map<String, Cookie> pathParams
= hh.getCookies();
Javaday
IV – Roma – 30 gennaio 2010
......
JAX-RS 1.1: JEE RESTful Services
●
Fully integrated “J”CDI & JAXB
●
Mashup Enabler
●
@Inject
SimplePojo mySimplePojo;
@GET
@Path("image")
@Produces("image/*")
public Response getImage(@QueryParam("image") String image)
@ Fully HTTP Method Supports:
–
POST=NEW
–
GET=FIND
–
PUT=UPDATE
–
DELETE=REMOVE
–
OPTIONS=RFI
–
TRACE=ECHO
–
HEAD=CHECK VALID GET
{
File f = new File(image);
String mt = new MimetypesFileTypeMap().getContentType(f);
return Response.ok(f, mt).build();
}
SimpleImageRestService.java
http://localhost:32989/TestRest/resources/res/image?image=/speaker.jpg
Connection Server INFO
Application and Rest Service Name
Simple REST Url
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
www.JavaPortal.it
Thanks
[email protected] [email protected]
Javaday IV – Roma – 30 gennaio 2010
Related documents