Если вы знаете количество секунд, которое у вас есть, это будет работать. Он также использует собственный объект Date ().
function formattime(numberofseconds){
var zero = '0', hours, minutes, seconds, time;
time = new Date(0, 0, 0, 0, 0, numberofseconds, 0);
hh = time.getHours();
mm = time.getMinutes();
ss = time.getSeconds()
// Pad zero values to 00
hh = (zero+hh).slice(-2);
mm = (zero+mm).slice(-2);
ss = (zero+ss).slice(-2);
time = hh + ':' + mm + ':' + ss;
return time;
}
Прямым подходом было бы следующее представление:
<h:panelGroup id="header" layout="block">
<h1>Header</h1>
</h:panelGroup>
<h:panelGroup id="menu" layout="block">
<h:form>
<f:ajax render=":content">
<ul>
<li><h:commandLink value="include1" action="#{bean.setPage('include1')}" /></li>
<li><h:commandLink value="include2" action="#{bean.setPage('include2')}" /></li>
<li><h:commandLink value="include3" action="#{bean.setPage('include3')}" /></li>
</ul>
</f:ajax>
</h:form>
</h:panelGroup>
<h:panelGroup id="content" layout="block">
<ui:include src="/WEB-INF/includes/#{bean.page}.xhtml" />
</h:panelGroup>
С помощью этого компонента:
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
private String page;
@PostConstruct
public void init() {
page = "include1"; // Default include.
}
// +getter+setter.
}
В этом примере фактические шаблоны включают include1.xhtml
, include2.xhtml
и include3.xhtml
в папке /WEB-INF/includes
(папка и местоположение полностью бесплатны по вашему выбору; файлы только что помещены в /WEB-INF
, чтобы запретил прямой доступ , угадывая URL-адрес в браузере адресная строка).
Этот подход работает во всех версиях MyFaces, но требует минимум Mojarra 2.3.0. Если вы используете версию Mojarra старше 2.3.0, тогда все это не удастся, когда страница <ui:include>
в свою очередь содержит <h:form>
. Любой postback не будет работать, потому что он полностью не видит состояние представления. Вы можете решить эту проблему, обновив до минимума Mojarra 2.3.0 или со скриптом, найденным в этом ответе h: commandButton / h: commandLink не работает при первом щелчке, работает только при втором щелчке , или если вы 'уже используете библиотеку утилиты JSF OmniFaces , используйте ее скрипт FixViewState . Или, если вы уже используете PrimeFaces и используете исключительно <p:xxx>
ajax, то он уже прозрачно принимается во внимание.
Кроме того, убедитесь, что вы используете минимальный Mojarra 2.1.18, поскольку более старые версии будут неспособность сохранить видимый объект в видимой области, что приводит к неправильному использованию во время обратной передачи. Если вы не можете обновить, вам нужно будет вернуться к приведенному ниже (относительно неуклюжему) подходу условного отображения представления вместо условного построения представления:
...
<h:panelGroup id="content" layout="block">
<ui:fragment rendered="#{bean.page eq 'include1'}">
<ui:include src="include1.xhtml" />
</ui:fragment>
<ui:fragment rendered="#{bean.page eq 'include2'}">
<ui:include src="include2.xhtml" />
</ui:fragment>
<ui:fragment rendered="#{bean.page eq 'include3'}">
<ui:include src="include3.xhtml" />
</ui:fragment>
</h:panelGroup>
Недостатком является то, что представление станет относительно большим и что все связанные управляемые компоненты могут быть излишне инициализированы, даже если они не будут использоваться в соответствии с предоставленным условием.
Что касается позиционирования элементов, это просто вопрос применения правый CSS. Это выходит за рамки JSF :) По крайней мере, <h:panelGroup layout="block">
отображает <div>
, поэтому это должно быть достаточно хорошим.
Последнее, но не менее важное: этот подход SPA (Single Page Application) - это не SEO дружелюбный. Все страницы не индексируются поисковыми роботами и не могут быть заклассифицированы конечными пользователями. Возможно, вам придется столкнуться с историей HTML5 на клиенте и предоставить резервную копию на стороне сервера. Более того, в случае страниц с формами тот же экземпляр bean-объекта с расширенным представлением будет повторно использоваться на всех страницах, что приведет к неинтуитивной видимости при переходе на ранее посещаемую страницу. Вместо этого я предлагаю использовать шаблонный подход, как указано во второй части этого ответа: Как включить другой XHTML в XHTML с помощью JSF 2.0 Facelets? См. Также Как перемещаться в JSF? Как сделать URL-адрес текущей страницы (а не предыдущей) .
Если вы хотите обновить часть страницы, есть только 2 пути (для Интернета в целом, а не только для JSF). Вы должны использовать фреймы или Ajax. JSF 2 поддерживает ajax изначально, проверьте тег f: ajax, чтобы обновить только один компонент без перезагрузки всей страницы.
Netbeans предоставляет мастер, который создает предложенный макет с минимальными усилиями с помощью JSF. Итак, лучший способ начать - взглянуть на Мастер шаблонов Facelets и посмотреть на сгенерированный источник.