Enterprise Java Web
Application Frameworks &
Sample Stack Implementation
Mert ÇALI
Ş
KAN
[email protected] STM Inc.
Who am I?
•
The Software Plumber :)SCJP certified dude bla bla...
•
Open Source EvangelistFounder & Author of various Open Source Projects
•
Member of MyFaces CommunityAgenda
•
The aim: Enterprise Java WebApp Framework•
Which stack to choose?•
•
The Stack•
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 (forums-mailing lists & etc.)Which stack to choose?
JSF WebWork Struts Spring MVC Tapestry Spring Guice Hibernate iBatis Toplink KODO EclipseLink Model/Persistence Layer picoContainer Controller/Dep.Inj. HiveMind XWork Apache CXF Spring WS Integration Apache Axis2 UI IDE Eclipse IntelliJ IDEA JDeveloper Wicket GWT NetBEANS Cocoon ZK Echo3•
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/mesirDOMAIN MODEL
AddressBook Contact 1 0..* id text creationDate contacts id name email phoneTHE STACK
VIEW CONTROLLER MODEL JSF FACELETS ORCHESTRA JPA HIBERNATE ENVERS SPRING H.VALIDATOR H.SEARCH MAVEN ECLIPSE with SecuRITY Apache CXFJSF-1
•
A standard (v1.2_13 and v2.0.1 FCS)•
A component oriented & event-driven framework•
Binding makes JSF PowerfulBind a bean’s variable to component
<h:inputText value=“#{person.name}” />
Bind a method to the action component
<h:commandButton
action=“#{personSavePage.savePerson}” />
•
Conversion & Validationno hassle with java.util.Date
JSF-2
•
3rd Party Ajaxified FrameworksPrimeFACES - Crazy Turks RichFACES - JBoss
IceFACES - Sun
ADFFaces - Oracle
•
IDE Support(Eclipse - NetBeans - JDeveloper)
FACELETS
•
ViewHandler created for JSF•
mixing JSF + JSP for JSF 1.x•
well balanced HTML : xhtml•
TemplatingSPRING-1
•
Dependency Injection & IoCwith XML and annotations
•
JEE ( JMS, EJBs, JCA ...)•
AOP•
ORM Integration, DAO Support tx management, entityManagerSPRING-2
DAO Spring JDBC Transaction management ORM Hibernate JPA TopLink JDO OJB iBatis JEE JMX JMS JCA Remoting EJB Email AOP Spring AOP AspectJ Integration Web Spring WEB MVC Framework Integration Struts Tapestry JSF JSPs Velocity FreeMarker JasperReports Excel Spring Portlet MVCSPRING-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" destroy-method="close">
<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>
...
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
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
JPA-1
•
Standard (Java EE 5.0)object/relational mapping and persistent management interface
•
Support from different vendorshibernate - toplink - eclipselink - kodo ...
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
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 objectconversion and SQL, well almost for SQL :)
•
Support for any DB with dialectsHibernate Search
•
Bringing full text search engine to the persistence domain modele.g. : amazon search
•
Apache Lucene™ under the hood•
Lucene DirectoryFile - DB - in mem
•
JPA Triggered Event SystemH.S. - How To Use
•
ConfigurationTransparent 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 ...
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")
HIBERNATE ENVERS-1
•
Versioning for JPA entities•
A part of Hibernate with Hib.3.5•
Simple to implement with annotations@Audited ....
HIBERNATE ENVERS-2
Entities R e v i s i o n s id=”1”data=”x” data=”p”id=”4”
id=”2” data=”a” id=”3” data=”x” id=”1” data=”y” id=”2” data=”b” id=”2”
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 + restApache 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
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 developmentMAVEN - 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>
... ...
... ...
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>
...
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: subclipseECLIPSE-2
Thank you...
http://www.jroller.com/mert