Java 获取<;h:输出文本>;作为支持bean中的ManagedProperty
首先,我想说我是JSF新手 我想创建一个简单的复合组件,可以编辑文章。它应该以这种方式工作:Java 获取<;h:输出文本>;作为支持bean中的ManagedProperty,java,jsf-2,managed-bean,Java,Jsf 2,Managed Bean,首先,我想说我是JSF新手 我想创建一个简单的复合组件,可以编辑文章。它应该以这种方式工作: 复合组件看起来像这样 ArticleBean负责处理复合组件的数据(这里是save方法) 要使用文章的每个页面都需要将复合组件添加到视图中,并将article对象添加到支持bean中 Article对象将被传递到复合组件,其值将在ArticleBean 问题是我不知道如何通过视图将实体(Article对象)从一个bean(感兴趣的bean)传递到另一个(ArticleBean) 示例(伪代码;假设项目实
ArticleBean
负责处理复合组件的数据(这里是save
方法)article
对象添加到支持bean中Article
对象将被传递到复合组件,其值将在ArticleBean
Article
对象)从一个bean(感兴趣的bean)传递到另一个(ArticleBean
)
示例(伪代码;假设项目实体是简单的字符串对象,所以我们不需要使用转换器):
//输入bean
公共类HomePageBean{
私人物品;
@施工后
公共void init(){
this.article=新文章();
this.article.setText(“主页欢迎”);
}
公共无效条款(第条){
this.article=物品;
}
公共物品第()条{
return article;//在真实页面上,将从数据库中获取文章
}
}
//看法
//输出bean
公共类ArticleBean{
私人物品;
公共无效条款(第条){
this.article=物品;
}
公共物品{
退货物品;
}
公共作废保存(){
//将文章数据保存到数据库
}
}
//实体
公共类文章{
私人文章文本;
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
}
问题是没有设置SecondBean.entity.text
值。如何从视图中将参数传递给支持bean?我试图使用@ManagedProperty(value=“#{param.Article}”)
设置Article
的值,但是
是以表单形式传递的,因此该值作为randomformname:Article
传递
对不起我的英语实际上这个问题需要澄清。所以我有两个基本的想法,你可能想做什么 在一个视图上简单地共享信息 如果要在同一视图上共享信息,可以使用
@ManagedProperty
将托管bean相互注入。只要记住,注入的bean的作用域不会小于它被注入的bean。事实上,如果您只需要一个article对象,那么我看不出在您的情况下使用两个托管bean的理由,但是您仍然可以使用
@ManagedBean
@RequestScoped
public class BaseBean {
private Article article;
@ManagedProperty(value="#{injectedBean}")
private InjectedBean injectedBean;
}
要初始化您希望相同的托管bean的两个属性,可以使用用@PostConstruct
注释的init方法(但有许多替代方法),如这里所示
@PostConstruct
public void init() {
Article article = new Article("Welcome");
this.article = article;
injectedBean.setArticle(article);
}
在视图之间共享信息
在这个场景中,用户在第一个视图中选择一篇他想要编辑的文章,并将其传递给第二个视图。在这个场景中,用户在一个页面上选择他想要操纵的文章(welcome.xhtml
),而实际操纵发生在另一个页面上(manipulation.xhtml
)
通常的方法是,每个页面都由自己的bean填充,因此在上述设置中,“基本bean”将丢失其注入。因此,welcome.xhtml
view将使用从某个地方在该页面上弹出的一些文章对象,并在单击按钮时将其传递给第二个视图进行操作
bean将与文章对象的reagrd相同
@ManagedBean
@RequestScoped
public class BaseBean {
private Article article;
}
@ManagedBean
@RequestScoped
public class InjectedBean {
private Article article;
}
而实际的传球将在点击按钮时发生,如中所示
<h:form>
<h:commandButton value="Manipulation" action="manipulation.xhtml">
<f:setPropertyActionListener target="#{injectedBean.article}" value="#{baseBean.article}"/>
</h:commandButton>
</h:form>
<h:link value="Manipulate" outcome="manipulation.xhtml" >
<f:param name="articleId" value="#{baseBean.article.id}" />
</h:link>
对于preRenderView
事件和
<f:metadata>
<f:viewParam id="articleId" name="articleId" value="#{injectedBean.id}" />
<f:viewAction action="#{injectedBean.initEvent}" />
</f:metadata>
@ManagedProperty
注释@PostConstruct
注释,并进行参数依赖注入。请记住,为了使设置生效,bean必须是@RequestScoped
,但是对于其他bean作用域有变通方法
@ManagedProperty(value="#{param.articleId}")
private Integer id;
@PostConstruct
public void initPostConstruct() {
if (id == null) {
String message = "No id specified in request";
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message));
return;
}
//use your service method to load the article
//article = articleService.findById(id);
//and add messages appropriately
}
在下一个视图(manipulation.xhtml
)中,bean将以任何方式初始化。BalusC提供的这两种方法的非常有用的比较可以找到
例如,可以通过一个简单的
来处理对此视图的导航,如
<h:form>
<h:commandButton value="Manipulation" action="manipulation.xhtml">
<f:setPropertyActionListener target="#{injectedBean.article}" value="#{baseBean.article}"/>
</h:commandButton>
</h:form>
<h:link value="Manipulate" outcome="manipulation.xhtml" >
<f:param name="articleId" value="#{baseBean.article.id}" />
</h:link>
欢迎来到stackoverflow!在继续讨论复合组件之前,请确保了解JSF的基本功能和框架中的通信。和是非常有价值的资产,它本质上是对许多JSF特性的概述。感谢您的帮助@skuntsel,我想
会帮助我的。我现在在工作,所以我回家后会检查一下。简言之,我将有很多bean使用文章,我不想在每个bean中注入ArticleBean
。我认为只注入文章
实体会更容易,因此最好的解决方案是复制视图中的文章
实体。给你一分!不客气!顺便说一句,如果答案对您有帮助,您可以随时接受。作为补充说明,您可能还希望根据ajax请求重新发布复合组件和/或制作文章列表,并制作许多“操纵”按钮,以便在新/当前视图中使用所选的Atricle。
<h:link value="Manipulate" outcome="manipulation.xhtml" >
<f:param name="articleId" value="#{baseBean.article.id}" />
</h:link>