2013-01-21 71 views
0

我有一個代表計算器的bean類。這個類暴露了4種方法:加,減,乘,除。JSP命令按鈕操作取決於用戶選擇

對於前端我正在寫一個JSP頁面。該頁面包含兩個文本輸入框(一個用於x,另一個用於y)。我有一個下拉菜單,用戶選擇操作,然後一個計算執行所選操作的命令按鈕。

<h:form> 
    <h:inputText value="#{calcBean.x}"></h:inputText> 
    <h:inputText value="#{calcBean.y}"></h:inputText> 
    <h:selectOneMenu> 
     <f:selectItem itemValue="Add"></f:selectItem> 
     <f:selectItem itemValue="Subtract"></f:selectItem> 
     <f:selectItem itemValue="Multiply"></f:selectItem> 
     <f:selectItem itemValue="Divide"></f:selectItem> 
    </h:selectOneMenu> 
    <h:commandButton value="Calculate" action="@SEE COMMENT"> 
    <%-- TODO the action of this command button needs to change depending on --%> 
    <%-- the user selection. For example: If the user selects "Add" the action --%> 
    <%-- needs to be #{calcBean.add} --%> 
    </h:commandButton> 
</h:form> 

我遇到了是我不知道如何改變這取決於用戶的選擇命令按鈕的行動問題。

我能做到這一點有四個不同的命令按鈕,但不是一個完美的解決方案:

<h:form> 
    <h:inputText value="#{calcBean.x}"></h:inputText> 
    <h:inputText value="#{calcBean.y}"></h:inputText> 
    <br/> 
    <h:commandButton value="Add" action="#{calcBean.add}"></h:commandButton> 
    <h:commandButton value="Subtract" action="#{calcBean.subtract}"></h:commandButton> 
    <h:commandButton value="Multiply" action="#{calcBean.multiply}"></h:commandButton> 
    <h:commandButton value="Divide" action="#{calcBean.divide}"></h:commandButton> 
</h:form> 
+1

如果您有任何JSF問題(我知道您會這樣),請使用JSF標記而不是JSP。 –

回答

1

您可以通過用戶的選擇綁定到後端bean的屬性,並使用該選擇的值作爲做到這一點你的行動方法中的一個條件來做適當的計算。

<h:selectOneMenu value=#{calcBean.calculationType}> 
    <f:selectItem itemValue="Add"></f:selectItem> 
    <f:selectItem itemValue="Subtract"></f:selectItem> 
    <f:selectItem itemValue="Multiply"></f:selectItem> 
    <f:selectItem itemValue="Divide"></f:selectItem> 
</h:selectOneMenu> 

<h:commandButton value="Add" action="#{calcBean.doSelectedCalculation}"></h:commandButton> 

在您的單一唯一操作方法中,根據所選的計算類型,您可以對給定的x和y值執行操作。

public void doSelectedCalculation() 
{ 
    if(calculationType.equals("Add")) 
    { 
      result = x + y; 
    } 
    else if(calculationType.equals("Subtract")) 
    { 
      result = x - y; 
    } 
    ... 

} 
+0

太好了。現在就試試看,謝謝。 –

+0

這是一種相當不同的思考方式。這就好像您必須編寫bean,並且理解它將通過JSF前端進行訪問。如果兩者不緊密結合會很好。 –

+1

@JanTacci是的,託管bean的編寫思路是View(JSP或Facelets頁面)如何使用它,但這是爲了讓一個或多個視圖可以使用單個託管bean,即提供列表的應用程序作用域託管bean填寫所有頁面中啓用的「選擇您的主題」選項列表。 –

1

的JSF上下的辦法是:

  1. 綁定您的<h:selectOneMenu>與財產託管的bean,讓我們說,int selectedOption

  2. 顯示給用戶的選項設置值(<f:selectItem>)。它可能是1,2,3和4(僅用於一個基本示例)

  3. 從您的託管bean公開了一種方法calculate。此方法將在您的<h:commandButton>操作屬性中。該方法將使用selectedOption屬性來知道要使用的操作。

有了這個信息,則結果將是:

JSF代碼

<h:form> 
    <h:inputText value="#{calcBean.x}" /> 
    <h:inputText value="#{calcBean.y}" /> 
    <h:selectOneMenu value="#{calcBean.selectedOption}"> 
     <f:selectItem itemLabel="Add" itemValue="1" /> 
     <f:selectItem itemLabel="Subtract" itemValue="2" /> 
     <f:selectItem itemLabel="Multiply" itemValue="3" /> 
     <f:selectItem itemLabel="Divide" itemValue="4" /> 
    </h:selectOneMenu> 
    <h:commandButton value="Calculate" action="#{calcBean.calculate}" /> 
</h:form> 
Result: <h:outputText value="#{calcBean.result}" /> 

CalcBean代碼

public class CalcBean { 

    private int x; 
    private int y; 
    private int selectedOption; 
    private double result; 
    //constructor... 
    //getters and setters... 

    public String calculate() { 
     result = 0; 
     switch(selectedOption) { 
      case 1: 
       result = x + y; 
       break; 
      //write the other cases... 
     } 
     return null; 
    } 
} 

上面的代碼對應於JSF 1.2。如果您使用的是JSF 2.x,那麼您應該停止使用JSP並移至Facelets,如the JSF wiki中所述。恕我直言,最好學習JSF 2而不是JSF 1.x.

+0

太棒了!謝謝。 @見上面我的評論。如果您知道JSF頁面將訪問您的代碼,那麼這是一種全新的編程思維方式。如果你已經編寫了一個不知道用戶界面的計算器類,那麼你需要編寫一些類似於「Bean代理」的代碼,它使用JSF類中的「普通」計算器類。 –

+0

我對這一切都很陌生......我的目的是學習JSF ..你是說我所做的甚至不是JSF?這是JSP? –

+0

我在說的是JSF 1.x是在JSP中構建的,但是從JSF 2中可以(並且最好)使用Facelets。這一切都在我的答案底部的鏈接中解釋,請點擊它並閱讀,有很多信息需要處理和學習,但它會很好。另外,您從JSF的基本練習開始,我試圖幫助您完成它。可以通過其他方式使用JSF來完成它。 –