是否可以为UISelectOne使用自定义JSF转换器,具体取决于Bean属性或UIInputText值的值?

时间:2012-04-02 11:19:26

标签: attributes converter jsf-1.2

我需要帮助解决问题。 我有一个应用程序,它显示数据库中的数据。

在数据库中,我使用一列来识别时间变化的对象(对象的版本)。 我的意思是行具有不同的ID,但具有相同的OBJECT_ID。 它们也通过有效性DATE列(VALID_FROM和VALID_TO)区分,因此我可以在选定的时间内找到正确的对象版本。

当向用户显示页面时,他将DATE设置为显示数据。 页面上有表格,有选择框(它们的项目是数据库中的对象)。 我只需要显示符合有效性条件的项目。 表单处理之前一切正常。

我正在使用自定义转换器,它将String值(数据库表中的行ID)转换为我的模型的Object,但我需要两个值来查找行。 (用户表单中的ID和日期)。

转换器方法getAsObject只获取一个VALUE参数(来自Select Box的ID)。 如何让第二个参数工作? 我可以从Bean或JSF输入对象中找到它吗?

如果有某种方式包含使用< f:attribute />,是否可以设置< f:attribute />通过Bean中的Java代码? (表单由bean方法生成)。

我很抱歉我的英语,我尽我所能:o)

P.S。:由于使用了JOIN,日期参数在sqlMap中很重要。我按ID搜索,但其他表由OBJECT_ID(version)=>连接。我只需要一行

感谢您的回答并度过愉快的一天

Worsik

编辑: 选择框由此代码生成:

                uiInput = new HtmlSelectOneMenu();
                UISelectItems items = new UISelectItems();
                items.setValueExpression("value", createValueExpression(
                        "#{myBean.referencedList." + item.getName() + "}",
                            List.class));
                uiInput.getChildren().add(items);

转换器方法如下所示:

public Object getAsObject(FacesContext context, UIComponent component, String value) 
{
    if (value.equals("")) {
        return null;
    }
    Class entityType = component.getValueExpression("value").getType(
            FacesContext.getCurrentInstance().getELContext());
    // TODO: need to get date value from form
            Date day = new Date();
    return myService(context).findEntityById(entityType, Long.valueOf(value), day);
}

entityType是数据库对象的模型类

myService调用Dao对象并调用sqlMap

select * from object_table as t1 
JOIN other_table as t2 ON t1.object_fk = t2.object_id // (or version_id) 
where t1.id = #id:INTEGER#
and t2.valid_from <= #day:DATE#
and t2.valid_to >= #day:DATE#

1 个答案:

答案 0 :(得分:1)

我想通过转换器中的代码<f:attribute/>如何做到这一点:

Date day = (Date) component.getAttributes().get("dateForSearch");
生成带有代码的SelectBox后的

和bean方法:

uiInput.getAttributes().put("dateForSearch", getSelectedDate()); 

并且在没有动态生成我使用的表单的页面中:

<SelectOneMenu> 
... 
<f:attribute name="dateForSearch" value="#{myBean.selectedDate}" />
</SelectOneMenu> 

我希望这不仅是自我回答的问题而且会帮助其他人