JSF 1.2 - проблема с передачей количества страниц бобу для создания списка - PullRequest
2 голосов
/ 12 ноября 2009

У меня есть эта опция выбора:

<f:verbatim>Pages: </f:verbatim>
<h:selectOneMenu id="selectPage" value="#{pageList.selectedPage}">
    <f:selectItems value="#{pageList.selectPages}" />
</h:selectOneMenu>

И базовый компонент (называемый mybean2 ) для этого:

private int pages;

public void getPages(int Pages) 
{
 this.pages = Pages;
}

// getter methods
public List<SelectItem> getSelectPages() 
{
 selectPages = new ArrayList<SelectItem>();
        pages++;
        for (int i = 1; i > pages; i++) {
         selectPages.add(new SelectItem(Integer.toString(i), Integer.toString(i)));
        } 

     return selectPages;
}

public String getSelectedPage()
{
     return selectedPage;
}

// setter methods
public void setSelectPages(List<SelectItem> selectPages) {
        this.selectPages = selectPages;
}  

public void setSelectedPage(String selectedPage) {
     this.selectedPage = selectedPage;
}

Приведенный выше метод getPages возвращает количество страниц из метода mybean1.submit . Таким образом, например, когда метод submit возвращает 30, как я могу передать это значение в метод getSelectPages, чтобы он мог динамически создавать количество страниц, как в:

for (int i = 1; i > pages; i++) {

Кроме того, я хочу, чтобы mybean2 был универсальным, т. Е. Я не хочу, чтобы другие bean-компоненты ссылались непосредственно на mybean2. Например, я не хочу ссылаться так в mybean2:

mybean1 mb1 = new mybean1();
pages = mb1.getPages();

В противном случае я должен объявить отдельные экземпляры других bean-компонентов (около 12 других), которые отправляют количество страниц в mybean2 для его действия - этот способ был бы слишком грязным ...

Любая подсказка или пример кода приветствуются. Спасибо.

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

Если вы хотите, чтобы ваш mybean2 был универсальным, вы можете поместить конкретный бин в качестве переменной сеанса / запроса и в вашем mybean2 получить его из этой области.
Код для установки компонента в области видимости сеанса:

FacesContext context = FacesContext.getCurrentInstance();
Map sessionMap = context.getExternalContext().getSessionMap();
sessionMap.put("beanName", yourBean);

В вашем mybean2 вы получите текущий боб по:

FacesContext context = FacesContext.getCurrentInstance();
Map applicationMap = context.getExternalContext().getApplicationMap();
GetPagesInterface yourBean = (GetPagesInterface)applicationMap.get("beanName");

Для следующего кода вы можете поместить этот код в методы и создать для этого служебный компонент. Также метод public void getPages(int Pages) должен быть как метод в интерфейсе (GetPagesInterface), который должны реализовывать все компоненты.

Помимо , в вставленном вами коде есть ошибка, код:

pages++;
   for (int i = 1; i > pages; i++)

Вы должны заменить на:

for (int i = 1; i > pages+1; i++)

потому что метод getSelectPages может вызываться много раз, и это увеличит ценность ваших страниц.

0 голосов
/ 14 ноября 2009

Решил это. Просто переместите код для расчета страниц с mybean1 на mybean2.

@ BalusC. Привет, Баулке - pageList - это mybean2. Извините, я пытался упростить это. Mybean1 - это место, где я обрабатываю метод submit, чтобы получить количество страниц для передачи в pageList (он же mybean2). Во всяком случае, я уже решил эту проблему.

Было бы хорошо, однако, знать, как это сделать с помощью внедрения зависимостей (DI). Я прошел спецификации JSF 1.2, но там не было примера о DI, которому я мог бы следовать Я думаю, что мой метод работает хорошо для меня.

0 голосов
/ 12 ноября 2009

Как говорит cetnar , вы можете искать значения напрямую, используя FacesContext.

В качестве альтернативы вы можете ввести значение через вашу конфигурацию faces-config.xml. В этом примере дескриптора дорогостоящий для создания bean-компонент сохраняется в сеансе и внедряется в bean-компонент области запроса, когда это требуется:

  <managed-bean>
    <managed-bean-name>expensiveBean</managed-bean-name>
    <managed-bean-class>lifetime.ExpensiveBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  <managed-bean>
    <managed-bean-name>requestBean</managed-bean-name>
    <managed-bean-class>lifetime.RequestBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
      <property-name>cachedAsset</property-name>
      <property-class>lifetime.ExpensiveBean</property-class>
      <value>#{expensiveBean}</value>
    </managed-property>
  </managed-bean>

Преимущество этого подхода состоит в том, что вы можете сохранить свою модель свободной от JSF-зависимостей, упрощая их для модульного тестирования. Конечно, это не всегда возможно сделать. См. JSF spec для получения полной информации о правилах внедрения свойств (вам, вероятно, нужна спецификация 1.2).

...