JSF: навигация - PullRequest
       15

JSF: навигация

1 голос
/ 30 июня 2009

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

У меня есть два управляемых 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. сворачивание двух бобов в один

Ответы [ 4 ]

2 голосов
/ 30 июня 2009

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

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

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

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

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

1 голос
/ 30 июня 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, так как на нее будут ссылаться.

FacesContext fc = FacesContext.getCurrentInstance ();
fc.getExternalContext (). getRequestMap (). get ("d9", d9);

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

1 голос
/ 30 июня 2009

Вы должны настроить навигационный поток в Face-config.xml. В идеальном случае вы должны вернуть сообщение «status», которое будет определять поток. Узнайте больше по следующей ссылке: 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

Что касается передачи значений с одной страницы на другую, вы можете использовать вспомогательные компоненты. Подробнее о бобах здесь: 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 использует одноэлементные экземпляры, вы должны иметь возможность доступа к значениям из других bean-компонентов. Если вы найдете более подробную информацию об этой технике, я уверен, что вы получите то, что ищете.

0 голосов
/ 30 июня 2009

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

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

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

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

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

параметр в face-config.xml, и он не будет создан снова при загрузке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...