JSF2 Programming Basics
JSF2 Programming Basics
For live training on JSF 2.x, please see courses at htt // t http://courses.coreservlets.com/. l t /
Taught by the author of Core Servlets and JSP, More Servlets and JSP and this tutorial. Available at public JSP, tutorial venues, or customized versions can be held on-site at your organization.
C Courses d developed and t l d d taught b M t H ll ht by Marty Hall Courses developed and taught by coreservlets.com experts (edited by Marty)
JSF, servlets/JSP, Ajax, jQuery, Android development, Java 6 programming, custom mix of topics Ajax courses can concentrate on 1EE Training: http://courses.coreservlets.com/several Customized Java library (jQuery, Prototype/Scriptaculous, Ext-JS, Dojo, etc.) or survey
Servlets, JSP, Hibernate/JPA, EJB3, GWT, jQuery, GWT, RESTful Web Services RESTful Web Services, Android. Spring, JSF 2.0, Java 6, Ajax, SOAP-based and Spring, Hibernate, Contact hall@coreservlets.com for details Developed and taught by well-known author and developer. At public venues or onsite at your location.
Setup
Setup Summary
JAR files
JSF 2.0 JAR files required; JSTL 1.2 JARs recommended
Omit them in Glassfish 3, JBoss 6, and other Java EE 6 servers
web.xml
Must have a url-pattern for *.jsf (or other pattern you choose) Usually sets PROJECT_STAGE to Development
A Accessing some-page.xhtml i ht l
Use URL some-page.jsf (matches url-pattern from web.xml)
6
faces-config.xml
<?xml version="1.0"?> <faces config xmlns http://java.sun.com/xml/ns/javaee <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" _ _ version="2.0"> </faces-config>
File is mostly empty, but the file must exist (in WEB-INF), and you must have legal start and end tags that designate JSF 2.0. There will be no content inside the tags for any of the examples in this section. All examples in this section use default bean names (derived from the beans class name with the first letter changed to lower case) and default results pages (derived from the action controllers return controller s values).
web.xml
<?xml version="1.0" encoding="UTF-8"?> You must have a url-pattern for the FacesServlet, just as in JSF 1.x. You can optionally set the PROJECT_STAGE, pp <web-app version="2.5"> which is recommended during development and testing. <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> </servlet> / <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> u patte .js /u patte <url-pattern>*.jsf</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> / </context-param> <welcome-file-list> <welcome file>index.jsp</welcome file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
The first time you do it, you will have to give location of the JSF 2.0 (and JSTL) JAR files ( )
Coreservlets sample projects use C:\mojarra-jsf-2.0
Benefits
Visual previews of .xhtml files (useful now) Lots of support for editing faces-config.xml (useful later)
9
Solutions
web.xml file
Copy the web.xml version from jsf-blank or the basics project at coreservlets.com. Copy it into your project after adding f l t C i t j t ft ddi facet. t
Business Logic
results submit form POST request bl h j f t blah.jsf
Instantiate Bean
return value l
Choose Page
forward
The action controller method is the exact method name given in the th pushbuttons action. hb tt ti
12
The Th pushbutton said action="#{someBean.someMethod}". So, hb tt id ti "#{ B M th d}" S instantiate bean whose name is someBean. In this section, we will declare bean with @ManagedBean, so that means to instantiate bean whose class name is SomeBean. In later sections, we will see that the bean could be session-scoped (or have other scopes), so this will be called Find Bean instead of Instantiate Bean.
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> You use "facelets" pages that use xhtml syntax for all JSF 2.0 pages; you never use old-style JSP syntax. You </h:head> always have xmlns:h, h:head, h:body, and (for input forms) h:form In later sections we will see that you h:form. <h:body> <h b d > sometimes also have xmlns:f... and/or xmlns:ui Results pages that do not also contain input elements can omit the h:form part. No @taglib entries needed. <h:form> Remember that the URL does not match the real filename: you use blah.xhtml for the files, but blah.jsf for the URLs (or whatever ending matches the url-pattern in web.xml). </h:form> </h:body> </html>
13
14
@ManagedBean Basics
Main Points
@ManagedBean annotation
@ManagedBean public class SomeName { }
You refer to bean with #{someName.blah}, where bean name is class name (minus packages) with first letter changed to lower case. Request scoped by default.
And blah is either an exact method name (as with action blah of h:commandButton), or a shortcut for a getter and setter method (as with value of h:inputText).
Example
Idea
Click on button in initial page Get one of three results pages, chosen at random
A bean
Class: Navigator (bean name above except for case) @ManagedBean annotation choosePage method returns 3 possible Strings
"page1", "page2", or "page3"
start-page.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1 transitional.dtd > "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head></h:head> <h:body> <fieldset> <legend>Random Results Page</legend> <h:form> Press button to get one of three possible results pages. <br/> <h:commandButton value="Go to Random Page" action="#{navigator.choosePage}"/> </h:form> </fieldset> This means that when you press button, JSF instantiates bean whose name is navigator and then runs the choosePage method. This is same format as in JSF 1.x, but here name of bean is automatically derived from Java class name. </h:body></html>
18
Navigator.java
package coreservlets; import javax.faces.bean.*;
Declares this as managed bean, without requiring entry in faces-config.xml as in JSF 1.x. Since no name given, name is class name with first letter changed to lower case (i.e., navigator). You can also do @ManagedBean(name="someName"). See later section.
Since no scope given it is request scoped You can also given, scoped. @ManagedBean use an annotation like @SessionScoped. See later section. public class Navigator { public String doNavigation() { String[] results = { "page1", "page2", "page3" }; ( ( )); return(RandomUtils.randomElement(results)); The randomElement method just uses Math.random to return an } element from the array at random. Source code is in the downloadable Eclipse project. }
19
Since there are no explicit navigation rules in faces-config.xml, these return values correspond to page1.xhtml, page2.xhtml, and page3.xhtml (in same folder as page that has the form).
page1.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" p // g/ / / / "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> I dont actually have any dynamic code in this simplistic example, but <h:head><title>Result Page 1</title> it is a good idea to plan ahead and <link href="./css/styles.css" href=" /css/styles css" always include h:head and h:body. l i l d hh d dhb d rel="stylesheet" type="text/css"/> </h:head> <h:body> <table class="title"> <tr><th>Result Page 1</th></tr> </table> <p/> <h2>One. Uno. Isa.</h2> <p>Blah, blah, blah.</p> </h:body></html>
20
Results
21
Business Logic
results
Instantiate Bean
return value l
Choose Page
forward
23
Main Points
Input values correspond to bean properties
<h:inputText value="#{someBean.someProp}"/>
When form is submitted, takes value in textfield and passes it to setSomeProp.
Validation and type conversion ( f any) is first. See later section. (if ) f S
When form is displayed, calls getSomeProp(). If value is other than null or empty String, puts value in field. See later section.
Example
Idea
Enter name of a programming language Get one of
Error page no language e te ed o page: o a guage entered Warning page: language cannot be used for JSF
Needs to output the language the user entered
Input form
<h:inputText value="#{languageForm.language}"/>
Results pages
#{languageForm.language} (for warning page)
25
choose-language.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> p g <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> When form is submitted, languageForm is instantiated and textfield value is passed to <h:body> setLanguage. Then, the showChoice method is called to <fieldset> determine the results page. <legend>Choose JSF Language</legend> <h:form> Enter a programming language that can be used to implement JSF managed beans:<br/> <h:inputText value="#{languageForm.language}"/><br/> <h:commandButton value="Check Language" action="#{languageForm.showChoice}"/> </h:form> </fieldset> The value of h:inputText actually plays a dual role. When form is first displayed, languageForm is instantiated and getLanguage is called. If the value is non-empty, that result is the initial value of the textfield. Otherwise, the textfield is initially empty. When the form is submitted, languageForm is reinstantiated (assuming request </h:body></html>
26 scope) and the value in the textfield is passed to setLanguage. More on this dual behavior in the next tutorial section, but for now just be aware that your bean must have both getLanguage and setLanguage methods.
LanguageForm.java (Top)
package coreservlets; import javax.faces.bean.*; @ManagedBean public class LanguageForm { private String language; public String getLanguage() { return(language); }
This will be automatically called by JSF when form is submitted.
public void setLanguage(String language) { this.language = language.trim(); } Using #{languageForm.language} in the results page corresponds to the getLanguage method. Using <h:inputText value="#{languageForm.language}"/> in the input form
27 means the textfield value will be passed to the setLanguage method. The names of instance variables (if any) is irrelevant. The next lecture will give the full rules for mapping the short form to the method names, but the simplest and most common rule is to drop get or set from the method name, then change the next letter to lower case.
LanguageForm.java (Continued)
public String showChoice() { if (isMissing(language)) { return("missing-language"); } else if (language.equalsIgnoreCase("Java") || language.equalsIgnoreCase("Groovy")) language equalsIgnoreCase("Groovy")) { return("good-language"); The action of } else { h:commandButton is this exact method name name, return("bad-language"); t ("b d l ") rather than a shortcut for a pair of getter and setter } methods as with } h:inputText. private boolean isMissing(String value) { return((value == null) || (value.trim().isEmpty())); } }
28
missing-language.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" p // g/ / / / "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> </h:head> <h:body> <table class="title"> <tr><th>Missing Language</th></tr> </table> <h2>Duh! You didn t enter a language! didn't (<a href="choose-language.jsf">Try again</a>)</h2> <p>Note that using separate error pages for missing input values does not scale well to real applications. The later section on validation shows better approaches.</p> / </h:body></html>
29
bad-language.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" p // g/ / / / "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> </h:head> <h:body> Calls getLanguage and outputs the result. <table class="title"> <tr><th>Bad Language</th></tr> </table> <h2>Use #{languageForm language} in JSF? #{languageForm.language} Be serious!</h2> </h:body></html>
In JSF 2.x you can use #{result} instead of <h:outputText value="#{result}"/> as was needed in JSF 1.x. Both approaches escape HTML characters, so you don't have to worry about the user entering HTML tags. Therefore, use the shorter approach shown here unless you need one of the options to h:outputText like escape (with a value of false), rendered (with a computed value), id, converter, etc. These are covered in later lectures.
30
good-language.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" p // g/ / / / "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> </h:head> <h:body> <table class="title"> <tr><th>Good Language</th></tr> </table> <h2>Good choice </h2> choice.</h2> <p>In the Oracle (Mojarra) JSF 2 implementation, </p> </h:body></html>
31
Results
Empty
COBOL Java
32
Wrap-Up
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Java 6, Ajax, jQuery, GWT, Spring, Hibernate, RESTful Web Services, Android. Developed and taught by well-known author and developer. At public venues or onsite at your location.
Business Logic
results
Find Bean
Choose Page
forward
35
Summary
Forms (facelets pages)
Declare h: namespace, use h:head, h:body, h:form
Managed beans
D l with @ManagedBean Declare i h @M dB
Bean name is class name with first letter in lower case
Results pages p g
36
Questions?
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Java 6, Ajax, jQuery, GWT, Spring, Hibernate, RESTful Web Services, Android. Developed and taught by well-known author and developer. At public venues or onsite at your location.