J'ai un JSP qui doit imprimer du texte qui est produit en prenant une itératrice en boucle et en l'alimentant à un autre objet (Spring Bean), quelque chose comme: évidemment le code ci-dessus 't valide comme jstl 1) scriptlets p> Le convenu évident ici est la pollution du code JSP et la laideur générale. P> 2) Écrire une balise qui fait tout ce qui est fait à l'intérieur des scripts. Exemple typique de sur-ingénierie, yuck! P> 3) décompose une collection de Je ne peux pas ajouter On dirait que les paramètres de passage seront possibles dans JSP / EL 2.2, mais j'utilise Tomcat 6.0.29 qui ne fait que grouper el 2.1 API. P> Question: strong> Quelqu'un peut-il suggérer l'approche la plus propre pour cette situation? P> P> . code> n'autorise que les invocations de paramètres. Je peux voir les solutions suivantes au problème: p>
myvars code> et remplacez chaque
myvar code> avec un Proxy dynamique ,
InvocommationHandler code> de qui ajouterait une méthode de paramètre supplémentaire - moins pour fabriquer tous les appels
getfooooOO () code> via
autreObject code>. Tout cela serait fait dans le contrôleur afin que JSP reste propre et
myvar code> reste le même. Mais à quel prix? P>
.gefooo () code> méthode au
myvar code> car il ne correspond pas là et enfreindrait la séparation des préoccupations. P>
6 Réponses :
Si vous ne pouvez pas respecter Scriptlets (votre alternative 1), je créerais une balise personnalisée pour elle (votre alternative 2) ou une fonction EL personnalisée. Je ne suis pas d'accord pour dire que c'est "sur-ingénierie", il utilise les outils disponibles pour leur objectif. P>
Votre alternative 3, cependant, je n'aime pas. Si quelque chose, c'est trop ingénierie et cela rendra votre système inutilement complexe et plus difficile que d'autres personnes suivent. Adhérer aux intentions des spécifications et des normes que vous travaillez dans. Ne rendez pas les choses plus difficiles ou plus complexes pour cela. P>
Si vous écrivez une balise JSP pour chaque appel de méthode unique n'est pas sur-ingénierie, je ne sais pas ce qu'est la sur-ingénierie. Je ne dis pas que l'option n ° 3 est bonne / préférée, mais non plus # 2.
Eh bien, si vous avez beaucoup d'instances où vous devez appeler explicitement des méthodes dans votre JSP: S, alors je vous suggère d'améliorer votre motif MVC et de mettre en place des efforts pour créer une couche de modèle plus propre qui ne contient que des données. Déplacez ensuite toute logique dans votre couche de contrôleur.
L'objet MyVar est un exemple précis de ce que vous appelez le modèle (objet qui ne contient que des données de données - les données de persistance dans ce cas). Cependant, les données que je dois visualiser provient d'une source complètement différente (" autreObject code>") et nécessite cette classe de modèle. Votre suggestion de déplacer la logique à la couche de contrôleur est proche de l'option n ° 3 que j'ai suggérée et que vous avez dit que c'était une mauvaise idée.
Je faisais référence à votre idée du proxy dynamique pour réaliser un comportement de type AOO, que je maintenue toujours est trop compliqué et sera difficile à maintenir au fil du temps. Je refactorisez votre code de support (le contrôleur) pour extraire les informations requises de l'instance "autreObject" et stockez-la un objet de modèle plus propre.
Voici comment je l'ai fait à la fin. P>
Au lieu de passer une collection de code> des instances code>, je passe une carte. Les touches de la carte sont les mêmes code> sentatype code> s et valeurs sont des instances de la classe interne spécifique au contrôleur, appelons-le De cette façon, j'évite someypeSuppplement code>. P>.
someypeSuppplement code> ajoute que le no-arg getters et file tout ensemble. JSP désigne maintenant sur les entrées de la carte et est capable de récupérer les données via JSTL. P>
proxy code> magie, inutile TLDS, garder JSP bien rangé et raisonnablement sécurisé. P>
Pourquoi ne pas simplement composer votre liste d'objets dans votre code Java Backend, puis utilisez JSP pour l'afficher? P>
Je ne pense pas que vous ayez compris le problème que je faisais face. $ {myvars} code> fait déjà référence à une liste d'objets.
Une autre option consiste à utiliser Vélocité . C'est beaucoup plus gentil que JSTL. P>
Votez-vous pour une alternative créative (et une préférence sur moi personnellement), mais là encore, nous ne pouvons pas toujours choisir comment nous sommes autorisés à servir des vues
Un simple java uniquement "truc-correction" qui fonctionne dans l'ancienne version JSTL, aussi,
et ne nécessite aucun taglibs supplémentaire / configuration / dépendances / cadres, etc.
est de "envelopper" la fonction que vous souhaitez appeler de JSTL
Dans une classe qui s'étend à partir d'une classe code> carte code>, et remplacez son comme exemple minimal, si vous êtes exemplaire, si vous par exemple. Voulez-vous appeler la fonction puis dans votre méthode d'exécution d'action (), vous faites: p> puis JSP, vous pouvez dire: p> pour calculer la valeur JSTL traitera le sinon de la variable en tant que carte Je suppose que cela devient un peu plus impliqué si vous avez plus d'un argument à votre fonction,
Mais il devrait y avoir des solutions de contournement pour cela aussi :) p> p> get () code> méthode.
math.sin () code> de JSTL,
vous définissez une classe: p>
math.sin (0.75) code> p>
code>, mais vous pouvez calculer et renvoyer tout ce que vous voulez de la méthode get (). p>
Si gentil et délicat, merci beaucoup. Pour ceux qui sont nouveaux dans ces trucs modelandview.addObject ("sinus", nouveau sinus ()); est l'équivalent printemps Version MVC de demande.setattribute ("sinus", nouveau sinus ());
Je voulais ajouter un commentaire à la dernière réponse (par heure) de ROP, mais manquante "réputation", alors je suis ici avec une réponse. P>
J'ai prochainement eu la même idée d'une telle carte, mais j'ai essayé de le rendre plus généralement utilisable, avec une interface "dynamicmap", une interface dynamicmapcalculator et vous permettant d'envelopper n'importe quelle méthode dans une telle carte (sans la nécessité de faire une nouvelle carte. Mise en œuvre de la carte à chaque fois, à l'aide d'une instanciation de classe anonyme). P>
Ce serait le sujet, si vous êtes intéressé: A. de style: carte dynamique JSTL Hack pour contourner les appels de fonctions de paramètres manquants P>
Et je serais intéressé par les opinions: est-ce quelque chose que vous pouvez faire sans mauvaise conscience? P>