Struts2 HowTo

De Wikifago.

Sommaire

Java server page JSP

  • Positionner un paramètre au niveau d'une JSP.
// Une valeur en dure
<s:set name="statusKey" value="%{'Une valeur'}"/>
// Une valeur issue d'une méthode statique qui prend en entrée un parametre et 2 propriétés
<s:set name="statusKey" value='%{@com.package.static.ViewHelper@getStatusPropertyKey( #param, ConnectedUser, ConnectedUser.id )}'/>
// Une valeur issue d'un fichier de properties
<s:set var="libelleTraduit"><h3><s:text name="cle.du.libelle"/></h3></s:set>
// Une valeur issue d'un Enuméré
<s:set var="typeEnv" value="%{@com.package.common.TypeEnvironnement@PRODUCTION}"/>
  • Utiliser les paramétres positionnés
<s:if test="%{'V'==status.code  && !'key.refused'.equals(#statusKey)}}">
  <s:checkbox theme="simple" id="productIds" name="productIds" fieldValue="%{id}"/>
</s:if>
<a href="javascript:alert('${typeEnv}');"></a>
});
  • Utiliser un paramétre dépendant d'une propriété typeActivite positionnée au niveau de l'action pour conditionner un label utilisant l'internationnalisation
<s:if test='%{@mon.package.Constante@TYPE_ETUDE.equals(typeActivite)}'>
  <s:set name="btLabel" value="%{getText('properties.button.etude')}"/>
</s:if>
<s:elseif test='%{@mon.package.Constante@TYPE_LOISIR.equals(typeActivite)}'>
  <s:set name="btLabel" value='%{getText("properties.button.loisir")}'/>
</s:elseif>

<input type="button" value="<s:property value="#btLabel"/>" id="btnXX" onclick="soumetre();">


  • Utiliser un paramètre dans les messages internationalisés
   <s:set name="name" value='%{user.firstname + " " + user.surname}'/>
   <h3>
   <s:text name="tso.edit.h3">
	<s:param><s:property escape="true" value="name"/></s:param>
   </s:text>
   </h3>
  • Tester si une proprité est nulle
<s:if test="reference"><s:property value="reference.code" /></s:if>
<s:else>Le réference est nulle</s:else>
  • Utiliser un message dépendant d'une propriété 'nature' dans les messages internationalisés

getByCode(String) est une fonction statique de l'énuméré TypeMoteur, qui renvoie l'énuméré qui correspond au code. L'énuméré TypeMoteur à une fonction statique getPropertyKey() qui renvoie la clé du libellé.

   <s:text name="%{@com.common.TypeMoteur@getByCode( nature ).propertyKey}"/>
   <s:text name="%{@com.common.TypeMoteur@ESSENCE.propertyKey}"/>
  • Utiliser un message qui prend des paramètres Ex : msg.key=Mon message avec paramètre 1:{0} et paramètre 2: {1}
  <s:text name="msg.key">
     <s:param><s:property value="param1"/></s:param>
     <s:param><s:property value="param2"/></s:param>
  </s:text>
  • Boucler sur un Enum

TypeUnite.java du package com.common

public enum TypeUnite {
    /** litre*/
    LITRE("L"),
    /** Metre cube */
    CENTILITRE("cL");
   
    private final String code;

    private TypeUnite(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}
  <s:iterator value="%{@com.common.TypeUnite@values()}"><s:property/> - <s:property value="code"/></s:iterator>
  • Boucler sur une Map
  <s:iterator value="mapTypesVelo"><s:property value="key"/> - <s:property escape="false" value="value"/></s:iterator>
  • Construire une url de type action avec des paramètres
  var dataUrl = '<s:url action="/archiverDonnees" escapeAmp="false">
    <s:param name="variableIdr" value="%{variableIdr}"/>
    <s:param name="nomVar" value="%{nomVar}"/>
  </s:url>';

avec des parametres javascript

