program tip

기본 URL은 어떻게 얻습니까?

radiobox 2020. 11. 14. 10:06
반응형

기본 URL은 어떻게 얻습니까?


이 구조가 있습니다.

WebContent
    resources
        components
            top.xhtml

    company
        about_us.xhtml

    index.xhtml

top.xhtml안에 사용되는 부품입니다 index.xthmlabout_us.xhtml도.

top.xhtml

<ul>
    <li><a href="index.xhtml">Home</a></li>
    <li><a href="company/about_us.xhtml">About us</a></li>
    ...
</ul>

그래서 내 문제는 현재 페이지가 index.xhtml구성 요소 일 때 URL을 올바르게 생성하지만 현재 페이지가 about_us.xhtml이면 잘못된 URL을 생성한다는 것입니다. 잘못된 URL도 생성 할 것이기 때문에 상대 경로를 사용할 수 없습니다. 구성 요소가 *.xhtml페이지 의 현재 경로를 기반으로하기 때문이라고 생각합니다 .

내가 찾은 유일한 해결책은 다음과 같습니다.

<ul>
    <li><a href="${pageContext.request.contextPath}/webname/index.xhtml">Home</a></li>
    <li><a href="${pageContext.request.contextPath}/webname/about_us.xhtml">About us</a></li>
    ...
</ul>

그러나 나는 전혀 '우아하다'고 생각하지 않습니다. 어떤 아이디어?


URL은 서버 측의 파일 구조를 기반으로 확인되지 않습니다. URL은 해당 리소스의 실제 공개 웹 주소를 기반으로 확인됩니다. 즉, 웹 서버가 아닌 웹 브라우저를 호출해야합니다.

통증을 완화하는 방법에는 여러 가지가 있습니다.

JSF EL은에 속기를 제공 ${pageContext.request}의 맛 #{request}:

<li><a href="#{request.contextPath}/index.xhtml">Home</a></li>
<li><a href="#{request.contextPath}/about_us.xhtml">About us</a></li>

필요한 경우 <c:set>태그를 사용하여 더 짧게 만들 수 있습니다 . 마스터 템플릿 어딘가에 넣으면 모든 페이지에서 사용할 수 있습니다.

<c:set var="root" value="#{request.contextPath}/" />
...
<li><a href="#{root}index.xhtml">Home</a></li>
<li><a href="#{root}about_us.xhtml">About us</a></li>

JSF 2.x는 <h:link>컨텍스트 루트 outcome관련된 뷰 ID를 가져올 수 있는 제공하며 컨텍스트 경로와 FacesServlet매핑을 자동으로 추가합니다 .

<li><h:link value="Home" outcome="index" /></li>
<li><h:link value="About us" outcome="about_us" /></li>

HTML은 <base>문서의 모든 상대 URL을이 기반에 상대적으로 만드는 태그를 제공합니다 . 당신은 그것을 사용할 수 있습니다. 에 넣어 <h:head>.

<base href="#{request.requestURL.substring(0, request.requestURL.length() - request.requestURI.length())}#{request.contextPath}/" />
...
<li><a href="index.xhtml">Home</a></li>
<li><a href="about_us.xhtml">About us</a></li>

(참고 : 이것은 EL 2.2가 필요합니다. 그렇지 않으면 JSTL을 사용하는 것이 좋습니다. 이 답변fn:substring() 도 참조하십시오 )

이것은 다음과 같이 생성 된 HTML로 끝나야합니다.

<base href="http://example.com/webname/" />

Note that the <base> tag has a caveat: it makes all jump anchors in the page like <a href="#top"> relative to it as well! See also Is it recommended to use the <base> html tag? In JSF you could solve it like <a href="#{request.requestURI}#top">top</a> or <h:link value="top" fragment="top" />.


JSTL 1.2 variation leveraged from BalusC answer

<c:set var="baseURL" value="${pageContext.request.requestURL.substring(0, pageContext.request.requestURL.length() - pageContext.request.requestURI.length())}${pageContext.request.contextPath}/" />

<head>
  <base href="${baseURL}" />

참고URL : https://stackoverflow.com/questions/6878275/how-get-the-base-url

반응형