Java/J2EE/JavaServer Faces

Материал из Java эксперт
Версия от 06:49, 1 июня 2010; Admin (обсуждение | вклад) (1 версия)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Change Bean Property

 
//This example is from Jakub Czeczotka <jakub.czeczotka>
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.ru/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.ru/xml/ns/j2ee http://java.sun.ru/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
  ChangeBeanProperty
    </display-name>
    
    <description>
  Change a property of a simple bean
    </description>
    <listener>
        <listener-class>
      org.apache.myfaces.webapp.StartupServletContextListener
  </listener-class>
    </listener>
    
    <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
        
</web-app>

//faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.ru/dtd/web-facesconfig_1_1.dtd">
<faces-config>
    <managed-bean>
  <managed-bean-name>simpleBean</managed-bean-name>
  <managed-bean-class>eu.czeczotka.SimpleBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
</faces-config>
//SimpleBean.java
package eu.czeczotka;

import java.util.logging.Logger;

/**
 * Simple bean for the ChangeBeanProperty project
 *
 * @author Jakub Czeczotka
 */
public class SimpleBean {
    
    private Logger logger = Logger.getLogger ("eu.czeczotka.SimpleBean");
    private String property = "initial value";
    
    public String getProperty () {
  return this.property;
    }
    
    public void setProperty (String property) {
  logger.info ("changing property value from \"" + 
    this.property + "\" to \"" + property + "\"");
  this.property = property;
    }
}

//index.jsp
<% response.sendRedirect("changeBeanProperty.jsf"); %>
//changeBeanProperty.jsp
<%@ taglib uri="http://java.sun.ru/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.ru/jsf/html" prefix="h" %>
<%-- ChangeBeanProperty - author Jakub Czeczotka --%>
<html>
<head>
    <title>ChangeBeanProperty</title>
</head>
<body>
    <f:view>
  <h:form>
      <h3>Change a property of a simple bean</h3><br />
      <h:inputText value="#{simpleBean.property}" />
      <h:commandButton type="submit" value="change value" action="#" />
  </h:form>
    </f:view>
</body>
</html>





Common static utility methods that help in implementing JSF tags

 
/**********************************************************************************
 * $URL: https://source.sakaiproject.org/svn/jsf/branches/sakai_2-5-4/widgets/src/java/org/sakaiproject/jsf/util/TagUtil.java $
 * $Id: TagUtil.java 9278 2006-05-10 23:29:21Z ray@media.berkeley.edu $
 **********************************************************************************
 *
 * Copyright (c) 2003, 2004 The Sakai Foundation.
 *
* Licensed under the Educational Community License, Version 1.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.opensource.org/licenses/ecl1.php
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
 *
 **********************************************************************************/

import java.io.Serializable;
import java.util.HashMap;
import javax.faces.application.Application;
import javax.faces.ruponent.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.webapp.UIComponentTag;
/**
 * Common static utility methods that help in implementing JSF tags.
 */
