<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks

    Selecting from a list of entities

    See http://docs.jboss.org/seam/latest/reference/en/html/controls.html

    • Use <s:selectItems> to produce a list of labeled select items from a list of entities.
    • Use <s:convertEntity> to map back and forth between the select items and the actual entity values. This is what allows you to map the value of the <h:selectOneMenu> directly to the property of the referencing entity (e.g. a property that is a many-to-one).
    <h:selectOneMenu value="#{person.continent}" required="true">                        (1)
    <s:selectItems value="#{continents.resultList}" var="continent" (2)
    label="#{continent.name}" noSelectionLabel="Please Select..."/>
    <s:convertEntity /> (3)
    </h:selectOneMenu>
    1. person is an entity that has been outjected into the conversation. It has a 'continent' property which is many-to-one association with another entity.
    2. continents is a Seam application framework 'query' object. This 'query' object should probably use a Seam-managed EntityManager because we want have the Hibernate session-in-view behavior so we don't get lazy initialization exceptions when rendering the labels, etc.
    3. s:convertEntity will convert the Continent entities into values for the HTML select, and vice versa.

    Tips

    1. To avoid LazyInitializationExceptions and/or writing extra code in your EJB/Controller bean to initialize objects, use session in view.
    2. For required fields, put required="true" on the selectOneMenu and override javax.faces.component.UIInput.REQUIRED in messages.properties (see Standard Faces Error Messages).

    Select from an enum

    This works just like selecting an entity, but <s:convertEnum/> is used instead.


    XHTML:

    <h:selectOneMenu id="marketStatus" value="#{person.status}"         (1)
    required="true">
    <s:selectItems value="#{enumLists.statusArray}" var="status" (2)
    label="#{status}"
    noSelectionLabel="Select a status..."/>
    <s:convertEnum/>
    </h:selectOneMenu>

    EnumLists.java:

    @Name("enumLists")
    @Scope(ScopeType.STATELESS)
    public class EnumLists
    {
    public Status[] getStatusArray()
    {
    return Status.values();
    }
    }
    1. person is an entity that has been outjected into the conversation. It has a 'status' property which is an enum.
    2. We need to expose the values of the enum as a list or an array, so we make a stateless POJO component with getters that returns arrays for various enums called enumLists.

    Multi-select from an enum

    Here we use a selectManyCheckbox.


    <h:selectManyCheckbox id="roles" 
    layout="pageDirection" value="#{person.roles}"
    required="true">
    <s:selectItems value="#{enumLists.roleArray}" var="role"
    label="#{role}"/>
    <s:convertEnum/>
    </h:selectManyCheckbox>

    Unfortunately, Seam's convertEnum can't handle multi selects yet. This example will yeild a strange exception:

    java.lang.IllegalArgumentException: java.util.List is not an enum type

    Luckily, it's very easy to create custom converter tags with Facelets. Here is the converter class that handles both ordinary enums and multi-selects:

    package eg;

    import javax.faces.component.*;
    import javax.faces.context.*;
    import javax.faces.convert.*;
    import javax.faces.el.ValueBinding;
    import java.util.List;
    import java.util.Collection;

    /**
    * Converter for enum multi-selects.
    * <br>User: Joshua Davis
    * Date: May 16, 2007
    * Time: 7:25:58 AM
    */
    public class EnumListConverter implements Converter
    {
    @SuppressWarnings({"unchecked"})
    public Object getAsObject(FacesContext context,
    UIComponent comp,
    String value)
    throws ConverterException
    {
    ValueBinding binding = comp.getValueBinding("value");
    Class enumType = binding.getType(context);
    if (enumType.isEnum()) // Single enum?
    return Enum.valueOf(enumType, value);
    else // List of enums.
    {
    // Find the s:selectItems so we can get the enum.
    List children = comp.getChildren();
    for (Object child : children)
    {
    if (child instanceof UIComponent)
    {
    UIComponent c = (UIComponent) child;
    ValueBinding b = c.getValueBinding("value");
    Class t = b.getType(context);
    // Array of enums: use the component type.
    if (t.isArray() && t.getComponentType().isEnum())
    {
    t = t.getComponentType();
    return Enum.valueOf(t,value);
    }
    else
    {
    Object v = b.getValue(context);
    // Collection of enum values, get the type of the first element.
    if (v instanceof Collection)
    {
    t = ((Collection) v).iterator().next().getClass();
    return Enum.valueOf(t,value);
    }
    }
    }
    }
    throw new ConverterException("Unable to find selectItems with enum values!");
    }
    }

    public String getAsString(FacesContext context,
    UIComponent component,
    Object object)
    throws ConverterException
    {
    if (object == null) {
    return null;
    }

    return ((Enum) object).name();
    }

    }
    Retrieved from "
    主站蜘蛛池模板: 红杏亚洲影院一区二区三区| 精品国产麻豆免费网站| 国产V亚洲V天堂无码| 亚洲免费一区二区| 久久久久亚洲精品男人的天堂| 亚洲AV无码专区在线观看成人| 日本一道一区二区免费看| 亚洲一本一道一区二区三区| 成人免费无码大片a毛片 | 久热综合在线亚洲精品| 久久国产精品免费专区| 亚洲综合综合在线| 免费av欧美国产在钱| 精品国产日韩亚洲一区91 | 国产AV无码专区亚洲AVJULIA | 亚洲av无码乱码在线观看野外| 国产亚洲视频在线播放大全| 亚洲第一页综合图片自拍| 国产裸体美女永久免费无遮挡| 亚洲精品乱码久久久久久自慰| 日韩精品无码免费一区二区三区 | 色se01短视频永久免费| youjizz亚洲| 又粗又黄又猛又爽大片免费| 国产日韩精品无码区免费专区国产| 国产成人精品日本亚洲网站| 18禁黄网站禁片免费观看不卡| 一本色道久久88—综合亚洲精品| 亚洲av日韩片在线观看| 一个人看的www免费视频在线观看| 亚洲自偷自拍另类12p| 成人毛片18女人毛片免费视频未| 国产91成人精品亚洲精品| 久久精品国产精品亚洲精品| 免费国产作爱视频网站| www一区二区www免费| 亚洲一区电影在线观看| 亚洲国产精品第一区二区三区| 色猫咪免费人成网站在线观看| 亚洲国产成人无码AV在线影院| 亚洲欧洲精品无码AV|