2013-05-27 4 views
0

У меня очень простое приложение. Один компонент, аннотированный с @Named @SessionScoped и двумя веб-страницами. home.xhtml и list.xhtml. Когда я устанавливаю searchForm.hostanme на первой странице и снова получаю его на второй странице. Я могу видеть из инструкций sysout, что имя хоста становится установленным, но есть место, где это значение должно быть на странице list.xhtml. Он исчезает между домом и списком. Зачем?Почему управляемый компонент JSF 2 недоступен на странице результатов?

home.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html"> 
<h:head></h:head> 
<h:form> 
    <h:outputText value="Hi Mama" /> 
    <h:inputText value="#{searchForm.hostname}" /> 
    <h:commandButton action="list?faces-redirect=true" value="Devices" /> 
    <h:commandButton action="#{searchForm.reset}" value="Reset" immediate="true" type="reset" /> 
</h:form> 
</html> 

List.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html"> 
    <h:outputText value="Device is #{searchForm.hostname}" /> 
</html> 

SearchForm.java

import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named 
@RequestScoped 
public class SearchForm { 

    String hostname; 

    public String getHostname() { 
     return hostname; 
    } 

    public void setHostname(String hostname) { 
     System.out.println("hostname is "+ hostname); 
     this.hostname = hostname; 
    } 

    public String reset(){ 
     System.out.println("RESETTING"); 
     System.out.println("hostname is "+ hostname); 
     return "/index.xhtml"; 
    } 
} 

Я думаю, что это может быть проблемой обзорное, но я пытался несколько областей и до сих пор searchForm.hostname недоступно к моменту перехода на страницу list.xhtml.

Я читал и читал и читал JSF2, но я все еще не могу решить. Надеюсь, это простая проблема.

У меня есть файл beans.xml в WEB-INF.

+0

В вашем коде говорится, что bean is '@ RequestScoped'. Описанное поведение является правильным, если бит является объектом запроса. – SJuan76

+0

omg Я только что понял, что задал почти этот точный вопрос раньше. http://stackoverflow.com/questions/9861144/why-is-my-viewscoped-bean-not-surviving-hcommandbutton Я начал работать над jsf2 некоторое время назад и с тех пор не смотрел. Я думаю, что это неправильное соответствие библиотек. – april26

+0

Вы должны создать ответ и отметить его, если это так! –

ответ

0

Я родом из шва 2, поэтому решил, что мне было удобно с Разговором в этом контексте. Оно работало завораживающе.

Еще несколько мыслей, которые могут помочь смущенному человеку, как я.

Как я уже отмечал выше, я столкнулся с аналогичной проблемой до in this question. Как показывают вышеприведенные комментарии, это проблема с областью. Я понял, что это не только проблема, но и проблема путаницы между управляемыми бинами CDI и JSF2.

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

  1. Решают ли использовать CDI beans или управляемые bean-компоненты JSF2
  2. Тщательно изучите области, связанные с любым типом бобов
  3. Знайте, какой из них вы выбираете, когда eclipse предлагает вам 2 варианта!

Этот последний испортил мне больше времени, чем я должен признать.

Следует ли использовать CDI или JSF2 только Google «cdi vs. jsf2». Я выбрал CDI, так как большинство вещей, которые я читал, использовали для использования CDI. Я не уверен, что это действительно имеет значение для моего простого приложения.

Узнайте свои возможности! Есть много статей о областях, к сожалению, я не понимаю их так хорошо, как должен.

Это классика для пользователей JSF2: Communication in JSF2, и я нашел this полезной. (обратите внимание, что тот же автор - BalusC - хороший ресурс для чего-либо JSF2)

Что касается CDI, просто придерживайтесь учебника на веб-сайте Oracle.

И как, для которых библиотека для импорта - как JSF и CDI имеют SessionScoped, и я думаю, также RequestScoped:

  • CDI прицелы в javax.enterprise.context.SessionScoped
  • JSF прицелы в javax.faces.bean.SessionScoped

Я последовательно просто беру первое, что предлагает затмение. Это действительно может вас повредить, поэтому обратите внимание!

Смежные вопросы