public class TagUtil
{
    /** This class is meant for static use only */
    private TagUtil()
    {
    }
   /**
    * Set a string value on a component - used by tags setProperties() method.
    * Handles value bindings.
    */
   public static void setString(UIComponent component, String name, String value)
   {
       if (value == null)
       {
           return;
       }
       if (UIComponentTag.isValueReference(value))
       {
           setValueBinding(component, name, value);
       } else
       {
           component.getAttributes().put(name, value);
       }
   }
   /**
    * Set a string value on a component - used by tags setProperties() method.
    * Handles value bindings.
    */
   public static void setObject(UIComponent component, String name, String value)
   {
       if (value == null)
       {
           return;
       }
       if (UIComponentTag.isValueReference(value))
       {
           setValueBinding(component, name, value);
       } else
       {
           component.getAttributes().put(name, value);
       }
   }
    /**
     * Set an integer value on a component - used by tags setProperties()
     * method. Handles value bindings.
     */
    public static void setInteger(UIComponent component, String name, String value)
    {
        if (value == null)
        {
            return;
        }
        if (UIComponentTag.isValueReference(value))
        {
            setValueBinding(component, name, value);
        } else
        {
            component.getAttributes().put(name, Integer.valueOf(value));
        }
    }
    /**
     * Set a Map value on a component - used by tags setProperties() method.
     * Handles value bindings.
     */
    public static void setMap(UIComponent component, String name, String value)
    {
        if (value == null)
        {
            return;
        }
        if (UIComponentTag.isValueReference(value))
        {
            setValueBinding(component, name, value);
        } else
        {
            component.getAttributes().put(name, new HashMap());
        }
    }
    /**
     * Set a double value on a component - used by tags setProperties() method.
     * Handles value bindings.
     */
    public static void setDouble(UIComponent component, String name, String value)
    {
        if (value == null)
        {
            return;
        }
        if (UIComponentTag.isValueReference(value))
        {
            setValueBinding(component, name, value);
        } else
        {
            component.getAttributes().put(name, Double.valueOf(value));
        }
    }
    /**
     * Set a boolean value on a component - used by tags setProperties() method.
     * Handles value bindings.
     */
    public static void setBoolean(UIComponent component, String name, String value)
    {
        if (value == null)
        {
            return;
        }
        if (UIComponentTag.isValueReference(value))
        {
            setValueBinding(component, name, value);
        } else
        {
            component.getAttributes().put(name, Boolean.valueOf(value));
        }
    }
    /**
     * Set a ValueBinding on a component - used by tags setProperties() method.
     */
    public static void setValueBinding(UIComponent component, String name, String value)
    {
        FacesContext context = FacesContext.getCurrentInstance();
        Application app = context.getApplication();
        ValueBinding vb = app.createValueBinding(value);
        component.setValueBinding(name, vb);
    }
    /**
     * Set an ActionListener on a component - used by tags setProperties()
     * method. Handles method bindings.
     */
    public static void setActionListener(UIComponent component, String value)
    {
        setMethodBinding(component, "actionListener", value, new Class[] { ActionEvent.class });
    }
    /**
     * Set a ValueChangeListener on a component - used by tags setProperties()
     * method. Handles method bindings.
     */
    public static void setValueChangeListener(UIComponent component, String value)
    {
        setMethodBinding(component, "valueChangeListener", value,
                new Class[] { ValueChangeEvent.class });
    }
    /**
     * Set a Validator on a component - used by tags setProperties() method.
     * Handles method bindings.
     */
    public static void setValidator(UIComponent component, String value)
    {
        setMethodBinding(component, "validator", value, new Class[] { FacesContext.class,
                UIComponent.class, Object.class });
    }
    /**
     * Set an action on a component - used by tags setProperties() method.
     * Handles method bindings.
     */
    public static void setAction(UIComponent component, String value)
    {
        if (value == null)
        {
            return;
        }
        if (UIComponentTag.isValueReference(value))
        {
            setMethodBinding(component, "action", value, new Class[] {});
        } else
        {
            FacesContext context = FacesContext.getCurrentInstance();
            Application app = context.getApplication();
            MethodBinding mb = new ActionMethodBinding(value);
            component.getAttributes().put("action", mb);
        }
    }
    /**
     * Set a MethodBinding on a component - used by tags setProperties() method.
     */
    public static void setMethodBinding(UIComponent component, String name, String value,
            Class[] paramTypes)
    {
        if (value == null)
        {
            return;
        }
        if (UIComponentTag.isValueReference(value))
        {
            FacesContext context = FacesContext.getCurrentInstance();
            Application app = context.getApplication();
            MethodBinding mb = app.createMethodBinding(value, paramTypes);
            component.getAttributes().put(name, mb);
        }
    }
    public static String eval(String expression)
    {
        if (expression == null)
        {
            return null;
        }
        if (UIComponentTag.isValueReference(expression))
        {
            FacesContext context = FacesContext.getCurrentInstance();
            Application app = context.getApplication();
            return "" + app.createValueBinding(expression).getValue(context);
        } else
        {
            return expression;
        }
    }
    public static Integer evalInteger(String expression)
    {
        if (expression == null)
        {
            return null;
        }
        if (UIComponentTag.isValueReference(expression))
        {
            FacesContext context = FacesContext.getCurrentInstance();
            Application app = context.getApplication();
            Object r = app.createValueBinding(expression).getValue(context);
            if (r == null)
            {
                return null;
            } else if (r instanceof Integer)
            {
                return (Integer) r;
            } else
            {
                return Integer.valueOf(r.toString());
            }
        } else
        {
            return Integer.valueOf(expression);
        }
    }
    public static Double evalDouble(String expression)
    {
        if (expression == null)
        {
            return null;
        }
        if (UIComponentTag.isValueReference(expression))
        {
            FacesContext context = FacesContext.getCurrentInstance();
            Application app = context.getApplication();
            Object r = app.createValueBinding(expression).getValue(context);
            if (r == null)
            {
                return null;
            } else if (r instanceof Double)
            {
                return (Double) r;
            } else
            {
                return Double.valueOf(r.toString());
            }
        } else
        {
            return Double.valueOf(expression);
        }
    }
    public static Boolean evalBoolean(String expression)
    {
        if (expression == null)
        {
            return null;
        }
        if (UIComponentTag.isValueReference(expression))
        {
            FacesContext context = FacesContext.getCurrentInstance();
            Application app = context.getApplication();
            Object r = app.createValueBinding(expression).getValue(context);
            if (r == null)
            {
                return null;
            } else if (r instanceof Boolean)
            {
                return (Boolean) r;
            } else
            {
                return Boolean.valueOf(r.toString());
            }
        } else
        {
            return Boolean.valueOf(expression);
        }
    }
    /**
     * A shortcut MethodBinding which just returns a single string result -
     * useful when an action should just return a certain result, not call a
     * method.
     */
    private static class ActionMethodBinding extends MethodBinding implements Serializable
    {
        private String result;
        public ActionMethodBinding(String result)
        {
            this.result = result;
        }
        public Object invoke(FacesContext context, Object params[])
        {
            return result;
        }
        public String getExpressionString()
        {
            return result;
        }
        public Class getType(FacesContext context)
        {
            return String.class;
        }
    }
}





