2010-11-11 5 views
1

je suis arrivé deux vues:Spring portlets MVC: Forward Paramètres de la requête pour modéliser

  1. Affiche une information commune sur une entité
  2. Affiche plus de détails sur cette entité

La deuxième vue a lien vers le premier. Pour créer le lien j'ai besoin de quelques informations, disons deux ids ("id1" et "id2"). Ces identifiants sont transmis au contrôleur de la deuxième vue par des paramètres de requête.

Pour créer le lien arrière dans la deuxième vue, je dois transmettre les paramètres de la demande au modèle manuellement. Ce n'est pas très pratique.

Y at-il une approche pour faire ce transfert automatiquement?

Voici un exemple:

Lien vers les détails dans la première vue:

<portlet:renderURL var="detailsUrl"> 
    <portlet:param name="action" value="showDetails" /> 
    <portlet:param name="id1" value="${entity.id1}" /> 
    <portlet:param name="id2" value="${entity.id2}"/> 
</portlet:renderURL> 
<a href="${detailsUrl}">Details</a> 

méthode Render dans le second contrôleur:

@RenderMapping(params = "action=showDetails") 
public String showDetails (
     @RequestParam("id1") int id1, 
     @RequestParam("id2") int id2, 
     Model model) { 
    // The current unconvenient approach 
    model.addAttribute("id1", id1); 
    model.addAttribute("id2", id2); 

    return "showDetails"; 
} 

Retour lien dans la deuxième vue:J'ai cherché sur Internet pour des heures pour trouver quelque chose comme un truc que j'ai raté. Mais la seule chose que j'ai trouvée était: "Le printemps le dose automatiquement pour toi". Mais je ne peux pas le confirmer.

Merci pour votre aide ...

+0

Ce serait bien pour moi, si la réponse est que c'est impossible. – scheffield

Répondre

0

Essayez le marquage de votre id avec @ModelAttribute:

@RenderMapping(params = "action=showDetails") 
public String showDetails (
     @ModelAttribute @RequestParam("id1") int id1, 
     @ModelAttribute @RequestParam("id2") int id2, 
     Model model) { 
    // The current unconvenient approach 
    //model.addAttribute("id1", id1); 
    //model.addAttribute("id2", id2); 

    return "showDetails"; 
} 

Avis, que je commentais le cadre explicite des id au modèle. Je n'ai pas testé cela, donc s'il vous plaît faire rapport de retour ici si cela fonctionne ..

+0

Salut, j'ai déjà essayé. Et je peux vous dire que ça ne marchera pas. Pardon. – scheffield

2

Ok, si @ModelAttribute ne permet pas que diriez-vous un peu approche plus complexe:

Faire une classe qui implémente org . springframework.web.portlet HandlerInterceptor. Vous devez remplacer un ensemble de méthodes, mais dans l'un d'entre eux postHandleRender, définissez vos ID sur le modèle.

Assurez-vous que chaque méthode d'implémentation qui renvoie un booléen renvoie true. Sinon, vos méthodes de portlets risquent de ne pas être appelées (si, par exemple, preHandleRender renvoie false).

L'intercepteur doit être introduit dans votre portlet pour qu'il fonctionne, bien sûr. Cela peut se faire en ajoutant ce qui suit au contexte config du portlet:

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <bean class="some.package.to.my.interceptors.MyInterceptor"/> 
    </property>   
</bean> 
+0

OK, je vais essayer ça. – scheffield

0

Vous pouvez simplement écrire une méthode comme ci-dessous et ajouter générer une carte. Ajoutez-le à la carte modèle.Appelez cette méthode à partir de votre méthode RenderMapping pour ajouter tous vos paramètres de requête à la ModelMap.

private Map<String, String> getParamterMap(PortletRequest request){ 
     Map<String, String> parameters = new HashMap<String, String>(); 

     Set<String> keySet = request.getParameterMap().keySet(); 
     for(String key : keySet){ 
      parameters.put(key, request.getParameter(key)); 
     } 

     return parameters; 

    } 

modelMap.addAllAttributes(getParamterMap(request)); 
Questions connexes