7
votes

Appeler une méthode avec le paramètre à l'intérieur de la boucle JSTL

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: xxx

évidemment le code ci-dessus 't valide comme jstl . n'autorise que les invocations de paramètres. Je peux voir les solutions suivantes au problème:

1) scriptlets xxx

Le convenu évident ici est la pollution du code JSP et la laideur générale.

2) Écrire une balise qui fait tout ce qui est fait à l'intérieur des scripts. Exemple typique de sur-ingénierie, yuck!

3) décompose une collection de myvars et remplacez chaque myvar avec un Proxy dynamique , InvocommationHandler de qui ajouterait une méthode de paramètre supplémentaire - moins pour fabriquer tous les appels getfooooOO () via autreObject . Tout cela serait fait dans le contrôleur afin que JSP reste propre et myvar reste le même. Mais à quel prix?

Je ne peux pas ajouter .gefooo () méthode au myvar car il ne correspond pas là et enfreindrait la séparation des préoccupations.

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.

Question: Quelqu'un peut-il suggérer l'approche la plus propre pour cette situation?


0 commentaires

6 Réponses :


1
votes

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.

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.


4 commentaires

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 ") 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.



2
votes

Voici comment je l'ai fait à la fin.

Au lieu de passer une collection de des instances , je passe une carte. Les touches de la carte sont les mêmes sentatype s et valeurs sont des instances de la classe interne spécifique au contrôleur, appelons-le someypeSuppplement . .

someypeSuppplement 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.

De cette façon, j'évite proxy magie, inutile TLDS, garder JSP bien rangé et raisonnablement sécurisé.


0 commentaires

1
votes

Pourquoi ne pas simplement composer votre liste d'objets dans votre code Java Backend, puis utilisez JSP pour l'afficher?


1 commentaires

Je ne pense pas que vous ayez compris le problème que je faisais face. $ {myvars} fait déjà référence à une liste d'objets.



0
votes

Une autre option consiste à utiliser Vélocité . C'est beaucoup plus gentil que JSTL.


1 commentaires

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



7
votes

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 carte , et remplacez son get () méthode.

comme exemple minimal, si vous êtes exemplaire, si vous par exemple. Voulez-vous appeler la fonction math.sin () de JSTL, vous définissez une classe: xxx

puis dans votre méthode d'exécution d'action (), vous faites: xxx

puis JSP, vous pouvez dire: xxx

pour calculer la valeur math.sin (0.75)

JSTL traitera le sinon de la variable en tant que carte , mais vous pouvez calculer et renvoyer tout ce que vous voulez de la méthode get ().

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 :)


1 commentaires

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 ());



1
votes

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.

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).

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

Et je serais intéressé par les opinions: est-ce quelque chose que vous pouvez faire sans mauvaise conscience?


0 commentaires