2010-10-28 5 views
12

Je veux mettre des fichiers JavaScript dans un de mes colis et de les servir Struts comme /struts/js/foo.jsServe fichiers statiques (JavaScript) avec Struts 2

Struts fait que pour les fichiers dans le package « modèle » (c'est là plugin jQuery de les fichiers sont situés, gardés par l'option struts.ui.templateDir). Cependant, je veux mettre ces fichiers dans un autre paquet; Si je redéfinis struts.ui.templateDir alors struts cesse de fonctionner parce qu'il ne peut pas trouver ses modèles.

Donc la question est: Comment dire Struts pour servir les fichiers dans org.foo.some.package.js comme /struts/js/whatever.js?

+2

Avez-vous vu ce lien: http://struts.apache.org/development/2.x /docs/static-content.html? –

+0

@AleksandrM gentil, ne le savais pas. Vous êtes un bon candidat pour la prime si vous voulez écrire une réponse complète. – alamar

+2

pourquoi ne pas utiliser un serveur web? dire Apache ou nigix qui est beaucoup mieux et efficace pour servir le contenu statique –

Répondre

7

Struts2 peut servir contenu statique hors de la boîte. Par défaut, le contenu statique est servi par DefaultStaticContentLoader une implémentation de StaticContentLoader. Il recherche automatiquement les paquets suivants:

  • org.apache.struts2.static
  • modèle
  • statique
  • org.apache.struts2.interceptor.debugging

Vous pouvez ajouter d'autres paquets à rechercher dans le paramètre init du filtre nommé "packages".

<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class> 
     org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
    </filter-class> 
    <init-param> 
     <param-name>packages</param-name> 
     <param-value>some.package another.one</param-value> 
    </init-param> 
</filter> 

Vous pouvez ajouter plus d'un paquet, utiliser une virgule ou un espace ou un onglet ou une nouvelle ligne comme séparateur.

BTW vous pouvez contrôler si le contenu statique est mise en cache par un navigateur ou non avec cette constante:

struts.serve.static.browserCache 
+0

Réponse canonique, +1 –

+0

Comment ont-ils réussi à avoir des paquets nommés statiques? C'est un mot réservé: -/ – alamar

+0

@alamar: Eh bien, c'est pour les ressources statiques après tout. Donc, il n'y a pas de fichiers source dedans. –

3

Une façon consiste à étendre le modèle entier & changez le templateDir comme vous l'avez déjà suggéré. À moins qu'il ne soit nécessaire d'implémenter un gabarit personnalisé, ceci est très surprenant.

Mais la meilleure façon IMHO est d'oublier /struts/js/foo.js & utiliser une autre URL pour charger le js.

Quelques exemples:

JSP

WebPages 
    |-->myjs.js   (a normal js file) 
    |-->mydynamicjs.jsp (a .jsp file containing ONLY javascript code) 
    |-->WEB-INF-->xyz.js (another .js file but accessed only through action) 

Struts

<action name="myacctionjs"> 
    <result>/WEB-INF/xyz.js</result> 
</action> 
+0

Eh bien, y a-t-il un moyen facile de faire que Struts serve mon js à n'importe quelle autre URL? – alamar

+0

@alamar J'ai modifié ma réponse pour ajouter un exemple de code. –