簡體   English   中英

得到 <h:outputText> 作為支持bean的ManagedProperty

[英]get <h:outputText> as ManagedProperty in backing bean

首先,我想說我是JSF的新手。

我想創建一個簡單的復合組件,可用於編輯文章。 它應該以這種方式工作:

  1. 復合組件看起來像這樣<my:article article="#{interestedBean.article}" />
  2. ArticleBean負責處理復合組件的數據(這里是save方法)
  3. 想要使用文章的每個頁面都需要將復合組件添加到視圖,將Article對象添加到輔助bean
  4. Article對象將傳遞給復合組件,其值將在ArticleBean更改

問題是我不知道如何通過視圖將實體( Article對象)從一個bean(感興趣的bean)傳遞到另一個( ArticleBean )。

示例(偽代碼;讓我們假設Article實體是簡單的String對象,因此我們不需要使用轉換器):

// input bean
public class HomePageBean {
    private Article article;
    @PostConstruct
    public void init() {
        this.article = new Article();
        this.article.setText("welcome on home page");
    }
    public void setArticle(Article article) {
        this.article = article;
    }
    public Article article() {
        return article; // on real page article will be taken from database
    }
}

// view
<h:form>
    <h:outputText value="#{articleBean.article.text}">
        <f:attribute name="value" value="#{homePageBean.article.text}" />
    </h:outputText>
</h:form>

// output bean
public class ArticleBean {
    private Article article;
    public void setArticle(Article article) {
        this.article = article;
    }
    public Article getArticle() {
        return article;
    }
    public void save() {
         // save article data to database
    }
}

// entity
public class Article {
    private article text;
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
}

問題是未設置SecondBean.entity.text值。 如何從視圖中將參數傳遞給backing bean? 我試圖使用@ManagedProperty(value="#{param.article}")設置Article@ManagedProperty(value="#{param.article}")但是<h:outputText>處於表單中,因此值將作為randomformname:article傳遞。

對不起我的英語不好

實際上這個問題需要澄清。 所以我對你可能想做的事情有兩個基本的想法。

在一個視圖上簡單地共享信息

如果要在同一視圖上共享信息,可以使用@ManagedProperty將托管bean互相注入。 請記住,注入的bean的范圍不會小於注入的bean。 實際上,如果您需要的只是一個文章對象,那么我沒有看到在您的情況下使用兩個托管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綁定,所以在上面提到的設置中,'base bean'將失去它的注入。 因此, welcome.xhtml視圖將使用從某個地方彈出該頁面的一些文章對象,並在按鈕點擊時將其傳遞給第二個視圖。

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>

在代碼中,屬性動作偵聽器方法是為第二個視圖實例化一個bean,並使用基本bean的屬性設置它的屬性。

使用get參數進行頁面加載

有時它更多的是不包括命令按鈕來觸發導航到下一個視圖,但提供了編輯頁面的簡單鏈接。 它可以通過使用<f:param>標簽來實現。 在JSF中有兩種處理參數的基本方法:使用頁面操作/ preRenderView事件或使用@ManagedProperty直接在托管bean中注入它們。

  1. 使用Page actions / preRenderView事件

作業將由目標視圖完成

<f:metadata>
    <f:viewParam id="articleId" name="articleId" value="#{injectedBean.id}" />
    <f:event type="preRenderView" listener="#{injectedBean.initEvent}" />
</f:metadata>

對於preRenderView事件和

<f:metadata>
    <f:viewParam id="articleId" name="articleId" value="#{injectedBean.id}" />
    <f:viewAction action="#{injectedBean.initEvent}" />
</f:metadata>

用於頁面操作。 托管bean( InjectedBean對象)將具有以下init方法

public void initEvent() {
    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
}
  1. 使用@ManagedProperty注釋

該作業將通過以下bean方法完成,該方法使用@PostConstruct注釋,並且參數依賴注入。 請記住, @RequestScoped設置正常工作,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:link>處理對該視圖的導航,例如

<h:link value="Manipulate" outcome="manipulation.xhtml" >
    <f:param name="articleId" value="#{baseBean.article.id}" />
</h:link>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM