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