본문 바로가기
[2020]KIC 캠퍼스 복습/JAVA SCRIPT(5,6,7)

[코드리뷰] SERVLET) SERVLET

by 두블두블 2020. 8. 19.

자바의 서블릿 에 대해 알아보자 

 


학습목표

1. 서블렛을 작성할 수 있다. 

2. 자바을 주의하자 


<코드 1 : Main.html>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인</title>
</head>
<body>
서블릿 연습<br>
<!-- <a href="HelloServlet">서블릿 호출1</a> --><!-- 확장자가 java인 웹용 java -->
<!-- Java Resources > src > pack > HelloServelet.java -->
<!-- get방식으로  서버 파일 호출 -->
<!-- get 방식(<a> tag, <form> tag 일반, 주소창 입력 등) -->

<!-- post 방식은 <form> tag 중 method="post"방식을 취할 때만 post -->

<!-- 논리적 이름을 부여한 순간 -->
<a href="kor.do">서블릿 호출1</a>
<br>
<form action="kor.do" method="get">
   <input type="submit" value="서블릿 호출2">
</form>

<br>
<form action="HelloServlet" method="post">
   <input type="submit" value="서블릿 호출3">   <!-- HTTP 상태 405 – 허용되지 않는 메소드 -->
   <!-- Servlet을 쓰면 get/post 구분 처리(=Spring 도 servlet) -->
   <!-- doGet메소드로 받는 다면 get으로만 받을 수 있음 -->
</form>
<hr>
<a href="ServletGo">서블릿 file1 - get</a><!-- servlet은 언제나 root폴더에 위치 -->
<form action="ServletGo" method="get">   <!-- default값 = "get" (안써도 "get"임) -->
   <input type="submit" value="서블릿 file2 - get">
</form>
<form action="ServletGo" method="post">
   <input type="submit" value="서블릿 file3 - post">
</form>
</body>
</html>

 

<코드 2 : HelloServlet.java>

package pack;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/kor.do")//바로 논리적 이름을 부여할 수 있음
public class HelloServlet extends HttpServlet {
   //HttpServlet을 상속 받았으므로 웹용 자바가 됨 (웹으로 출력) [cf.JFrame (프레임 창으로 출력)]
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //클라이언트가 get으로 호출 시 반응하는 메소드
      System.out.println("안녕");
      
      //자바로 어쩌구 저쩌구 하다가 ... 출력 결과를 브라우저로 나타내고 싶다면?
      /*이렇게 해석 해줘*/
      response.setContentType("text/html;charset=utf-8"); //Mime type (문자 set code)
      /*response.setContentType("test/html;charset=utf-8"); ⇒ test는 해석할 능력이 없으므로 클라이언트에게 다운받게 함*/
      /*클라이언트 에게 출력*/
      PrintWriter out = response.getWriter();
      out.println("<html>");
      out.println("<body>");
      out.println("<h1>안녕</h1>");
      out.println("</body>");
      out.println("</html>");
      out.close();
      //자바안에 servlet 있다.
   }

}

 

<코드 3 : ServletGo.java>

package pack;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ServletGo")
public class ServletGo extends HttpServlet {
   private BadaClass badaClass;

   //Servlet Life cycle(init[서비스 시작] > doGet, doPost > destroy[서비스 끝]) 
   public void init(ServletConfig config) throws ServletException {
      // 서블릿 파일 최초 호출 시 1회 수행 : 초기화 담당
      System.out.println("init 수행");
      badaClass = new BadaClass("홍길동");   //최초 1회만 수행하기 때문에 효율적 (가장 먼저 접속된 client로부터 수행되어짐)
      //그 다음 client들은 init 메소드 수행 할 수 없음
   }

   public void destroy() {
      // 서블릿 파일 서비스 해제 시 1회 수행 : 마무리 담당 (cf.C언어의 소멸자) - 거의 쓸 일은 없다;
      System.out.println("destroy 수행");
      badaClass = null; //굳이 쓰지 않아도 garbage collector로 인해 사라짐
   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // Client가 Get으로 호출 시 매 client마다 Thread가 생성되면서  매번 호출 (socket 통신)
      System.out.println("doGet 수행~~~/**");
      
      // java를 신나게 하다가... 웹으로 출력하고 싶다면?
      response.setContentType("text/html;charset=utf-8");
      PrintWriter out = response.getWriter();
      out.println("<html><body>");
      out.println("<h2>서블릿 연습(Get)</h2>");
      //불현 듯 java를 수행
      int a = 10, b = 20;
      out.println("a=" + a + ",b=" + b);
      int hap = myCalc(a, b);
      out.println("<br>합은 " + hap);
      
      /*BadaClass badaClass = new BadaClass("홍길동");*/   //Client 요청 시 마다 새로운 인스턴스 생성 (스레드 실행)하므로 매우 비효율적 (서버 과부하) 
      String irum = badaClass.getIrum();            //같은 정보는 하나의 인스턴스를 공유도록 해야함
      out.println("<br>이름은 " + irum);
      
      out.println("<br>작성자: YONG");
      out.println("</html></body>");
      out.close();   //다쓴 자원 반납
   }

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // Client가 Post로 호출 시 매 client마다 Thread가 생성되면서  매번 호출 (socket 통신)
      System.out.println("doPost 수행@@@");
      
      response.setContentType("text/html;charset=utf-8");
      PrintWriter out = response.getWriter();
      out.println("<html><body>");
      out.println("<h2>서블릿 Practice(Post)</h2>");
      
      out.println("</html></body>");
      out.close();   //다쓴 자원 반납
      
   }
   
   private int myCalc(int m, int n) {
      int tot = m + n;
      return tot;
   }

}

 

<코드 3 : BadaClass.java>

package pack;

public class BadaClass {
	private String irum;
	
	public BadaClass(String irum) {
		this.irum = irum;
	}
	
	public String getIrum() {
		return irum;
	}
	
}

 

 


결과화면

 

<결과 출력 : '콘솔창'과 '웹'>