Динамические шаблоны в JSF [дубликат]

Если вы знаете количество секунд, которое у вас есть, это будет работать. Он также использует собственный объект 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; 
}
32
задан BalusC 24 March 2016 в 11:01
поделиться

3 ответа

Прямым подходом было бы следующее представление:

<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-адрес текущей страницы (а не предыдущей) .

58
ответ дан BalusC 27 August 2018 в 20:33
поделиться

Если вы хотите обновить часть страницы, есть только 2 пути (для Интернета в целом, а не только для JSF). Вы должны использовать фреймы или Ajax. JSF 2 поддерживает ajax изначально, проверьте тег f: ajax, чтобы обновить только один компонент без перезагрузки всей страницы.

2
ответ дан GBa 27 August 2018 в 20:33
поделиться

Netbeans предоставляет мастер, который создает предложенный макет с минимальными усилиями с помощью JSF. Итак, лучший способ начать - взглянуть на Мастер шаблонов Facelets и посмотреть на сгенерированный источник.

0
ответ дан lu4242 27 August 2018 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: