当前位置: 首页 > 面试题库 >

如何在JSF中将List

柳涵意
2023-03-14
问题内容

情况:我有一个JavaServer Faces页面和一个会话范围的托管bean,它具有两个ArrayList<Integer>属性:一个用于保存可能值的列表,另一个用于保存所选值的列表。在JSF页面上,有一个<h:selectManyListBox>绑定了这两个属性的组件。

问题:提交表单后,选定的值将转换为字符串(ArrayList类型的属性实际上包含几个字符串!);但是,当我使用转换器时,出现如下错误消息:

验证错误:值无效

问题:如何将ArrayList<Integer>性<h:selectManyListBox>正确绑定到组件?

谢谢您的帮助。

具体代码

JSF页面:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:body>
        <h:form>
            <h:selectManyListbox value="#{testBean.selection}">
                <f:selectItems value="#{testBean.list}"></f:selectItems>
            </h:selectManyListbox>
            <h:commandButton action="#{testBean.go}" value="go" />
            <ui:repeat value="#{testBean.selection}" var="i">
                #{i}: #{i.getClass()}
            </ui:repeat>
        </h:form>
    </h:body>
</html>

和托管bean:

import java.io.Serializable;
import java.util.ArrayList;

@javax.faces.bean.ManagedBean
@javax.enterprise.context.SessionScoped
public class TestBean implements Serializable
{
    private ArrayList<Integer> selection;
    private ArrayList<Integer> list;

    public ArrayList<Integer> getList()
    {
        if(list == null || list.isEmpty())
        {
            list = new ArrayList<Integer>();
            list.add(1);
            list.add(2);
            list.add(3);
        }
        return list;
    }

    public void setList(ArrayList<Integer> list)
    {
        this.list = list;
    }

    public ArrayList<Integer> getSelection()
    {
        return selection;
    }

    public void setSelection(ArrayList<Integer> selection)
    {
        this.selection = selection;
    }

    public String go()
    {
            // This throws an exception: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
            /*for (Integer i : selection)
            {
                System.out.println(i);
            }*/
        return null;
    }
}

问题答案:

通用类型信息List<Integer>在运行时会丢失,因此仅看到的JSF / ELList无法识别该通用类型Integer并将其假定String为默认类型(因为这是HttpServletRequest#getParameter()应用请求值阶段中基础调用的默认类型)。

你需要要么显式地指定一个Converter,你可以使用JSF内置IntegerConverter

<h:selectManyListbox ... converter="javax.faces.Integer">

或仅使用它Integer[],其类型信息在运行时清楚地知道:

private Integer[] selection;


 类似资料:
  • 问题内容: 在JSF中减小viewstate隐藏字段大小的最佳方法是什么?我已经注意到,我的视图状态大约为40k,这会下降到客户端,并在每次请求和响应(尤其是到达服务器)时都返回到服务器,这对于用户来说是一个严重的问题。 我的环境JSF 1.2,MyFaces,Tomcat,战斧,RichFaces 问题答案: 您是否尝试过将状态保存设置为服务器?这应该仅将ID发送给客户端,并在服务器上保持完整状

  • 问题内容: 我想在我的JSF Web项目上实现Ajax。我搜索了一下,发现ICEFaces正在通过JSF支持Ajax。但是我不知道它的可用性。 任何人都有Ajax / JSF的经验,请指导我搬到哪里。 [编辑] 如果有人有类似经验,请也分享可用性。好与坏.. 问题答案: JSF 2.0使用f:ajax标记内置了对Ajax的支持。ICEFaces,OpenFaces和RichFaces的所有三个都还

  • 我正在开发一个遗留的JSF应用程序,我们正在慢慢地将其移植到Spring MVC。我们正在使用Spring Security来控制登录信息。在用户登录之后,JSF页面全局地实例化一个在任何地方都使用的会话作用域bean。我想更改应用程序,这样我们就可以先进入用Spring MVC开发的页面。 我尝试的一种方法是将bean转换为spring bean,并将其注入JSF,但不幸的是,这需要对bean进

  • 问题内容: 假设我是关于DTO的新手。我不知道将DTO与JSF,Spring和Hibernate一起使用是否正确。 让我解释一下,到目前为止,我已经在业务层和表示层中使用了直接从数据库创建的实体bean。现在,我决定尝试使用DTO方法,但是我不明白它们如何提供帮助。 例如,如果我有两个类User和Message,而一个用户有更多关联的消息;如何从数据库填充DTO?还是在业务层手动填充DTO?有人可

  • 问题内容: 我想在bean中动态创建控件。我正在使用JSF 2.0 现在我应该设置哪个属性来设置内容? 问题答案: 该代表变量,而不是一个组成部分。宁可使用。然后,您可以像在JSF页面中的真实组件中那样完全设置属性。如果您需要将其作为原始文件而不是原始文件,则需要使用进行创建。这是一个启动示例: 这里的便捷方法如下所示: 将其隐藏在某个实用程序类中很远,这样就不必一次又一次地重复所有代码;)参数显

  • 我在某个地方读到,使用CDI而不是JSF更好,因为有CDI,所以我尝试转换一些代码。我试图在JSF中使用,但总是无法实现。当使用时,没有任何问题。 index.xhtml