Jsf 2 faces-config.xml中没有视图范围

Jsf 2 faces-config.xml中没有视图范围,jsf-2,Jsf 2,为什么faces-config.xml中没有视图范围?如果我不使用faces-config.xml,我将如何设置bean来查看范围 我使用了以下bean文件: @ManagedBean @ViewScoped public class StatusBean2 implements Serializable { /** * */ private static final long serialVersionUID = -752899856282185631

为什么faces-config.xml中没有视图范围?如果我不使用faces-config.xml,我将如何设置bean来查看范围

我使用了以下bean文件:

@ManagedBean
@ViewScoped
public class StatusBean2 implements Serializable  {

    /**
     * 
     */
    private static final long serialVersionUID = -7528998562821856315L;
    private EntityManager em;

    public StatusBean2() {
        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("FreeBird");
        em = emf.createEntityManager();
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        int toIndex = 5;
       session.setAttribute("toIndex", toIndex);

    }
    public List<Status> getStatusList() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext()
                .getSession(true);
        User user = (User) session.getAttribute("userdet");
        Query query = em.createQuery("SELECT s FROM Status s WHERE s.email='"
                + user.getEmail() + "' ORDER BY s.timeMillis desc",
                Status.class);
        List<Status> results = query.getResultList();
        Query query1 = em.createQuery("SELECT f FROM Friend f WHERE f.email='"
                + user.getEmail() + "'", Friend.class);
        List<Friend> results1 = query1.getResultList();
        Iterator<Friend> it = results1.listIterator();
        while (it.hasNext()) {
            String email = it.next().getFriendEmail();
            Query query2 = em.createQuery(
                    "SELECT s FROM Status s WHERE s.email='" + email
                            + "' ORDER BY s.timeMillis desc", Status.class);
            List<Status> results2 = query2.getResultList();
            results.addAll(results2);

        }
        Collections.sort(results);

        int toIndex = (int) session.getAttribute("toIndex");
        List<Status> subList = results.subList(0, toIndex);

        return subList;

    }
}
在托管bean上使用@ViewScope注释:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class AViewScopedBean {
    //managed bean contents...
}
如果您不喜欢annotations配置非常奇怪,那么可以在faces-config.xml上设置视图范围

aViewScopedBean some.package.AViewScopedBean 看法 注意,这只适用于JSF2。检查您的faces配置文件是否配置为处理JSF 2.x版本:

根据您的问题更新进行编辑:

错误消息非常简单:

java.io.NotSerializableException:com.bean.StatusBean2

这意味着您的com.bean.StatusBean2还必须实现可序列化接口。从文件:

在遍历图形时,可能会遇到不支持序列化接口的对象。在这种情况下,将抛出NotSerializableException并标识不可序列化对象的类。这就是你得到的错误

您可以在此处了解有关Java序列化的更多信息:


从您的问题:是否有必要实现serializable?中,BalusC已经给出了一个很好的答案/解释:

在托管bean上使用@ViewScope注释:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class AViewScopedBean {
    //managed bean contents...
}
如果您不喜欢annotations配置非常奇怪,那么可以在faces-config.xml上设置视图范围

aViewScopedBean some.package.AViewScopedBean 看法 注意,这只适用于JSF2。检查您的faces配置文件是否配置为处理JSF 2.x版本:

根据您的问题更新进行编辑:

错误消息非常简单:

java.io.NotSerializableException:com.bean.StatusBean2

这意味着您的com.bean.StatusBean2还必须实现可序列化接口。从文件:

在遍历图形时,可能会遇到不支持序列化接口的对象。在这种情况下,将抛出NotSerializableException并标识不可序列化对象的类。这就是你得到的错误

您可以在此处了解有关Java序列化的更多信息:


从您的问题:是否需要实现serializable?中,BalusC已经给出了一个很好的答案/解释:

