🔍 1순위: HTTP 요청/응답
GET vs POST
// 패턴 1: 폼 보여주기 → 처리하기
@WebServlet("/exam7_2")
public class exam7_2 extends HttpServlet {
// 사용자가 주소창에 입력하거나 링크 클릭 → GET
protected void doGet() {
// 📄 폼 JSP 보여주기
dispatcher.forward(req, resp);
}
// 사용자가 폼에서 submit 버튼 클릭 → POST
protected void doPost() {
// 🔧 실제 처리 (파일 업로드, DB 저장 등)
dispatcher.forward(req, resp);
}
}
- GET: 데이터 가져오기, URL에 데이터 노출 OK
- POST: 데이터 보내기, URL에 데이터 숨김
- 언제 GET: 폼 보여주기, 목록 보기, 검색
- 언제 POST: 파일 업로드, 로그인, 회원가입
🔗 2순위: JSP → 서블릿 데이터 전송
<!-- JSP: 데이터 보내기 -->
<form action="exam7_2" method="post">
<input type="text" name="username"> <!-- name이 키! -->
<input type="file" name="profileImg"> <!-- name이 키! -->
<input type="submit" value="전송">
</form>
// 서블릿: 데이터 받기
String username = req.getParameter("username"); // name="username"
String filename = multi.getFilesystemName("profileImg"); // name="profileImg"
서블릿 → JSP 데이터 전송
// 서블릿: 데이터 보내기
req.setAttribute("userInfo", username); // "userInfo"라는 이름으로 보냄
req.setAttribute("uploadedFile", filename); // "uploadedFile"이라는 이름으로 보냄
RequestDispatcher dispatcher = req.getRequestDispatcher("result.jsp");
dispatcher.forward(req, resp);
<!-- JSP: 데이터 받기 -->
<%
String userInfo = (String) request.getAttribute("userInfo"); // 같은 이름!
String uploadedFile = (String) request.getAttribute("uploadedFile"); // 같은 이름!
%>
<h3>사용자: <%= userInfo %></h3>
<img src="images/<%= uploadedFile %>">
- name 속성 ↔ getParameter() 연결
- setAttribute() ↔ getAttribute() 연결
- 문자열 이름이 정확히 일치해야 함
🗺️ 3순위: URL 매핑과 경로 이해
URL이 어떻게 연결되는가?
@WebServlet("/exam7_2") // ← 이게 URL!
public class exam7_2 extends HttpServlet {
<form action="exam7_2"> <!-- ← 같은 이름! -->
<a href="exam7_2">다시하기</a> <!-- ← 같은 이름! -->
브라우저 주소창: http://localhost:8080/JSPBook/exam7_2
↑
@WebServlet("/exam7_2")
JSP 파일 경로
// 서블릿에서 JSP 호출
RequestDispatcher dispatcher = req.getRequestDispatcher("chapter07/fileupload02.jsp");
// ↑
// 실제 파일 경로
프로젝트 구조:
src/main/webapp/
├── chapter07/
│ ├── fileupload02.jsp ← 여기!
│ └── fileupload02_process.jsp
└── resources/
└── images/
- 상대 경로 vs 절대 경로
- 웹앱 컨텍스트 경로
- 서블릿 URL 패턴
📝 4순위: JSP 스크립틀릿 패턴
JSP에서 자바 코드 쓰는 패턴들
<%
// 1. 데이터 받기
String name = (String) request.getAttribute("name");
List<String> items = (List<String>) request.getAttribute("items");
// 2. 조건 처리
if (name != null) {
out.println("안녕하세요 " + name + "님!");
} else {
out.println("이름이 없습니다.");
}
// 3. 반복 처리
for (String item : items) {
out.println("<p>" + item + "</p>");
}
%>
<!-- 4. 표현식으로 출력 -->
<h3>이름: <%= name %></h3>
<h3>파일: <%= filename %></h3>
🎯 공부할 것:
<% %>(스크립틀릿): 자바 코드<%= %>(표현식): 값 출력<%! %>(선언): 메서드 선언- 조건문, 반복문 패턴
🔄 5순위: 요청-처리-응답 사이클
1. 사용자가 주소 입력/링크 클릭
↓
2. 브라우저가 서버에 GET 요청
↓
3. @WebServlet("/exam7_2")의 doGet() 실행
↓
4. RequestDispatcher로 JSP 폼 보여주기
↓
5. 사용자가 폼 작성 후 submit 클릭
↓
6. 브라우저가 서버에 POST 요청 (form 데이터 포함)
↓
7. 같은 서블릿의 doPost() 실행
↓
8. req.getParameter()로 폼 데이터 받기
↓
9. 파일 처리, DB 저장 등 비즈니스 로직
↓
10. req.setAttribute()로 결과 데이터 설정
↓
11. RequestDispatcher로 결과 JSP로 이동
↓
12. JSP에서 request.getAttribute()로 데이터 받아서 HTML 생성
↓
13. 완성된 HTML을 브라우저에 응답
연습
Step 1:
<!-- 폼 -->
<form action="test" method="post">
<input type="text" name="message">
<input type="submit" value="전송">
</form>
// 서블릿
@WebServlet("/test")
public class TestServlet extends HttpServlet {
protected void doGet() { /* 폼 보여주기 */ }
protected void doPost() {
String message = req.getParameter("message");
req.setAttribute("result", message);
// 결과 JSP로 이동
}
}
<!-- 결과 -->
<h3>받은 메시지: <%= request.getAttribute("result") %></h3>
Step 2:
- 여러 개 input 추가
- 파일 업로드 추가
- 조건문, 반복문 추가
- 에러 처리 추가
📚
웹 기초
- HTTP GET/POST 차이점
- HTML form 태그와 input 태그
- URL 구조와 경로
서블릿 핵심
- @WebServlet 어노테이션
- doGet() vs doPost() 역할
- HttpServletRequest/Response 객체
- RequestDispatcher.forward()
JSP 핵심
- 스크립틀릿
<% %>사용법 - 표현식
<%= %>사용법 - request 내장 객체
데이터 전달
- req.getParameter() ↔ HTML name 속성
- req.setAttribute() ↔ request.getAttribute()
- form action ↔ @WebServlet URL
'JSP' 카테고리의 다른 글
| HashMap 서블릿 코드 (exam7_4.java) 해석 (0) | 2025.05.28 |
|---|---|
| JSP에 필요한 자바 공부 순서 (0) | 2025.05.28 |
| 언제 폴더 경로를 써야 하고, 언제 안 써도 되는지 (0) | 2025.05.27 |
| MultipartRequest (0) | 2025.05.27 |
| DiskFileUpload 순서도 (시험 X) (0) | 2025.05.27 |