【问题标题】:Input text returning null value输入文本返回空值
【发布时间】:2015-04-18 20:32:26
【问题描述】:

这可能是一个简单的问题,但我无法弄清楚。

这是我的 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

【问题讨论】:

  • 我认为你必须退后一步,做一些 jsf 101。这是尝试获取输入字段值的一种不寻常的方式。它确实不是那样工作的。您通常在 bean 中设置值并让框架为您完成所有这些工作
  • 我想获取这个输入变量来设置和调用存储过程。

标签: jsf-2 primefaces


【解决方案1】:

首先h:inputText中没有名为name的属性,如果您确实需要使用该属性,请参考该问题了解更多详情: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指的是当前请求中包含的请求参数名称,对应客户端ID(因为name是JSF基于自动生成的客户端 ID),因此如果您的 h:inputText 在其 id= "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:inputText 的组件id 而不是它的客户端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);

}

注意:请注意event.getComponent() 获取触发事件的组件是p:commandButton(在您的情况下)而不是h:inputText

【讨论】:

  • 虽然您的答案是正确的,但仅使用validationView.number 不是更合乎逻辑吗?它会更好的可维护性、更好的 IDE 支持、代码完成和重构吗?对我来说,它看起来像 OP 有例如一个php背景,切换到java/jsfand尝试以Y(/php)方式解决X问题
  • 但是 numbervalidationView 托管 bean 中,而操作在另一个托管 bean 中。因此,要直接使用数字,他需要在UserBean1 中注入validationView,那么如果validationView 是requestScoped 怎么办?使用 JSF 托管 bean 是不可能的
  • 这就是为什么我认为 jsf 101 更好。也在考虑其他帖子。
  • 但是为什么 JSF 1.1 会更好?!在这种情况下,他会错过 JSF 2.0 中的许多新功能(我想发送一些链接,但抱歉我是用手机回答的)
  • 哈哈哈,对不起。 101 是在你可以跟随初学者的课程中……与 jsf 1.1 无关 english.stackexchange.com/questions/14265/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多