jsf2 event handling languages

Upload: henry-ccoa-heredia

Post on 03-Jun-2018

236 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/11/2019 JSF2 Event Handling Languages

    1/27

    2013 Marty Hall

    Customized Java EE Training: http://courses.coreservlets.com/ Java, JSF 2, PrimeFaces, HTML5, JSP, Ajax, jQuery, Spring, Hibernate, RESTful Web Services, Hadoop, Android.

    Developed and taught by well-known author and developer. At public venues or onsite at your location.

    JSF 2.0: HandlingGUI (Application) Events

    Originals of Slides and Source Code for Examples:

    http://www.coreservlets.com/JSF-Tutorial/jsf2/

    2013 Marty Hall

    Customized Java EE Training: http://courses.coreservlets.com/ Java, JSF 2, PrimeFaces, HTML5, JSP, Ajax, jQuery, Spring, Hibernate, RESTful Web Services, Hadoop, Android.

    Developed and taught by well-known author and developer. At public venues or onsite at your location.

    For live training on JSF 2 and/or PrimeFaces,see http://courses.coreservlets.com/

    or email [email protected] by the author ofCore Servlets and JSP , More Servlets

    and JSP , and this tutorial. Available at publ ic venues, orcustomized versions can be held on-site at your organization.

    Courses developed and taught by Marty Hall JSF 2, PrimeFaces, servlets/JSP, Ajax, jQuery, Android development, Java 7 or 8 programming, custom mix of topics Courses available in any state or country. Maryland/DC area companies can also choose afternoon/evening courses.

    Courses developed and taught by coreservlets.com experts (edited by Marty) Spring, Hibernate/JPA, GWT, Hadoop, HTML5, RESTful Web Services

    Contact [email protected] for details

  • 8/11/2019 JSF2 Event Handling Languages

    2/27

    Topics in This Section

    Motivation Comparing action controllers to

    action listeners Action listeners Value change listeners Using JavaScript to submit form

    Dealing with browser incompatibilities

    5

    2013 Marty Hall

    Customized Java EE Training: http://courses.coreservlets.com/ Java, JSF 2, PrimeFaces, HTML5, JSP, Ajax, jQuery, Spring, Hibernate, RESTful Web Services, Hadoop, Android.

    Developed and taught by well-known author and developer. At public venues or onsite at your location.

    Overview

  • 8/11/2019 JSF2 Event Handling Languages

    3/27

    Motivation

    There are 2 varieties of user interface events Events that start back-end processing Events that affect only the format of the user interface

    JSF categorizes code that handles these asaction controllers and event l ist eners Action controllers handle main form submission

    Fire after bean has been populated (see previous section) Fire after validation logic (see upcoming section) Return strings that directly affect page navigation

    Event listeners handle UI events Often fire before bean has been populated Often bypass validation logic Never directly affect page navigation

    7

    Event Handlers vs. Ajax Event handlers are one of the most

    convenient features of JSF Especially compared to Struts or regular MVC

    However, Ajax is sometimes even better Some of the situations where event handlers apply

    result in only a small number of elements changing In that case, Ajax often yields a more interactive user

    experience If you need to update the entire page, use event listeners.

    If you need to update only part of the page, use Ajax.

    See later lecture on Ajax support in JSF 2

    8

  • 8/11/2019 JSF2 Event Handling Languages

    4/27

    submit formPOST request balance.jsf

    JSF Flow of Control(Updated but Still Simplified)

    9

    FindBean

    Run ActionController Method

    Run Setter Methods

    BusinessLogic

    results

    Button referred toaction controller

    Button or other controlreferred to action listener

    Do SideEffect

    Redisplayform

    balance.xhtmlUses and

    returnvalue

    ChoosePage

    forward result1.xhtmlresult2.xhtml

    ...resultN .xhtml

    Uses#{bankForm.someProperty}to display bean properties

    Types of Event Listeners: ActionListener Summary

    Fired by buttons, image maps, and hypertext links (linkshave attached JavaScript)

    These elements automatically submit the form Syntax

    public void blah(ActionEvent e) { } With commandButton, the ActionEvent does not contain

    much useful info, so is usually ignored. But methodsignature requires that you declare it.

    10

  • 8/11/2019 JSF2 Event Handling Languages

    5/27

    Types of Event Listeners:ValueChangeListener

    Summary Fired by combo boxes, checkboxes, radio buttons, etc.

    These elements do not automatically submit the form Syntax

    public void blah(ValueChangeEvent e) { } The event has useful info in it: the value just selected

    Important alternative Often easier to omit the valueChangeListener and justhave the value do something as a side effect, sincethese elements dont do page navigation anyhow

    11

    2013 Marty Hall

    Customized Java EE Training: http://courses.coreservlets.com/ Java, JSF 2, PrimeFaces, HTML5, JSP, Ajax, jQuery, Spring, Hibernate, RESTful Web Services, Hadoop, Android.

    Developed and taught by well-known author and developer. At public venues or onsite at your location.

    Action Listeners

  • 8/11/2019 JSF2 Event Handling Languages

    6/27

    Using ActionListener in Facelets

    Some buttons submit the form and startbackend processing Use

    Other buttons affect only the UI Use You usually want this process to occur before beans are

    populated and especially before validation occurs Since forms are often incomplete when the UI is adjusted

    Use immediate to designate that listener fires beforevalidation is performed or beans are populated

    13

    Implementing ActionListener in theJava Code

    Listener need not be in the form bean class Sometimes use a separate bean to represent GUI

    information. Often session scoped. Method takes ActionEvent as argument

    void return type ( not String as in action controllers) ActionEvent is in javax.faces.event ActionEvent has a getComponent method that lets you

    obtain the UIComponent reference From the UIComponent, you can get the component ID,

    renderer, and other low-level information Sample code

    public void someMethod(ActionEvent event) {doSomeSideEffects();

    }14

  • 8/11/2019 JSF2 Event Handling Languages

    7/27

    Example

    Idea Adapt the registration example from the I18N tutorial

    section. Provide pushbuttons to change the font size. Approach Store the name of the body style to be used in the

    property of a session-scoped bean

    Provide two pushbuttons that run action listeners whichchange the body-style class

    15

    Input Form: Top(register1.xhtml)

    #{msgs.registrationTitle}

    #{msgs.registrationTitle}

    :16

    This is a normal pushbutton asshown many times in earliersections. It results in the normalrequest processing flow.

    There is a second way to load CSS files in JSF 2. See section onrelocatable resources in Page Templating tutorial. However, thesimple/basic usage is fine here.

  • 8/11/2019 JSF2 Event Handling Languages

    8/27

    Input Form: Bottom(register1.xhtml)


    17

    These two pushbuttons invoke actionlisteners. So, pressing them results in goi ngto the server, calling setNormalSize orsetLargeSize, then redisplaying the form.

    Bean for Action Listener (Bean for Form Settings)

    @ManagedBean@SessionScoped

    public class FormSettings implements Serializable { private boolean isNormalSize = true;

    public String getBodyStyleClass() {if (isNormalSize) {

    return("normalSize");} else {

    return("largeSize");}

    } public void setNormalSize(ActionEvent event) {

    isNormalSize = true;}

    public void setLargeSize(ActionEvent event) {isNormalSize = false;

    }}

    18

  • 8/11/2019 JSF2 Event Handling Languages

    9/27

    Bean for Action Controller ( Main Bean)

    @ManagedBean public class Person {

    private String firstName, lastName, emailAddress;

    // Accessor methods: getFirstName, setFirstName, etc.

    public String doRegistration() {if (isAnyEmpty(firstName, lastName, emailAddress)) {

    return("missing-input");} else {

    return("confirm-registration");}

    }

    }

    19

    This action controller method is called by the normal button in thetop half of the form, resulting in the normal request processing flow.

    faces-config.xml

    messagesmsgs

    20

    The first example uses strings from properties files, but not I18N. So,the only file used is messages.properties. The second example willalso set the Locale and make use of messages_es.properties.

  • 8/11/2019 JSF2 Event Handling Languages

    10/27

  • 8/11/2019 JSF2 Event Handling Languages

    11/27

    Results Page: Success(confirm-registration.xhtml)

    #{msgs.successTitle}#{msgs.successText}

    #{msgs.firstName}: #{person.firstName}#{msgs.lastName}: #{person.lastName}#{msgs.emailAddress}: #{person.emailAddress}

    23

    This example does not make use of the f:view locale settings, but the results pages are shared with the next twoexamples, which do make use of this. This setting will be explained in next example.

    Results Page: Error (missing-input.xhtml)

    #{msgs.errorTitle}#{msgs.missingData}

    24

  • 8/11/2019 JSF2 Event Handling Languages

    12/27

  • 8/11/2019 JSF2 Event Handling Languages

    13/27

    Results: Results Pages (Error)

    27

    2013 Marty Hall

    Customized Java EE Training: http://courses.coreservlets.com/ Java, JSF 2, PrimeFaces, HTML5, JSP, Ajax, jQuery, Spring, Hibernate, RESTful Web Services, Hadoop, Android.

    Developed and taught by well-known author and developer. At public venues or onsite at your location.

    Changing the LocaleProgrammatically

  • 8/11/2019 JSF2 Event Handling Languages

    14/27

    Setting the Locale from UserSettings

    Two methods to set the Locale Call setLocale on the view

    You can also get Locale from browser settings

    Set the Locale of the UIViewRoot FacesContext.getCurrentInstance().getViewRoot()

    .setLocale(currentLocale);

    Previous tutorial section Last section, we set the Locale based on browser settings

    Now, we want to set it based on user choices This can change from page to page, so is trickier

    29

    Setting the Locale from UserSettings (Continued)

    Problem Calling setLocale on the view

    Triggered when you reload the page Not triggered when you redisplay the page after running

    action listener (or submitting form) Setting the Locale of the UIViewRoot

    Triggered when you redisplay the page after runningaction listener (or submitting form)

    Not triggered when you reload the page Because the Locale is reset to the default

    Solution Do both !

    Before navigating to page, call FacesContext.getCurrentInstance().getViewRoot().setLocale(currentLocale);

    On page, use 30

  • 8/11/2019 JSF2 Event Handling Languages

    15/27

    Example

    Idea Adapt the previous example. Provide pushbutton to

    switch between English and Spanish. Approach

    Create two properties files messages.properties and messages_es.properties

    Provide pushbutton that runs action listener whichchanges the Locale

    Directly sets the UIViewRoot Sets a flag that will determine what getLocale returns

    Look up the Locale in f:view, as in I18N tutorial

    31

    Input Form (register2.xhtml)

    32

  • 8/11/2019 JSF2 Event Handling Languages

    16/27

    Bean for Action Listener (Part Called by f:view)

    @ManagedBean@SessionScoped

    public class FormSettings implements Serializable { / / Code f or f ont si ze cont r ol shown ear l i er

    private boolean isEnglish = true; private static final Locale ENGLISH = new Locale("en"); private static final Locale SPANISH = new Locale("es"); private Locale locale = new Locale("en");

    public Locale getLocale() {return(locale);

    }

    33

    Bean for Action Listener (Part Called by ActionListener)

    public void swapLocale(ActionEvent event) {isEnglish = !isEnglish;if (isEnglish) {

    locale = ENGLISH;} else {

    locale = SPANISH;

    }FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);

    }

    34

  • 8/11/2019 JSF2 Event Handling Languages

    17/27

    Previously-Shown Files

    Unchanged from last example Main bean

    Person, with the doRegistration action controller method faces-config.xml

    Defines the msgs variable as referring tomessages.properties

    messages.properties Default/English strings

    CSS file Defines normalSize and largeSize class names

    Results pages confirm-registration.xhtml and missing-input.xhtml These also use

    35

    Spanish Properties File(messages_es.properties)

    registrationTitle=RegistrofirstName=Primer NombrelastName=ApellidoemailAddress=Direccin de EmailregistrationText=Incorpore Por Favor su {0}, {1}, y {2}.

    prompt=Incorpore {0} buttonLabel=Coloqeme

    successTitle=xitosuccessText=Se Registr con xito.switchLanguage=In EnglishnormalFont=Fuente NormallargeFont=Fuente GrandeerrorTitle=Error!

    missingData=Falta de input. Por favor, intntelo de nuevo.

    36

  • 8/11/2019 JSF2 Event Handling Languages

    18/27

    Results: Input Form(Normal Font Size)

    37

    Results: Input Form(Large Font Size)

    38

  • 8/11/2019 JSF2 Event Handling Languages

    19/27

    Results: Results Pages(Success)

    39

    Results: Results Pages (Error)

    40

  • 8/11/2019 JSF2 Event Handling Languages

    20/27

    2013 Marty Hall

    Customized Java EE Training: http://courses.coreservlets.com/ Java, JSF 2, PrimeFaces, HTML5, JSP, Ajax, jQuery, Spring, Hibernate, RESTful Web Services, Hadoop, Android.

    Developed and taught by well-known author and developer. At public venues or onsite at your location.

    Using Input Elementsthat Dont Submit

    Forms

    Option 1: Use ValueChangeListener Before: Act ionListener was used

    For buttons. Form was automatically submitted when clicked Now: ValueChangeListener is used

    For combobox, listbox, radio button, checkbox, textfield, etc. Difference from ActionListener

    Form not automatically submitted Need to add JavaScript to submit the form

    onclick="submit()" or onchange="submit()" Event incompatibility between Firefox and IE

    Firefox, Netscape, and Opera fire the onchange events when thecombobox selection changes, radio button is selected, orcheckbox is checked/unchecked

    Internet Explorer fires event when selection changes andanother GUI control receives the input focus

    onclick generally works consistently in current browsers. Older IEversions behave differently. Test on multiple browsers!

    42

  • 8/11/2019 JSF2 Event Handling Languages

    21/27

    Implementing ValueChangeListenerin Java Code

    Listener can be in session-scoped bean Different from main bean, as discussed previously

    Method takes ValueChangeEvent as arg Useful ValueChangeEvent methods

    getComponent (as mentioned for ActionEvent) getOldValue (previous value of GUI element) getNewValue (current value of GUI element)

    Needed since bean has probably not been populated Value for checkbox is of type Boolean Value for radio button or textfield corresponds to request parameter

    Sample code public void someMethod(ValueChangeEvent event) {Boolean flag = (Boolean)event. getNewValue() ;

    takeActionBasedOn(flag);}

    43

    Option 2: Have value PerformSide Effect

    Facelets code

    Java codepublic String getSomeProperty(String prop) {

    this.prop = prop;doSomeOtherSideEffects();

    }

    44

  • 8/11/2019 JSF2 Event Handling Languages

    22/27

    Example

    Idea Extend previous example. Use radio buttons to switch among

    English, Spanish, and Japanese Approach

    Have radio button value change Locale as side effect Facelets

    Java

    public void setLanguage(String language) {this.language = language;locale = new Locale(language);FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);

    }

    Make sure clicking radio button submits the form onclick="submit()"

    45

    Input Form (register3.xhtml)

    46

  • 8/11/2019 JSF2 Event Handling Languages

    23/27

    Bean: Processing the value

    private String language = "en";

    public String getLanguage() {return(language);

    }

    public void setLanguage(String language) {this.language = language;locale = new Locale(language);FacesContext.getCurrentInstance().getViewRoot()

    .setLocale(locale);}

    47

    What is displayed to the user is the language name (English, Espaol, etc.). But what isreturned as the value is the locale name (en, es, etc.). As discussed earlier, this can beaccomplished with menus and radio buttons by using a Map as the value. The Map keys arethe display values and th e Map values are the return values. See next page for the code.

    Bean: The List of Choices private static final Map LANGUAGE_MAP =

    new LinkedHashMap();

    static {LANGUAGE_MAP.put("English", "en");LANGUAGE_MAP.put("Espaol", "es");LANGUAGE_MAP.put(" ", "jp");

    }

    public Map getLanguages() {return(LANGUAGE_MAP);

    }

    48

    getLanguages is what is called by f:selectItems in the facelets code

  • 8/11/2019 JSF2 Event Handling Languages

    24/27

  • 8/11/2019 JSF2 Event Handling Languages

    25/27

    Results: Input Form(Normal Font Size)

    51

    Results: Input Form(Large Font Size)

    52

  • 8/11/2019 JSF2 Event Handling Languages

    26/27

    2013 Marty Hall

    Customized Java EE Training: http://courses.coreservlets.com/ Java, JSF 2, PrimeFaces, HTML5, JSP, Ajax, jQuery, Spring, Hibernate, RESTful Web Services, Hadoop, Android.

    Developed and taught by well-known author and developer. At public venues or onsite at your location.

    Wrap-Up

    Summary Event l isteners are used to handle events that

    affect only the user interface Typically fire before beans are populated and validation is

    performed Use immediate="true" to designate this behavior

    Form is redisplayed after listeners fire

    No navigation rules apply Things that submit forms:

    Use actionListener Applies to buttons, hypertext links, or image maps

    Things that dont submit forms Use side effect of value or use valueChangeListener

    Applies to radio buttons, menus, list boxes, checkboxes, textfields, etc. Require onclick="submit()" or onchange="submit()" to submit form

    Test carefully on all expected browsers54

  • 8/11/2019 JSF2 Event Handling Languages

    27/27