Converts UISelectMany submitted value to converted value

 
/**
 * Licensed under the Common Development and Distribution License,
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.sun.ru/cddl/
 *   
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.FacesException;
import javax.faces.ruponent.UIComponent;
import javax.faces.ruponent.UIInput;
import javax.faces.ruponent.UIOutput;
import javax.faces.ruponent.UISelectItem;
import javax.faces.ruponent.UISelectItems;
import javax.faces.ruponent.UISelectMany;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.el.ValueBinding;
import javax.faces.model.SelectItem;

/**
 * @author Maksim Kaszynski
 *
 */
public class SelectUtils {
  /**
   * Gathers all select items from specified component"s children
   * @param context
   * @param component
   * @return list of {@link SelectItems} taken from f:selectItem and f:selectItems
   */
  public static List getSelectItems(FacesContext context, UIComponent component) {
        ArrayList list = new ArrayList();
    Iterator kids = component.getChildren().iterator();
    while (kids.hasNext()) {
      UIComponent kid = (UIComponent) kids.next();
      if (kid instanceof UISelectItem) {
        Object value = ((UISelectItem) kid).getValue();
        if (value == null) {
          UISelectItem item = (UISelectItem) kid;
          list.add(new SelectItem(item.getItemValue(), item.getItemLabel(), item.getItemDescription(), item.isItemDisabled()));
        } else if (value instanceof SelectItem) {
          list.add(value);
        } else {
          String valueClass = (value != null ? """ + value.getClass().getName() + """ : "");
          throw new IllegalArgumentException(Messages.getMessage(Messages.INVALID_ATTRIBUTE_VALUE, valueClass, "<selectItem>"));
        }
      } else if (kid instanceof UISelectItems && null != context) {
        Object value = ((UISelectItems) kid).getValue();
        if (value instanceof SelectItem) {
          list.add(value);
        } else if (value instanceof SelectItem[]) {
          SelectItem items[] = (SelectItem[]) value;
          for (int i = 0; i < items.length; i++) {
            list.add(items[i]);
          }
        } else if (value instanceof Collection) {
          Iterator elements = ((Collection) value).iterator();
          while (elements.hasNext()) {
            list.add(elements.next());
          }
        } else if (value instanceof Map) {
          Iterator keys = ((Map) value).keySet().iterator();
          while (keys.hasNext()) {
            Object key = keys.next();
            if (key == null) {
              continue;
            }
            Object val = ((Map) value).get(key);
            if (val == null) {
              continue;
            }
            list.add(new SelectItem(val.toString(), key.toString(),
                null));
          }
        } else {
          String valueClass = (value != null ? """ + value.getClass().getName() + """ : "");
          throw new IllegalArgumentException("INVALID_ATTRIBUTE_VALUE, valueClass");
        }
      }
    }
        return list;
  }
  
