자바의 서블릿 에 대해 알아보자
학습목표
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;
}
}
결과화면
'[2020]KIC 캠퍼스 복습 > JAVA SCRIPT(5,6,7)' 카테고리의 다른 글
[수업 D-31 ] JSP) 지시어, 내장객체 (0) | 2020.08.25 |
---|---|
[수업 D-30 ] SERVLET) 쿠키, 세션, 쇼핑몰, 방명록 (0) | 2020.08.24 |
[수업 D-27 ] JS)AJAX, SERVLET (0) | 2020.08.19 |
[수업 D-26 ] JS) AJAX, JSON //JQUERY (0) | 2020.08.18 |
[코드리뷰] JS) AJAX를 구성, "팩토리파일" (0) | 2020.08.18 |