2010-06-07 3 views
37

Comment puis-je obtenir l'URL de demande dans JSP qui est transférée par Servlet?Obtenir l'URL de demande dans JSP qui est transférée par le 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-je obtenir le chemin du côté du serveur à la JSP. Mais je veux obtenir l'URL comme vous pouvez le voir dans la barre d'adresse du navigateur. Je peux l'obtenir dans la servlet qui transmet à la JSP, mais je veux l'obtenir dans la JSP.

+2

en double de http://stackoverflow.com/questions/2089528/how-to-get-the-url-of-the-client – skaffman

+1

En fait, je pense en utilisant la tête referrer est encore pire passe alors URL valide avec le modèle – user12384512

Répondre

64

Si vous utilisez RequestDispatcher.forward() pour router la demande du contrôleur vers la vue, l'URI de demande est exposée en tant qu'attribut de requête nommé javax.servlet.forward.request_uri. Ainsi, vous pouvez utiliser

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

ou

${requestScope['javax.servlet.forward.request_uri']} 
+1

Il est l'inverse. Il veut réellement l'URL telle qu'elle est affichée dans la barre d'adresse du navigateur. – BalusC

+1

je vous remercie, c'était exactement ce que je cherchais – user12384512

+1

@aauser: en d'autres termes, vous ** cherchez ** pas ** l'URL telle qu'elle était affichée dans la barre d'adresse du navigateur mais juste pour l'URL de la vue transférée ? (qui n'apparaît pas du tout dans la barre d'adresse du navigateur). Si oui, alors votre question était assez floue et trompeuse. – BalusC

3

Aucun de ces attributs sont fiables, car pour la spécification servlet (2.4, 2.5 et 3.0), ces attributs sont remplacés si vous incluez/avant une seconde temps (ou si quelqu'un appelle getNamedDispatcher). Je pense que le seul moyen fiable d'obtenir la chaîne de requête/URI d'origine est de coller un filtre au début de votre chaîne de filtre dans web.xml qui définit vos propres attributs de requête personnalisés basés sur request.getRequestURI()/getQueryString() avant tout avant/inclut avoir 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 second renvoi/inclusion perturbe votre capacité à utiliser ces attributs).

7

Essayez ceci:

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; 

Note: Vous ne pouvez pas obtenir l'ancre HREF de votre URL. Par exemple, si vous avez url "toc.html # top" alors vous pouvez obtenir que "toc.html"

Remarque: req.getAttribute ("javax.servlet.forward.request_uri") travail seulement dans JSP. si vous exécutez ce dans le contrôleur avant JSP alors résultat est nul

Vous pouvez utiliser le 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; 
} 
+0

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

3

Pour obtenir le chemin courant à partir du fichier JSP, vous pouvez simplement faire une des opérations suivantes:

<%= request.getContextPath() %> 
<%= request.getRequestURI() %> 
<%= request.getRequestURL() %> 
1

vous pouvez également utiliser

${pageContext.request.requestURI} 
+0

Essayez de donner des réponses plus détaillées. – veducm

2

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

+2

En quoi est-ce différent de la réponse plus ancienne que vous référencez? – jbindel

+0

La réponse n'est pas différente dans quoi faire. J'ai ajouté quelques précisions en utilisant $ {pageContext.request.requestURI} pour éviter d'utiliser des scriplets. – stock

4

Essayez ceci,

<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 mettre dans mon modèle de base et l'utilisation dans l'application tout quand je veux.