  /**
   * Converts UISelectMany submitted value to converted value
   * 
   * @author Manfred Geiler
   * @param facesContext
   * @param component
   * @param submittedValue
   * @return
   * @throws ConverterException
   */
  public static Object getConvertedUISelectManyValue(
      FacesContext facesContext, UISelectMany component,
      String[] submittedValue) throws ConverterException {
    // Attention!
    // This code is duplicated in jsfapi component package.
    // If you change something here please do the same in the other class!
    if (submittedValue == null)
      throw new NullPointerException("submittedValue");
    ValueBinding vb = component.getValueBinding("value");
    Class valueType = null;
    Class arrayComponentType = null;
    if (vb != null) {
      valueType = vb.getType(facesContext);
      if (valueType != null && valueType.isArray()) {
        arrayComponentType = valueType.getComponentType();
      }
    }
    Converter converter = component.getConverter();
    if (converter == null) {
      if (valueType == null) {
        // No converter, and no idea of expected type
        // --> return the submitted String array
        return submittedValue;
      }
      if (List.class.isAssignableFrom(valueType)) {
        // expected type is a List
        // --> according to javadoc of UISelectMany we assume that the
        // element type
        // is java.lang.String, and copy the String array to a new List
        int len = submittedValue.length;
        List lst = new ArrayList(len);
        for (int i = 0; i < len; i++) {
          lst.add(submittedValue[i]);
        }
        return lst;
      }
      if (arrayComponentType == null) {
        throw new IllegalArgumentException(Messages.getMessage(Messages.VALUE_BINDING_TYPE_ERROR));
      }
      if (String.class.equals(arrayComponentType))
        return submittedValue; // No conversion needed for String type
      if (Object.class.equals(arrayComponentType))
        return submittedValue; // No conversion for Object class
      try {
        converter = facesContext.getApplication().createConverter(
            arrayComponentType);
      } catch (FacesException e) {
        System.out.println("NO_CONVERTER_FOUND_ERROR");
        return submittedValue;
      }
    }
    // Now, we have a converter...
    if (valueType == null) {
      // ...but have no idea of expected type
      // --> so let"s convert it to an Object array
      int len = submittedValue.length;
      Object[] convertedValues = (Object[]) Array.newInstance(
          arrayComponentType == null ? Object.class
              : arrayComponentType, len);
      for (int i = 0; i < len; i++) {
        convertedValues[i] = converter.getAsObject(facesContext,
            component, submittedValue[i]);
      }
      return convertedValues;
    }
    if (List.class.isAssignableFrom(valueType)) {
      // Curious case: According to specs we should assume, that the
      // element type
      // of this List is java.lang.String. But there is a Converter set
      // for this
      // component. Because the user must know what he is doing, we will
      // convert the values.
      int len = submittedValue.length;
      List lst = new ArrayList(len);
      for (int i = 0; i < len; i++) {
        lst.add(converter.getAsObject(facesContext, component,
            submittedValue[i]));
      }
      return lst;
    }
    if (arrayComponentType == null) {
      throw new IllegalArgumentException("VALUE_BINDING_TYPE_ERROR");
    }
    if (arrayComponentType.isPrimitive()) {
      // primitive array
      int len = submittedValue.length;
      Object convertedValues = Array.newInstance(arrayComponentType, len);
      for (int i = 0; i < len; i++) {
        Array.set(convertedValues, i, converter.getAsObject(
            facesContext, component, submittedValue[i]));
      }
      return convertedValues;
    } else {
      // Object array
      int len = submittedValue.length;
      ArrayList convertedValues = new ArrayList(len);
      for (int i = 0; i < len; i++) {
        convertedValues.add(i, converter.getAsObject(facesContext,
            component, submittedValue[i]));
      }
      return convertedValues.toArray((Object[]) Array.newInstance(
          arrayComponentType, len));
    }
  }
  public static Object getConvertedUIInputValue(
      FacesContext facesContext, UIInput component,
      String submittedValue) throws ConverterException{
    Object convertedValue = null;
    
    /*
    if (submittedValue == null)
      throw new NullPointerException("submittedValue");
    */
    if(InputUtils.EMPTY_STRING.equals(submittedValue)){
      return null;
    }
    Converter converter = getConverterForProperty(facesContext, component, "value");
    if(converter != null){
      convertedValue = converter.getAsObject(facesContext, component, submittedValue);
    } else {
      convertedValue = submittedValue;
    }
    
    return convertedValue;
  }
  /**
   * 
   * @param facesContext
   * @param component
   * @param property
   * @return converter for specified component attribute
   */
  public static Converter getConverterForProperty(FacesContext facesContext, UIOutput component, String property){
    Converter converter = component.getConverter();
    if(converter == null){
      ValueBinding valueBinding = component.getValueBinding(property);
      if(valueBinding != null){
        Class valueType = valueBinding.getType(facesContext);
        if(valueType == null || String.class.equals(valueType) || Object.class.equals(valueType)){
          //No converter needed
        } else {
          converter = facesContext.getApplication().createConverter(valueType);
          if(converter == null){
            throw new ConverterException("NO_CONVERTER_FOUND_ERROR");
          }
        }
      }
    } 
    return converter;
  }
  
}





