Использование управляемого свойства с CommandButton в Java Server Faces - PullRequest
1 голос
/ 07 октября 2009

В дополнение к моему вопросу «Создание страницы« Редактировать мой элемент »на Java Server Faces с Facelets» Я хотел бы рассказать о проблеме, которая была предоставлена.

Когда я нажимаю кнопку Command, ID = 100 удаляется, и страница обновляется, и это До он даже запускает метод, верно, так что это означает, что у меня нет идентификатора, когда я нажмите кнопку.

Как вы решаете это?

Имея этот управляемый компонент

public class BeanWithId implements Serializable {
  private String id;
  private String info;

  private void populateInfo() {
    info = "Some info from data source for id=" + id;
  }

  public String getId() { return id; }

  public void setId(String id) {
    this.id = id;
    populateInfo();
  }

  public String getInfo() { return info; }
  public void setInfo(String info) { this.info = info; }

  public String save() {
    System.out.println("Saving changes to persistence store");
    return null; // no navigation
  }
}

И добавление

<p><h:commandButton action="#{beanWithId.save}" value="Save" /></p>

На мою лицевую страницу. Теперь у меня также есть правильная информация в файле face-config.xml, и когда я получаю доступ к своей странице, используя? ID = 100, я получаю правильный возвращенный элемент.

Ответы [ 3 ]

1 голос
/ 07 октября 2009

Есть несколько способов сохранить идентификатор из исходного GET URL. Я не пытаюсь быть исчерпывающим.

Добавить параметр к commandLink

<h:commandLink action="#{beanWithId.save}" value="Save">
  <f:param name="ID" value="#{param.ID}" />
</h:commandLink>

При каждом нажатии на ссылку идентификатор будет установлен из параметра.

Использовать скрытое поле

<h:form>
  <h:inputHidden value="#{beanWithId.id}" />
  <p>ID: <h:outputText value="#{beanWithId.id}" /></p>
  <p>Info: <h:inputText value="#{beanWithId.info}" /></p>
  <p><h:commandButton action="#{beanWithId.save}" value="Save" /></p>
</h:form>

Каждый раз, когда форма публикуется, идентификатор будет установлен из формы.


Сохранение URL

Поскольку URL-адрес формы не включает исходный запрос, сообщение удалит идентификатор из URL-адреса на панели браузера. Это можно исправить с помощью перенаправления на стороне сервера после выполнения действия.

  public String save() {
    System.out.println("Saving changes to persistence store: id=" + id);
    redirect();
    return null; // no navigation
  }

  private void redirect() {
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext ext = context.getExternalContext();
    UIViewRoot view = context.getViewRoot();
    String actionUrl = context.getApplication().getViewHandler().getActionURL(
        context, view.getViewId());
    try {
      // TODO encode id value
      actionUrl = ext.encodeActionURL(actionUrl + "?ID=" + id);
      ext.redirect(actionUrl);
    } catch (IOException e) {
      throw new FacesException(e);
    }
  }
0 голосов
/ 07 октября 2009

Это решило мою проблему

<h:commandLink action="#{beanWithId.save}" value="">
    <f:verbatim><input type="button" value="Save"/></f:verbatim>
    <f:param name="id" value="#{beanWithId.id}"/>
</h:commandLink>

Работает как Charm, однако он удаляет видимый GET-параметр, но все еще сохраняется, чтобы face-config могла получить доступ к param.id.

0 голосов
/ 07 октября 2009

Вы можете установить свойство с помощью f: setPropertyActionListener, если вы используете JSF 1.2 или новее.

<h:commandButton value="Save" action="#{beanWithId.save}">
     <f:setPropertyActionListener target="#{beanWithId.id}" value="100" />
</h:commandButton>

Если вы используете JSF 1.1 или более раннюю версию, вы можете использовать

<f:param name="reqId" value="100" />

но на этот раз вы должны получить параметр и установить его вручную в действии, например:

public String save() {
String idParam
=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("reqId");
setId(idParam);
return null;
}
...