2012-03-08 34 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