2015-09-01 3 views
1

У меня есть много страниц JSF, в которых используется <ui:composition>. Скажем, у меня есть следующие страницыУправление кешем в JSF

  • common.xhtml (здесь определяют head и body. Это родитель/главная/главная страница всех страниц)
  • p1.xhtml (включен в common.xhtml с использованием <ui:composition>)
  • p2.xhtml (включен в common.xhtml используя <ui:composition>)
  • p3.xhtml (включено в common.xhtml с использованием <ui:composition>, и я хочу перезагрузить файлы JF и css, когда эта страница попадает)

Я иду через this ссылки, но это не поможет мне, потому что я должен поместить заголовок в common.xhtml (это остановит кэширование всех JF и CSS файлы, и я выигрыш хочу этого.)

Как я могу перезагрузить js и css файлы только когда p3.xhtml показов?

EDIT

Я добавил следующее common.xhtml

<h:head> 
    .... 
    <ui:insert name="metaTags" /> 
</h:head> 

Я добавил следующее в p3.xhtml

<ui:define name="metaTags"> 
    <meta http-equiv="cache-control" content="max-age=0" /> 
    <meta http-equiv="cache-control" content="no-cache" /> 
    <meta http-equiv="expires" content="0" /> 
    <meta http-equiv="pragma" content="no-cache" /> 
</ui:define> 

Но все-таки это не забрать свой обновленный файл JS.

ответ

2

на основе @BalusC комментария (спасибо за комментарий) Я буду полностью переписать мой ответ:

Вам не нужен никакой Servlet, вы можете включать логику в любом из фаз жизненного цикла JSF реализации JSF фаз слушатель. Я адаптировал контент here на ваш вопрос.

Вам нужно только реализовать фазовый прослушиватель, который запускает перед фазой визуализации и объявляет его внутри файла faces-config.xml.

Объявление:

<lifecycle> 
    <phase-listener id="nocache">com.company.package.CacheControlPhaseListener</phase-listener> 
</lifecycle> 

Код фазы слушатель:

import javax.faces.context.FacesContext; 
import javax.faces.event.PhaseEvent; 
import javax.faces.event.PhaseId; 
import javax.faces.event.PhaseListener; 
import javax.servlet.http.HttpServletResponse; 

public class CacheControlPhaseListener implements PhaseListener 
{ 
    private static final long serialVersionUID = 1L; 

    @Override 
    public PhaseId getPhaseId() 
    { 
     return PhaseId.RENDER_RESPONSE; 
    } 

    @Override 
    public void afterPhase(PhaseEvent event) 
    { 
    } 

    @Override 
    public void beforePhase(PhaseEvent event) 
    { 
     FacesContext facesContext = event.getFacesContext(); 
     if("/p3.xhtml".equals(facesContext.getExternalContext().getRequestServletPath())){ 
      HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); 
      response.addHeader("Pragma", "no-cache"); 
      response.addHeader("Cache-Control", "no-cache"); 
      // Stronger according to blog comment below that references HTTP spec 
      response.addHeader("Cache-Control", "no-store"); 
      response.addHeader("Cache-Control", "must-revalidate"); 
      // some date in the past 
      response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT"); 
     } 
    } 
} 

Неверная первоначальный ответ:

Вы можете написать define похожее на это в p3.xhtml:

<ui:define name="nocache"> 
    <meta http-equiv=... /> 
    ... 
</ui:define> 

и писать в головной части common.xhtml в insert:

<ui:insert name="nocache" />* 
+0

Вы говорите, что в вашем вопросе: «это остановит кэширование все JF и CSS файлы, и я хочу это выигрыш ..». Вы это проверили?Я предположил, что вы ответили на ответ, который вы цитируете в своем вопросе, а вы? – lametaweb

+0

@BalusC есть ли какой-нибудь тег JSF, который может мне помочь, или мне нужно реализовать сервлет? – Junaid

Смежные вопросы