Java 获取<;h:输出文本>;作为支持bean中的ManagedProperty

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) 示例(伪代码;假设项目实

首先,我想说我是JSF新手

我想创建一个简单的复合组件,可以编辑文章。它应该以这种方式工作:

  • 复合组件看起来像这样
  • 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
    注释
  • 该工作将通过以下bean方法完成,该方法用
    @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>