Hi Caroline,


Caroline Jen wrote:
...
> Meanwhile, would you mind advising:
> 

You want to clear the selected Items?

just clear or null the field in the bean.
public void clear(ActionEvent e)
{
  FacesContext facesContext =
      FacesContext.getCurrentInstance();
  ValueBinding vb = e.getComponent().getValueBinding();
  if (vb != null) {
    vb.setValue(facesContext, null);
  }
}



> 1. How do I deliver each element of the Object[]
> selectedItems into this method:
> 
> public void clear(ActionEvent e) 
> {
>     FacesContext facesContext =
> FacesContext.getCurrentInstance();
>     UIViewRoot uiViewRoot =
> facesContext.getViewRoot();
> 
>     // Here, I want to iterating through the Object[]
>     if (selectedItems[i] instanceof
> EditableValueHolder)
>     {

this can never happen, selectedItems[i] is not an instance of
EditableValueHolder !
selectedItems[i] is the first argument of SelectItem constructor:
String in my example.

>     EditableValueHolder evh = (EditableValueHolder)
> selectedItems[i];
>     evh.setSubmittedValue(null);

This has no effect in application phase.
just setting a variable to null and throwing away afterwards.

>     } 
> }
> 
> The code snippet above is a draft.  I am uncertain if
> I am doing it right.
> 



> 2. The multiple selections made by user are in an
> Object array (i.e. Object[] selectedItems).  How do I
> retrieve the values from this Object array (I think

Just fetch them from your bean or via ValueBinding from your Component.

> that the values retrieved will be a String[] if I am
> not terribly wrong.) to be sent to the database?

The type is the array type of the objects used to create the
selectItems, in my example Strings.

I attached updated TestBean.java and test.jsp with examples.

Regards
Volker Weber
-- 
Don't answer to From: address!
Mail to this account are droped if not recieved via mailinglist.
To contact me direct create the mail address by
concatenating my forename to my senders domain.
package org.apache.myfaces.examples;

import javax.faces.component.UISelectMany;
import javax.faces.component.UISelectItems;
import javax.faces.model.SelectItem;
import javax.faces.event.ActionEvent;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import java.util.List;
import java.util.ArrayList;

public class TestBean {

  private UISelectMany selectMany;

  private Object[] selectedItems;

  public TestBean() {
    selectMany = new UISelectMany();
    selectMany.setId("selectMany");

    UISelectItems items = new UISelectItems();
    items.setId("selectManyItems");
    items.setValue(createSelectItems());

    selectMany.getChildren().add(items);
  }

  private Object createSelectItems() {
    List items = new ArrayList();
    for (int i = 0; i < 10; i++){
      items.add(new SelectItem("item" + i, "Item No. " + i));
    }
    return items;
  }

  public UISelectMany getSelectMany() {
    return selectMany;
  }

  public void setSelectMany(UISelectMany selectMany) {
    this.selectMany = selectMany;
  }

  public Object[] getSelectedItems() {
    return selectedItems;
  }

  public void setSelectedItems(Object[] selectedItems) {
    this.selectedItems = selectedItems;
  }

  public void clear(ActionEvent e) {

    selectedItems = null;

// or if no direct access possible
//    FacesContext facesContext =
//        FacesContext.getCurrentInstance();
//    ValueBinding vb = e.getComponent().getValueBinding("value");
//    if (vb != null) {
//      vb.setValue(facesContext, null);
//    }

// ! we have to clear itemsDisplay here also !
// otherwise it holds his value until next submit click.    
    itemsDisplay = null;
  }

  private String itemsDisplay;

  public void submit(ActionEvent e){
    Object[] items;

    items = selectedItems;

// or if no direct access possible
//    FacesContext facesContext =
//        FacesContext.getCurrentInstance();
//    ValueBinding vb = e.getComponent().getValueBinding("value");
//    if (vb != null) {
//      items = vb.getValue(facesContext);
//    }

    if (items == null || items.length == 0) {
      itemsDisplay = "No items selected!";
    } else {
      StringBuffer sb = new StringBuffer("Selected Items: ");
      for (int i = 0; i < items.length; i++) {
        sb.append(items[i]);
        sb.append("; ");
      }
      itemsDisplay = sb.toString();
    }
  }

  public String getItemsDisplay() {
    return itemsDisplay;
  }
}
<%@ page import="org.apache.myfaces.examples.TestBean"%>
<%@ taglib uri="http://java.sun.com/jsf/html"; prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core"; prefix="f"%>

<%
  Object testbean = pageContext.getAttribute("TestBean", 
PageContext.SESSION_SCOPE);
  if (testbean == null) {
    pageContext.setAttribute("TestBean", new TestBean(), 
PageContext.SESSION_SCOPE);
  }
%>

<html>
<body>
<f:view>
  <h:form>

    <h:selectManyListbox id="selectMany"
        binding="#{TestBean.selectMany}"
        value="#{TestBean.selectedItems}" />

    <br>
    <h:commandButton value="Submit" actionListener="#{TestBean.submit}"/>
    <h:commandButton value="Clear" actionListener="#{TestBean.clear}"/>
    <br>
    <br>
    <h:outputText value="#{TestBean.itemsDisplay}"/>

  </h:form>
</f:view>
</body>
</html>

Reply via email to