  var url = '<s:url action="archiverVariables"/>?variableIdr='+ id +'&nomVar='+unLibelle;
  • Récuperer le ressource Bundle de l'action pour le passer à la couche de service

Coté Actions et Services

  ResourceBundle.getBundle("globalmessages", getLocale())
  • Utiliser les resource Bundle dans le service
  resourceBundle.getString(theMessageKey));

Utiliser le plugin Json de struts 2 et faire de l'ajax avec en utilisant JQuery

  • Dans le fichier de mapping Xml de struts déclarer le type json comme étant org.apache.struts2.json.JSONResult.
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>
	<package name="monPackage" extends="common" >
	<result-types>
        	<result-type name="json" class="org.apache.struts2.json.JSONResult" />
    	</result-types>
    	
		<action name="monAction" class="com.xxx.yyy.action.monPackage.MonAction">
			<result name="success">/jsp/monPack/maJsp.jsp</result>
			<result type="json" name="ajaxResult"></result>
		</action>
	</package>
</struts>
  • Au niveau de l'action faire une méthode qui retourne "ajaxResult".

La fonction alimente la propriété nomProduit et une map de composés, toutes les propriétés non vides seront renvoyé dans un flux Json

private Map mapComposes;
private String nomProduit;
private String code; //avec setter et getter
private String reference; //avec setter et getter

public String getDataProduit() {
  if (StringUtils.isEmpty(getCode())) {
    return "ajaxResult";
  }

  long code = new Long(getCode()).longValue();
  Produit p = produitDAO.getByCode(code);
  // Nom du produit associe
  setNomProduit(getText(p.getLibelle()));
  // Prix
  getMapCompose(p);

  return "ajaxResult";
}

/**
 * Methode qui alimente une map des Composés du produit
 */
private void getMapCompose(Produit p) {
  List<Compose> list = composeDAO.getComposeByProduct(p);
  mapComposes = new HashMap<Long, String>();

  Iterator<Compose> it = list.iterator();
  Compose c;
  while (it.hasNext()) {
    c = it.next();
    mapComposes.put(new Long(c.getId()),
    getText(c.getLibelle()));
  }
}
  • Appel Ajax au niveau de la jsp avec utilisation de JQuery 1.4

La fonction getLinkedData effectue une requête ajax en appelant la méthode getDataProduit de l'action "monAction" Les propriétés "code" et reference de l'action seront positionnées avec les paramètres passés en paramètre. Les paramètres sont séparé par des virgules. Au retours le flux est mis dans le json "data". L'exemple utilise Jquery pour lister le contenu de la map et positionner un élément html dont l'id est "libelle"

function getLinkedData(code){
	if (code==null)return;

	$.post("<s:url value='monAction!getDataProduit.action'/>", { code: ''+code+'', reference: ''+$('#reference').val()+'' },
	   function(data){
		try
		{
		    var i=-1;
		    $.each(data.mapCompose, function(i,mapCompose){
			alert(i+','+mapCompose);
		    });
		$("#libelle").val(data.nomProduit);

		}
		finally	{alert('final')}
	   });
}


Utiliser le plugin Json de struts 2 pour ne renvoyer que quelques propriétés

@Action(value="/update_XXXAjax")
public String updateSelectRessourceId() {
  try {
	// récupération des informations sous forme de map
	// résultats
	Map<String, Serializable> resultats = new HashMap<String, Serializable>(2);
	resultats.put("propriete1", "blabla");
	resultats.put("propriete2", 33L);
			
	// positionnement de la réponse en tant que JSON
	HttpServletResponse response =  ServletActionContext.getResponse();
	response.setCharacterEncoding("UTF-8");
	response.setContentType("application/json");
			
	// sérialization JSON & écriture sur la sortie
	ServletOutputStream out = response.getOutputStream();
	String json = JSONUtil.serialize(resultats);
	out.print(json);
	out.flush();
  } catch (Exception e) {
        addActionError(getText("administration.erreur.inatendue"));
  }
  return null;
}
Outils personnels