2015-08-21 72 views
1

为了支持我们组织的组件库,我想创建一个增强的selectManyMenu。一个要求是,它类似于具有下拉菜单的类型,其菜单项具有显示是否被选中的复选框。最重要的是,我想要下拉的第一行,该区域总是可见的,以显示缺少更好的术语的“泡泡”,其中包含所选项目的标签以及“X”按钮删除每一个,类似于'标签'小部件。JSF 2.2多选择自定义组件

我想创建一个JSF自定义组件,而不是用现有的<h:selectManyMenu>来装饰一些隐藏它的jQuery插件,并用一堆混淆的javascript呈现它自己的小部件,我不知道它是如何工作的。说实话,没有一个我发现它与我们的用户界面非常吻合,并且从根本上说,我并不认为这很好地利用了JSF,当JSF拥有如此强大的自定义组件特性。

去我当前的问题,我已经建立了一个自定义组件类,它扩展UIInput,并提供encode*()方法来呈现一个<select><option>标签相同的<h:selectManyMenu>一样。我有一个问题与decode()方法:

@Override 
public void decode(FacesContext context) { 
    Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap(); 
    String clientId = getClientId(); 
    Object param = requestParams.get(clientId); 
    LOG.debug("param: {}", param); 
} 

的问题是param结束是一个字符串,不管我有多少项目中进行选择。我在前端验证了使用<h:selectManyMenu>时发送的完全相同的POST请求,所以我猜测我必须在decode()中对请求中的所有值做不同的处理。

对于奖励积分,任何人都可以指出我对源代码的简单解释,比如说,即使只是<h:inputText>。我能够浏览我们正在使用的JSF实现源代码Mojarra,但由于它使用单独的渲染器以及各种工厂和事物来选择使用哪个渲染器等,所以它非常难以遵循。我已经获得了到目前为止,靠着复合材料部件,必要时还需要支撑部件,但是这一个和其他一些部件从管道下来,我认为超出了可以有效使用的复合材料部件。

此外,这是最好的方法来完成我后?为现有的<h:selectManyMenu>创建自定义渲染器会更好吗?这似乎是一个更优雅的解决方案,因为这个组件基本上是一个selectManyMenu,只是呈现有点不同,前端有一点javascript。

回答

1

我猜你的问题可以归结为:

我怎样才能获得与JSF多个值的请求参数?

答案是:使用ExternalContext#getRequestParameterValuesMap()

@Override 
public void decode(FacesContext context) { 
    Map<String, String[]> requestParamValues = context.getExternalContext().getRequestParameterValuesMap(); 
    String clientId = getClientId(context); 
    String[] params = requestParamValues.get(clientId); 
    // ... 
} 

但它变得非常难以遵循,因为它使用独立的渲染器,以及工厂和事物的种种选择要使用的渲染器等

不知道,但也许你正在寻找What is the relationship between component family, component type and renderer type?How do I determine the renderer of a built-in component

我会更好地为现有的<h:selectManyMenu>创建自定义渲染器吗?这似乎是一个更优雅的解决方案,因为这个组件基本上是一个selectManyMenu,只是呈现有点不同,前端有一点javascript。

确实更有意义。

+0

感谢BalusC,这两个链接包含了很多我缺少的信息。我还发现http://omnifaces-fans.blogspot.ro/2014/11/omnifaces-component-family-component.html对组织我的组件库非常有帮助。 – Matt

+0

不客气。 – BalusC