2015-02-17 59 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