2011-10-06 4 views
7
<c:url var="myUrl" value="/MyPath/${MyID}"/> 

とホスト名を含む、完全なURLへのアクセス〜になる私は、(リンクをコピーするには、ユーザーを有効にするために)後で使用JSTL

http://myHost/my-app-name/MyPath/23 

私は文字列を前に付けることができますが、方法をしたい積極的に正しいホスト名を取得する...?

+2

Sidenote:アクティブにホスト名を取得すると、サーバーに到達するために使用されたホスト名が得られることに注意してください。 reverseProxyの背後にあるアプリケーション(たとえば、アプリケーションのサーバーへのApacheの再ルーティング要求)では、ユーザーに表示されるホスト名は持ちません。 – helios

答えて

22

あなたがHttpServletRequest#getRequestURL()JSTL functionsの少しの助けに基づいて、それを自分で準備する必要があります:

<c:set var="req" value="${pageContext.request}" /> 
<c:set var="baseURL" value="${fn:replace(req.requestURL, fn:substring(req.requestURI, 1, fn:length(req.requestURI)), req.contextPath)}" /> 
... 
<c:url var="myUrl" value="${baseURL}/${MyID}"/> 
+0

はすばやく、thnx、それはショットを与えるだろう。 – NimChimpsky

+0

のTomcat 7.0.52では、部分文字列の先頭を1から0に変更する必要がありました。 'fn:substring(req.requestURI、0、fn:length(req.requestURI))など。 – cthiebaud

+3

tomcat 7.0.52、単純化されたbaseURLが動作します: '' – cthiebaud

7

HttpServletRequestオブジェクトは、すべての詳細を持っています

  • getProtocol
  • getServerName
  • getContextPath

ので、私はあなたが使用することができると思う:

${request.protocol} :// ${request.serverName} ${request.contextPath} /etc 

をあなたが望むものを構築します。

+4

とポートtoo :) – helios

+2

これは、指定されたプロトコルの既定のポートであるときはいつでも、ポートを非表示にするために、不器用なif-elseロジックフローで終わるだけです。 'getRequestURL()'に基づいて構築する方が簡単です。また、 'getServerName()'はクライアントが 'Host'リクエストヘッダを通して操作することができます。私はこれに依存しません。 – BalusC

+0

私はポートを隠すことについては考えなかった。 OPがURLを変更したかったので、私はgetRequestURLの方法には行っていませんでした。一つの質問。私はservernameの操作を理解していませんでした。クライアントがホスト:www.other.comを送信してビルドされたURLに入るのでしょうか? – helios

関連する問題