【问题标题】:How to populate certain text field after selecting item from <h:selectOneMenu /> JSF 2.0从 <h:selectOneMenu /> JSF 2.0 中选择项目后如何填充某些文本字段
【发布时间】:2012-09-12 20:03:54
【问题描述】:

我想要这样,当用户在 inputText 字段中选择项目时填充数据库中的数据。

我有一个选择菜单列表:

<h:selectOneMenu id="blah" value="#{controller.selected.id}" title="#{bundle.CreateTitle_id}" > 
     <f:selectItems value="#{controller.listOfId()}" />
</h:selectOneMenu>

假设有这样的输入文本:

<h:inputText value="In here we place value from backing bean"></h:inputText>

从列表中选择一个项目(包含 id)后,我如何使用我的支持 bean 中的其他数据填充文本字段(假设是一个名称)。

这是我的 backingBean:

@ManagedBean(name = "controller")
@SessionScoped
public class Bean implements Serializable {

private Catalog current;// here i'm holding int id, String name and other stuff...
private DataModel items = null;
@EJB
private probaSession.CatalogFacade ejbFacade;
private PaginationHelper pagination;
private int selectedItemIndex;

public KatalogController() {
}

public Katalog getSelected() {
    if (current == null) {
        current = new Catalog();
        selectedItemIndex = -1;
    }
    return current;
}

private KatalogFacade getFacade() {
    return ejbFacade;
}

public PaginationHelper getPagination() {
    if (pagination == null) {
        pagination = new PaginationHelper(10) {

            @Override
            public int getItemsCount() {
                return getFacade().count();
            }

            @Override
            public DataModel createPageDataModel() {
                return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}));
            }
        };
    }
    return pagination;
}

//......

public ArrayList<Catalog> listOfId()  { 
          ArrayList<Catalog> list=new ArrayList<Catalog>();
   try{

    String upit="select id from Catalog";

   Statement st=connection.createStatement(); 
   ResultSet rs=st.executeQuery(upit);

   while(rs.next()) {

      Katalog k=new Katalog();
      k.setId(rs.getInt(1));
      k.setName(rs.getString(2));





         list.add(k);


   }

 disconnect();


   }
   catch (Exception ex) {
       ex.printStackTrace();
   }

   return list;
}

差不多就是这样。

如果有什么需要解释的,我在这里。它认为这很容易(比如说使用 ajax),但我什至不知道如何开始......

【问题讨论】:

    标签: java jsf-2


    【解决方案1】:

    您必须添加一个f:ajax(即标准,许多组件库提供扩展版本)才能在inputText 中捕获change 事件

    <h:selectOneMenu id="blah" value="#{controller.selected.id}" title="#{bundle.CreateTitle_id}" >
      <f:selectItems value="#{controller.listOfId()}" />
      <f:ajax
         event="change"        <-- The event to capture. I believe that if not specified
                                     there is a default event to capture from
                                     each component (for inputText it would be "change")
         render="myForm:foo"  <-- Only repaint "blah"
         listener="#{controller.myBlahListener}"
    </h:selectOneMenu>
    
    <h:inputText id="foo" value="#{controller.fooText}"/>
    

    您的侦听器将读取this.getSelected().getId() 中的新值,并更改模型以使controller.getFooText() 返回新值(最简单的方法可能是this.setFooTest(this.getSelected().getId(),但这取决于您的模型。

    【讨论】:

    • 让我学习一点关于 ajax 的知识,我会尽快回复您。 :-) 这个听众有点困惑,但我想我能在几个小时内理解这一点..
    • 更新添加了触发 ajax 的事件。
    • 您能给我举一个您自己的简单例子吗?仅对于ajax部分,我得到了bean的概念,所有方法都很好,只是ajax部分令人困惑!我将拥有从数据库填充的 selectOneMenu 列表。它有自己的id。而且我还有输入文本,其中填充了来自使用 id 列表(在 selecOneMenu 中)的 bean 的相同数据,一旦列表被更改......如何编码? :)
    • 好的,我看错了你,我之前的代码是在修改 textField 时更新列表。在这里更正了。
    • 很抱歉让您感到无聊,但如果您有时间,请检查一下 :-) stackoverflow.com/questions/12530866/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2021-10-04
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多