웹리소스에서 주소를 사용할때 사용 하는… URL!
** web resource 식별방법(URL)
- URL (Unified Resource Locator)
- **URI** (Unified Resource Ientifier)
- URC (Unified Resource Content)
- URN (Unified Resource Naming) 모든이름이 어딘가에 등록되어있어야 하고 중복성불가
/image.do는 uri에 가깝고
web-inf/inner/cat1.jsp 는 존재하는 실제파일의 위치 즉 url
** URL 표현방법
http://IP[Domain]:port/contextPath/depth..../resourceName
http://localhost:80/WebStudy01/resources/images/cat1.jpg
01(폴더네임) = 현재자원의 위치가 된다
상대경로 : 현재 브라우저가 가지고 있는 URL을 기준으로 상대적 경로 표기
절대경로 : 자원의 위치에서 최상위 경로부터 전체경로가 표기 (이미 인지하고있는 위치는 표현하지 않는다)
1) client side : <%=request.getContextPath() %>/resources/images/cat1.jpg
반드시 contextPath부터 시작되는 경로형태
2) server side : /resources/images/cat1.jpg (서버사이드에서는 반드시 절대경로만 사용할것)
contextPath 이후의 경로형태
<%
String path = "/resources/images/cat1.jpg";
URL url = application.getResource(path);
out.print(url);
%>
<img src="../resources/images/cat1.jpg">
<img src="http://localhost:80/WebStudy01/resources/images/cat1.jpg">
web-inf아래의 jsp를 보여주러면 모델2구조가 필요하다
즉 요청을 서블릿이 다시 받아주면됨
package kr.or.ddit.servlet02;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/sampleView.do") //uri에 가까운 이 경로를 servletPath라고도 한다
public class smapleModel2Servlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/views/sampleView.jsp").forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
sampleView
</body>
</html>
모델1과 모델2 식별 : req,resp이 하나의 객체에서 처리하면 모델1 별개의 컴퍼넌트 쓰고 서로 포워드하거나 임플리먼트하면 모델2구조(책임이 분리되는가!)
<body>
sampleView
상대경로
<img src="../../resources/images/cat1.jpg"> //두번 올라가면 웹앱 아니라 웹스터디
</body>
이 상대경로는 틀렸음!
개발자도구 켜서 보면 .. 리소스 경로에 웹스터디가 없음...
**위치의 기준점은 브라우저가 잡는거!**
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
sampleView
상대경로 : ./resources/images/cat1.jpg
<img src="./resources/images/cat1.jpg"/>
절대경로 : http://localhost:80/WebStudy01/resources/images/cat1.jpg
<img src="http://localhost:80/WebStudy01/resources/images/cat1.jpg"/>
</body>
</html>
절대경로 쓰는게 좋지만 배포시엔 루트가 바뀔수도 있는거고… 이름이 바뀔수도 있는거고… 배포 절차가 까다로워져버린다 그런데 여기서 변하지않는 원칙, 이미 인지하고있는 위치는 표현하지 않는다!
이미 브라우저가 프로토콜이나 자원의 출처 등을 알고있다…
프로토콜 호스트 포트넘버 표현 필요없다
컨텍스트 네임은 없으니…
<img src="http://localhost:80/WebStudy01/resources/images/cat1.jpg">
아는거 다 빼고
<img src="WebStudy01/resources/images/cat1.jpg">
이거만 표현해도 나온다
즉
<img src="WebStudy01/resources/images/cat1.jpg">
<img src="../resources/images/cat1.jpg">
<img src="http://localhost:80/WebStudy01/resources/images/cat1.jpg">
셋다 잘나옴 그런데 리소스가 같아서 개발자도구 보면 사진창은 하나
근데 컨텍스트 이름이바뀔수있으니 하드코딩 하지말고
<img src="WebStudy01/resources/images/cat1.jpg">
<img src="<%=request.getContextPath() %>/resources/images/cat1.jpg"> 이렇게하자
@WebServlet("**sampleView.do**")
// 이건 (/)가 없으므로 상대경로일텐데 실행이 안됨
// 상대경로는 기준위치가 필요한데 그 기준위치가 애매함
// 현재위치를 몰라 주소 매핑이 불가능....
서버사이드에서는 반드시 절대경로
로만 표기!