📁 파일 타입별 경로 규칙
JSP 파일 → 📄 전체 경로 필요 (폴더/파일.jsp)
서블릿 → 🔗 URL 매핑만 (폴더 없이)
이미지 → 🖼️ 웹 경로 (/프로젝트명/폴더/파일)📄 JSP 파일 경로 (폴더 포함)
Why 전체 경로?
JSP는 실제 파일이라서 정확한 위치를 알려줘야 함
// ✅ 올바른 JSP 경로 (폴더 포함)
RequestDispatcher dispatcher = req.getRequestDispatcher("chapter07/fileupload02.jsp");
RequestDispatcher dispatcher = req.getRequestDispatcher("chapter07/fileupload02_process.jsp");
프로젝트 구조와 비교:
src/main/webapp/
├── chapter07/ ← 이 폴더명 포함!
│ ├── fileupload02.jsp ← 이 파일
│ └── fileupload02_process.jsp ← 이 파일
└── index.jsp패턴:
// 패턴: "폴더명/파일명.jsp"
req.getRequestDispatcher("chapter07/fileupload02.jsp");
req.getRequestDispatcher("chapter08/loginForm.jsp");
req.getRequestDispatcher("member/signup.jsp");
// ❌ 틀린 예시
req.getRequestDispatcher("fileupload02.jsp"); // 폴더 없으면 못 찾음!
🔗 서블릿 URL (폴더 없이)
Why 폴더 없이?
서블릿은 가상 URL이라서 실제 폴더 구조와 상관없음
<!-- ✅ 올바른 서블릿 연결 (폴더 없이) -->
<form action="exam7_2" method="post">
<a href="exam7_4">파일 업로드</a>
// 서블릿은 어느 패키지에 있든 상관없음
package chapter07; // ← 실제로는 이 폴더에 있지만
@WebServlet("/exam7_2") // ← URL은 그냥 "/exam7_2"
패턴:
<!-- HTML/JSP에서 서블릿 호출 -->
<form action="exam7_2"> <!-- 폴더 없이 그냥 이름만 -->
<form action="loginServlet">
<a href="fileUpload">
<a href="memberList">
<!-- ❌ 틀린 예시 -->
<form action="chapter07/exam7_2"> <!-- 서블릿은 폴더 안 써도 됨! -->
🖼️ 이미지/리소스 경로 (웹 경로)
Why 특별한가?
브라우저가 직접 접근하는 웹 리소스라서 전체 웹 경로 필요
<!-- ✅ 올바른 이미지 경로 -->
<img src="/JSPBook/resources/images/<%= filename %>">
웹 경로 구조:
/JSPBook/ ← 프로젝트명 (Context Path)
├── resources/ ← 웹에서 접근 가능한 폴더
│ └── images/ ← 이미지 폴더
│ ├── photo1.jpg ← 실제 이미지 파일
│ └── photo2.png
└── chapter07/ ← JSP 폴더 (브라우저가 직접 접근 안 함)
└── fileupload02.jsp패턴:
<!-- 이미지 경로: /프로젝트명/폴더/파일 -->
<img src="/JSPBook/resources/images/photo.jpg">
<img src="/JSPBook/resources/css/style.css">
<!-- 상대 경로로도 가능 -->
<img src="resources/images/photo.jpg">
<!-- ❌ 틀린 예시 -->
<img src="images/photo.jpg"> <!-- resources 폴더 빠짐! -->
🔍 비교표로 완전 정리
| 타입 | 사용 위치 | 경로 작성법 | 예시 |
|---|---|---|---|
| JSP 파일 | 서블릿 → JSP | 폴더/파일.jsp |
"chapter07/fileupload02.jsp" |
| 서블릿 | HTML/JSP → 서블릿 | 서블릿명만 |
"exam7_2" |
| 이미지 | JSP → 브라우저 | /프로젝트명/폴더/파일 |
"/JSPBook/resources/images/photo.jpg" |
📝 실제 코드 예시로 확인
예시 1: 파일 업로드 플로우
// 1. 서블릿에서 JSP로 (폴더 포함)
@WebServlet("/exam7_2") // ← URL (폴더 없음)
public class exam7_2 extends HttpServlet {
protected void doGet() {
// JSP 파일 (폴더 포함)
RequestDispatcher ds = req.getRequestDispatcher("chapter07/fileupload02.jsp");
ds.forward(req, resp);
}
protected void doPost() {
// 처리 후 결과 JSP (폴더 포함)
RequestDispatcher ds = req.getRequestDispatcher("chapter07/fileupload02_process.jsp");
ds.forward(req, resp);
}
}
<!-- 2. JSP에서 서블릿으로 (폴더 없음) -->
<form action="exam7_2" method="post"> <!-- 서블릿 (폴더 없음) -->
<input type="file" name="filename">
<input type="submit" value="업로드">
</form>
<!-- 3. JSP에서 이미지 표시 (웹 경로) -->
<img src="/JSPBook/resources/images/<%= filename %>"> <!-- 이미지 (전체 웹 경로) -->
🎯 헷갈리지 않는 방법
기억하기 쉬운 규칙:
1. .jsp 확장자가 있으면 → 폴더 포함
req.getRequestDispatcher("chapter07/fileupload02.jsp"); // ✅
req.getRequestDispatcher("member/login.jsp"); // ✅
2. 서블릿 이름이면 → 폴더 없이
<form action="exam7_2"> // ✅
<a href="loginServlet"> // ✅
3. 브라우저가 직접 보는 거면 → 전체 웹 경로
<img src="/JSPBook/resources/images/photo.jpg"> // ✅
<link href="/JSPBook/resources/css/style.css"> // ✅
🚨 자주 하는 실수들
❌ 실수 1: 서블릿에 폴더 경로 붙이기
<!-- 틀림 -->
<form action="chapter07/exam7_2">
<!-- 맞음 -->
<form action="exam7_2">
❌ 실수 2: JSP에서 폴더 빼먹기
// 틀림
req.getRequestDispatcher("fileupload02.jsp");
// 맞음
req.getRequestDispatcher("chapter07/fileupload02.jsp");
❌ 실수 3: 이미지 경로에서 프로젝트명 빼먹기
<!-- 틀림 -->
<img src="resources/images/photo.jpg">
<!-- 맞음 -->
<img src="/JSPBook/resources/images/photo.jpg">
🔄 내 프로젝트에 맞게 바꾸는 법
// 내 프로젝트명이 "MyProject"라면
<img src="/MyProject/resources/images/photo.jpg">
// 내 JSP가 "views" 폴더에 있다면
req.getRequestDispatcher("views/upload.jsp");
// 내 서블릿이 "FileUploadServlet"이라면
<form action="FileUploadServlet">'JSP' 카테고리의 다른 글
| JSP에 필요한 자바 공부 순서 (0) | 2025.05.28 |
|---|---|
| 요청->서블릿->뷰 3단계 설명 (0) | 2025.05.27 |
| MultipartRequest (0) | 2025.05.27 |
| DiskFileUpload 순서도 (시험 X) (0) | 2025.05.27 |
| [오류log] 서버 깨질 때 서블렛 확인할 것 (0) | 2025.05.27 |