2010-04-07 8 views
3

J'utilise Spring Web Flow (version 1.0.5) et j'ai une page JSP qui fait un appel AJAX à un flux et qui doit être lue dans les résultats XML. Ce flux définit avec succès un objet dans le FlowScope, puis appelle une page JSP pour afficher les résultats. Dans la page JSP, je voudrais tester si l'objet a une propriété (par exemple, .firstName) et si oui, faire quelque chose. Je peux accéder à la variable dans le FlowScope en utilisant le langage d'expression JSTL (en disant $ {userObj}), mais cela me permet de le cracher. J'ai essayé les méthodes ci-dessous pour y arriver et mettre la logique autour, avec un succès variable.Accéder à FlowScope à partir de JSP sans JSTL

Mise à jour: La question restante est: Comment obtenir le contexte et l'étendue de flux dans la section scriptlet (<%%>)?

<rootnode> 

<!-- Attempt 1: c:if isn't being interpreted (though ${userObj.firstName} is), 
     it's just displaying the tags on the page. --> 
<!-- Update, I didn't have the <%@ taglib directive for jstl/core. 
     Now I do, and they're being interpreted, but it says 
     "According to TLD or attribute directive in tag file, 
      attribute test does not accept any expressions" 
     How can the if/@test not accept expressions? Isn't that its whole purpose 
     in life? --> 
<!-- Update 2, I also forgot the taglib for the rt language, which is separate, 
     I guess (jstl/core_rt). <c:if test now works properly. --> 
<c:if test="${!empty(userObj.firstName)}"> 
<test>not empty</test> 
</c:if> 

<% 
/* Attempt 2: This throws an error, can't resolve "context". How do I get the context? */ 
if (context.getFlowScope().userObj != null) { 
    out.write("not null"); 
} else { 
    out.write("not not null"); 
} 
%> 

<!-- Attempt 3: This works, I get the reference to the Object and it 
     spits out the correct firstName, gives me no control other than 
     spitting out the value. --> 
<userReference>${userObj}</userReference> 
<userReference_firstName>${userObj.firstName}</userReference_firstName> 

</rootnode> 

Répondre

2

Tentative 1 devrait fonctionner si vous avez installé JSTL et a déclaré la taglib la bonne façon et a déclaré la web.xml être au moins Servlet 2.4. Voir aussi les questions suivantes:

Pour tester si un objet est vide ou non, vous devriez plutôt utiliser la construction suivante:

<c:if test="${not empty userObj.firstName}"> 

ou

<c:if test="${userObj.firstName != null}"> 

La tentative 2 est fortement déconseillée. Les scriptlets sont une mauvaise pratique et devraient toujours être remplacés par des taglibs comme JSTL et EL (comme vous l'avez fait dans la tentative 1). Si ce n'est pas possible pour des raisons techniques, alors le codage doit être fait dans une classe Java réelle, (indirectement) en commençant par une servlet.

Tentative 3 est faisable, mais je recommanderais d'utiliser servlet avec un sérialiseur Javabean-à-XML comme XStream à la place. De cette façon, vous pouvez juste alimenter une collection de Javabeans vers le flux de sortie de la réponse de manière transparente.