서블릿이 JSP로 전달 될 때 CSS 및 이미지를로드하고 다른 페이지에 대한 링크를 만드는 데 문제가 있습니다. 내가 설정 한 경우 특히, <welcome-file>
에을 index.jsp
의 CSS로드되고 있으며, 내 이미지가 표시되고있다. 그러나 제어를 전달하는 내 <welcome-file>
를로 설정 하면 CSS가 적용되지 않고 내 이미지가 표시되지 않습니다.HomeServlet
index.jsp
내 CSS 파일은 web/styles/default.css
.
내 이미지는 web/images/
.
내 CSS에 다음과 같이 연결합니다.
<link href="styles/default.css" rel="stylesheet" type="text/css" />
다음과 같이 내 이미지를 표시하고 있습니다.
<img src="images/image1.png" alt="Image1" />
이 문제는 어떻게 발생하며 어떻게 해결할 수 있습니까?
업데이트 1 : 응용 프로그램의 구조와 도움이 될 수있는 기타 정보를 추가했습니다.
header.jsp
파일은 CSS에 대한 링크 태그가 들어있는 파일입니다. 은 HomeServlet
내로 설정 welcome-file
에서 web.xml
:
<welcome-file-list>
<welcome-file>HomeServlet</welcome-file>
</welcome-file-list>
서블릿은 다음과 같이 선언되고 매핑됩니다 web.xml
.
<servlet>
<servlet-name>HomeServlet</servlet-name>
<servlet-class>com.brianblog.frontend.HomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HomeServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
업데이트 2 : 마침내 문제를 발견했습니다-내 서블릿이 잘못 매핑되었습니다. 분명히 Servlet을 설정할 때 <welcome-file>
URL 패턴을 가질 수 없습니다 /
. 사이트의 루트 디렉토리를 나타내지 않기 때문에 이상한 것 같습니다.
새 매핑은 다음과 같습니다.
<servlet-mapping>
<servlet-name>HomeServlet</servlet-name>
<url-pattern>/HomeServlet</url-pattern>
</servlet-mapping>
답변
JSP 파일에 의해 생성 된 HTML 페이지의 모든 상대 URL은 예상대로 서버 측의 JSP 파일 위치가 아니라 현재 요청 URL (브라우저 주소 표시 줄에 표시되는 URL)에 상대적 입니다. 즉, 디스크에서 리소스를 포함해야하는 웹 서버가 아니라 URL별로 리소스를 개별적으로 다운로드해야하는 웹 브라우저입니다.
JSP 파일의 위치 대신 서블릿의 URL을 기준으로 상대 URL을 변경하는 것 외에도이 문제를 해결하는 또 다른 방법은 도메인 루트에 대해 상대 URL을 만드는 것입니다 (예 :로 시작 /
). 이렇게하면 서블릿의 URL을 변경할 때 상대 경로를 다시 변경하는 것에 대해 걱정할 필요가 없습니다.
<head>
<link rel="stylesheet" href="/context/css/default.css" />
<script src="/context/js/default.js"></script>
</head>
<body>
<img src="/context/img/logo.png" />
<a href="/context/page.jsp">link</a>
<form action="/context/servlet"><input type="submit" /></form>
</body>
그러나 컨텍스트 경로를 하드 코딩하지 않는 것이 좋습니다. 매우 합리적입니다. 를 사용하여 EL에서 컨텍스트 경로를 얻을 수 있습니다 ${pageContext.request.contextPath}
.
<head>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/default.css" />
<script src="${pageContext.request.contextPath}/js/default.js"></script>
</head>
<body>
<img src="${pageContext.request.contextPath}/img/logo.png" />
<a href="${pageContext.request.contextPath}/page.jsp">link</a>
<form action="${pageContext.request.contextPath}/servlet"><input type="submit" /></form>
</body>
(쉽게 단축하여 다른 곳 <c:set var="root" value="${pageContext.request.contextPath}" />
에서처럼 사용할 수 있음 ${root}
)
또는 읽을 수없는 XML과 깨진 XML 구문 강조 표시를 두려워하지 않는다면 JSTL을 사용하십시오 <c:url>
.
<head>
<link rel="stylesheet" href="<c:url value="/css/default.css" />" />
<script src="<c:url value="/js/default.js" />"></script>
</head>
<body>
<img src="<c:url value="/img/logo.png" />" />
<a href="<c:url value="/page.jsp" />">link</a>
<form action="<c:url value="/servlet" />"><input type="submit" /></form>
</body>
어느 쪽이든, 상대 URL이 많은 경우 이는 차례로 매우 번거 롭습니다. 이를 위해 <base>
태그를 사용할 수 있습니다 . 모든 상대 URL은 즉시 상대 URL이됩니다. 이 계획 (로 시작하지만이 http://
, https://
등). 일반 EL에서 기본 컨텍스트 경로를 얻을 수있는 깔끔한 방법이 없으므로 여기서 JSTL에 대한 약간의 도움이 필요합니다 .
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="uri" value="${req.requestURI}" />
<c:set var="url">${req.requestURL}</c:set>
...
<head>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/" />
<link rel="stylesheet" href="css/default.css" />
<script src="js/default.js"></script>
</head>
<body>
<img src="img/logo.png" />
<a href="page.jsp">link</a>
<form action="servlet"><input type="submit" /></form>
</body>
이것은 다시 (다시) 몇 가지주의 사항이 있습니다. 앵커 ( #identifier
URL)도 기본 경로에 상대적이됩니다! 대신 요청 URL (URI)에 상대적으로 만들고 싶습니다. 그래서 변경
<a href="#identifier">jump</a>
…에
<a href="${uri}#identifier">jump</a>
각 방식마다 장단점이 있습니다. 선택하는 것은 당신에게 달려 있습니다. 적어도이 문제의 원인과 해결 방법을 이제 이해해야합니다. 🙂
또한보십시오:
답변
Spring MVC 응용 프로그램과 비슷한 문제에 직면했습니다. < mvc:resources >
이 문제를 해결하기 위해 태그를 사용 했습니다.
자세한 내용은 다음 링크를 참조하십시오.
http://www.mkyong.com/spring-mvc/spring-mvc-how-to-include-js-or-css-files-in-a-jsp-page/
답변
힌트를 위해 실제 HTML 출력을 분석해야합니다.
이와 같은 경로를 제공하는 것은 “현재 위치에서”를 의미하는 반면,로 시작하면 /
“컨텍스트에서”를 의미합니다.
답변
환영 페이지는 That Servlet으로 설정됩니다. 따라서 모든 css, 이미지 경로는 해당 서블릿 DIR에 상대적으로 제공되어야합니다. 그것은 나쁜 생각입니다! 왜 서블릿이 홈 페이지로 필요합니까? .jsp를 색인 페이지로 설정하고 거기에서 페이지로 리디렉션합니까?
db에서 필드를 채우려 고하니 서블릿을 사용하고 있습니까?
답변
Spring MVC를 사용하는 경우 정적 콘텐츠에 대한 기본 액션 서블릿을 선언해야합니다. spring-action-servlet.xml에 다음 항목을 추가하십시오. 그것은 나를 위해 일했습니다.
참고 : 모든 정적 콘텐츠는 WEB-INF 외부에 보관하십시오.
<!-- Enable annotation-based controllers using @Controller annotations -->
<bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="0" />
</bean>
<bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="order" value="1" />
</bean>
<bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
답변
당신의 업데이트에 관해서는, 나는 그 이유에 대해 혼란 스러웠습니다. 조금 더 깊이 파고이 보석을 찾았습니다.
- yoursite.com은 yoursite.com/이됩니다.
- yoursite.com/은 디렉토리이므로 welcome-file-list가 스캔됩니다.
- yoursite.com/CMS는 첫 번째 환영 파일 (welcome-file-list의 “CMS”)이며 / CMS를 MyCMS 서블릿에 매핑하므로 서블릿에 액세스 할 수 있습니다.
출처 : http://wiki.metawerx.net/wiki/HowToUseAServletAsYourMainWebPage
따라서 매핑은 의미가 있습니다.
이제 $ {pageContext.request.contextPath} / path /를 상대 링크의 src / href로 자유롭게 사용할 수 있습니다!
답변
짧은 대답-jsp에 기본
기본 href = “/ {응용 프로그램의 루트} /”를 정의 할 다음 줄을 추가 합니다.