국비지원학원/HTML,JavaScript,jQ

86일차-JavaEE_Servlet/Life cycle

초코맛 2019. 3. 7. 01:53
반응형
흐름도)

Web browser------요청------WAS(Servlet이 들은 class를 부르면 server.xml에 등록되고)---->JVM에 instance가 생성되고---->Servlet이 HTML을 동적으로 생성해 준다----응답---->Web browser에 생성된 HTML을 뿌려줌.


-작성법, life cycle, 요청객체 사용(HttpServletRequest), 응답객체 사용(HttpServletResponse), 관계유지(HttpSession,Cookie), 페이지 이동(forword, redirect), DBCP



*Servlet Life cycle
  • 객체생성,사용, 소멸의 단계
  • Generic Servlet이 method제공
  • Container가 관리한다.
  • init( ) : 생성자의 역할을 수행, 최초 접속자에 의해서 1번 호출 (오버 로딩~!!!!!)//일땐 화면응답X?
    • 생성자 : 객체생성시 초기화 되어야할 값을 설정하거나, 실행되어야 할 코드를 정의
  • service, doGet,doPost
    • 업무처리(요청에 대한 응답 처리)
    • 접속자에게 보여줄 페이지 생성
    • 접속한 접속자 수 대로 수행(들어오는대로 호출된다-가장 바쁨)
  • destroy( ) : 
    • 객체가 소멸될때 호출되는 method( JavaSE: finalize( ) )
    • Web Container instance가 사라질 때 호출(접속자가 연결을 끊었다고 호출되지 않는다)
    • 가장 마지막에 1번 호출됨.
  • //처음 요청에만 객체를 생성하느라 비교적 느리고 두번째 부터는 균일한 빠른 속도를 갖는다.

*class Life cycle
  • 생성(생성자로 1번) -> method(정의한 method 여러번 호출) -> 소멸( finalize( )호출 )
    • =>소멸 : Garbage Collector가 heap에 생성된 객체(instance->heap에 올라감)를 소멸 시킨다.(참조되지 않는 객체-일정시간 사용하지 않아 앞으로도 사용될 확률이 없는 객체)
      • =>Garbage Collector가 동작을 하면 JVM시스템에 부하가 걸린다./자동동작(언제 동작할지는 알 수 없음)/개발자가 호출 : System.gc( );
package day0226;

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

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

@SuppressWarnings("serial")
//1.HttpServlet 상속
public class LifeCycle extends HttpServlet {
    
    //생명주기 method
    public void init() {
        System.out.println("============>init method 최초 접속자에 의해 1번 호출(생성자 역할)");
    }//init

    public void destroy() {
        System.out.println("============>Web Container가 종료될때 객체가 사라지면서 1번만 호출.");
    }//destroy
    
    //2.응답방식에 대한 처리 method를 Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //3.응답방식 설정(MIME-TYPE설정)
        response.setContentType("text/html;charset=UTF-8");
        //4.출력스트림 얻기
        PrintWriter out=response.getWriter();
        //5.응답내용 생성
        out.println("<strong>방문자 정보</strong><br/>");
        out.println("<strong>접속자 ip :</strong>");
        out.println(request.getRemoteAddr());
        out.println("에서 접속 하셨습니다.");
        
        System.out.println("--------->service,doGet,doPost 모든 접속자에게 호출되어, 여러번 호출 : "+request.getRemoteAddr());
        //http://211.63.89.130:8080/servlet_prj/life_cycle
        
        //Console창에서 비정상종료를 하면 destroy가 불리지 않지만 servers를 끊으며 정상종료를 하면 출력된다.
    }//doGet

}//class

package day0226;
public class Person {
     private String name;
     public Person(String name) {
           this.name=name;
           System.out.println("신입사원 "+name+"님  입사하셨습니다.");
     }//Person
     
     @Override
     public void finalize() {//객체가 Garbage Collector에 의해  소멸될때 호출된다.
           System.out.println(name+"님이 퇴사하셨습니다.");
     }//finalize
     
     public String getName() {
           return name;
     }//getName
}//class
package day0226;
/**
* Garbage Collector를 호출하여 객체를 소멸 시키기(메모리의  여유공간 확보)
* @author owner
*/
public class UseGarbageCollector {
     public static void main(String[] args) {
           Person p=new Person("이");
           p=new Person("김");
           p=new Person("정");
           p=new Person("공");
           p=new Person("이");
           
           System.gc();//가비지 컬렉터 호출
           System.out.println("남은 사원 :"+p.getName());
     }//main
}//class



*Servlet 호출
  • 서버에 올라간 call.html을 요청하여 클라이언트에서 응답 받아 연 페이지에서 이벤트가 발생했을때 method에 정해진 방식으로 넘어가는데, 기본이get[사진]
  • get방식
    • 링크로 요청(호출): <a href="서블릿의 url mapping">
    • javaScript 호출 : location href="서블릿 mapping";
    • <Form> 호출 : <form method="get" action="서블릿mapping">
    •                                   <input type="submit">
    •                         </form>
  • post방식
    • <form method="post" aaction="서블릿mapping">
    •          <input type="submit>
    • </form>
