2012-03-08 45 views
0

我想用jsf 2.0创建简单的博客。它包含2类:JSf在简单的博客请求范围

BlogManager(session范围内) 博客(请求范围)

@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中注入请求范围吗?

感谢

+0

只是好奇,你的'blog' bean似乎没有任何行为,那么需要将它定义为'RequestScoped' bean?为什么不把它保留一个简单的pojo? – Nikhil 2012-03-08 07:31:44

+0

如果我这样做了简单的pojo,那么我就不能在xhml页面中为用户输入使用它:例如: Elbek 2012-03-08 07:33:18

+0

如果使用'@ManagedBean(”YourBean“)'注释而不是使用'@Named(”YourBean“)''会发生什么?试试看 – Lion 2012-03-08 08:08:28

回答

0

理想情况下,您的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

这是我第二次做的,但问题是所有的时间每个请求的BlogManager的jsf类构造函数?它应该是在会话中,应该创建一次会话。我是否错? – Elbek 2012-03-08 08:27:31

+0

反正很好的答案。 – Elbek 2012-03-08 08:28:07

+0

这真是奇怪!你说得对,它不应该被称为不止一次..某些地方是错误的地方.. – Nikhil 2012-03-08 08:43:47

0

不能较低范围的对象注入到一个更高的范围内的对象。因此,您不能将请求范围对象blog注入到会话作用域blogManager。如果您将它创建为一个简单的pojo,则可以像访问它一样总是像<h:inputText value="#{blogManager.blog.title}" />

+0

+1对于'你不能将更低范围的对象注入更高范围的对象' – Nikhil 2012-03-08 08:16:14

+1

错误,这只适用于JSF管理的bean,不适用于CDI管理的bean – BalusC 2012-03-08 12:12:14

2

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

修复:

@Inject 
private Blog blog; 

而且你还需要绝对确保当您通过CDI的@Named管理豆类,所有范围的注解像@SessionScopedjavax.enterprise.context包来而不是从javax.faces.bean包。


无关的具体问题,这样的设计是flawy。 Blog类不应该是托管bean,而应该是@Entity,它只是BlogManager类的普通属性。

+0

哎呀..我明显忽略了它的CDI注释的事实。你的应该被标记为答案老鼠她比我的! – Nikhil 2012-03-08 15:47:32