4

Primefaces 3.4.2 で JSF 2.0 を使用しています

JSFページに次のものがあります

<p:selectOneMenu value="#{mb.employee}">
    <f:selectItems value="#{mb.employeeList}" var="emp"
    itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeCode}"/>
    <p:ajax listener="#{mb.changeMethod}" />
</p:selectOneMenu>

問題は、selectOneMenu で値を選択すると、ManagedBean の changeMethod で null を取得することです。System.out.println("val "+employee.getEmployeeName());

この理由は何でしょうか?この問題を解決するにはどうすればよいですか? 任意の hep は非常に高く評価されます。

ManagedBeanコード

@Named("mb")
@ViewAccessScoped
public class MyBean implements Serializable {

private Employee employee;
private List<Employee> employeeList;

@Inject
EmployeeService employeeService;

@PostConstruct
public void loadEmployees() {
employeeList = employeeService.getEmployees();
}


public void changeMethod() {
System.out.println("val  "+employee.getEmployeeName());
}


/* getters and setters for employee and employeeList */
.... methods
/* */

ユーザー コントロールでメソッドが呼び出されたときに、メイン フォームのボタン テキストを更新する方法は?

私のメインフォームで:

public string updateButtonText
{
   get { return btnInbox.Text; }
   set { btnInbox.Text = value; }
}

私のユーザーコントロールで:

public void refreshInbox()
{
   try
   {
       mailboxLogic.constructInbox(lstViewInbox, StudentsData.studentUsername);
       frmMailbox.updateButtonText = "Inbox" + "(" + MailboxLogic.emailcounter + ")";
   }
   catch (Exception ex)
   {
       MessageBox.Show("1"+ex.Message);
   }
}

リストビューを更新するたびに updateButtonText メソッドを呼び出そうとしています。

4

2 に答える 2

9

<p:ajax>処理するフォーム要素をコンポーネントで指定していないため、ajax リクエストは、他のフィールド検証と競合する可能性のある複数の値を送信する可能性があります。値が送信され、検証に失敗した場合、リクエスト値はモデルに設定されないことに注意してください。Application(Event) フェーズに到達すると、モデルの値には送信されたリクエストの値が反映されません。

これを試して:

<p:selectOneMenu value="#{mb.employee}">
    <f:selectItems value="#{mb.employeeList}" var="emp"
    itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeCode}"/>
    <p:ajax process="@this" partialSubmit="true" listener="#{mb.changeMethod}" />
</p:selectOneMenu>

上記では、モデルに適用される現在のコンポーネント リクエスト値のみを送信します。

編集:

実際には、ajax イベントで送信されるリクエスト値がないため、おそらく検証の問題ではありません。

Primefaces マニュアルによると:

process null String 部分リクエストで処理するコンポーネント。

ajax で更新する null 文字列コンポーネントを更新します。

2 番目の列はデフォルト値です。標準<f:ajax>では、execute属性のデフォルト@thisは ですが、 の場合はそうではありません<p:ajax>process現在のコンポーネントを送信する場合は、属性でこれを指定する必要があります。

于 2013-02-20T19:17:35.030 に答える
2

従業員オブジェクトを扱っていることを知らせるために、 p:selectOneMenuにコンバーターを追加する必要があります。コンバーター クラスを作成し、それをコンバーター属性と共に使用します。これがサンプルコンバーターです。

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;

@FacesConverter("employeeConverter")
@Configurable
public class EmployeeConverter implements Converter {

    @Autowired
    EmployeeService employeeService;

    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        if (value == null || value.length() == 0) {
            return null;
        }
        Long id = Long.parseLong(value);
        return employeeService.findUser(id);
    }

    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        return value instanceof Employee ? ((Employee) value).getId().toString() : "";
    }
}
于 2013-02-21T15:05:17.343 に答える