Java 绑定a<;h:输入文本>;值设置为bean属性,同时在字段中显示不同的文本

Java 绑定a<;h:输入文本>;值设置为bean属性,同时在字段中显示不同的文本,java,jsf,javabeans,facelets,Java,Jsf,Javabeans,Facelets,我知道这个标题听起来很荒谬,但我不知道该怎么解释我的意思:) 我有一个用来编辑实体的表单。 每个字段都链接到其相关的bean属性,并且工作正常 我需要做的是在表单字段中显示实体的当前值,以加快编辑速度(使用当前值而不是空字段非常有用!) 因此,我得到了这个edit.xhtml页面,它从get参数获取ID,并使用支持bean中的getFromId方法检索实体 假设该实体存储在一个名为“contact”的var中,我希望使用以下表单: <f:view> <h:for

我知道这个标题听起来很荒谬,但我不知道该怎么解释我的意思:)

我有一个用来编辑实体的表单。 每个字段都链接到其相关的bean属性,并且工作正常

我需要做的是在表单字段中显示实体的当前值,以加快编辑速度(使用当前值而不是空字段非常有用!)

因此,我得到了这个edit.xhtml页面,它从get参数获取ID,并使用支持bean中的getFromId方法检索实体

假设该实体存储在一个名为“contact”的var中,我希望使用以下表单:

<f:view>
        <h:form>
            <h1><h:outputText value="Edit"/></h1>
            <h:panelGrid columns="2">
                <h:outputLabel value="Name:" for="name" />
                <h:inputText id="name" value="#{contactsMB.name}" title="Name" required="true"/>
                <h:outputLabel value="Surname:" for="surname" />
                <h:inputText id="surname" value="#{contactsMB.surname}" title="Cognome"/>
                <h:outputLabel value="Email:" for="email" />
                <h:inputText id="email" value="#{contactsMB.email}" title="Email" required="true"/>
                <h:outputLabel value="Number:" for="number" />
                <h:inputText id="number" value="#{contactsMB.number}" title="Number" />
                <h:inputHidden id="id" value="#{contactsMB.id}"/>
                <h:commandButton value="Edit" action="#{contactsMB.editContact}"/>
            </h:panelGrid>
        </h:form>
    </f:view>

但是我想在texfields中显示contact变量的值

因此,例如,第一个inputText必须显示“stefano”作为名称,但必须链接到contactsMB.name

基本上,它就像inputText的默认值,这个默认值必须来自实体


这可能吗?

首先,你应该问问自己:
你真的需要这样做吗?
。如果您正在编辑一个实体,您应该直接利用该实体的getter和setter。可能是这样的:

@ManagedBean
@ViewScoped
public void ContactsMB {

   @EJB
   private SomeEJB someEJB;
   @ManagedProperty(value = "#{param.username}")
   private String username;
   private User   user;

   @PostConstruct
   public void prepareEditing() {
      this.user = someEJB.loadUserFromDatabase(username);
   }

   // Getters and Setters
}
<h:outputLabel value="Name:" for="name" />
<h:inputText id="name" value="#{contactsMB.user.name}" />
@ManagedBean
@ViewScoped
public void ContactsMB {

   @EJB
   private SomeEJB someEJB;
   @ManagedProperty(value = "#{param.username}")
   private String username;
   private User   user;

   private String name;
   private String email;

   @PostConstruct
   public void prepareEditing() {
      this.user  = someEJB.loadUserFromDatabase(username);
      this.name  = user.getName();
      this.email = user.getEmail();
   }

   // Getters and Setters
}
然后,例如,您可以按如下方式显示用户名:

@ManagedBean
@ViewScoped
public void ContactsMB {

   @EJB
   private SomeEJB someEJB;
   @ManagedProperty(value = "#{param.username}")
   private String username;
   private User   user;

   @PostConstruct
   public void prepareEditing() {
      this.user = someEJB.loadUserFromDatabase(username);
   }

   // Getters and Setters
}
<h:outputLabel value="Name:" for="name" />
<h:inputText id="name" value="#{contactsMB.user.name}" />
@ManagedBean
@ViewScoped
public void ContactsMB {

   @EJB
   private SomeEJB someEJB;
   @ManagedProperty(value = "#{param.username}")
   private String username;
   private User   user;

   private String name;
   private String email;

   @PostConstruct
   public void prepareEditing() {
      this.user  = someEJB.loadUserFromDatabase(username);
      this.name  = user.getName();
      this.email = user.getEmail();
   }

   // Getters and Setters
}

您的需求与显示绑定值的JSF输入的默认行为有什么不同?我知道这很难解释我的问题,所以我再次尝试。如果使用,它将显示contactsMB.getName()给定的值,并在发送表单时调用contactsMB.setName()。但是我需要显示contact.name给出的值,其中contact是引用实体实例的var,而不是contactsMB.name中的值!因此,它必须显示一个不是从beans属性中获取的值,同时在提交表单时仍然设置beans属性。你不能将“默认”值放入contactsMB吗?我明白了。但我仍然不了解全部情况:)为什么不能用contact最初的值填充contactsMB?您需要以某种方式检测显式编辑?不,因为它们不是真正的默认值。这些值取决于传递给页面的ID参数,它们不是“固定”值!我需要@ManagedProperty(value=“#{request.getParameter('id')}”)之类受保护的字符串id;这一个有效,即使我们的老师没有解释这个注释!非常感谢:)如果您使用的是
@ManagedProperty
,那么应该使用JSF的
param
,而不是
{request.getParameter('id')}
。我认为您应该将其更改为
@ManagedProperty(value=“#{param.id}”)