为了支持我们组织的组件库,我想创建一个增强的selectManyMenu。要求是它类似于具有下拉菜单的类型,其菜单项具有显示是否被选中的复选框。除此之外,我希望下拉列表的顶行,由于缺少更好的术语而始终显示“气泡”的区域,包含所选项目的标签以及“X”按钮删除每一个,类似于“标记”小部件。
我想创建一个JSF自定义组件,而不是用一些隐藏它的jQuery插件来装饰现有的<h:selectManyMenu>
,并使用一堆混淆的javascript渲染自己的小部件,我不知道它是如何工作的。说实话,我发现没有一个我的用户界面非常好用,从根本上说,当JSF具有如此强大的自定义组件功能时,我不觉得好好利用JSF来填充一些jQuery小部件
为了解决我当前的问题,我设置了一个自定义组件类,扩展了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。
答案 0 :(得分: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。
确实更有意义。