<새프젝에 -컨피그-tern해 두개 선택해야 컨트롤+스페이스 먹힘>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/html_prj/common/main_v190130.css"/>
<style type="text/css">
     #wrap{width:500px; height:250px; margin:0px auto; }
     #get{width: 220px; height: 250px; border: 1px solid #333;
            border-radius: 10px; box-shadow:10px 10px 10px #333;
            float:left; padding-top: 10px; padding-left: 5px}
     #post{width: 220px; height: 250px; border: 1px solid #333;
            border-radius: 10px; box-shadow:10px 10px 10px #333;
            float:right;padding-top: 10px; padding-left: 5px}
            
</style>
<!-- CDN을 사용하여 jQuery를 다운로드 받아 사용. -->
<script  src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
     $(function(){
           $(".link").click(function(){
                movePage();
           });//click
           
           $("#btnGet").click(function(){
                movePage();
           });//click
           
           $("#frmGet").click(function(){
                //javascript에서 action, method를 변경
                var obj=document.frm;
                //method 변경 : obj.method="변경할  method"
                obj.method="get";
                //action 변경 : obj.action="변경할  action"
                obj.action="../test_call";
                //alert(obj.method+" "+obj.action);
                obj.submit();
           });//click
           
           $("#btnPost").click(function(){
                /* var obj=document.frmPost;
                obj.submit(); */
                $("#postFrm").submit();
           });//click
     });//ready
     
     function movePage(){
           if(confirm("이동하시겠습니까?")){
                //location.href="../test_call";//뒤로가기 가능
                location.replace("../test_call");//뒤로가기  불가능
           }//end if
     }//movePage
</script>
</head>
<body>
<div id="wrap">
<!--
서블릿의 요청 URL : http://localhost:8080/servlet_prj/test_call
HTML의 요청 URL :  http://localhost:8080/servlet_prj/day0226/call_servlet.html
-->
     <div id="get">
           <strong>GET방식의 요청</strong>
           <div>
           <ul>
                <li>&lt;a&gt;태그 : <a  href="../test_call">요청</a></li>
                <li>
                     location.href 요청 : <a href="#void"  class="link">Javascript 요청</a>
                     <input type="button"value="JavaScript요청"  class="btn" id="btnGet"/>
                </li>
                <li>
                <!-- javaScript에서 method와 action을 설정하여  이동 -->
                     <form name="frm">
                           <input type="button" value="요청"  class="btn" id="frmGet"/>
                     </form>
                </li>
           </ul>
           </div>
     </div>
     <div id="post">
           <strong>POST방식의 요청</strong>
           <div>
                <form method="post" action="../test_call"  name="frmPost" id="postFrm">
<!--                 <input type="submit" value="post요청"  class="btn" id="btnPost"/> -->
                     <input type="button" value="post요청"  class="btn" id="btnPost"/>
                </form>
           </div>
     </div>
</div>
</body>
</html>
package day0226;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
//1.HttpServlet상속
public class TestCall extends HttpServlet {
     //2.요청방식을 처리할 수 있는 method Override
     protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException,  IOException {
           //3.응답 장식 설정
           response.setContentType("text/html;charset=UTF-8");
           //4.출력스트림 얻기
           PrintWriter out=response.getWriter();
           //5.출력 내용 생성
           out.println("<!DOCTYPE html>");
           out.println("<html>");
           out.println("<head>");
           out.println("<title>GET방식의 요청 처리 </title>");
           out.println("<style type='text/css'>");
           out.println("span{font-weight:bold; font-size:20px;  color:#0000FF}");
           out.println("</style>");
           out.println("<body>");
           out.println("<span>GET방식의 요청 처리</span><br/>");
           out.println("<a  href='day0226/call_servlet.html'>뒤로</a>");
           out.println("</body>");
           out.println("</html>");
     }//doGet
     //2.요청방식을 처리할 수 있는 method Override
     protected void doPost(HttpServletRequest request,  HttpServletResponse response) throws ServletException,  IOException {
           //3.응답 장식 설정
           response.setContentType("text/html;charset=UTF-8");
           //4.출력스트림 얻기
           PrintWriter out=response.getWriter();
           //5.출력 내용 생성
           out.println("<!DOCTYPE html>");
           out.println("<html>");
           out.println("<head>");
           out.println("<title>POST방식의 요청 처리 </title>");
           out.println("<style type='text/css'>");
           out.println("span{font-weight:bold; font-size:15px;  color:#FF0000;}");
           out.println("</style>");
           out.println("<body>");
           out.println("<span>POST방식의 요청 처리</span><br/>");
           out.println("<a  href='javascript:history.back();'>뒤로</a>");
           out.println("</body>");
           out.println("</html>");
     }//doPost
}//class





반응형