检查faces-config.xml中列出的xsd,例如:应该向您显示视图范围是允许的托管bean范围:

  <xsd:complexType name="faces-config-managed-bean-scopeOrNoneType">
    <xsd:annotation>
      <xsd:documentation>
        <![CDATA[[
        Defines the legal values for the <managed-bean-scope>
        element's body content, which includes all of the scopes
        normally used in a web application, plus the "none" value
        indicating that a created bean should not be stored into
        any scope.  Alternatively, an EL expression may be used
        as the value of this element.  The result of evaluating this
        expression must by of type java.util.Map.

        ]]>
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
      <xsd:restriction base="javaee:string">
        <xsd:pattern value="view|request|session|application|none|#\{.*\}"/>
      </xsd:restriction>
    </xsd:simpleContent>
  </xsd:complexType>
假设JSF2.0或更高版本

这本身并不是一个新的答案,只是另一种让你自己发现这是允许的方式

--------编辑--------

检查:

请注意,bean需要实现可序列化 存储在视图映射中,视图映射又存储在会话中。一些 servletcontainer配置将在磁盘上存储会话 而不是在内存中。配置后,这也是必需的 将JSF视图状态保存方法保存到客户端,而不是默认服务器

解释为什么视图范围需要可序列化。

检查faces-config.xml中列出的xsd,例如:应该向您显示视图范围是允许的托管bean范围:

  <xsd:complexType name="faces-config-managed-bean-scopeOrNoneType">
    <xsd:annotation>
      <xsd:documentation>
        <![CDATA[[
        Defines the legal values for the <managed-bean-scope>
        element's body content, which includes all of the scopes
        normally used in a web application, plus the "none" value
        indicating that a created bean should not be stored into
        any scope.  Alternatively, an EL expression may be used
        as the value of this element.  The result of evaluating this
        expression must by of type java.util.Map.

        ]]>
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
      <xsd:restriction base="javaee:string">
        <xsd:pattern value="view|request|session|application|none|#\{.*\}"/>
      </xsd:restriction>
    </xsd:simpleContent>
  </xsd:complexType>
假设JSF2.0或更高版本

这本身并不是一个新的答案,只是另一种让你自己发现这是允许的方式

--------编辑--------

检查:

请注意,bean需要实现可序列化 存储在视图映射中,视图映射又存储在会话中。一些 servletcontainer配置将在磁盘上存储会话 而不是在内存中。配置后,这也是必需的 将JSF视图状态保存方法保存到客户端,而不是默认服务器


解释为什么视图范围要求可序列化。

您可以发布faces config jsf文件版本吗?因为我得到了一个exception@AmlanKarmakar请编辑您的问题并添加错误的stacktrace好吗?@AmlanKarmakar,是的,需要可序列化,请看下面。你能发布faces config jsf文件版本吗?因为我得到了一个exception@AmlanKarmakar请编辑您的问题并添加错误的stacktrace好吗?@AmlanKarmakar,是的,需要可序列化,请参见下文。如果我没有使用faces-config.xml,为什么会出现此问题?如果我没有使用faces-config.xml,为什么会出现此问题?java.io.notserializableeexception:org.eclipse.persistence.internal.jpa.EntityManagerImpl我在添加Serializable后会出现上述异常。@AmlanKarmakar,这可能是因为您将一个不可序列化的变量注入到可序列化的托管bean中,从而使bean实际上不可序列化。要解决这个问题,您可以按照中概述的方法。您能给我举个例子吗?我在理解瞬态的概念方面遇到了问题。@AmlanKarmakar transient意味着变量的值被忽略了w
当对象被序列化时。这反过来意味着当对象被反序列化时,该变量的值将为null。这实际上意味着您无法安全地注入该依赖项。相反,您应该更喜欢BalusC答案中概述的延迟加载方法。@AmlanKarmakar我的答案中关于Java序列化的链接中介绍的所有内容。请注意,这些链接是为了被查看而存在的。java.io.NotSerializableException:org.eclipse.persistence.internal.jpa.EntityManagerImpl在添加Serializable之后,我得到了上述异常。@AmlanKarmakar,这可能是因为您将一个不可序列化的变量注入到可序列化的托管bean中,因此,使bean实际上不可序列化。要解决这个问题,您可以遵循中概述的方法。您能给我举个例子吗?我在理解瞬态的概念方面遇到了问题。@AmlanKarmakar transient意味着当对象被序列化时,变量的值被忽略了。这反过来意味着当对象被反序列化时,该变量的值将为null。这实际上意味着您无法安全地注入该依赖项。相反,您应该更喜欢BalusC答案中概述的延迟加载方法。@AmlanKarmakar我的答案中关于Java序列化的链接中介绍的所有内容。请注意,这些链接是为了便于查看。