web-dev-qa-db-fra.com

Comment définir la valeur de la variable JSTL en javascript?

Comment définir la valeur de la variable JSTL dans un script Java?

<script>

 function function1()

 { 

  var val1 = document.getElementById('userName').value;

  <c:set var="user" value=""/>  // how do i set val1 here?   

 }
 </script>

Comment définir la valeur ' user ' (JSTL) entre ' val1 ' (script Java)?

34
Tony

Ce n'est pas possible car ils sont exécutés dans différents environnements (JSP côté serveur, JavaScript côté client). Ils ne sont donc pas exécutés dans l'ordre que vous voyez dans votre code.

var val1 = document.getElementById('userName').value; 

<c:set var="user" value=""/>  // how do i set val1 here? 

Ici, le code JSTL est exécuté côté serveur et le serveur voit les codes JavaScript/Html comme de simples textes. Le contenu généré à partir du code JSTL (le cas échéant) sera restitué dans le code HTML résultant avec vos autres codes JavaScript/HTML. Maintenant, le navigateur rend le HTML avec l'exécution des codes Javascript. Rappelez-vous qu’il n’ya pas de code JSTL disponible pour le navigateur.

Maintenant par exemple

<script type="text/javascript">
<c:set var="message" value="Hello"/> 
var message = '<c:out value="${message}"/>';
</script>

Maintenant pour le navigateur, ce contenu est rendu,

<script type="text/javascript">
var message = 'Hello';
</script>

J'espère que cela t'aides.

43
Marimuthu Madasamy

une autre approche à utiliser.

tout d’abord, définissez les éléments suivants quelque part sur la page:

<div id="valueHolderId">${someValue}</div>

puis dans JS, il suffit de faire quelque chose de similaire à

var someValue = $('#valueHolderId').html();

cela fonctionne très bien pour les cas où tous les scripts sont dans des fichiers .js et il n'y a évidemment pas de jstl disponible

11
Cyril Deba
<script ...
  function(){
   var someJsVar = "<c:out value='${someJstLVarFromBackend}'/>";

  }
</script>

Ceci fonctionne même si vous n'avez pas de champ de saisie caché/non caché défini quelque part dans le jsp.

4
Vikram

Juste ne pas. Ne pas écrire le code avec le code. Ecrivez un objet JSON ou une var quelque part, mais pour l'amour d'une division HTTP sensible, n'écrivez pas de fonctions ou méthodes JavaScript codées en dur avec vars/propriétés fournies par JSTL. Générer du JSON, c'est cool. Ça se termine là ou votre interface utilisateur vous déteste.

Imaginez si vous deviez creuser dans JavaScript pour trouver quelque chose qui définissait des paramètres au milieu d'une classe ayant pour origine le côté client. C'est affreux. Passe les données dans les deux sens. Gérer les données. Mais n'essayez pas de générer du code réel.

2
Erik Reppen

En réponse, je dis non. Vous ne pouvez obtenir les valeurs que de jstl à javascript. Mais vous pouvez afficher le nom d'utilisateur à l'aide de javascript lui-même.

<div id="uName"></div>

Vous pouvez afficher le nom d'utilisateur comme suit.

var val1 = document.getElementById('userName').value;
document.getElementById('uName').innerHTML = val1;

Pour obtenir des données de jstl sur votre javascript:

var userName = '<c:out value="${user}"/>';

ici, $ {utilisateur} correspond aux données que vous obtenez en réponse (à partir du backend).

Nombre assigné/longueur du tableau

var arrayLength = <c:out value="${details.size()}"/>;

Avancée

function advanced(){
    var values = new Array();
    <c:if test="${empty details.users}">
       values.Push("No user found"); 
    </c:if>         

    <c:if test="${!empty details.users}">
        <c:forEach var="user" items="${details.users}" varStatus="stat">
            values.Push("${user.name}");   
        </c:forEach>
    </:c:if>
    alert("values[0] "+values[0]);

}); 
0
shreedhar bhat

Cette variable peut être définie à l'aide de value="${val1}" dans c:set si vous avez utilisé jquery dans votre système.

0
mohiz tank

Vous devez utiliser la concaténation de chaînes normale, mais vous devez vous assurer que la valeur est une chaîne XML valide. Vous trouverez une bonne pratique pour écrire du XML dans cette source http://oreilly.com/pub/h/2127 , ou si vous le souhaitez, vous pouvez utiliser une API en javascript pour écrire XML sous la forme helma par exemple.

0
Kronass

Vous pouvez enregistrer l’objet entier jstl en tant qu’objet Javascript en le convertissant en objet json. C'est possible par Jackson en Java.

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtil{
   public static String toJsonString(Object obj){
      ObjectMapper objectMapper = ...; // jackson object mapper
      return objectMapper.writeValueAsString(obj);
   }
}

/WEB-INF/tags/util-functions.tld:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib xmlns="http://Java.Sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" 
  version="2.1"> 

  <tlib-version>1.0</tlib-version>
  <uri>http://www.your.url/util-functions</uri>

  <function>
      <name>toJsonString</name>
      <function-class>your.package.JsonUtil</function-class>
      <function-signature>Java.lang.String toJsonString(Java.lang.Object)</function-signature>
  </function>  

</taglib> 

web.xml

<jsp-config>
  <tablib>
    <taglib-uri>http://www.your.url/util-functions</taglib-uri>
    <taglib-location>/WEB-INF/tags/util-functions.tld</taglib-location>
  </taglib>
</jsp-confi>

mypage.jsp:

<%@ taglib prefix="uf" uri="http://www.your.url/util-functions" %> 

<script>
   var myJavaScriptObject = JSON.parse('${uf:toJsonString(myJstlObject)}');
</script>
0
Dariush Jafari