一尘不染

没有发送ViewState

tomcat

我有一个带有primefaces 3.5的JSF 2.2.0-m12应用程序。因为我将应用程序从JBoss 7.1.1移植到Tomcat
7.0.39,所以在重新加载页面后对输入字段(输入文本,滑块,按钮等)的第一个更改可以正常工作,但是第二个更改则无济于事。我搜索了第一个请求和第二个请求之间的区别:

第一个要求:

  • JSF阶段:执行从1到6的阶段
  • 在Firebug中,“网络->所有-> POST zinsrechner.xhtml->发布”是一个视图状态:

    contentForm contentForm
    contentForm:inputZinsatz 2.0
    contentForm:j_idt157:anla … 277
    contentForm:j_idt157:maxA … 25
    contentForm:j_idt157:slid … 277
    contentForm:j_idt72:saveA … 10000
    contentForm:j_idt72:saveA … 20000
    contentForm:selectSparArt false
    javax.faces.ViewState -1622287370124327744:4775655032591022279
    javax.faces.behavior.even … slideEnd
    javax.faces.partial.ajax true
    javax.faces.partial.event slideEnd
    javax.faces.partial.execu … contentForm:j_idt157:sliderAnlageDauer
    javax.faces.partial.rende … contentForm
    javax.faces.source contentForm:j_idt157:sliderAnlageDauer

第二个要求:

  • JSF阶段:在阶段1之后执行6
  • 在Firebug的’网络- >所有- > POST zinsrechner.xhtml - >后’是 没有 的视图状态:

    contentForm contentForm
    contentForm:inputZinsatz 2.0
    contentForm:j_idt157:anla … 460
    contentForm:j_idt157:maxA … 25
    contentForm:j_idt157:滑动… 460
    contentForm:j_idt72:saveA … 10000
    contentForm:j_idt72:saveA … 20000
    contentForm:selectSparArt false
    javax.faces.behavior.even … slideEnd
    javax.faces.partial.ajax true
    javax.faces.partial.event slideEnd
    javax.faces.partial.execu … contentForm:j_idt157:sliderAnlageDauer
    javax.faces.partial.rende … contentForm
    javax.faces.source contentForm:j_idt157:sliderAnlageDauer

现在我不确定,是否缺少ViewState导致错误的行为。

在我的页面中,有三种不包含表格的形式。对于每种形式,都会在即将出现的html(压缩)中呈现一个隐藏的viewstate标签:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Zinsrechner</title>
<body>
<div class="wrapper">
    <form id="headerForm" name="headerForm" method="post"
        action="/Tools_Web/pages/rechner/zinsrechner.xhtml"
        enctype="application/x-www-form-urlencoded">
        <input type="hidden" name="headerForm" value="headerForm" />

        <header>
            <html xmlns="http://www.w3.org/1999/xhtml">
                <script type="text/javascript"> ... </script>
                <nav>...</nav>
            </html>
            <h1>Zinsrechner</h1>
        </header>
        <input type="hidden" name="javax.faces.ViewState"
            id="j_id1:javax.faces.ViewState:0"
            value="863948539220421748:307506195687956782" autocomplete="off" />
    </form>


    <div id="contentOutline">
        <div id="content">
            <div class="wrapper">
                <form id="contentForm" name="contentForm" method="post"
                    action="/Tools_Web/pages/rechner/zinsrechner.xhtml"
                    enctype="application/x-www-form-urlencoded">
                    <input type="hidden" name="contentForm" value="contentForm" />
                    <div id="sidebar"></div>
                    <div id="zinsrechner">
                        <!-- Headline -->
                        <header>
                            <div style="padding: 0 1em; float: right;">
                                <span
                                    title="Zinssatz pro Jahr"><span id="contentForm:j_idt70"
                                    class="ui-inplace ui-hidden-container"><span
                                        id="contentForm:j_idt70_display" class="ui-inplace-display"
                                        style="display: inline">2.0%</span><span
                                        id="contentForm:j_idt70_content" class="ui-inplace-content"
                                        style="display: none"><input
                                            id="contentForm:inputZinsatz" name="contentForm:inputZinsatz"
                                            type="text" value="2.0"
                                            style="width: 70px; right: 0px; top: 0 position:absolute"
                                            class="ui-inputfield ui-inputtext ui-widget ui-state-default ui-corner-all" />
                                        <script id="contentForm:inputZinsatz_s" type="text/javascript">PrimeFaces.cw('InputText','widget_contentForm_inputZinsatz',{id:'contentForm:inputZinsatz',behaviors:{change:function(event) {mojarra.ab('contentForm:inputZinsatz',event,'valueChange','@form','@form headerForm footerForm')},change:function(event) {PrimeFaces.ab({source:'contentForm:inputZinsatz',event:'change',process:'contentForm:inputZinsatz',update:'contentForm'}, arguments[1]);}}});</script></span></span>
                                <script id="contentForm:j_idt70_s" type="text/javascript">PrimeFaces.cw('Inplace','widget_contentForm_j_idt70',{id:'contentForm:j_idt70',effect:'fade',effectSpeed:'normal',event:'click',toggleable:true});</script>
                                </span>
                            </div>
                        </header>


                        <div>
                            <!-- More input elements -->
                        </div>
                    </div>
                    <input type="hidden" name="javax.faces.ViewState"
                        id="j_id1:javax.faces.ViewState:0"
                        value="863948539220421748:307506195687956782" autocomplete="off" />
                </form>
            </div>
        </div>
    </div>
    <form id="footerForm" name="footerForm" method="post"
        action="/Tools_Web/pages/rechner/zinsrechner.xhtml"
        enctype="application/x-www-form-urlencoded">

        <input type="hidden" name="footerForm" value="footerForm" />

        <footer></footer>
        <input type="hidden" name="javax.faces.ViewState"
            id="j_id1:javax.faces.ViewState:0"
            value="863948539220421748:307506195687956782" autocomplete="off" />
    </form>
