Нет ViewState отправлено
У меня есть приложение JSF 2.2.0-m12 с простыми лицами 3.5. Так как я перенес приложение из JBoss 7.1.1 в Tomcat 7.0.39, первое изменение поля ввода (inputtext, slider, button,...) после перезагрузки страницы работает нормально, но второе изменение ничего не делает. Я искал различия между первым и вторым запросом:
1-й запрос:
- Фазы JSF: Фазы от 1 до 6 выполнены
- В Firebug 'network -> all -> POST zinsrechner.xhtml -> post' это состояние просмотра:
contentForm contentForm contentForm: inputZinsatz 2.0 contentForm: j_idt157: anla... 277 contentForm: j_idt157: maxA... 25 contentForm: j_idt157: слайд... 277 contentForm: j_idt72: saveA... 10000 contentForm: j_idt72: saveA... 20000 contentForm: selectSparArt falsejavax.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
2-й запрос:
- Фазы JSF: после Фазы 1 выполняется 6
- В Firebug 'network -> all -> POST zinsrechner.xhtml -> post' нет состояния просмотра:
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 вызывает некорректное поведение.
На моих страницах три не вмещающие формы. Для каждой формы есть скрытый тег viewstate, представленный в исходящем html(сокращенно):
<!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>
Отредактировано Это страница HTML:
<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 быть причиной неправильного поведения?
Спасибо за вашу помощь. Если вам нужна дополнительная информация, просто спросите!
1 ответ
Как BalusC и Jens сказали, что проблема в версиях Primefaces и JSF:
PF 3.5 не предназначен для JSF 2.2. Вы должны использовать PF 4.0 для этого. Пожалуйста, протестируйте, используя обычные компоненты JSF, чтобы исключить причину PF 3.5, или понизьте ее до JSF 2.1.
После понижения до JSF 2.1 это работает.