코드 설명
1. DTO (Data Transfer Object) 클래스 정의
: 데이터를 담아 전달할 DTO 클래스를 정의
: 여기서는 HumanDto 클래스를 생성하여 이름(name)과 나이(age) 정보를 저장하도록 한다.
HumanDto.java
package com.mulcam.edu.dto;
public class HumanDto {
private String name;
private int age;
public HumanDto() {
}
public HumanDto(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
데이터 저장: name, age 정보를 저장
데이터 이동: Servlet 간 데이터를 전달하는 객체 역할 수행
2. HelloSvl (HelloServlet) - 데이터 설정 및 이동
HelloSvl.java
package com.mulcam.edu.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mulcam.edu.dto.HumanDto;
public class HelloSvl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProc(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProc(req, resp);
}
public void doProc(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet doProc");
// 데이터 설정
String memo = "나는 오늘도 보람찬 하루였다.";
req.setAttribute("memo", memo); // request 객체에 데이터 저장
// DTO 객체 생성 및 데이터 설정
String name = "성춘향";
int age = 16;
HumanDto human = new HumanDto(name, age);
req.setAttribute("human", human); // request 객체에 DTO 저장
// WorldServlet으로 이동 (RequestDispatcher 사용)
RequestDispatcher dispatch = req.getRequestDispatcher("world");
dispatch.forward(req, resp); // forward 방식으로 이동
}
}
: memo는 단순 문자열 → request 객체에 바로 저장
: name과 age는 DTO 내부 멤버 변수에 먼저 저장 → DTO 객체를 request 객체에 저장
1. 데이터 설정
- memo 문자열을 request 속성(attribute)에 저장
- HumanDto 객체를 생성하여 request 속성(attribute)에 저장
2. RequestDispatcher를 이용한 이동
- req.getRequestDispatcher("world"): /world로 이동 설정
- dispatch.forward(req, resp): forward 방식으로 이동
- forward 방식은 클라이언트의 url을 변경하지 않고 내부에서 이동
- 즉, 브라우저 주소창은 여전히 /hello가 남아있지만 실제 실행된 서블릿은 worldServlet
sendRedirect : 데이터를 전송하는 것이 아닌 단순 이동이나 간단한 데이터를 전송 시 사용
resp.sendRedirect("world") : 가고싶은 링크 입력
resp.sendRedirect("world?name=KimTuTa&age=25") : 이런식으로 긴단한 데이터 전송
2. WorldServlet - 데이터 수신 및 출력
WorldServlet.java
package com.mulcam.edu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mulcam.edu.dto.HumanDto;
public class WorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProc(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProc(req, resp);
}
public void doProc(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// request 객체에서 데이터 가져오기 (짐 풀기)
String memo = (String) req.getAttribute("memo");
HumanDto human = (HumanDto) req.getAttribute("human");
// HTML 응답 전송
resp.setContentType("text/html; charset=utf-8");
PrintWriter pw = resp.getWriter();
pw.println("<html>");
pw.println("<head><title>WorldServlet</title></head>");
pw.println("<body>");
pw.println("<h1>World Servlet</h1>");
pw.println("<p>welcome</p>");
// request에서 전달받은 데이터 출력
pw.println("<p>" + memo + "</p>");
pw.println("<p>" + human.getName() + "</p>");
pw.println("<p>" + human.getAge() + "</p>");
pw.println("</body>");
pw.println("</html>");
pw.close();
}
}
1. request 객체에서 데이터 추출
- req.getAttribute("memo") → memo 데이터 받기
- req.getAttribute("human") → HumanDto 객체 받기
2. HTML 응답 생성 및 데이터 출력
- memo 내용 및 HumanDto 객체의 name, age 정보 출력
4. Servlet 매핑 (Web.xml)
web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.mulcam.edu.servlet.HelloSvl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>world</servlet-name>
<servlet-class>com.mulcam.edu.servlet.WorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>world</servlet-name>
<url-pattern>/world</url-pattern>
</servlet-mapping>
web.xml의 역할
: /hello 요청 → HelloSvl 실행
: /world 요청 → WorldServlet 실행
실행 흐름
1. 클라이언트에서 /hello 요청
2. helloSvl 실행
- memo 데이터 설정
- HumanDto 객체 생성 및 설정
- /world로 forward 이동
3. WorldServlet 실행
- request에서 memo, human 데이터를 꺼냄
- HTML로 데이터를 출력
[ 클라이언트 요청 (/hello) ]
↓
[ HelloSvl 실행 ]
↓ (forward)
[ WorldServlet 실행 ]
↓
[ 클라이언트에게 HTML 응답 ]
실행화면 (index.html에서 클릭 시 서블릿 실행)
: forward로 설계하여 주소는 hello에 남아있음
: 실제 실행된 서블릿은 world임!!
'back > Servlet' 카테고리의 다른 글
Servlet) 서버 저장 공간(Session) 및 xml 파일 대신 어노테이션 활용 방법 (0) | 2025.02.28 |
---|---|
Servlet) GET / POST 요청을 하나의 메서드에서 처리하는 방법 (0) | 2025.02.27 |
Servlet) HTML 응답을 Servlet에서 직접 생성하기 (0) | 2025.02.27 |
Servlet) 간편하게 자동 Servlet xml 파일 생성하기 & 예제 (0) | 2025.02.27 |
Servlet) 개념 간단한 예제 & GET / POST 방식 정리 (0) | 2025.02.27 |