</div>

我尝试无法解决此处所述的JS问题:h:commandButton/h:commandLink在第一次单击时不起作用,仅在第二次单击时有效

以及web.xml中的以下配置:

<context-param>
<param-name>com.sun.faces.autoCompleteOffOnViewState</param-name>
<param-value>false</param-value>
</context-param>

<context-param>
<param-name>com.sun.faces.enableViewStateIdRendering</param-name>
<param-value>false</param-value>
</context-param>

编辑 这是xhtml页面:

<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
template="/template/baseLayout.xhtml"
xmlns:ad="http://java.sun.com/jsf/composite/components/ad">
<ui:param
    name="title"
    value="Zinsrechner" />
<ui:param
    name="bgClass"
    value="whiteGrid" />
<ui:define name="content">
    <div id="zinsrechner">
        <!-- Headline -->
        <header>
            <p:selectOneButton
                id="selectSparArt"
                value="#{zinsrechner.monthly}"
                styleClass="selectSparArt">
                <f:selectItem
                    itemLabel="Anlagebetrag"
                    itemValue="#{false}" />
                <f:selectItem
                    itemLabel="Sparbetrag"
                    itemValue="#{true}" />
                <p:ajax
                    event="change"
                    update="contentForm"
                    process="selectSparArt"
                    listener="#{zinsrechner.onMonthlyChange()}" />
            </p:selectOneButton>
            <div style="padding: 0 1em; float: right;">
                <span title="Monatlicher Sparbetrag">
                    <p:inplace label="#{zinsrechner.saveAmount}€" rendered="#{zinsrechner.monthly}">
                        <p:inputText
                            style="width: 70px; margin-right: 10px;"
                            id="inputSparbetrag"
                            value="#{zinsrechner.saveAmount}">
                            <p:ajax
                                event="change"
                                update="contentForm"
                                process="inputSparbetrag"
                                listener="#{zinsrechner.onSaveAmountChange()}" />
                            </p:inputText>
                        </p:inplace>
                    </span>

                <span title="Zinssatz pro Jahr">
                    <p:inplace label="#{zinsrechner.interestRate}%">
                        <p:inputText
                            style="width: 70px; right:0px; top: 0 position:absolute"
                            id="inputZinsatz"
                            value="#{zinsrechner.interestRate}">
                            <p:ajax
                                event="change"
                                update="contentForm"
                                process="inputZinsatz"
                                listener="#{zinsrechner.onInterestRateChange()}" />
                                <f:ajax execute="@form" render="@form :headerForm :footerForm"></f:ajax>
                        </p:inputText>
                    </p:inplace>
                </span>
            </div>
        </header>

        <!-- Y-Achse -->
        <ad:yAxis
            component="#{zinsrechner}"
            editable="true"
            inputId="saveAmount"
            inputMaxValueId="saveAmountMax"
            rendered="true"
            sliderId="saveAmountSlider"></ad:yAxis>

        <!-- Chartcontainer -->
        <ad:barChart
            component="#{zinsrechner}"
            rendered="true"
            renderSumBarLeft="false"
            renderSumBarRight="false" />


        <!-- X-Achse -->
        <ad:xAxis
            component="#{zinsrechner}"
            sliderId="sliderAnlageDauer"
            editable="true"
            inputId="anlagedauer"
            inputMaxValueId="maxAnlagedauer"
            rendered="true"
            renderSumBarLeft="false"
            renderSumBarRight="false"></ad:xAxis>
    </div>
</ui:define>

如何将ViewStatus传递给服务器?缺少ViewState可能是错误行为的原因吗?

谢谢你的帮助。如果您需要更多信息,请询问!


阅读 318

收藏
2020-06-16

共1个答案

一尘不染

就像BalusC和Jens所说的那样,问题是Primefaces和JSF的版本:

PF 3.5不是为JSF 2.2设计的。您应该为此使用PF 4.0。请使用常规JSF组件进行测试以排除PF 3.5的原因,或降级到JSF 2.1。

降级到JSF 2.1后,它可以工作。

2020-06-16