Обновление в конце ниже .
У меня есть веб-приложение на основе JSF, в котором некоторые страницы отображаются частично пустыми. Кажется, что в некоторых случаях на странице отсутствует информация ViewState. Хотя я не знаю почему.
В этом приложении мы используем шаблон для наших страниц (здесь упрощенно):
<h:body>
<div id="header">
<ui:insert name="header">
<ui:include src="/pages/common/header.xhtml" />
</ui:insert>
</div>
<div id="nav-bar">
<ui:insert name="nav-bar">
<ui:include src="/pages/common/navbar.xhtml"></ui:include>
</ui:insert>
</div>
<div id="breadcrumbs">
<ui:insert name="breadcrumbs">
<ui:include src="/pages/common/breadcrumbs.xhtml"></ui:include>
</ui:insert>
</div>
<div id="content">
<ui:insert name="content">
</ui:insert>
</div>
<div id="footer">
<ui:insert name="footer">
<ui:include src="/pages/common/footer.xhtml" />
</ui:insert>
</div>
Из того, что я вижу в HTML из браузера, отображается заголовок и Navbar, но все остальное отсутствует.
Код Навбара:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<body>
<ui:composition>
<div>
<ui:param name="view" value="#{facesContext.viewRoot.viewId}" />
<h:form>
<ul class="nav nav-pills">
<li id="home" class="#{view == '/pages/home.xhtml' ? 'active' : ''}"><a jsfc="h:link" outcome="/pages/home.xhtml">Home</a></li>
<li id="search" class="#{view == '/pages/search.xhtml' ? 'active' : ''}"><a jsfc="h:link" outcome="/pages/search">Search</a></li>
<!-- other LI's like above -->
</ul>
</h:form>
</div>
</ui:composition>
</body>
</html>
В отображаемом HTML я вижу div и форму nav-bar ....
<html>
<!-- above this looks fine -->
<div>
<form id="j_id_q" name="j_id_q" method="post" action="http://mysever.com/viewPage.xhtml" enctype="application/x-www-form-urlencoded">
<ul class="nav nav-pills">
<li id="home" class=""><a href="http://myserver.com/faces/pages/home.xhtml">Home</a></li>
<!-- other LI tags -->
</ul>
<input type="hidden" name="j_id_q_SUBMIT" value="1">
</form>
</div>
Сравнивая это с рабочей страницей, рабочая страница имеет скрытый ввод ViewState:
<input type="hidden" name="j_id_q_SUBMIT" value="1"><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="srDkVocvtTYI ..."></form>
рабочая страница корректно отображает остальную часть страницы.
Таким образом, пустые страницы не имеют этой информации ViewState.
Я не уверен, почему отсутствует ViewState?
К сожалению (для отладки), только несколько пользователей системы сообщили об этой проблеме. Я предполагаю, что большинство пользователей не имеют эту проблему. Пока я просматривал журналы Tomcat, мне ничего не выделялось и ошибок не было.
Мы используем JSF (Myfaces) 2.1.11, PrimeFaces 6.2, Spring 4.3.18.
У кого-нибудь есть мысли о том, в чем может быть проблема? Или где еще я могу посмотреть в коде? Я не настолько знаком с тем, как ViewState работает в JSF, как мне нужно: (
заранее спасибо за любую помощь !!
Обновление
Я наткнулся на пару сообщений о методе сохранения состояния JSF, который заставил меня более внимательно посмотреть на нашу конфигурацию. И мы используем Client в качестве State_Saving_Method вместо Server по умолчанию. Я не уверен, почему мы сделали это изменение некоторое время назад.
Я полагаю, что это может быть причиной того, что видит пользователь, основываясь на том, что я читал о клиенте против сервера State_Saving_Method. Просто попробуйте на нашем тестовом сайте, используя метод сохранения клиента, наша страница просмотра занимает почти 2 мегабайта, а при переключении на метод сохранения на сервере та же страница просмотра занимает менее 100 Кбайт.
Есть ли у кого-нибудь какие-нибудь мысли по этому поводу или они согласны (подтвердят) мое понимание?
Еще раз спасибо!
Chris