0

我有一个非常简单的应用程序。一个用@Named @SessionScoped 注释的bean 和2 个网页。home.xhtml 和 list.xhtml。当我在第一页设置 searchForm.hostanme 并在第二页再次访问它时。我可以从 sysout 语句中看到主机名正在设置,但是该值应该在 list.xhtml 页面上有一个空格。它在 home 和 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: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>

列表.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";
    }
}

我认为这可能是一个范围问题,但我已经尝试了几个范围,但在我导航到 list.xhtml 页面时仍然无法使用 searchForm.hostname。

我一直在阅读和阅读 JSF2,但我仍然无法解决我希望是一个简单的问题。

我有一个 beans.xml 文件在 WEB-INF 中。

4

1 回答 1

0

我来自 seam 2 背景,因此决定在这种情况下对 ConversationScoped 感到满意。它就像一个魅力。

更多的想法可能会帮助像我这样困惑的人。

正如我上面评论的那样,我之前在这个问题中遇到过类似的问题。正如上面的评论所暗示的,这是一个范围问题。我意识到这不仅是一个范围界定问题,还是一个混淆 CDI 和 JSF2 托管 bean 的问题。

两者都有一套独特的范围,但有一些重叠,为了不让你对真正不应该是一个难题的问题摸不着头脑,重要的是

  1. 决定是使用 CDI bean 还是 JSF2 托管 bean
  2. 彻底了解与任何一种 bean 相关的范围
  3. 当 eclipse 为您提供 2 种选择时,请知道您选择的是哪一种!

最后一个把我搞砸的次数比我应该承认的要多。

无论是使用 CDI 还是 JSF2,只需 google “cdi vs. jsf2”。我之所以选择 CDI,是因为我读过的大多数东西都说使用 CDI。我不确定它是否真的会对我的简单应用程序产生影响。

学习你的范围!有很多关于作用域的文章,不幸的是,我并没有像我应该的那样理解它们。

这是 JSF2 用户的经典之作:JSF2中的通信,我发现也很有帮助。(注意同一作者 - BalusC 是 JSF2 的任何东西的好资源)

至于 CDI,请坚持使用 Oracle 网站上的教程。

至于要导入哪个库——JSF 和 CDI 都有一个 SessionScoped,我认为还有 RequestScoped:

  • CDI 范围位于 javax.enterprise.context.SessionScoped
  • JSF 范围在 javax.faces.bean.SessionScoped

我一直只接受 eclipse 提供给我的第一件事。它真的可以把你搞砸,所以要注意!

于 2013-05-28T12:37:39.427 回答