Enterprise Java Web Application Frameworks & Sample Stack Implementation Mert ÇALIŞKAN mcaliskan@stm.com.tr STM Inc. 2009
Who am I? The Software Plumber :) SCJP certified dude bla bla... Open Source Evangelist Founder & Author of various Open Source Projects Member of MyFaces Community OpenLogic Expert Community Member
Agenda The aim: Enterprise Java WebApp Framework Which stack to choose? The Stack Questions are welcome anytime..!
The aim: Enterprise WebApp Framework MVC pattern Quality & Competency of The Stack Performance & Scalability Learning Curve & Development Speed! don t let cutting edge turn into bleeding edge... release early & release often..! Community Factor & Open Source support (forumsmailing lists & etc.)
Which stack to choose? UI Controller/Dep.Inj. JSF Struts Spring Guice HiveMind Spring MVC WebWork ZK picocontainer XWork Wicket Tapestry GWT Echo3 Cocoon Model/Persistence Layer Hibernate ibatis Integration Toplink KODO Apache CXF Apache Axis2 Spring WS Eclipse JDeveloper IDE IntelliJ IDEA NetBEANS EclipseLink
It s nothing new! not yet another java framework It s a stack demonstration with OSS Released on 01.2009 http://code.google.com/p/mesir 2000+ downloads
DOMAIN MODEL AddressBook id text creationdate contacts 1 0..* Contact id name email phone
THE STACK JSF VIEW FACELETS MAVEN ECLIPSE ORCHESTRA Apache CXF CONTROLLER SPRING with SecuRITY MODEL JPA HIBERNATE H.SEARCH H.VALIDATOR ENVERS
JSF-1 A standard (v1.2_13 and v2.0.1 FCS) A component oriented & event-driven framework Binding makes JSF Powerful Bind a bean s variable to component <h:inputtext value= #{person.name} /> Bind a method to the action component <h:commandbutton action= #{personsavepage.saveperson} /> Conversion & Validation no hassle with java.util.date extensible - write your own converter & validator
JSF-2 3rd Party Ajaxified Frameworks PrimeFACES - Crazy Turks RichFACES - JBoss IceFACES - Sun ADFFaces - Oracle IDE Support (Eclipse - NetBeans - JDeveloper) Everything s gonna be alright with JSF 2.0 :)
FACELETS ViewHandler created for JSF mixing JSF + JSP for JSF 1.x well balanced HTML : xhtml Templating Composite Components
SPRING-1 Dependency Injection & IoC with XML and annotations JEE ( JMS, EJBs, JCA...) AOP ORM Integration, DAO Support tx management, entitymanager
SPRING-2 DAO Spring JDBC Transaction management AOP Spring AOP AspectJ Integration ORM Hibernate JPA TopLink JDO OJB ibatis JEE JMX JMS JCA Remoting EJB Email Web Spring WEB MVC Framework Integration Struts Tapestry JSF JSPs Velocity FreeMarker JasperReports Excel Spring Portlet MVC
SPRING-3 <context:property-placeholder location="classpath:application.properties">... <context:component-scan base-package="tr.mesir" />... <tx:annotation-driven />... <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource" destroymethod="close"> </bean>... <property name="driverclassname" value="${database.driver}"/> <property name="url" value="${database.uri}"/> <property name="username" value="${database.username}"/> <property name="password" value="${database.password}"/> <bean id="transactionmanager" class="org.springframework.orm.jpa.jpatransactionmanager"> <property name="entitymanagerfactory" ref="entitymanagerfactory" />
SPRING-4 @Service("addressBookService") public class AddressBookServiceImpl implements AddressBookService {... @Autowired private AddressBookDAO addressbookdao;... } @Repository public class AddressBookDAOImpl implements AddressBookDAO {... @PersistenceContext protected EntityManager entitymanager;... }
MyFaces ORCHESTRA Conversation Scoped beans & Conversation Scoped Persistence Contexts LazyInitializationException or NonUniqueObjectException Heavily built-on Spring Framework
JPA-1 Standard (Java EE 5.0) object/relational mapping and persistent management interface Support from different vendors hibernate - toplink - eclipselink - kodo... Enhanced Query Langugage (JPQL)
JPA-2 @Entity public class AddressBook extends BaseObject { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; } @OneToMany(cascade={CascadeType.ALL}) @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private List<Contact> contacts = new ArrayList<Contact>();
JPA-3 Some DAO code: public AddressBook loadbyid(long id) { return entitymanager.find(addressbook.class, id); } public void save(addressbook addressbook) { entitymanager.persist(addressbook); } public List<String> findalltitles() { return entitymanager.createquery("select ab.title from AddressBook ab").getresultlist(); }
HIBERNATE-1 Object / Relational Mapping framework No hassle with result set handling object conversion and SQL, well almost for SQL :) Support for any DB with dialects Oracle, MySQL, PostgreSQL, HSQL, DB2, Sybase and many more...
Hibernate Search Bringing full text search engine to the persistence domain model e.g. : amazon search Apache Lucene under the hood Lucene Directory File - DB - in mem JPA Triggered Event System Persist - Update - Delete
H.S. - How To Use Configuration Transparent with JPA (hibernate entity manager) (hibernate annotations) Annotation Based @Indexed @Field(store, index) @IndexedEmbedded...
H.S. - Example @Entity @Indexed public class AddressBook extends BaseObject { @Field(index=Index.TOKENIZED, store=store.no) private String title; } @OneToMany(cascade={CascadeType.ALL}) @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) @IndexedEmbedded private List<Contact> contacts = new ArrayList<Contact>();...
H.S. - Example @SuppressWarnings("unchecked") public List<AddressBook> findbyword(string searchword) throws ParseException { // Since contacts list is declared as @IndexedEmbedded inside AddressBook, // we can search through the name or email of a contact also. MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] { "title", "contacts.name", "contacts.email" }, new StandardAnalyzer()); Query query = parser.parse(searchword); } FullTextQuery ftq = getfulltextentitymanager().createfulltextquery( query, AddressBook.class); return ftq.getresultlist();
HIBERNATE VALIDATOR-1 Reference implementation for JSR 303: Bean Validation DRY (Don t Repeat Yourself) express your domain constraints once..! property2ddlschema annotation-based @NotNull @NotEmpty @Length(min=, max=)... @Email @Pattern @Valid... custom validators
HIBERNATE VALIDATOR-2 @Field @NotEmpty(message="Name should not be empty") @Length(min=4, max=40) private String name; @Field @NotEmpty(message="Email should not be empty") @Email private String email;
HIBERNATE ENVERS-1 Versioning for JPA entities A part of Hibernate with Hib.3.5 Simple to implement with annotations @Audited... Querying on Revisions, Entity at Revisions
HIBERNATE ENVERS-2 Entities R e id= 1 data= x id= 4 data= p v i id= 2 data= a id= 3 data= x s i o id= 1 data= y id= 2 data= b n s id= 2 data= c id= 4 data= r
HIBERNATE ENVERS-3 @Entity @Indexed @Audited public class Contact extends BaseObject { } @Field @Versioned private String name;
Apache CXF-1 open-source services framework annotation driven JAX-WS & JAX-RS compliant soap + rest xml + json
Apache CXF-2 @Component("addressBookWebService") @WebService public class AddressBookWebService { @Autowired private AddressBookService addressbookservice; } @WebMethod public List<String> alladdressbooktitles() { return addressbookservice.findalltitles(); } spring configuration: <jaxws:endpoint id="addressbookws" implementor="#addressbookwebservice" address="/addressbook" />
Apache CXF-3 http://localhost:8080/mesir/ws/addressbook/alladdressbooktitles
MAVEN Stop building the build and focus on building the application...! A uniform build system... Project Object Model (POM) Guidelines for best practices while doing development (TDD - Cont. Int. & etc.)
MAVEN - The POM-1 <project...> <modelversion>4.0.0</modelversion> <groupid>tr.mc</groupid> <artifactid>mesir</artifactid> <packaging>war</packaging> <version>1.0-snapshot</version> <name>mesir</name> <url>http://code.google.com/p/mesir</url> <description>skeleton project for java based web applications</description>............ </project>
MAVEN - The POM-2 <dependencies>... <dependency> <groupid>org.springframework</groupid> <artifactid>spring</artifactid> <version>2.5.6</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-test</artifactid> <version>2.5.6</version> <scope>test</scope> </dependency>... </dependencies>
MAVEN - The POM-3 <repositories> <repository> <id>mesir-repo</id> <url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url> </repository> <repository> <id>jboss</id> <url>http://repository.jboss.com/maven2</url> </repository> <repository> <id>apache-snapshot</id> <url>http://people.apache.org/repo/m2-snapshot-repository</url> </repository> </repositories>
ECLIPSE-1 Universal toolset for Development Open Source IDE Extensible architecture based on plugins Specified mostly on Java but development language is independent... CDT - PHP - Cobol Plugins used while developing mesir: subclipse m2eclipse
ECLIPSE-2
Thank you... http://www.jroller.com/mert http://www.twitter.com/mertcaliskan