【问题标题】:PrimeFaces inputText not rendering sometimesPrimeFaces inputText有时不呈现
【发布时间】:2013-12-27 01:13:38
【问题描述】:

我来到这里是因为我在我的应用程序中遇到了一个非常奇怪的问题,如下所示:我有一个带有 JSF 和 EJB 的电子商务应用程序,我正在尝试用用户信息填写表格.问题是当有登录用户时我的表单显示不好,当我没有登录时,他显示得很好:O 我正在使用托管 bean (MB) 进行治疗,他正在存储一个帐户对象代表用户登录的帐户。我正在使用 jsf 复合来为 xhtml 页面创建表单和模板。

此外,我还收到了 glassfish 的这些警告:

  • 警告:无法在视图中找到 ID 为 firstName 的组件。
  • 警告:无法在视图中找到 ID 为 lastName 的组件。
  • 警告:无法在视图中找到 ID 街道的组件。
  • 警告:无法在视图中找到 ID 为 postalCode 的组件。
  • 警告:在视图中找不到 ID 城市的组件。

因为没有渲染,我用firebug检查了一下。

这是我的 XHTML 页面代码(用户访问的 /Form.xhtml):

<ui:composition template="template/common/commonLayout.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:component="http://java.sun.com/jsf/composite/component">
    <ui:define name="title">Formulaire</ui:define>

    <ui:define name="content">
        <ui:fragment rendered="#{dataManagedBean.connected}">
            <component:FormValidateCartComponent title="Valider mon panier" first_name="yann"  />
        </ui:fragment>
        <ui:fragment rendered="#{not dataManagedBean.connected}">
            <component:FormValidateCartComponent title="Valider mon panier" first_name="NoName"  />
        </ui:fragment>
    </ui:define>
</ui:composition>

这是我的表单组件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:composite="http://java.sun.com/jsf/composite"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <composite:interface>
        <composite:attribute name="title" />
        <composite:attribute name="first_name"/>
        <!--ajouter des attributs pour le cas ou l'utilisateur est connecté -->
    </composite:interface>
    <composite:implementation>
        <h:form id="form" class="span5 offset4">
            <h2>#{cc.attrs.title}</h2>
            <p:panel header="Adresse de Livraison">  
                <h:panelGrid id="gridpanel" columns="2" style="margin-bottom:10px">  
                    <h:outputLabel for="firstName" value="Prenom : " />  
                    <p:inputText id="firstName" value="#{cc.attrs.first_name}" binding="#{firstName}"/>
                    <h:outputLabel for="lastName" value="Nom : " />  
                    <p:inputText id="lastName" binding="#{lastName}"/>
                    <h:outputLabel for="street" value="Rue : " />  
                    <p:inputText id="street" binding="#{street}" />
                    <h:outputLabel for="postalCode" value="Code Postale : " />  
                    <p:inputText id="postalCode" binding="#{postalCode}" />
                    <h:outputLabel for="city" value="Ville : "/>  
                    <p:inputText id="city"  binding="#{city}"/>
                    <h:outputLabel for="pbutton"/>  
                    <h:commandButton id="pbutton" class="paypal-button" 
                                     action="Cart.xhtml" 
                                     actionListener="#{dataManagedBean.creatOrder(firstName.value,lastName.value,street.value,postalCode.value,city.value)}" /> 
                </h:panelGrid>  
            </p:panel> 
            <ui:fragment rendered="#{!dataManagedBean.connected}">
                <p:panel header="Connexion">  
                    <h:panelGrid id="grid" columns="2" style="margin-bottom:10px">
                        <h:outputLabel for="login" value="Login : "/>  
                        <p:inputText id="login" binding="#{login}" />
                        <h:outputLabel for="password" value="Mot de passe : "/>  
                        <p:inputText id="password" binding="#{password}" />
                        <h:outputLabel for="accountCreationButton"/>  
                        <h:commandButton id="accountCreationButton" value="Créer un compte" action="Cart.xhtml" actionListener="#{dataManagedBean.createAccount(login.value,password.value,dataManagedBean.creatOrder(firstName.value,lastName.value,street.value,postalCode.value,city.value))}"/>
                    </h:panelGrid>
                </p:panel>
            </ui:fragment>
        </h:form>  
    </composite:implementation>
</html>

目前我只是想设置 first_name,但就像我之前所说的,当我登录时,html 渲染中的每个 inputText 都丢失了。这怎么可能 ?当我断开连接并访问表单时,一切正常...感谢您的帮助,我真的不知道为什么会发生这种情况...我的连接和断开连接功能只是通过 JPA 请求具有登录名和密码的帐户和断开连接是只需在托管 bean 中将帐户设置为 null。

编辑:通过使用 c:if 我的问题得到解决!为什么,我不知道......如果你有线索,请告诉我:)

托管 Bean 部分代码:

    public void connect(String login, String password) {
        account = client.connect(login, password);
    }

    public String disconnect() {
        if (account != null) {
            account = null;
        }
        return "index.xhtml?faces-redirect=true";
    }

    public boolean isConnected() {
        return account != null;
    }

【问题讨论】:

    标签: jsf jsf-2 primefaces composite-component


    【解决方案1】:

    UI 片段会导致视图范围和某些属性出现问题,我建议只需将 ui:frament 更改为 ah:panelGroup,如果您只是放置渲染属性 JSF 不会生成 span 或 div,只会渲染或不渲染里面的内容 编辑: 看起来 balusC 说,ui:fagment 无法解决问题,快速阅读后我找不到错误,您使用的范围是什么?是 CDI 托管 bean 还是 old faces bean?

    【讨论】:

    • 我用 h:panelGroup 测试过,问题是一样的......所以它不是 UI 片段,但我会保留 panelGroup :)
    • &lt;ui:fragment&gt; 是一个 UI 组件,而不是标签处理程序。您描述的症状仅与标记处理程序匹配,例如&lt;ui:include&gt;&lt;ui:decorate&gt; 等(那些 具有rendered 属性的)。因此,这个“答案”具有误导性,不太可能解决具体问题。
    • 好的,那么请检查您的示例代码,如果我找到了一些东西,请告诉您,还有一件事,请记住,如果您使用复合组件,JSF 将为您的复合组件中的每个组件添加一个 id,所以,你应该检查这个“无法找到 id”警告,@balusc,对不起,我不知道 ui:fragment 是一个 UiComponent,现在添加到我的知识中。
    • 关于您的disconnect() 方法,它不是在JSF 中执行此操作的标准方式。您的 disconnect() 方法只是使一个对象无效。相反,您最好使用 Faces 和 Servlet API 中提供的 logout()invalidateSession() 方法。它将确保会话在注销时真正过期,并且在下一次垃圾回收期间从 JVM 中转储未使用的会话范围 bean。它更安全,优化内存管理,是标准。
    猜你喜欢
    • 2012-12-25
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多