【问题标题】:Convert h:selectBooleanCheckbox value between boolean and String在布尔值和字符串之间转换 h:selectBooleanCheckbox 值
【发布时间】:2011-09-15 11:00:50
【问题描述】:

我有一个包含字段creditCard 的支持bean,它可以有两个字符串值yn 从数据库填充。我想在复选框中显示它,以便 yn 转换为 boolean

我该如何实现它?我不能使用自定义转换器,因为getAsString() 在呈现响应时返回String,而我需要boolean

【问题讨论】:

  • 为什么不能将 Backing Bean 实例变量 (creditCard) 更改为布尔值 - 最好不要表示 Java 有一个 Object 可以用字符串表示的类型。
  • 要求类型为“y”或“n”,因为在旧版数据库中为“y”或“n”
  • 是的,但是 Java 是数据库之上的一个层——它是面向对象的。通过作为字符串离开,您没有有效地使用对象。因此,在 Java 对象中,它可以是布尔值,然后在您的 SQL 交互中将其转换为“y”或“n”。因此,在读取 convert char to Boolean 和将 convert Boolean to char 写入时。
  • planetjones,这正是我向客户建议的,但客户希望 bean 仅具有 'y' 或 'n'
  • 哦,好吧@Tarun - 听起来你在那里不走运。谢天谢地,我从来没有要求指定对象应该是什么数据类型;)在这种情况下,@BalusC 更改访问器以转换为布尔值听起来很明智。

标签: jsf converter selectbooleancheckbox


【解决方案1】:

您可以将 BooleanConverter 用于 java 原语,这会将文本解析为您的 managedbean 中的布尔值,在 here 只需将您的代码像这样放入您的 .xhtml 文件中

<p:selectOneMenu id="id"
                        value="#{yourMB.booleanproperty}"
                        style="width:60px" converter="javax.faces.Boolean">
                        <p:ajax listener="#{yourMB.anylistener}"
                            update="anyIDcontrol" />
                        <f:selectItem itemLabel="------" itemValue="#{null}"
                            noSelectionOption="true" />
                        <f:selectItem itemLabel="y" itemValue="true" />
                        <f:selectItem itemLabel="n" itemValue="false" />                                                
                    </p:selectOneMenu>

托管豆:

@ManagedBean(name="yourMB")
@ViewScoped
public class YourMB implements Serializable {

       private boolean booleanproperty;


    public boolean isBooleanproperty() {
        return booleanproperty;
    }
    public void setBooleanproperty(boolean booleanproperty) {
        this.booleanproperty = booleanproperty;
    }      

}    

【讨论】:

  • 问题是关于复选框,而不是下拉菜单。
【解决方案2】:

我有类似的问题,我同意之前的帖子,你应该在持久层处理这个问题。 但是,还有其他解决方案。我的问题是下一个:我在数据库中有 TINYINT 列,它表示布尔值 true 或 false(0=false,1=true)。所以,我想在我的 JSF 应用程序中显示它们并作为布尔值处理。不幸的是,这不太可能,或者只是我没有找到合适的方法。但我的解决方案是使用复选框,而不是使用 selectOneMeny 并将这些值转换为“是”或“否”。这是代码,所以有类似问题的人可以使用它。

转换器:

@FacesConverter("booleanConverter")

public class BooleanConverter implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {

    short number= 0;

    try {
        if (value.equals("Yes")) {
            number= 1;
        }
    } catch (Exception ex) {
        FacesMessage message = new FacesMessage();
        message.setSeverity(FacesMessage.SEVERITY_FATAL);
        message.setSummary(MessageSelector.getMessage("error"));
        message.setDetail(MessageSelector.getMessage("conversion_failed") + ex.getMessage());
        throw new ConverterException(message);
    }
    return number;
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {


    return value.toString();
    //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

JSF 页面:

<h:selectOneMenu id="selectOnePlayerSucc" value="#{vezbaTrening.izvedenaUspesno}" converter="booleanConverter">
  <f:selectItems id="itemsPlayerSucc" value="#{trainingOverview.bool}" var="opt" itemValue="#{opt}" itemLabel="#{opt}"></f:selectItems>

在我的 ManagedBean 中,我创建了一个包含可能值(“是”和“否”)的列表

private List<String> bool;

public List<String> getBool() {
    return bool;
}

public void setBool(List<String> bool) {
    this.bool = bool;

@PostConstruct
public void init () {
    ...

    bool = new LinkedList<>();
    bool.add("Yes");
    bool.add("No");
}

【讨论】:

    【解决方案3】:

    &lt;h:selectBooleanCheckbox&gt; 组件不支持自定义转换器。该属性必须是boolean。期间。

    您可以做的最好的事情是在持久层中进行转换或添加额外的布尔 getter/setter 来装饰原始 y/n getter/setter 或完全替换旧的 getter/setter。例如

    private String useCreditcard; // I'd rather use a char, but ala.
    
    public boolean isUseCreditcard() {
        return "y".equals(useCreditcard);
    }
    
    public void setUseCreditcard(boolean useCreditcard) {
        this.useCreditcard = useCreditcard ? "y" : "n";
    }
    

    然后在&lt;h:selectBooleanCheckbox&gt; 中使用它。

    <h:selectBooleanCheckbox value="#{bean.useCreditcard}" />
    

    【讨论】:

    • 在执行此技巧时,请不要忘记将 get 替换为 is。 :)
    • &lt;h:selectBooleanCheckbox&gt; 不支持自定义转换器的任何原因? 15,000 人最终来到这里,最好也是唯一的答案就是重写生成的遗留数据库的持久层。
    • @ForguesR:因为支持的 value 属性类型是 boolean 而不是 Object。如果模型将布尔值表示为非布尔值(字符、数字、字符串等),那么我会说模型是错误的。考虑创建一个复合组件以使其保持干燥。
    • "模型将布尔值表示为非布尔值" - 如果自定义模型包装一个布尔值并且转换器将包装/解包它可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2013-01-24
    • 2016-11-16
    • 1970-01-01
    • 2021-05-07
    • 2012-03-10
    • 2012-12-16
    相关资源
    最近更新 更多