Beruflich Dokumente
Kultur Dokumente
Çağatay Çivici
cagatay@apache.org
Çağatay Çivici
Apache MyFaces PMC
“The Definitive Guide to Apache MyFaces and Facelets” Co-Author
Reference in “Core JSF 2nd Edition” (Sun Core Series)
Technical reviewer of “JBoss Seam and Trinidad” and “Apache MyFaces” books
Speaker in JSFOne, JSFDays, universities and local Java Groups.
PrimeFaces founder and project lead
Krank CRUD framework team member
Trainer, Consultant, Mentor
FC Barcelona fan
Prime Teknoloji (UK-TURKEY)
Prime Teknoloji
Consulting, Training, Software Development
Agile Agile Agile, TDD, Patterns
Java EE, JSF, Spring, Seam, JPA
www.emlakharitam.com
PrimeFaces
www.prime.com.tr
JSF
Joint Strike Fighter
Crew: 1
Java Server Faces
Standard WEB Framework of JAVA EE
Component Oriented
Event driven
Swing and WEB
Apache MyFaces and Sun Mojarra (RI)
Vendor support (Sun, IBM, Oracle, JBoss, Apache etc)
Apache MyFaces
JSF 1.1 ve 1.2 implementation
Tomahawk
Trinidad
Tobago
Portlet Bridge RI
Orchestra
ExtVAL
JSF Tools
Netbeans
JBoss Tools
MyEclipse
Eclipse WTP
JDeveloper
IBM RAD
IDEA
Macromedia Dreamweaver
Component Libraries
MyFaces Tomahawk
MyFaces Trinidad
MyFaces Tobago
JBoss RichFaces
IceFaces
Quipukit
NetAdvantage
WebGalileo
PrimeFaces
Open Source
Rich Components
Easy AJAX
XML Free JSF
Detailed Documentation
Not a framework
Open Source Model
May the source be with you
Free :)
Apache Software Foundation Experience
http://code.google.com/p/primefaces/
Turkey and Open Source
Turkish Support
Turkish Docs (160 + sayfa)
Turkish enabled components
Turkish support forum
PrimeFaces Modules
UI Components
Optimus
FacesTrace
Mutually Exclusive modules
Installation
1) Download
2) Logging ve SLF4J
3) Resource Servlet
4) JSP or Facelets Taglib
5) p:resources
Let’s ROCK!
Manuel Download
Google code page:
http://code.google.com/p/primefaces/issues/list
Maven Download
<repository>
<id>prime-repo</id>
<name>Prime Technology Maven Repository</name>
<url>http://repository.prime.com.tr/</url>
<layout>default</layout>
</repository>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces-ui</artifactId>
<version>0.8.1</version>
</dependency>
Resource Servlet
Serving packed resources (js, css, ...)
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>
org.primefaces.ui.resource.ResourceServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resources/*</url-pattern>
</servlet-mapping>
Taglib
JSP Taglib
<%@ taglib uri="http://primefaces.prime.com.tr/ui" prefix="p" %>
Facelets Namespace
xmlns:p="http://primefaces.prime.com.tr/ui"
JSF Page
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:p="http://primefaces.prime.com.tr/ui">
<head>
<p:resources />
</head>
<body>
<p:editor />
</body>
</html>
UI Components
Rich components
Easy AJAX
Flash chart components
Unobstrusive Javascript
Yahoo UI, Prototype, Scriptaculous
Rich Components
UIAjax DataTable
AccordionPanel Dialog
AutoComplete Editor
Button ImageCropper
Calendar Menu
Captcha Panel
Carousel Poll
Charts Resizable
ColorPicker Slider
ConfirmDialog Tabview
Tooltip Tree
Easy AJAX
Partial Page Rendering - PPR
Declarative AJAX
Ajax Update
<h:form prependId=”false”>
</h:form>
Ajax Status
Displaying Ajax request status
Global Ajax Request indicator
<p:ajaxStatus>
<f:facet name="start">
<h:graphicImage value="ajaxloadingbar.gif" />
</f:facet>
<f:facet name="complete">
<h:outputText value="User Saved" />
</f:facet>
</p:ajaxStatus>
Ajaxify
Enables ajax on standard JSF components
<h:inputText value="#{createUser.name}">
<p:ajax event="keyup" update="name" />
</h:inputText>
public SaleReport() {
sales = new ArrayList<Sale>();
sales.add(new Sale("Brand 1", 540));
sales.add(new Sale("Brand 2", 325));
sales.add(new Sale("Brand 3", 702));
sales.add(new Sale("Brand 4", 421));
}
<script type=”text/javascript”>
var editor = new PrimeFaces.widget.Editor(...);
</script>
PrimeFaces.ajax.*
Ajax API
PrimeFaces.ajax.AjaxUtils
PrimeFaces.ajax.AjaxRequest
PrimeFaces.ajax.AjaxResponse
<script type=”text/javascript”>
</script>
Unobstrusive Javascript
Vanilla JSF
<h:commandbutton value=”Submit” onclick=”alert(‘Barca’)” />
PrimeFaces
<p:button value=”Submit” onclick=”alert(‘Barca’)” />
YAHOO.util.Event.addListener(“_id1”,”click”, function(e) {
alert(‘Barca’);}
Optimus
Non rendering goodies
Guice integration
Validators
XML-free JSF
PDF and Excel export
Security Extensions and AOP
Google Guice Integration
Guice based JSF beans
@Controller for <managed-bean />
Dependency Injection
Aspect Oriented Programming
Vanilla JSF 1.x Managed-Bean
CreateUser.java
package fc.barcelona;
faces-config.xml
<managed-bean>
<managed-bean-name>createUser</managed-bean-name>
<managed-bean-class>fc.barcelona.CreateUser</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
createUser.xhtml
<h:inputText value=”#{createUser.user.name}” />
Optimus IOC
CreateUser.java
package fc.barcelona;
@Controller(name=”createUser”, scope=Scope.REQUEST)
public class CreateUser {
...
}
faces-config.xml
createUser.xhtml
<h:inputText value=”#{createUser.user.name}” />
Controller
name
scope
Request
Session
Application
View
startup: Initiate on application startup
Classpath scanning
Scan specific packages
<context-param>
<param-name>optimus.SCAN_PATH</param-name>
<param-value>org.sopranos.project.ui</param-value>
</context-param>
package org.sopranos.project.ui;
@Controller(name=”createUser”, scope=Scope.REQUEST)
public class CreateUser {
...
}
Dependency Injection
CreateUser UserDAO
userDAO
implements
UserDAOJPA
Dependency Injection
public interface UserDAO {
public void save(User user);
}
<context-param>
<param-name>optimus.CONFIG_MODULES</param-name>
<param-value>org.sopranos.moviestore.MainAppModule </param-value>
</context-param>
Simple Injection
No getter and setter
package fc.barcelona;
//imports
@Controller(name=”createUser”, scope=Scope.REQUEST)
public class CreateUser {
@Inject
private UserDAO userDAO;
//Other stuff
//imports
@Controller(name=”createUser”, scope=Scope.REQUEST)
public class CreateUser {
@Inject
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
//Other stuff
//imports
@Controller(name=”createUser”, scope=Scope.REQUEST)
public class CreateUser {
@Inject
public CreateUser(UserDAO userDAO) {
this.userDAO = userDAO;
}
//Other stuff
web.xml
<filter>
<filter-name>Optimus Persistence Filter</filter-name>
<filter-class>org.primefaces.optimus.persistence.filter.PersistenceFilter</filter-class>
</filter>
UserDAOJPA.java
public interface UserDAOJPA implements UserDAO {
@Inject
private EntityManager em;
import org.primefaces.optimus.config.annotations.Transactional;
//...
@Transactional
public void save(User user) {
em.persist(user);
}
ViewScope
Page scope
Between request and session scope
View Create()
Sess. Create()
faces-config.xml
<navigation-rule>
<from-view-id>/userList.xhtml</from-view-id>
<navigation-case>
<from-outcome>userDetail</from-outcome>
<to-view-id>/userDetail.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
Optimus Navigation
userList.xhtml userDetail.xhtml
<h:commandButton
userDetail
value =”Detail”
action=”userDetail” />
faces-config.xml
<application>
<navigation-handler>
org.primefaces.optimus.navigationhandler.ViewIdBasedNavigationHandler
</navigation-handler>
</application>
AuthContext
UI Security
<h:commandButton value=”Save” action=”#{createUser.save}”
rendered=”#{authContext.ifGranted[‘ROLE_ADMIN’]}” />
ifGranted
ifAllGranted
ifAnyGranted
ifNonGranted
AOP and @Authorize
Method level security
package org.sopranos.project.ui;
@Controller(name=”createUser”, scope=Scope.REQUEST)
public class CreateUser {
package org.sopranos.project.ui;
@Controller(name=”createUser”, scope=Scope.REQUEST)
public class CreateUser {
@Authorize(“ROLE_ADMIN”)
public String saveUser() {
//...
}
}
Exporter
Exports datatable data, Excel or PDF
<p:dataTable id=”users”>
...
</p:dataTable>