Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单blog中的JSf请求范围_Java_Jsf 2_Scope - Fatal编程技术网

Java 简单blog中的JSf请求范围

Java 简单blog中的JSf请求范围,java,jsf-2,scope,Java,Jsf 2,Scope,我正在尝试用JSF2.0创建简单的博客。它包含两个类: BlogManager(会话范围内) 博客(在请求范围内) 然后,在我的xhtml表单中,我编写了以下内容: <h:form> <fieldset> <legend>Blog</legend> <p> Title:

我正在尝试用JSF2.0创建简单的博客。它包含两个类:

BlogManager(会话范围内) 博客(在请求范围内)

然后,在我的xhtml表单中,我编写了以下内容:

<h:form>
            <fieldset>
                <legend>Blog</legend>
                <p>
                    Title:
                    <h:inputText value="#{blog.title}" />
                </p>
                <p>
                    Text:
                    <h:inputTextarea value="#{blog.text}" />
                </p>
                <p>
                    <h:commandButton action="#{blogManager.addBlog}" />
                </p>
            </fieldset>
        </h:form>

博客

标题:

正文:

当我点击提交时,它说博客目标无法到达。这是请求范围。我在想,一旦jsf找不到blog对象,它就会创建并向blog对象分配用户输入。然后我可以在blogManager中看到它。但它不起作用。博客类应该使用什么范围?我可以在blogManager中插入请求范围吗


谢谢

您不能将范围较低的对象注入范围较高的对象。因此,不能将请求范围的对象
blog
注入会话范围的
blogManager
。如果您将它创建为一个简单的pojo,那么您可以像

一样访问它。理想情况下,您的
博客
类应该只是一个pojo。它应该是
BlogManager
的成员。所以你唯一需要的是 博客管理员:

@Named("blogManager")
@SessionScoped
public class BlogManager {
    private List<Blog> blogs;

    private Blog blog;

    public BlogManager() {
        blogs = new ArrayList<Blog>();
            blog = new Blog();
    }

    // getter setters for blog and blogs

    public void addBlog() {
        blogs.add(blog);
    }

    public void removeBlog(Blog blog) {
        blogs.add(blog);
    }
}
以及您的xhtml:

<h:form>
            <fieldset>
                <legend>Blog</legend>
                <p>
                    Title:
                    <h:inputText value="#{blogManager.blog.title}" />
                </p>
                <p>
                    Text:
                    <h:inputTextarea value="#{blogManager.blog.text}" />
                </p>
                <p>
                    <h:commandButton action="#{blogManager.addBlog}" />
                </p>
            </fieldset>
        </h:form>

博客

标题:

正文:


您正在混合JSF和CDI注释。您已经通过CDI的
@Named
管理了bean,但是您正在尝试使用JSF特定的
@ManagedProperty
注释将一个CDI管理的bean注入另一个CDI管理的bean中。这是行不通的。您需要使用CDI自己的
@Inject
注释。
@ManagedProperty
仅适用于JSF
@ManagedBean

相应地进行修正:

@Inject
private Blog blog;
此外,您还需要绝对确保,当您通过CDI的
@Named
管理bean时,像
@SessionScoped
这样的所有范围注释都来自
javax.enterprise.context
包,而不是来自
javax.faces.bean



与具体问题无关,这个设计是有缺陷的。
Blog
类不应该是一个托管bean,而应该是一个
@实体
,并且只是
BlogManager
类的一个普通属性。

只是好奇,你的
Blog
bean似乎没有任何行为,那么需要将其定义为
RequestScoped
bean吗?为什么不保留一个简单的pojo呢?如果我使用简单的pojo,那么我就不能在XHTML页面中使用它进行用户输入:例如:如果使用
@ManagedBean(“YourBean”)
注释而不是使用
@Named(“YourBean”)
,会发生什么?试试看。@elbek:当然可以。检查我下面的答案。+1对于
您不能将较低范围的对象注入较高范围的对象
错误,这仅适用于JSF托管bean,而不适用于CDI托管bean。这是我第二次这样做的,但问题是每次请求都使用BlogManager的JSF类构造函数?它应该在会话中,并且应该在每个会话中创建一次。我错了吗?真奇怪!你说得对,它不应该被多次调用。其他地方出了点问题..哎呀。。我显然忽略了一个事实,即它的CDI注释。你的答案应该被标记为答案,而不是我的!
public class Blog {

    private Integer id;

    private String title;
    private String text;
    private Date date;
    private Integer readed;

    public Blog() {
        id = (int) System.currentTimeMillis();
    }

    // getters-setters

}
<h:form>
            <fieldset>
                <legend>Blog</legend>
                <p>
                    Title:
                    <h:inputText value="#{blogManager.blog.title}" />
                </p>
                <p>
                    Text:
                    <h:inputTextarea value="#{blogManager.blog.text}" />
                </p>
                <p>
                    <h:commandButton action="#{blogManager.addBlog}" />
                </p>
            </fieldset>
        </h:form>
@Inject
private Blog blog;