Gathers all select items from specified component"s children

 
/**
 * Licensed under the Common Development and Distribution License,
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.sun.ru/cddl/
 *   
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.FacesException;
import javax.faces.ruponent.UIComponent;
import javax.faces.ruponent.UIInput;
import javax.faces.ruponent.UIOutput;
import javax.faces.ruponent.UISelectItem;
import javax.faces.ruponent.UISelectItems;
import javax.faces.ruponent.UISelectMany;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.el.ValueBinding;
import javax.faces.model.SelectItem;

/**
 * @author Maksim Kaszynski
 *
 */
public class SelectUtils {
  /**
   * Gathers all select items from specified component"s children
   * @param context
   * @param component
   * @return list of {@link SelectItems} taken from f:selectItem and f:selectItems
   */
  public static List getSelectItems(FacesContext context, UIComponent component) {
        ArrayList list = new ArrayList();
    Iterator kids = component.getChildren().iterator();
    while (kids.hasNext()) {
      UIComponent kid = (UIComponent) kids.next();
      if (kid instanceof UISelectItem) {
        Object value = ((UISelectItem) kid).getValue();
        if (value == null) {
          UISelectItem item = (UISelectItem) kid;
          list.add(new SelectItem(item.getItemValue(), item.getItemLabel(), item.getItemDescription(), item.isItemDisabled()));
        } else if (value instanceof SelectItem) {
          list.add(value);
        } else {
          String valueClass = (value != null ? """ + value.getClass().getName() + """ : "");
          throw new IllegalArgumentException(Messages.getMessage(Messages.INVALID_ATTRIBUTE_VALUE, valueClass, "<selectItem>"));
        }
      } else if (kid instanceof UISelectItems && null != context) {
        Object value = ((UISelectItems) kid).getValue();
        if (value instanceof SelectItem) {
          list.add(value);
        } else if (value instanceof SelectItem[]) {
          SelectItem items[] = (SelectItem[]) value;
          for (int i = 0; i < items.length; i++) {
            list.add(items[i]);
          }
        } else if (value instanceof Collection) {
          Iterator elements = ((Collection) value).iterator();
          while (elements.hasNext()) {
            list.add(elements.next());
          }
        } else if (value instanceof Map) {
          Iterator keys = ((Map) value).keySet().iterator();
          while (keys.hasNext()) {
            Object key = keys.next();
            if (key == null) {
              continue;
            }
            Object val = ((Map) value).get(key);
            if (val == null) {
              continue;
            }
            list.add(new SelectItem(val.toString(), key.toString(),
                null));
          }
        } else {
          String valueClass = (value != null ? """ + value.getClass().getName() + """ : "");
          throw new IllegalArgumentException("INVALID_ATTRIBUTE_VALUE, valueClass");
        }
      }
    }
        return list;
  }
  
