자바 웹 애플리케이션
- WAS에 설치(deploy)되어 동작하는 애플리케이션
- HTML, CSS, 이미지, 자바로 작성된 클래스(Servlet, package, interface 등), 각종 설정 파일 등이 포함됨
자바 웹 애플리케이션의 폴더 구조
- 자바 웹 애플리케이션
- WEB-INF 폴더
- web.xml 파일 (웹 애플리케이션에 대한 정보를 모두 담고 있음)
- lib 폴더 (각종 jar 파일들)
- classes 폴더 (java 패키지, servlet 클래스 등)
- 리소스들
- 각종 폴더, 이미지, 다양한 리소스들
- WEB-INF 폴더
Servlet이란?
- 자바 웹 애플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할
- WAS에서 동작하는 Java 클래스
- 서블릿은 HttpServlet 클래스를 상속 받아야 함
- 서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 둘을 조화롭게 사용해야 함
ex) 웹 페이지를 구성하는 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현
- Servlet 3.0 spec 이상에서는 web.xml 파일을 사용하지 않고, 자바 annotation을 사용함
Servlet 작성하기
- Servlet 3.0 이상인 경우
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/ten")
public class TenServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TenServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* HttpServletRequest: 서버가 요청을 받아내는 객체
* HttpServletResponse: 서버가 응답을 하기 위한 객체
*/
response.setContentType("text/html;charset=utf-8"); // setContentType: 응답할 콘텐츠의 타입을 알려주는 메소드
PrintWriter out = response.getWriter();
out.print("<h1>1부터 10까지 출력합니다.</h1>");
for(int i = 1; i <= 10; i++) {
out.print(i + "<br>");
}
out.close();
}
}
Servlet 생명주기
- WAS는 Servlet 요청을 받으면, 해당 Servlet이 메모리에 있는지 확인
- 메모리에 없으면, 해당 Servlet 클래스를 메모리에 올림. init() 메소드 실행
- 메모리에 있으면, service() 메소드 실행
- WAS가 종료되거나, 웹 애플리케이션이 새롭게 갱신될 경우 destroy() 메소드 실행
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
public LifecycleServlet() {
System.out.println("Create LifecycleServlet");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("This is init");
}
public void destroy() {
System.out.println("This is destroy");
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("This is service");
}
}
service (request, response) 메소드
- HttpServlet의 service 메소드는 템플릿 메소드 패턴으로 구현됨
- 클라이언트 요청이 GET인 경우, 자신이 갖고 있는 doGet(request, response) 메소드 호출
- 클라이언트 요청이 POST인 경우, 자신이 갖고 있는 doPost(request, response) 메소드 호출
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
public LifecycleServlet() {
System.out.println("Create LifecycleServlet");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("This is init");
}
public void destroy() {
System.out.println("This is destroy");
}
// protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("This is service");
// }
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
out.println("<form method='post' action='/basic-servlet/LifecycleServlet'>");
out.println("name : <input type='text' name='name'><br>");
out.println("<input type='submit' value='ok'><br>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
out.println("<h1> hello " + name + "</h1>");
out.close();
}
}
https://actually94.tistory.com/121
[Servlet, JSP] Intellij JSP, Servlet Setting 및 실습
Intellij JSP, Servlet 환경 구성하기 진짜 intellij로 이부분 세팅하는데 고생을 너무 많이했다 ㅠㅠ 1. 2. 3. 4. web -> web-INF내부에 server-config.wsdd 삭제 및 web.xml 내부 수정 5. tomcat 설정 (요건 기억안나면 검
actually94.tistory.com
Request, Response 객체
요청과 응답
- 클라이언트로부터 요청이 들어오면, WAS는 HttpServletRequest 객체와 HttpServletResponse 객체를 생성함
- Path로 매핑된 Servlet에게 전달됨
HttpServletRequest
- http 프로토콜의 request 정보를 Servlet에게 전달하기 위한 목적으로 사용
- 헤더 정보, 파라미터, 쿠키, URL 등의 정보를 읽어 들이는 메소드를 가지고 있음
- Body의 Stream을 읽어 들이는 메소드를 가지고 있음
HttpServletResponse
- WAS는 어떤 클라이언트가 요청을 보냈는지 알고, 해당 클라이언트에게 응답을 보내기 위해 해당 객체를 생성해서 Servlet에게 전달
- Servlet은 해당 객체를 이용하여 content type, 응답 코드, 응답 메시지 등을 전송함
Header 정보 읽어 들이기
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet("/HeaderServlet")
public class HeaderServlet extends HttpServlet {
public HeaderServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
out.println(headerName + " : " + headerValue + "<br>");
}
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Parameter 읽어 들이기
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/param")
public class ParameterServlet extends HttpServlet {
public ParameterServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
String name = request.getParameter("name");
String age = request.getParameter("age");
out.println("name: " + name + "<br>");
out.println("age: " + age + "<br>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
그 외 요청 정보 출력하기
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/info")
public class InfoServlet extends HttpServlet {
public InfoServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
String uri = request.getRequestURI();
StringBuffer url = request.getRequestURL();
String contentPath = request.getContextPath(); // WAS에는 여러 웹 애플리케이션이 돌아갈 수 있음. 특정 애플리케이션을 찾아가는 이름
String remoteAddr = request.getRemoteAddr();
out.println("uri: " + uri + "<br>");
out.println("url: " + url + "<br>");
out.println("contentPath: " + contentPath + "<br>");
out.println("remoteAddr: " + remoteAddr + "<br>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
'강의 노트 > 웹 프로그래밍(풀스택)' 카테고리의 다른 글
[boostcourse] 2.4. Redirect & Forward - BE (0) | 2023.06.20 |
---|---|
[boostcourse] 2.3. JSP - BE (0) | 2023.06.20 |
[boostcourse] 2.2. WEB UI 개발 - FE (0) | 2023.06.19 |
[boostcourse] 1.3. CSS - FE (0) | 2023.06.15 |
[boostcourse] 1.1. Web개발의 이해 - FE/BE (0) | 2023.06.15 |