2012-12-02 19 views
5

Ho un server dedicato per i contenuti statici quindi non voglio usare la directory delle risorse per memorizzare i file javascript ma non voglio smettere di usare il tag <h:outputScript />.Come posso usare <h: outputScript /> con un file remoto?

Come posso fare in modo che quel tag generi un collegamento al mio server statico in cui si trovano i file invece di RES_NOT_FOUND. Non ho nemmeno bisogno JSF per verificare se i file sono lì ...

ho provato: <h:outputScript name="#{requestBean.staticURL}/javascript.js"/>

generare: <script type="text/javascript" src="http://static.server.com/javascript.js"></script>

ma genera: <script type="text/javascript" src="RES_NOT_FOUND"></script>

Cosa posso fare ?

SOLUZIONE: Daniel mi ha indicato una soluzione piacevole!

Ho scaricato il codice sorgente del Omnifaces e modificato il metodo org.omnifaces.resourcehandler.CDNResourceHandle.createResource(String resourceName, String libraryName) a:

public Resource createResource(String resourceName, String libraryName) { 
    final Resource resource = wrapped.createResource(resourceName, libraryName); 

    if (cdnResources == null) { 
     return resource; 
    } 

    String resourceId = ((libraryName != null) ? libraryName + ":" : "") + resourceName; 

    String path = cdnResources.get(resourceId); 

    if(path == null){ 
     if(libraryName != null){ 
      resourceId = libraryName + ":%"; 
      path = cdnResources.get(resourceId); 
      if(path == null){ 
       return resource; 
      } 
      path += "/"+resourceName; 
     } 
     else return resource; 
    } 

    final String requestPath = path; 

    return new ResourceWrapper() { 

     @Override 
     public String getRequestPath() { 
      return requestPath; 
     } 

     @Override 
     public Resource getWrapped() { 
      return resource; 
     } 
    }; 
} 

Con questa modifica posso aggiungere questo al mio web.xml file di

<context-param> 
    <param-name>org.omnifaces.CDN_RESOURCE_HANDLER_URLS</param-name> 
    <param-value> 
     somelib2:%=http://cdn.example.com/somelib2, 
     js/script1.js=http://cdn.example.com/js/script1.js, 
     somelib:js/script2.js=http://cdn.example.com/somelib/js/script2.js, 
     otherlib:style.css=http://cdn.example.com/otherlib/style.css, 
     images/logo.png=http://cdn.example.com/logo.png 
    </param-value> 
</context-param> 

Avviso del somelib2:%=http://cdn.example.com/somelib2, questo punterà qualsiasi risorsa nella libreria somelib2 al relativo percorso in http://cdn.example.com/somelib2, per esempio:

<h:outputScript name="js/myjs.js" library="somelib2" />

uscita volontà:

<script type="text/javascript" src="http://cdn.example.com/somelib2/js/myjs.js"></script>

Questo funziona con <h:outputScript /><h:outputStylesheet /><h:graphicImage />, tutto ciò che utilizzano risorse;

risposta

8

Non puoi

Semplicemente perché <h:outputScript /> possibile leggere cartella delle risorse locali solo forma all'interno della vostra applicazione web

Che cosa si potrebbe fare è usareOmnifaces CDNResourceHandler, e qui è la JavaDoc

Ti consentirà di utilizzare un file remoto

Ecco un codice dalla vetrina

Per eseguirlo, questo gestore deve essere registrato come segue in faces-config.xml:

<application> 
    <resource-handler>org.omnifaces.resourcehandler.CDNResourceHandler</resource-handler> 
</application> 



<context-param> 
    <param-name>org.omnifaces.CDN_RESOURCE_HANDLER_URLS</param-name> 
    <param-value> 
     js/script1.js=http://cdn.example.com/js/script1.js, 
     somelib:js/script2.js=http://cdn.example.com/somelib/js/script2.js, 
     otherlib:style.css=http://cdn.example.com/otherlib/style.css, 
     images/logo.png=http://cdn.example.com/logo.png 
    </param-value> 
</context-param> 

Con la configurazione sopra, le seguenti risorse:

<h:outputScript name="js/script1.js" /> 
<h:outputScript library="somelib" name="js/script2.js" /> 
<h:outputStylesheet library="otherlib" name="style.css" /> 
<h:graphicImage name="images/logo.png" /> 
+0

Grazie, il vostro suggerimento mi ha aiutato molto e risolto il mio problema :) ho cambiato il CDNResourceHandle.createResource (String resourceName, String libraryName) metodo per consentire l'utilizzo della libreria per collegarsi al mio server invece di elencare ogni singolo file e ora funziona perfettamente :) –

+0

Se sei interessato alla modifica, ho cambiato questa parte: 'String resourceId = ((libraryName! = null)? libraryName + ":": "") + resourceName; String path = cdnResources.get (resourceId); se (percorso == null) { \t se (LibraryName! = Null) { \t \t ResourceId = LibraryName + ":%"; \t \t path = cdnResources.get (resourceId); \t \t if (percorso == null) { \t \t \t risorsa di ritorno; \t \t} \t \t path + = "/" + resourceName; \t} \t altra risorsa di restituzione; } finale String requestPath = percorso; ' –

+0

Questo farà il lavoro:' org.omnifaces.CDN_RESOURCE_HANDLER_URLS alibraryname:% = http: //cdn.example.com ', ora puoi fare ciò:' ' –

1

Penso che non ne abbia bisogno. Viene utilizzato per visualizzare uno script preso dagli archivi nel classpath. Per uno script normale, è sufficiente digitare il tag <script> corrispondente.