  /**
   * Converts UISelectMany submitted value to converted value
   * 
   * @author Manfred Geiler
   * @param facesContext
   * @param component
   * @param submittedValue
   * @return
   * @throws ConverterException
   */
  public static Object getConvertedUISelectManyValue(
      FacesContext facesContext, UISelectMany component,
      String[] submittedValue) throws ConverterException {
    // Attention!
    // This code is duplicated in jsfapi component package.
    // If you change something here please do the same in the other class!
    if (submittedValue == null)
      throw new NullPointerException("submittedValue");
    ValueBinding vb = component.getValueBinding("value");
    Class valueType = null;
    Class arrayComponentType = null;
    if (vb != null) {
      valueType = vb.getType(facesContext);
      if (valueType != null && valueType.isArray()) {
        arrayComponentType = valueType.getComponentType();
      }
    }
    Converter converter = component.getConverter();
    if (converter == null) {
      if (valueType == null) {
        // No converter, and no idea of expected type
        // --> return the submitted String array
        return submittedValue;
      }
      if (List.class.isAssignableFrom(valueType)) {
        // expected type is a List
        // --> according to javadoc of UISelectMany we assume that the
        // element type
        // is java.lang.String, and copy the String array to a new List
        int len = submittedValue.length;
        List lst = new ArrayList(len);
        for (int i = 0; i < len; i++) {
          lst.add(submittedValue[i]);
        }
        return lst;
      }
      if (arrayComponentType == null) {
        throw new IllegalArgumentException(Messages.getMessage(Messages.VALUE_BINDING_TYPE_ERROR));
      }
      if (String.class.equals(arrayComponentType))
        return submittedValue; // No conversion needed for String type
      if (Object.class.equals(arrayComponentType))
        return submittedValue; // No conversion for Object class
      try {
        converter = facesContext.getApplication().createConverter(
            arrayComponentType);
      } catch (FacesException e) {
        System.out.println("NO_CONVERTER_FOUND_ERROR");
        return submittedValue;
      }
    }
    // Now, we have a converter...
    if (valueType == null) {
      // ...but have no idea of expected type
      // --> so let"s convert it to an Object array
      int len = submittedValue.length;
      Object[] convertedValues = (Object[]) Array.newInstance(
          arrayComponentType == null ? Object.class
              : arrayComponentType, len);
      for (int i = 0; i < len; i++) {
        convertedValues[i] = converter.getAsObject(facesContext,
            component, submittedValue[i]);
      }
      return convertedValues;
    }
    if (List.class.isAssignableFrom(valueType)) {
      // Curious case: According to specs we should assume, that the
      // element type
      // of this List is java.lang.String. But there is a Converter set
      // for this
      // component. Because the user must know what he is doing, we will
      // convert the values.
      int len = submittedValue.length;
      List lst = new ArrayList(len);
      for (int i = 0; i < len; i++) {
        lst.add(converter.getAsObject(facesContext, component,
            submittedValue[i]));
      }
      return lst;
    }
    if (arrayComponentType == null) {
      throw new IllegalArgumentException("VALUE_BINDING_TYPE_ERROR");
    }
    if (arrayComponentType.isPrimitive()) {
      // primitive array
      int len = submittedValue.length;
      Object convertedValues = Array.newInstance(arrayComponentType, len);
      for (int i = 0; i < len; i++) {
        Array.set(convertedValues, i, converter.getAsObject(
            facesContext, component, submittedValue[i]));
      }
      return convertedValues;
    } else {
      // Object array
      int len = submittedValue.length;
      ArrayList convertedValues = new ArrayList(len);
      for (int i = 0; i < len; i++) {
        convertedValues.add(i, converter.getAsObject(facesContext,
            component, submittedValue[i]));
      }
      return convertedValues.toArray((Object[]) Array.newInstance(
          arrayComponentType, len));
    }
  }
  public static Object getConvertedUIInputValue(
      FacesContext facesContext, UIInput component,
      String submittedValue) throws ConverterException{
    Object convertedValue = null;
    
    /*
    if (submittedValue == null)
      throw new NullPointerException("submittedValue");
    */
    if(InputUtils.EMPTY_STRING.equals(submittedValue)){
      return null;
    }
    Converter converter = getConverterForProperty(facesContext, component, "value");
    if(converter != null){
      convertedValue = converter.getAsObject(facesContext, component, submittedValue);
    } else {
      convertedValue = submittedValue;
    }
    
    return convertedValue;
  }
  /**
   * 
   * @param facesContext
   * @param component
   * @param property
   * @return converter for specified component attribute
   */
  public static Converter getConverterForProperty(FacesContext facesContext, UIOutput component, String property){
    Converter converter = component.getConverter();
    if(converter == null){
      ValueBinding valueBinding = component.getValueBinding(property);
      if(valueBinding != null){
        Class valueType = valueBinding.getType(facesContext);
        if(valueType == null || String.class.equals(valueType) || Object.class.equals(valueType)){
          //No converter needed
        } else {
          converter = facesContext.getApplication().createConverter(valueType);
          if(converter == null){
            throw new ConverterException("NO_CONVERTER_FOUND_ERROR");
          }
        }
      }
    } 
    return converter;
  }
  
}





