05 Servlet(서블릿)
p53 - ./build.gradle
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.2.8'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'education'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
implementation 'jakarta.servlet:jakarta.servlet-api'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
tasks.named('test') {
useJUnitPlatform()
}
p57
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
p58, 61 - src/main/java/boot/start/servlet/ServletInit
@WebServlet(name = "servletInitServlet", urlPatterns = "/request")
public class ServletInit extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("request");
super.service(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
}
p62, 64, 72, 73, 74, 76, 81, 82, 83, 84, 85, 86, 93(주석제거해야함 line127부근), 94, 95 - src/main/java/boot/start/servlet/RequestServlet
@WebServlet(name = "requestServlet", urlPatterns = "/method")
public class RequestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 서블릿 경로 반환
// 클라이언트가 요청한 서블릿 경로 반환
System.out.println("Servlet Path: " + req.getServletPath());
// 웹 애플리케이션 컨텍스트 경로 반환
System.out.println("Context Path: " + req.getContextPath());
// 요청이 보안 프로토콜(HTTPS) 통해 이루어졌는지 여부 반환
System.out.println("is request secure: " + req.isSecure());
// 클라이언트 사용자 이름 반환
System.out.println("Remote User: " + req.getRemoteUser());
// 요청의 프로토콜 스킴(예: http, https)을 반환 클라이언트가 사용한 프로토콜 스킴을 확인
System.out.println("Request scheme: " + req.getScheme());
// 클라이언트의 인증 방식을 반환 클라이언트가 인증된 경우, 기본, 다이제스트 또는 폼 기반 인증 방식이 반환
System.out.println("Authentication Type: " + req.getAuthType());
// 요청 메서드 출력 (GET, POST, PUT, DELETE 등의 HTTP 메서드 확인)
System.out.println("Request Method: " + req.getMethod());
// 요청 URL 정보 출력 (전체 URL을 반환, 프로토콜부터 서버명, 포트, URI까지 모두 포함)
System.out.println("Request URL: " + req.getRequestURL().toString());
// 요청 URI 정보 출력 (요청된 리소스의 경로만 반환, URL에서 도메인 및 프로토콜을 제외한 부분)
System.out.println("Request URI: " + req.getRequestURI());
// 쿼리 스트링 출력 (URL 뒤에 붙은 파라미터 값을 반환, 예: ?user=abc에서 "user=abc" 반환)
System.out.println("Query String: " + req.getQueryString());
// 프로토콜 버전 출력 (요청에서 사용된 HTTP 프로토콜 버전을 반환, 예: HTTP/1.1)
System.out.println("Protocol: " + req.getProtocol());
// 요청 헤더 정보 출력
System.out.println("---- Headers ----");
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = req.getHeader(headerName);
System.out.println(headerName + ": " + headerValue);
}
System.out.println("일반적인 for loop를 통해 데이터 호출");
System.out.println("복수 파라미터 조회");
String[] userIds = req.getParameterValues("userId");
if(userIds != null) {
for (String userId : userIds) {
System.out.println("userId" + " = " + userId);
}
}
System.out.println("단일 파라미터 조회");
String userId = req.getParameter("userId");
System.out.println("userId = " + userId);
// 클라이언트 정보 확인
System.out.println("---- Client Info ----");
System.out.println("Remote Addr: " + req.getRemoteAddr());
System.out.println("Remote Host: " + req.getRemoteHost());
System.out.println("Remote Port: " + req.getRemotePort());
System.out.println("Remote User: " + req.getRemoteUser());
// 서버정보 확인
System.out.println("---- Locale ----");
System.out.println("Preferred Locale: " + req.getLocale());
// 쿠키 확인
System.out.println("---- Cookies ----");
if (req.getCookies() != null) {
for (var cookie : req.getCookies()) {
System.out.println("Cookie: " + cookie.getName() + " = " + cookie.getValue());
}
} else {
System.out.println("No cookies found.");
}
// 응답 상태 코드 설정
resp.setStatus(HttpServletResponse.SC_OK); // 200 OK
System.out.println("Response Status Code: " + HttpServletResponse.SC_OK);
// 응답 헤더 설정
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Custom-Header", "This is a custom header");
// 응답 데이터가 브라우저에 캐시되지 않도록 설정
resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
resp.setHeader("Pragma", "no-cache");
resp.setDateHeader("Expires", 0); // 만료 날짜를 과거로 설정하여 캐시 무효화
// 파일 다운로드 헤더 설정 (선택적으로 주석 처리)
resp.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition", "attachment; filename=\"file.txt\"");
// 응답 상태 코드 설정 (404 Not Found 예시)
// resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Resource not found");
System.out.println("Response Headers:");
System.out.println("Content-Type: text/html");
System.out.println("Character-Encoding: UTF-8");
System.out.println("Custom-Header: This is a custom header");
// 응답 본문 작성
PrintWriter writer = resp.getWriter();
writer.println("<html><body>");
// writer.println("<h1>Hello, this is a GET response before</h1>");
// // 버퍼 플러시
// resp.flushBuffer();
// // 지연 추가 (5초 동안 대기)
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// throw new RuntimeException(e);
// }
writer.println("<h1>Hello, this is a GET response</h1>");
writer.println("</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("---- HTTP POST Method ----");
System.out.println("복수 파라미터 조회");
String[] names = req.getParameterValues("name");
if (names != null) {
for (String name : names) {
System.out.println("name = " + name);
}
} else {
System.out.println("No name parameters found.");
}
String age = req.getParameter("age");
System.out.println("age = " + age);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("---- HTTP PUT Method ----");
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("---- HTTP DELETE Method ----");
}
}
p103 - src/main/java/boot/start/domain/Users
package boot.start.domain;
public class Users {
private Long userIdx;
private String userId;
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Long getUserIdx() {
return userIdx;
}
public void setUserIdx(Long userIdx) {
this.userIdx = userIdx;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
p104 - src/main/java/boot/start/servlet/ApiServlet
@WebServlet(name = "apiServlet", urlPatterns = "/api")
public class ApiServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream inputStream = req.getInputStream();
String msgBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("msgBody = " + msgBody);
Users user = objectMapper.readValue(msgBody, Users.class);
System.out.println("user.getUser_id() = " + user.getUserId());
System.out.println("user.getUser_name() = " + user.getUserName());
String result = objectMapper.writeValueAsString(user);
resp.getWriter().write(result);
}
}
Last updated