multiple内部サーブレット/ jspフォワードを使用して表示用の適切なjspに到達するstruts/tilesを使用するクルーズ予約アプリに取り組んでいます。しかし、ページのレンダリングに使用される最後のjspに到達すると、${pageContext.request.requestURL}
呼び出しで、jspはthisjspのパスを返します。
例えば
したがって、/ booking/showCruiseDetails.jspで${pageContext.request.requestURL}
/booking/showCruiseDetails.jspを取得します
multipleforwardで到達したjspから元の(クライアントが作成した)要求URLを取得するにはどうすればよいですか。私は解決策を示唆するstackoverflowに関する次の投稿を見つけました here および here ですが、複数回転送した後に元のリクエストURLを見つける方法については触れていません発生しています。
この投稿でより良い答えを見つけました[ JavaサーブレットでURLを検出するにはどうすればよいですか? ]
ターゲットJSPで次を使用します。
request.getAttribute("javax.servlet.forward.request_uri")
元のURLが何であるかを調べるため。
転送サーブレットで追加の手順を実行する必要はありません。
フィルタを使用して、Originアドレスを要求属性に設定し、jspから読み取ることができます。
/ booking/*にマップされたフィルターは実行します:
request.setAttribute("Origin", request.getRequestURL());
Jsp:
${pageContext.request.attribute["Origin"]}
これは、フィルターがデフォルトでREQUESTディスパッチャーを設定しているため機能します。これは、転送/インクルードではなく、直接のクライアント要求に対してのみフィルターが実行されることを意味します
${requestScope["javax.servlet.forward.request_uri"]}
または一重引用符で
${requestScope['javax.servlet.forward.request_uri']}
代わりに、サーブレットフィルターを使用して情報を検証することを検討してください。つまり、検証の転送を回避し、単一のJSPファイルにとどまることができます。
以下を使用して、Bean参照を使用せずに表示できます。
<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />
もちろん、web.xmlファイルで404ページをマップする必要があります。
<error-page>
<error-code>404</error-code>
<location>/xhtml/pg/error/404.xhtml</location>
</error-page>
@Lenny Markusと同じですが、Request Dispatcherクラスで提供される定数を使用します。
request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)