web-dev-qa-db-fra.com

Obtenir l'URL de demande dans JSP qui est transmise par Servlet

Comment puis-je obtenir l'URL de demande dans JSP qui est transmise par Servlet?

Si je lance le code suivant dans JSP,

System.out.println("servlet path= " + request.getServletPath());
System.out.println("request URL= " + request.getRequestURL());
System.out.println("request URI= " + request.getRequestURI());

puis j'obtiens le chemin côté serveur vers le JSP. Mais je veux obtenir l'URL comme vous pouvez le voir dans la barre d'adresse du navigateur. Je peux l'obtenir dans le Servlet qui le transmet à la JSP, mais je veux l'obtenir dans la JSP.

41
user12384512

Si vous utilisez RequestDispatcher.forward() pour acheminer la demande du contrôleur vers la vue, l'URI de la demande est exposé en tant qu'attribut de demande nommé javax.servlet.forward.request_uri. Vous pouvez donc utiliser

request.getAttribute("javax.servlet.forward.request_uri")

ou

${requestScope['javax.servlet.forward.request_uri']}
66
axtavt

Essayez ceci à la place:

String scheme = req.getScheme();             
String serverName = req.getServerName(); 
int serverPort = req.getServerPort();    
String uri = (String) req.getAttribute("javax.servlet.forward.request_uri");
String prmstr = (String) req.getAttribute("javax.servlet.forward.query_string");
String url = scheme + "://" +serverName + ":" + serverPort + uri + "?" + prmstr;

Remarque: Vous ne pouvez pas obtenir l'ancre HREF à partir de votre URL. Exemple, si vous avez l'url "toc.html # top" , vous ne pouvez obtenir que "toc.html"

Remarque: req.getAttribute ("javax.servlet.forward.request_uri") fonctionne uniquement dans JSP. si vous l'exécutez dans le contrôleur avant JSP, le résultat est nul

Vous pouvez utiliser du code pour les deux variantes:

public static String getCurrentUrl(HttpServletRequest req) {
    String url = getCurrentUrlWithoutParams(req);
    String prmstr = getCurrentUrlParams(req);
    url += "?" + prmstr;
    return url;
}

public static String getCurrentUrlParams(HttpServletRequest request) {
    return StringUtil.safeString(request.getQueryString());
}

public static String getCurrentUrlWithoutParams(HttpServletRequest request) {
    String uri = (String) request.getAttribute("javax.servlet.forward.request_uri");
    if (uri == null) {
        return request.getRequestURL().toString();
    }
    String scheme = request.getScheme();
    String serverName = request.getServerName();
    int serverPort = request.getServerPort();
    String url = scheme + "://" + serverName + ":" + serverPort + uri;
    return url;
}
8
Koss

Pour obtenir le chemin actuel à partir du fichier JSP, vous pouvez simplement effectuer l'une des opérations suivantes:

<%= request.getContextPath() %>
<%= request.getRequestURI() %>
<%= request.getRequestURL() %>
7
lanoxx

Essaye ça,

<c:set var="pageUrl" scope="request">
    <c:out value="${pageContext.request.scheme}://${pageContext.request.serverName}"/>
    <c:if test="${pageContext.request.serverPort != '80'}">
        <c:out value=":${pageContext.request.serverPort}"/>
    </c:if>
    <c:out value="${requestScope['javax.servlet.forward.request_uri']}"/>
</c:set>

Je voudrais le mettre dans mon modèle de base et l'utiliser dans toute l'application quand j'en ai besoin.

5
Hasasn

Aucun de ces attributs n'est fiable car selon la spécification de servlet (2.4, 2.5 et 3.0), ces attributs sont remplacés si vous incluez/transférez une deuxième fois (ou si quelqu'un appelle getNamedDispatcher). Je pense que le seul moyen fiable d'obtenir l'URI/la chaîne de requête d'origine est de coller un filtre au début de votre chaîne de filtrage dans web.xml qui définit vos propres attributs de demande personnalisés en fonction de request.getRequestURI ()/getQueryString () avant tous les transferts/inclusions ont lieu.

http://www.caucho.com/resin-3.0/webapp/faq.xtp contient un excellent résumé de la façon dont cela fonctionne (moins la note technique qu'un deuxième transfert/inclusion gâche votre capacité à utiliser ces attributs).

3
Raul Acevedo

Pour éviter d'utiliser des scriplets dans le jsp, suivez les conseils de "divideByZero" et utilisez ${pageContext.request.requestURI} C'est une meilleure façon de procéder.

2
stock

Vous pouvez également utiliser

${pageContext.request.requestURI}
2
divideByZero

Identique à @axtavt, mais vous pouvez également utiliser la constante RequestDispatcher.

request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
0
winter