Hello World JSF

 
//This example is from Jakub Czeczotka <jakub.czeczotka>

//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.ru/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.ru/xml/ns/j2ee http://java.sun.ru/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
  HelloWorldJSF
    </display-name>
    
    <description>
  Hello in the JavaServer Faces World!
    </description>
    <listener>
        <listener-class>
      org.apache.myfaces.webapp.StartupServletContextListener
  </listener-class>
    </listener>
    
    <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
        
</web-app>

//faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.ru/dtd/web-facesconfig_1_1.dtd">
<faces-config>
    <managed-bean>
  <managed-bean-name>helloWorldBean</managed-bean-name>
  <managed-bean-class>eu.czeczotka.HelloWorldBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
</faces-config>
//HelloWorldBean.java
package eu.czeczotka;
/**
 * Sample bean for the HelloWorldJSF project
 *
 * @author Jakub Czeczotka
 */
public class HelloWorldBean {
    
    private String hello = "Hello in the JavaServer Faces World!";
    
    public String getHello () {
  return this.hello;
    }
}
//helloworld.jsp
<%@ taglib uri="http://java.sun.ru/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.ru/jsf/html" prefix="h" %>
<%-- HelloWorldJSF - author Jakub Czeczotka --%>
<html>
<head>
    <title>HelloWorldJSF</title>
</head>
<body>
    <f:view>
  <h:form>
      <h3>
    <h:outputText value="#{helloWorldBean.hello}" />
      </h3>
  </h:form>
    </f:view>
</body>
</html>

//index.jsp
<% response.sendRedirect("helloworld.jsf"); %>





JavaServer Faces

 
/*
Chapter 21: JavaServer Faces.

Beginning JavaServer Pages
Vivek Chopra, Jon Eaves, Rupert Jones, Sing Li, John T. Bell
ISBN: 0-7645-7485-X
*/





jsf jpa war

Jsf Utility

 
/*
 * BEGIN_HEADER - DO NOT EDIT
 * 
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the "License").  You may not use this file except
 * in compliance with the License.
 *
 * You can obtain a copy of the license at
 * https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * HEADER in each file and include the License file at
 * https://open-jbi-components.dev.java.net/public/CDDLv1.0.html.
 * If applicable add the following below this CDDL HEADER,
 * with the fields enclosed by brackets "[]" replaced with
 * your own identifying information: Portions Copyright
 * [year] [name of copyright owner]
 */
/*
 * @(#)JsfUtility.java 
 *
 * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * END_HEADER - DO NOT EDIT
 */

import javax.el.MethodExpression;
import javax.el.ValueExpression;
import javax.faces.context.FacesContext;
import javax.faces.ruponent.UIComponent;

public class JsfUtility {
    protected JsfUtility() {
        super();
    }
    /**
     * Helper method to set value expression property.
     *
     * @param component The UIComponent to set a value expression for.
     * @param name The name of the value expression property.
     * @param expression The expresion for the value expression.
     */
    public static void setValueExpression(UIComponent component, String name, 
            String expression) {
        if (expression == null) {
            return;
        }
        FacesContext context = FacesContext.getCurrentInstance();
        component.setValueExpression(name, createValueExpression(
    context, expression, Object.class));
    }
    
