2015-01-12 31 views
5

Görüntülenen içeriğin (parçanın) URL'ye bağlı olduğu bir "genel" görünüm uygulamaya çalışıyorum. Örneğin.JSF'de yönlendirmeyi uygulamak için basit bir yol var mı?

bunun yerine ben gibi bir şey var genel görünümü, /genericview.xhtml kullanılarak veritabanından /somepath/somepage.xhtml 'in içeriği almak için denemek istiyorum 404 hatası düz gidiyor olmayan bir varolan dosyaya /somepath/somepage.xhtml puan,:

<h:outputText value="#{genericViewBean.content_lg}" 
       escape="false" /> 

olan, yedekleme fasulye ile çıkış tgenericcontent tablodan veri tabanı girişi içeriğini özgün olarak talep viewId bağlı olacaktır bulursa:

webpath        | content 
/somepath/somepage.xhtml    | <p>This is a test</p> 
/someotherpath/someotherpage.xhtml | <p>A different test</p> 

halinde Bu tablodaki içeriği görmüyorsanız, standart 404 hatası döndürülür.

En yakın ben sadece dosya yolunu (örneğin, /somepath/somepage.xhtml) değiştirerek /genericview.xhtml klonlamak için harcadım. Ama bu bana dosya başına bir kopyasını görüntü başına alır, oldukça karmaşıktır ve veri tabanına bir giriş ekleyerek yeni bir url oluşturmama izin vermez.

/genericview.xhtml klonlamadan aynı sonucu nasıl alabilirim?

(P.S.:? Ben prettyfaces hakkında okumak, ama orada daha basit bir çözüm değil) genel Bunun için

+1

Öyleyse ... bir ön denetleyici? FacesServlet'in halihazırda yaptığı şeyden farklı değil mi? Kendi ön kontrol cihazınızı (mevcut bir sayfa veya sunucuya karşılık gelmesi gereken) yazım veya çizim yapmak oldukça fazla seçeneğinizdir. Kendi ön kontrolörünüzde, seçenekler verilen – kolossus

+0

çeşitli mekanizmaları kullanarak isteği uygun görünüme gönderme esnekliğine sahipsiniz. Bu durumda, en güzel olanı, güzel yüzeyler dağıtırsam ve/dynamic/*// yolunda/dynamic/* yolunu yeniden yönlendiren bir face-config kurarsam genericview.xhtml? yol = * veya bunun gibi bir şey ... – NotGaeL

cevap

9

, normalde servlet filter kullanılıyor. PrettyFaces, UrlRewriteFilter ve FacesViews da bu şekilde yapın.

İstek URI'sini HttpServletRequest#getRequestURI()'dan alabilirsiniz. Bir web kaynağının varlığını null, var olmayan kaynaklarda döndüren ServletContext#getResource() ile kontrol edebilirsiniz. Kaynak varsa, isteği yalnızca FilterChain#doFilter()'a devam edin, aksi takdirde isteği genel görünümle RequestDispatcher#forward() iletin. /genericview.xhtml yılında

@WebFilter("/*") 
public class GenericViewFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String relativeRequestURI = request.getRequestURI().substring(request.getContextPath().length()); 

     boolean resourceExists = request.getServletContext().getResource(relativeRequestURI) != null; 
     boolean facesResourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)); 

     if (resourceExists || facesResourceRequest) { 
      chain.doFilter(request, response); 
     } 
     else { 
      request.getRequestDispatcher("/genericview.xhtml").forward(request, response); 
     } 
    } 

    // ... 
} 

, URI RequestDispatcher#FORWARD_REQUEST_URI ile anahtarlı istek niteliği olarak kullanılabilir orijinal istek:

Sonuçta

, bu filtre gibi görünebilir nasıl. Doğru içeriği DB'den çekmek için görünümle ilişkili artalan desteğinin @PostConstruct içinde kullanabilirsiniz.

String originalRequestURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 
// ... 
+0

Zaten bir süper basit Rewrite (http://www.ocpsoft.org/rewrite/) yapılandırma sağlayıcısı sınıfının uygulanmasını yapmış olsam da (Benekleri için büyük bir halefi ile: pompamda sadece bir fazladan bağımlılık ve projemde yapılandırma sağlayıcısı sınıfını uygulayarak herhangi bir ek değişiklik yapmadan tüm bunları hazır bulundurmanız gerekiyor), cevabınız tam olarak aradığım şeyi açıklıyor. Çok teşekkür ederim! – NotGaeL

+0

Rica ederim :) – BalusC

İlgili konular