JSF: навигация

Я должен вас предупредить: вопрос может быть довольно глупым, но я не могу сейчас осмыслить его.

У меня есть два управляемых bean-компонента, скажем, A и B:

class A
{
    private Date d8; // ...getters & setters
    public String search()
    {
        // search by d8
    }
}

class B
{
    private Date d9; //...getters & setters
    public String insert()
    {
         // insert a  new item for date d9
    }    
}

а затем у меня есть две страницы JSP, pageA.jsp (страница поиска) и pageB.jsp (страница ввода). Я бы хотел поместить командную кнопку на pageB, чтобы открыть страницу поиска pageA, передав параметр d9 каким-то образом или переход на pageA сразу после b.insert (). Я бы хотел показать результат поиска после вставки.

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

Я подумал об этих возможных решениях:

  1. включая ** A ** в ** B ** и связывание командной кнопки с ** b.a.search **
  2. передача ** d9 ** как ** hiddenInput ** и добавление нового метода ** searchFromB ** в ** A ** (уродливо!)
  3. сворачивание двух бобов в одну

person Manrico Corazzi    schedule 30.06.2009    source источник
comment
Было бы приемлемо иметь дату (ее длинное значение) в качестве параметра URL-адреса? Каковы области применения этих бобов? Есть ли у них какое-то другое состояние или цель? То есть вы удалили для краткости другие переменные? Есть ли другие результаты навигации в A, кроме перехода в B?   -  person McDowell    schedule 30.06.2009
comment
Сценарий (немного) более сложный, и я хотел бы больше не запутывать его, объединяя два bean-компонента или вставляя один в другой. Я рассмотрю возможность передачи параметров, как вы (и некоторые другие) предложили, tnx.   -  person Manrico Corazzi    schedule 02.07.2009


Ответы (4)


Вы должны настроить поток навигации в faces-config.xml. В идеальном сценарии вы должны вернуть сообщение «статус», которое будет определять поток. Подробнее читайте по следующей ссылке: http://www.horstmann.com/corejsf/faces-config.html http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?topic=/com.businessobjects.integration.eclipse.doc.devtools/developer/JSF_Walkthrough8.html

Что касается передачи значений с одной страницы на другую, вы можете использовать вспомогательные bean-компоненты. Подробнее о поддержке beans здесь: http://www.netbeans.org/kb/articles/jAstrologer-intro.html http://www.coderanch.com/t/214065/JSF/java/backing-beans-vs-managed-beans

Надеюсь, я понял и правильно ответил на ваш вопрос

Способ разделения ценностей между фасолью

FacesContext facesContext = FacesContext.getCurrentInstance();
Application app = facesContext.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class);
return valueExp.getValue(elContext);

В приведенном выше коде «выражение» будет выглядеть примерно как #{xyzBean.beanProperty}. Поскольку JSF использует экземпляры singleton, вы должны иметь возможность доступа к значениям из других bean-компонентов. Если вы найдете более подробную информацию об этой технике, я уверен, что вы получите то, что ищете.

person Priyank    schedule 30.06.2009
comment
Что ж, у меня есть общее представление о JSF. Однако это особый случай: я хочу, чтобы два бина обменивались параметрами, а не обычный обычный поток. - person Manrico Corazzi; 02.07.2009
comment
Я отредактировал свой пост, чтобы отразить один аспект, с помощью которого вы можете по крайней мере определить значения атрибутов между bean-компонентами. Надеюсь, поможет. - person Priyank; 02.07.2009

Необработанный JSF 1.1 / 1.2 не предоставляет простого способа сделать это. У Seam / Spring есть способы обойти это, и есть несколько вещей, которые вы можете сделать. В JSF 2 должны быть решения этой проблемы после выпуска.

Вероятно, самым простым и целесообразным было бы свернуть два компонента в один и сделать его областью действия сеанса. Беспокойство, конечно же, заключается в том, что этот bean-компонент не будет удален и останется в сеансе до тех пор, пока сеанс не истечет. Ура Утечки памяти!

Другое решение - передать дату как параметр GET. Например, ваш метод действия может вызвать

FacesContext.getCurrentInstance().getExternalContext().redirect("pageB?d9=" + convertDateToLong(d9));

а затем получить параметр с другой стороны.

person Drew    schedule 30.06.2009
comment
Что ж, я думаю, мне следовало лучше спланировать кодирование заранее, но я попробую передать обходной путь параметров и посмотреть, будет ли это просто поддерживать работу приложения. Я до сих пор не получаю (и не люблю) JSF ... :( - person Manrico Corazzi; 02.07.2009
comment
В текущем воплощении JSF raw есть свои недостатки. Определенно верно. Модель навигации - одна из самых больших. Тем не менее, концепция на основе компонентов действительно хороша, ИМО, и фреймворки, с которыми я играю (Seam, Facelets, IceFaces и иногда RichFaces), позволяют мне обойти проблемы с JSF. Seam, IMO, убийственное приложение для JSF. Если вы собираетесь заниматься длительной JSF-разработкой, я настоятельно рекомендую вам взглянуть на seam. - person Drew; 02.07.2009

  1. Добавить атрибут действия commandButton, ссылающийся на метод B'insert

<h:commandLink action="#{b.insert}" value="insert"/>

  1. В методе B'insert добавьте параметр d9 в качестве параметра запроса. Затем верните произвольную строку из метода вставки.

FacesContext fc = FacesContext.getCurrentInstance ();
fc.getExternalContext (). GetRequestMap (). Put ("d9", d9);

  1. Затем перейдите к контексту лиц и добавьте навигацию от B к A с «from-result» в качестве произвольной строки, которую вы вернули из метода вставки. Но не добавляйте тег перенаправления в теги навигации, так как он уничтожит запрос, исходящий от B, и добавленный вами параметр (d9) будет очищен.

<from-outcome>return string of insert method</from-outcome>
<to-view-id>address of A</to-view-id>

  1. Затем вы можете получить «d9» в классе A, извлекая его из карты запроса в его конструкторе или в месте, где это более уместно (геттеры). Вы можете добавить его в область сеанса или поместить в скрытую переменную, если хотите отслеживать его позже.

в классе A при переходе по странице A должен быть инициализирован, поскольку на него будет ссылаться.

FacesContext fc = FacesContext.getCurrentInstance ();
fc.getExternalContext (). GetRequestMap (). Get ("d9", d9);

Извините, я не могу дать полный код, так как у меня здесь нет идей, его интернет-машина работает. Поэтому я не могу сообщить подробности.

person erdemoo    schedule 30.06.2009
comment
Я попробую это. Хотя мне не нравится идея работать над механикой JSF, я думаю, что это может быть единственным выходом. - person Manrico Corazzi; 02.07.2009

На мой взгляд, самый простой способ - это 3-й вариант - иметь методы запроса и вставки в одном классе. А можно сделать что-то вроде этого:

public String query () {
//... 
}

public String Insert() {  
 //insert
return Query(); }

Если ваши классы являются управляемыми компонентами, вы можете загрузить класс A из класса B и вызвать A.query () в методе вставки в конце. Также класс A может иметь

<managed-bean-scope>session</managed-bean-scope>

параметр в faces-config.xml, и он больше не будет создаваться при загрузке.

person Vanger    schedule 30.06.2009
comment
Сессионный анализ bean-компонентов - это нормально, но просто будьте осторожны, избавляясь от них, иначе ваша память может быть съедена довольно быстро для большого количества пользователей. - person Drew; 02.07.2009