2015-02-17 60 views
0

這可能是一個簡單的問題,但我無法弄清楚。輸入文本返回空值

這是我的XHTML頁面:

*update p tag here, I am using primefaces* 
<h:outputLabel for="Number" value="Number(100-800):" /> 
    <h:inputText id="number" name="number_Name" value="#{validationView.number}" label="Number"> 
     <f:validateDoubleRange minimum="100" maximum="800" /> 
    </h:inputText> 

<p:commandButton value="S-ubmit" name="submit" actionListener="#{userBean1.method1}" ajax="false" icon="ui-icon-check" validateClient="true"/> 

這是我管理的bean

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.context.FacesContext; 
import javax.faces.event.ActionEvent; 

import org.primefaces.context.RequestContext; 

@ManagedBean(name="userBean1") 
@SessionScoped 
public class UserBean1 
{ 
    public void method(){ 
     String value = FacesContext.getCurrentInstance(). 
     getExternalContext().getRequestParameterMap().get("number_Name");   
     System.out.println("Value: "+value); 
    } 

    public void method1(ActionEvent event) {  
    String param = (String) event.getComponent().getAttributes().get("number_Name"); 
      System.out.println("Param: "+param); 
    } 
} 

我嘗試這兩種方法,並在這兩種情況下,它是印刷null輸出。我將el-impl-2,2.jar導入到我的構建路徑中。我使用primefaces 5.1和Tomcat7

+1

我認爲你必須退後一步,做一些jsf 101.這是一種嘗試獲取輸入字段值的不尋常方式。它確實不這樣。您通常在bean中設置值,並讓框架爲您完成所有這些管道工作 – Kukeltje 2015-02-18 01:08:54

+0

我想獲取此輸入變量以設置和調用存儲過程。 – SamK 2015-02-18 03:17:15

+0

@Kukeltje:確實,也請參閱http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – BalusC 2015-02-18 07:49:56

回答

1

首先,不存在所謂的nameh:inputText,如果你確實需要使用該屬性,請參閱該問題的更多詳細信息屬性:How to specify name attribute in h:inputText?

所以我會假設你h:inputText看起來是這樣的:

<h:inputText id="number" value="#{validationView.number}" label="Number"> 
    <f:validateDoubleRange minimum="100" maximum="800" /> 
</h:inputText> 

,在externalContext().getRequestParameterMap().get(key)key參考s到當前請求中包含的與客戶端ID相對應的請求參數名稱(因爲name是由JSF根據客戶端ID自動生成的),所以如果您的h:inputTextid= "form"那麼您的客戶端ID將是"form:number",更多When and how is clientID generated in JSF?

您可以使用第一種方法是這樣的:

public void method(){ 

    String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("form:number");   
    System.out.println("Value: "+value); 
} 

如果你只知道組件您h:inputTextid,而不是它的客戶端ID,請參閱:Find component by ID in JSF

Finnaly,我認爲最好的方法是使用下面的方法,讓你從ActionEvent受益:

public void method(ActionEvent event) {   

    String param = (String) ((UIInput) event.getComponent().findComponent("form:number")).getValue(); 
    System.out.println("Param: "+param); 

} 

NB:請注意event.getComponent()獲取觸發這是事件的組件p:commandButton(在你的情況)而不是h:inputText

+0

雖然你的回答是正確的,但是使用validationView.number?它會更好地維護,更好的IDE支持,代碼完成和重構明智嗎?對我來說,它看起來像OP有例如一個php背景,切換到java/jsfand嘗試以Y(/ php)方式解決X問題 – Kukeltje 2015-02-18 08:59:45

+0

但是'number'在'validationView'託管bean中,而該操作在另一個託管bean中。所以,要直接使用數字,他需要在'UserBean1'內部注入'validationView',那麼如果validationView是requestScoped呢?這將不可能使用JSF託管的豆 – Tarik 2015-02-18 13:46:06

+0

這就是爲什麼我認爲jsf 101更好。另外考慮其他職位。 – Kukeltje 2015-02-18 14:00:22