我希望当用户在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来说),但我什至不知道如何开始做...
最佳答案
您必须添加f:ajax
(这是标准的,许多组件库都提供扩展版本)才能在change
中捕获inputText
事件。
<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()
,但这取决于您的模型。