Объем запросов JSf в простом блоге - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь создать простой блог с jsf 2.0. Содержит 2 класса:

BlogManager (в области сеанса) Блог (в объеме запроса)

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

    @ManagedProperty(value = "#{blog}")
    Blog blog;

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

    public List<Blog> getBlogs() {
        return blogs;
    }

    public void setBlogs(List<Blog> blogs) {
        this.blogs = blogs;
    }

    public Blog getBlog() {
        return blog;
    }

    public void setBlog(Blog blog) {
        this.blog = blog;
    }

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

    public void removeBlog(Blog blog) {
        blogs.add(blog);
    }
}

класс блога:

@Named("blog")
@RequestScoped
public class Blog {

    private Integer id;

    private String title;
    private String text;
    private Date date;

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

    private Integer readed;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public Integer getReaded() {
        return readed;
    }

    public void setReaded(Integer readed) {
        this.readed = readed;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

тогда внутри моей формы 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 не сможет найти объект блога, он создаст и назначит пользовательский ввод для объекта блога. тогда я могу видеть это в blogManager. Но это не работает. какую область я должен использовать для класса блога? И можно ли ввести область запроса в blogManager?

спасибо

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Вы смешиваете аннотации JSF и CDI. Вы управляли своими bean-компонентами с помощью @Named CDI, но все же пытаетесь использовать специфическую для JSF аннотацию @ManagedProperty, чтобы внедрить один управляемый bean-компонент CDI в другой управляемый bean-компонент CDI. Это не сработает. Вам нужно использовать собственную аннотацию @Inject CDI. @ManagedProperty работает только с классами JSF @ManagedBean.

Исправьте это соответственно:

@Inject
private Blog blog;

Кроме того, вы также должны быть абсолютно уверены, что когда вы управляете bean-компонентами с помощью @Named CDI, все аннотации области, такие как @SessionScoped, поступают из пакета javax.enterprise.context, а не из пакета javax.faces.bean.


Не связанный с конкретной проблемой, эта конструкция ошибочна. Класс Blog должен быть не управляемым компонентом, а @Entity и быть просто обычным свойством класса BlogManager.

0 голосов
/ 08 марта 2012

В идеале, ваш Blog класс должен быть только POJO.И он должен быть членом BlogManager.Таким образом, единственное, что вам нужно, это 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);
    }
}

класс блога:

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

}

И ваш 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>
0 голосов
/ 08 марта 2012

Вы не можете внедрить объект с более низкой областью действия в объект с более высокой областью действия. Таким образом, вы не можете внедрить объект с областью запроса blog в область сессий blogManager. Если вы создаете его как простое pojo, вы всегда можете получить к нему доступ как <h:inputText value="#{blogManager.blog.title}" />

...