Устаревшие richfaces javax.faces.el.MethodBinding заменяет использование - PullRequest
5 голосов
/ 29 января 2010

Я обнаружил, что этот фрагмент кода работает в том смысле, что я могу программно создать выпадающее меню richfaces. Но часть кода устарела. Кто-нибудь может подсказать, что вместо звонков устареть вставлять?

Спасибо

     public HtmlDropDownMenu getMyMenu()
 {
  HtmlDropDownMenu menu = new HtmlDropDownMenu();
  menu.setValue( "Node Select" );

  HtmlMenuItem menuItem = new HtmlMenuItem();
  // TODO programmatically pass from getNodes into a String[] rather than an ArrayList of SelectItems
  String subOption = "myBox";   
  menuItem.setValue( subOption );

  Application app = FacesContext.getCurrentInstance().getApplication();
  javax.faces.el.MethodBinding mb = app.createMethodBinding( "#{PrismBacking.onItemClick}", new Class[] { ActionEvent.class } );
  menuItem.setActionListener( mb );

  menu.getChildren().add( menuItem );
  return( menu );
 }

 public void onItemClick( ActionEvent event )
 {
  Object obj = event.getSource();

  if( obj instanceof HtmlMenuItem )
  {
   HtmlMenuItem item = (HtmlMenuItem)obj;
   if( item != null )
   {
    lastItem = item.getValue().toString();

   }
  }
 }

устаревшие строки кода:

   javax.faces.el.MethodBinding mb = app.createMethodBinding( "#{PrismBacking.onItemClick}", new Class[] { ActionEvent.class } );
  menuItem.setActionListener( mb );

Ответы [ 3 ]

12 голосов
/ 29 января 2010

Как обычно, все амортизация действительно описана в документации API, включая подробности о замене.

Чтобы получить четкий обзор, ниже представлены способы динамического создания Action и ActionListener до JSF 1.2 и после JSF 1.2:

Привязка создания действия в JSF 1.0 / 1.1:

MethodBinding action = FacesContext.getCurrentInstance().getApplication()
    .createMethodBinding("#{bean.action}", new Class[0]);
uiCommandComponent.setAction(action);

Создать привязку ActionListener в JSF 1.0 / 1.1:

MethodBinding actionListener =  FacesContext.getCurrentInstance().getApplication()
    .createMethodBinding("#{bean.actionListener}", new Class[] {ActionEvent.class});
uiCommandComponent.setActionListener(actionListener);

Создать выражение действия в JSF 1.2 или новее:

FacesContext context = FacesContext.getCurrentInstance();
MethodExpression action = context.getApplication().getExpressionFactory()
    .createMethodExpression(context.getELContext(), "#{bean.action}", String.class, new Class[0]);
uiCommandComponent.setActionExpression(action);

Создать выражение ActionListener в JSF 1.2 или новее:

FacesContext context = FacesContext.getCurrentInstance();
MethodExpression actionListener = context.getApplication().getExpressionFactory()
    .createMethodExpression(context.getELContext(), "#{bean.actionListener}", null, new Class[] {ActionEvent.class});
uiCommandComponent.addActionListener(new MethodExpressionActionListener(actionListener));

Чтобы избежать большого количества стандартного кода, вы можете просто красиво обернуть его в вспомогательные методы (если необходимо в вспомогательном / служебном классе), например:

public static MethodExpression createAction(String actionExpression, Class<?> returnType) {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().getExpressionFactory()
        .createMethodExpression(context.getELContext(), actionExpression, returnType, new Class[0]);
}

public static MethodExpressionActionListener createActionListener(String actionListenerExpression) {
    FacesContext context = FacesContext.getCurrentInstance();
    return new MethodExpressionActionListener(context.getApplication().getExpressionFactory()
        .createMethodExpression(context.getELContext(), actionListenerExpression, null, new Class[] {ActionEvent.class}));
}

так что вы можете просто использовать его следующим образом:

uiCommandComponent.setActionExpression(createAction("#{bean.action}", String.class);
uiCommandComponent.addActionListener(createActionListener("#{bean.actionListener}");
7 голосов
/ 29 января 2010

В Javadocs ясно сказано:

Application.createMethodBinding

Устаревшие . Это было заменено вызовом getExpressionFactory () затем ExpressionFactory.createMethodExpression (javax.el.ELContext, java.lang.String, java.lang.Class, java.lang.Class []) .

Вот как это использовать:

MethodExpression methodExpression = 
    application.getExpressionFactory().createMethodExpression(
         FacesContext.getCurrentInstance().getELContext(), 
         "#{PrismBacking.onItemClick}", 
         null, 
         new Class[] { ActionEvent.class });
menuItem.setActionExpression(methodExpression);
1 голос
/ 29 января 2010

Механизмы замены подробно описаны в JEE5 API (частью которого является JSF):

...