web-dev-qa-db-fra.com

URL de demande MVC de printemps dans JSP

J'écris une application Web en utilisant Spring MVC. J'utilise des annotations pour les contrôleurs, etc. Tout fonctionne correctement, sauf en ce qui concerne les liens réels dans l'application (actions de formulaire, balises <a>, etc.), j'ai ceci (évidemment abrégé):

//In the controller
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET)

//In the JSP
<a href="/admin/listPeople">Go to People List</a>

Lorsque j'entre directement l'URL du type "http: // localhost: 8080/MyApp/admin/listPeople", la page se charge correctement. Cependant, le lien ci-dessus ne fonctionne pas. Il perd le nom de l'application "MyApp".

Est-ce que quelqu'un sait s'il y a un moyen de configurer Spring pour ajouter le nom de l'application là-bas?

Faites-moi savoir si vous avez besoin de voir l'une de mes configurations de printemps. J'utilise la servlet standard de dispatch avec un résolveur de vue, etc.

20
Rachel G.

Vous devez ajouter un chemin de contexte à vos liens.

// somewhere on the top of your JSP
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>

...
<a href="${contextPath}/admin/listPeople">Go to People List</a>
44
craftsman

La balise c:url ajoutera le chemin de contexte à votre URL. Par exemple:

<c:url value="/admin/listPeople"/>

Sinon, je préfère utiliser autant que possible les URL relatives dans mes applications Spring MVC. Donc, si la page est à /MyApp/index, le lien <a href="admin/listPeople"> me mènera à la page listPeople

Cela fonctionne également si vous êtes plus en profondeur dans la hiérarchie des URL. Vous pouvez utiliser le .. pour remonter d'un niveau. Donc sur la page at/MyApp/admin/people/aPerson, utiliser <a href="../listPeople"> sera comme revenir à la page de liste

13
Jason Gritman

Je préfère utiliser le tag BASE:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />

Ensuite, tous vos liens peuvent être comme:

<a href="admin/listPeople">Go to People List</a>
6
sinuhepop

Comme je viens d’essayer de trouver la réponse à cette question, c’est le premier résultat obtenu sur Google.

Cela peut être fait maintenant en utilisant le MvcUriComponentsBuilder

Cela fait partie de la version 4.0 de Spring MVC

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

La méthode nécessaire est fromMappingName

De la documentation:

Créez une URL à partir du nom du mappage de demandes d'une méthode de contrôleur Spring MVC . La HandlerMethodMappingNamingStrategy configurée détermine les noms des mappages de demandes de méthode de contrôleur au démarrage. Par défaut, tous les mappages se voient attribuer un nom basé sur les lettres majuscules du nom de la classe, suivi de "#" comme séparateur, puis du nom de la méthode. Par exemple, "PC # getPerson" pour une classe nommée PersonController avec la méthode getPerson. Si la convention de dénomination ne produit pas de résultats uniques, un nom explicite peut être attribué via l'attribut name de l'annotation @RequestMapping.

Ceci est principalement destiné aux technologies de rendu de vue et aux expressions EL. La bibliothèque de balises Spring Spring enregistre cette méthode en tant que fonction appelée "mvcUrl".

Par exemple, étant donné ce contrôleur:

@RequestMapping("/people")
 class PersonController {

   @RequestMapping("/{id}")
   public HttpEntity getPerson(@PathVariable String id) { ... }

 }

Une JSP peut préparer une URL vers la méthode du contrôleur comme suit:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

 <a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>
4
Chris Eccles

Je configure habituellement Tomcat pour utiliser la racine de contexte "/" ou déployer la guerre en tant que ROOT.war. Dans les deux cas, le nom de la guerre ne fait pas partie de l'URL.

0
Kevin

Depuis quelques années, je pensais pouvoir aider ceux qui en cherchaient. Si vous utilisez des annotations et que vous avez une action de contrôleur telle que celle-ci, par exemple:

@RequestMapping("/new")   //<--- relative url
public ModelAndView newConsultant() {
    ModelAndView mv = new ModelAndView("new_consultant");
    try {
        List<Consultant> list = ConsultantDAO.getConsultants();
        mv.addObject("consultants", list);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mv;
}

dans votre .jsp (voir) vous ajoutez cette directive

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

et simplement utiliser

<spring:url value="/new" var="url" htmlEscape="true"/>
<a href="${url}">Nuevo consultor</a>

où 

La valeur de value doit correspondre à l'argument de @RequestMapping dans l'action du contrôleur et 

var's valeur est le nom de la variable que vous utilisez pour href

HIH

0
Scaramouche

Vous pouvez utiliser un servletRelativeAction. Je ne suis pas sûr des versions disponibles (j'utilise actuellement la version 4.0.x) et je n'ai pas vu beaucoup de documentation à ce sujet, mais si vous examinez le code sauvegardant le formulaire print, vous pouvez probablement le deviner. Assurez-vous simplement que le chemin que vous empruntez commence par un "/".

Exemple:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check"  method="POST">

Voir org.springframework.web.servlet.tags.form.FormTag:

protected String resolveAction() throws JspException {
    String action = getAction();
    String servletRelativeAction = getServletRelativeAction();
    if (StringUtils.hasText(action)) {
        action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action));
        return processAction(action);
    }
    else if (StringUtils.hasText(servletRelativeAction)) {
        String pathToServlet = getRequestContext().getPathToServlet();
        if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) {
            servletRelativeAction = pathToServlet + servletRelativeAction;
        }
        servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction));
        return processAction(servletRelativeAction);
    }
    else {
        String requestUri = getRequestContext().getRequestUri();
        ServletResponse response = this.pageContext.getResponse();
        if (response instanceof HttpServletResponse) {
            requestUri = ((HttpServletResponse) response).encodeURL(requestUri);
            String queryString = getRequestContext().getQueryString();
            if (StringUtils.hasText(queryString)) {
                requestUri += "?" + HtmlUtils.htmlEscape(queryString);
            }
        }
        if (StringUtils.hasText(requestUri)) {
            return processAction(requestUri);
        }
        else {
            throw new IllegalArgumentException("Attribute 'action' is required. " +
                    "Attempted to resolve against current request URI but request URI was null.");
        }
    }
}