    /**
     * Helper method to set a method expression property.
     * Create a method expression that returns String and has no
     * input paramaters.
     *   
     * @param component The UIComponent to set a value binding for.     
     * @param name The name of the method expression property
     * @param expression The expression to create.
     */
    public static void setMethodExpression(UIComponent component,
      String name, String expression) {
  setMethodExpression(component, name, expression,
    Object.class, new Class[0]);
    }
    /**
     * Helper method to set a method expression property.
     *   
     * @param component The UIComponent to set a value binding for.     
     * @param name The name of the method expression property
     * @param expression The expression to create.
     */
    public static void setMethodExpression(UIComponent component,
      String name, String expression, Class out, Class[] in) {
        if (expression == null) {
            return;
        }
        FacesContext context = FacesContext.getCurrentInstance();
        component.getAttributes().put(name, 
      createMethodExpression(context, expression, out, in));
    }
    public static MethodExpression createMethodExpression(
      FacesContext context, String expr, Class out, Class[] in) {
  return context.getApplication().getExpressionFactory().
      createMethodExpression(context.getELContext(), expr, out, in);
    }
    public static ValueExpression createValueExpression(
      FacesContext context, String expr, Class value) {
  return context.getApplication().getExpressionFactory().
      createValueExpression(context.getELContext(), expr, value);
    }
}





Simple utility class for CSS style formatting

 
/**
 * Licensed under the Common Development and Distribution License,
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.sun.ru/cddl/
 *   
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
 * Simple utility class for CSS style formatting
 * Current version isn"t thread-safe and doesn"t provide any validation
 * 
 * Usage is simle
 * <code>
 *  CSSFormat format = new CSSFormat();
 *  format.add("background-position", "top left");
 *  format.addURL("background-image", "/images/corner.gif");
 *  responseWriter.writeAttribute("style", format, null);
 * </code>
 * 
 * @author Maksim Kaszynski
 *
 */
public class CSSFormat {
  
  /**
   * Surrounds given URL with <code>url()</code>
   * @param url
   * @return
   */
  public static String url(String url){
    StringBuffer buf = new StringBuffer(url.length() + 7);
    buf.append("url(").append(url).append(")");
    return buf.toString();
  }
  /**
   * Formats property-value pair in CSS fashion
   * @param property
   * @param value
   * @return
   */
  public static String propertyValue(String property, String value){
    return formatPropertyValue(property, value);
  }
  
  private static String formatPropertyValue(Object property, Object value){
    StringBuffer buf = new StringBuffer();
    buf.append(property).append(": ").append(value).append(";");
    return buf.toString();
  }
  
  private Map properties;
  /**
   * Constructs an empty CSSFormat object
   */
  public CSSFormat() {
    properties = new HashMap();
  }
  /**
   * Constructs CSSFormat object 
   * and fills it with given parameters
   * @param property
   * @param value
   */
  public CSSFormat(String property, String value){
    properties = new HashMap(3);
    add(property, value);
    
  }
  /**
   * Adds property. If such property already exists, 
   * its value is replaced with new one
   * @param property
   * @param value
   * @return itself
   */
  public CSSFormat add(String property, String value){
    properties.put(property, value);
    return this;
  }
  /**
   * adds a property with URL value
   * given value is wrapped in <code>url()</code> clause
   * @param property
   * @param url
   * @return itself
   */
  public CSSFormat addURL(String property, String url){
    properties.put(property, url(url));
    return this;
  }
  /**
   * Concatenates all properties with their values to produce single-line CSS output 
   */
  public String toString() {
    return concatenate(null);
  }
  /**
   * Concatenates all properties with their values to produce CSS output
   * @param separator - custom string to be inserted between properties
   * @return
   */
  public String concatenate(String separator){
    StringBuffer output = new StringBuffer();
    for(Iterator iter = properties.entrySet().iterator(); iter.hasNext();){
      Map.Entry entry = (Map.Entry) iter.next();
      output.append(formatPropertyValue(entry.getKey(), entry.getValue()));
      if(separator != null && iter.hasNext()){
        output.append(separator);
      }
    }
    return output.toString();
  }
}