WEB-INF
폴더가 있어야 한다.web.xml
파일lib
폴더classees
폴더*저 디렉토리 구조 보는 것 tree라는 명령어로 가능 → 리눅스에는 원래 없어서, brew로 설치하면 된다. brew install tree
HttpServletRequest
: 요청객체HttpServletResponse
: 응답객체setContentType()
: 응답할 타입을 지정해주는 것response.setContentType("text/html;charset=utf-8");
getWriter()
보낼 내용을 넣어주는 통로 만들어주기PrintWriter
객체PrintWriter out = response.getWriter();
print()
: 그 fd에 (printwriter에)출력close()
: 사용 후 닫아줘야 한다.package dynamic_webapp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "TenServlet", value = "/ten")
public class TenServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<h1>1-10까지 출력</h1>");
for(int i=1; i <=10; i++) {
out.print(i + "<br>");
}
out.close();
}
}
(2.5ver 실습은 pass)
init()
service(request, response)
(HttpServletRequest/Respond)destroy()
Constructor
called)init
호출service
호출service
만 호출된다.destroy
는 코드 내용이 바뀌거나 서버 종료될 때 호출됨init
이 호출, 그다음 service
호출, destroy
는 웹 어플리케이션이 갱신되거나, WAS가 종료될 때 호출된다.if (메모리에 없음) {
해당 서블릿 클래스를 메모리에 올림
init() 메서드 실행
}
service() 메서드 실행
service
에 들어가야함! (항상 실행되니까)doGet(request, response)
메서드를 호출doPost(request, response)
를 호출package example.firstweb;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "LifecycleServlet", value = "/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
public LifecycleServlet() {
System.out.println("LifecycleServlet 생성!");
}
@Override
public void init() throws ServletException {
System.out.println("init 호출 수정");
}
@Override
public void destroy() {
System.out.println("destroy 호출");
}
// @Override
// protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("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='/firstweb/LifecycleServlet'>"); //요청이 들어왔을 때, 해당 URL로 POST메서드 호출
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();
}
}
package example.firstweb;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet(name = "HeaderServlet", value = "/header")
public class HeaderServlet extends HttpServlet {
@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>");
((PrintWriter) out).println("<body>");
//Enumeration: 문자열
Enumeration<String> headerNames = request.getHeaderNames(); // 요청객체를 통해 헤더 이름을 받아온다.
while(headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName); // 헤더의 값 정보를 알아낼 수 있다.
out.println(headerName + " : " + headerValue + " <br> "); // 헤더의 이름과 값을 PrintWriter에 쓴다.
}
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
host : localhost:8080
connection : keep-alive
sec-ch-ua : " Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"
sec-ch-ua-mobile : ?0
sec-ch-ua-platform : "macOS"
upgrade-insecure-requests : 1
user-agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36
accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site : same-origin
sec-fetch-mode : navigate
sec-fetch-user : ?1
sec-fetch-dest : document
referer : http://localhost:8080/
accept-encoding : gzip, deflate, br
accept-language : en-US,en;q=0.9,ko-KR;q=0.8,ko;q=0.7
cookie : Idea-2951d09e=6ec0a767-d804-48b7-95e9-300b97f0ef28; JSESSIONID=B919BDF2A6141830EFF447FD237971A9
[http://localhost:8080/firstweb/param?name=kim&age=5](http://localhost:8080/firstweb/param?name=kim&age=5)
?
뒤에 있는 부분&
를 기준으로 파라미터가 나눠진다.{파라미터이름}={파라미터값}
form
태그라는 게 존재하는데, 이 태그 안에 input이라는 태그를 사용하여 파라미터를 넣어주고 꺼낼 수 있다.http://localhost:8080/firstweb/info
uri : /firstweb/info //포트번호 이하의 값들
url : http://localhost:8080/firstweb/info //전체주소
contentPath : /firstweb //Application context 웹 어플리케이션과 매핑된 패스
remoteAddr : 0:0:0:0:0:0:0:1 //클라이언트의 주소값 (로컬컴퓨터라 이럼, 다른경우 IP)