簡體   English   中英

JSF:導航

[英]JSF: navigation

我必須警告你:問題可能相當愚蠢,但我現在似乎無法繞過它。

我有兩個托管bean,比方說A和B:

class A
{
    private Date d8; // ...getters & setters
    public String search()
    {
        // search by d8
    }
}

class B
{
    private Date d9; //...getters & setters
    public String insert()
    {
         // insert a  new item for date d9
    }    
}

然后我有兩個JSP頁面, pageA.jsp (搜索頁面)和pageB.jsp (輸入頁面)。 我想要做的是在pageB中放置一個命令 按鈕,以便打開搜索頁面頁面A以某種方式傳遞參數d9 ,或者在b.insert()之后直接導航到pageA 我想要做的是在插入后顯示搜索結果。

也許只是因為我無法看到清晰,簡單的解決方案,但我想知道這里最好的做法是什么,也......

我想這些可能的解決方案:

  1. 包括** A ** in ** B **並將命令按鈕與** basearch相關聯**
  2. 將** d9 **作為** hiddenInput **並在** A **中添加新方法** searchFromB **(丑陋!)
  3. 將兩個豆子折疊成一個

JSF 1.1 / 1.2 raw不提供簡單的方法。 Seam / Spring都有辦法解決這個問題,你可以做幾件事。 一旦發布,JSF 2也應該有解決方案。

可能最容易也是最方便的是將兩個bean合並為一個並使其成為會話范圍。 當然,擔心的是這個bean不會被刪除並保持會話直到會話超時。 耶內存泄漏!

另一種解決方案是將日期作為GET參數傳遞。 例如,你的動作方法可以調用

FacesContext.getCurrentInstance().getExternalContext().redirect("pageB?d9=" + convertDateToLong(d9));

然后在另一側獲取參數。

您應該在faces-config.xml中配置導航流。 在理想情況下,您將返回“狀態”消息,該消息將決定流程。 閱讀以下鏈接: http//www.horstmann.com/corejsf/faces-config.html http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?topic=/com。 businessobjects.integration.eclipse.doc.devtools /開發商/ JSF_Walkthrough8.html

就將值從一個頁面傳遞到另一個頁面而言,您可以使用支持bean。 有關支持bean的更多信息, 訪問http//www.netbeans.org/kb/articles/jAstrologer-intro.html http://www.coderanch.com/t/214065/JSF/java/backing-beans-vs-managed -豆子

希望我已經理解並正確回答了你的問題

在bean之間共享值的方法

FacesContext facesContext = FacesContext.getCurrentInstance();
Application app = facesContext.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class);
return valueExp.getValue(elContext);

在上面的代碼中,“expression”類似於#{xyzBean.beanProperty}因為JSF使用單例實例,所以你應該能夠訪問其他bean的值。 如果你找到關於這種技術的更多細節,我相信你會得到你想要的東西。

  1. 添加引用B'insert方法的commandButton操作屬性

<h:commandLink action="#{b.insert}" value="insert"/>

  1. 在B'insert方法中,添加d9參數作為請求參數。 然后從insert方法返回一個任意字符串。

FacesContext fc = FacesContext.getCurrentInstance();
fc.getExternalContext()。getRequestMap()。put(“d9”,d9);

  1. 然后轉到faces上下文並添加從B到A的導航,其中“from-outcome”作為從insert方法返回的任意String。 但是不要將重定向標記添加到導航標記,因為它會破壞來自B的請求,並且您添加的參數(d9)將被清除。

<from-outcome>return string of insert method</from-outcome>
<to-view-id>address of A</to-view-id>

  1. 然后你可以在A類中獲取“d9”,方法是從構造函數的請求圖中或在更合適的地方(getter)中獲取它。 如果要稍后跟蹤它,可以將其添加到會話范圍中或將其放置到隱藏變量中。

在A類中,當導航頁面時,應該初始化A,因為它將被引用。

FacesContext fc = FacesContext.getCurrentInstance();
fc.getExternalContext()。getRequestMap()。get(“d9”,d9);

對不起,我不能給完整的代碼,因為我在這里沒有ide,它的互聯網機器在工作。 因此我無法提供細節。

在我看來,最簡單的方法是第3個選項 - 在同一個類中同時使用查詢和插入方法。 你可以這樣做:

public String query () {
//... 
}

public String Insert() {  
 //insert
return Query(); }

如果你的類是托管Beans,你可以從B類加載A類,並在最后的insert方法中調用A.query() A級也可以

<managed-bean-scope>session</managed-bean-scope>

faces-config.xml中的參數,加載時不會再次實例化。

暫無
暫無

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

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