![](/img/trans.png)
[英]@ManagedProperty in backing bean - setting getters and setters
[英]get <h:outputText> as ManagedProperty in backing bean
首先,我想說我是JSF的新手。
我想創建一個簡單的復合組件,可用於編輯文章。 它應該以這種方式工作:
<my:article article="#{interestedBean.article}" />
ArticleBean
負責處理復合組件的數據(這里是save
方法) Article
對象添加到輔助bean 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的屬性設置它的屬性。
有時它更多的是不包括命令按鈕來觸發導航到下一個視圖,但提供了編輯頁面的簡單鏈接。 它可以通過使用<f:param>
標簽來實現。 在JSF中有兩種處理參數的基本方法:使用頁面操作/ preRenderView
事件或使用@ManagedProperty
直接在托管bean中注入它們。
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
}
@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.