ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 인프런 - Servlet
    자바/인프런 인강 2018. 2. 17. 21:21
    • Servlet이란?

    CGI(Common Gateway Interface)언어, 동적 웹 어플리케이션 컴포넌트

    .java 확장자

    JAVA thread로 동작

    클라이언트의 요청에 동적으로 작동하고, html로 응답

    mvc패턴에서 Controller



    • 어노테이션

    @WebServlet("/HW2")


    public class Helloworld2 extends HttpServlet {


    }


    어노테이션 방법 설명:

    https://www.youtube.com/watch?v=s9Le8ypFIfA&t=0s&index=10&list=PLqaSEyuwXkSoeqnsxz0gYWZMihw519Kfr



    • web.xml에서 서블릿 맵핑


    경로가 너무 길고, 보안에 취약할 수 있기 때문에 간단하게 맵핑 한다.


      <servlet>

      <servlet-name>helloworld</servlet-name>

      <servlet-class>com.javalec.ex.Helloworld2</servlet-class>

      </servlet>

      

      <servlet-mapping>

      <servlet-name>helloworld</servlet-name>

      <url-pattern>/HW2</url-pattern>

      </servlet-mapping>

      

    </web-app>


    • Servlet 프로젝트 만들기

    이클립스에서 새로만들기 -> dynamic web project 생성 -> 프로젝트 폴더 선택된 상태에서 servlet 새로 만들기


    생성된 servlet파일은 .java 확장자이고 HttpServlet을 상속받는 자바 클래스이다.



    >톰캣에서 요청처리객체와 응답처리객체를 받는다.

    2가지의 매개변수

    HttpServletRequest request - 클라이언트의 요청이 request 객체에 담긴다.

    HttpServletResponse response -서버의 응답이 response 객체에 담긴다.



    >2가지 처리방식이 있다.

    1.Doget() 

    form태그의 method = get일 경우 호출

    웹브라우져의 주소창을 이용하여 servlet을 요청한 경우도 호출됨.

    URL 값에 정보가 포함되어 그대로 노출된다. 보안 취약 


    response.setContentType("text/html; charset=euc-kr");  


    //setContentType()으로 응답방식을 결정


    PrintWriter writer = response.getWriter();  


    //getWirter() 메소드로 출력 스트림을 얻는다?

    writer.println("<html>");

    writer.println("<head>");

    writer.println("</head>");

    writer.println("<body>");

    writer.println("HelloWorld");

    writer.println("</body>");

    writer.println("</html>");

    writer.close();


    writer.prinln()의 내용이 웹브라우져의 출력된다.



    2.DoPost() 

    form태그의 method = post일 경우 호출

    header 안으로 정보가 전송되어 보안이 된다.



    <!DOCTYPE html>

    <html>

    <head>

    <meta charset="EUC-KR">

    <title>Insert title here</title>

    </head>

    <body>


    <form action="HW" method="post">

    <input type="submit" value="post">

    </form>


    </body>

    </html>




    • context path

    WAS에서 웹 어플리케이션을 구분하기 위한 path이다. 이클립스에서 프로젝트를 생성하면, 자동으로 server.xml에 추가된다.



    • Servlet 작동순서

    웹브라우저 -> 웹서버 -> WAS -> Servlet 컨테이너


    웹브라우저에서 클라이언트의 요청이 들어온다

    웹서버에서 요청을 받고 WAS로 요청을 보낸다.

    웹어플리케이션 서버(WAS)에서 요청을 전달하고

    Servlet 컨테이너에서 스레드와 servlet 객체를 생성한다.


    다른 CGI언어는 요청이 들어올때마다 객체를 생성하는데 많은 요청을 메모리가 감당하지 못하면서 과부하가 걸린다. 그런데 servlet은 JVM이 메모리관리를 하기 때문에 다른 CGI언어에 비해 효율이 더 좋다.



    • Servlet 라이프사이클(생명주기)

    어느시점에 어느 메소드가 콜백 되는지 알고 있어야 적절한 시점에 특정 기능을 구현할 수 있다.(중요)


    servlet은 응답속도가 빨라서 사용도가 높다. 최초 요청시 메모리에서 만들어진 servlet 객체가 이후 요청에서 재활용되기 때문에


    Servlet 객체생성 -> Init()호출 -> service(), DoGet(), DoPost() 호출 -> destroy() 호출




    Init():

    servlet 객체생성시 최초 한번 호출


    destroy():

    서버 재가동, 종료시 호출


    • 선처리, 후처리

    라이프 사이클 중 init() 메소드 호출 전 선처리(@PostConstruct), 

    destroy() 메소드 호출 후 후처리(@PreDestroy) 작업이 가능하다.



    @PostConstruct


    import javax.annotation.PostConstruct;


    public void initPostConstruct() {

    }



    @PreDestroy


    import javax.annotation.PreDestroy;


    public void destroyPreDestroy() {

    }


    • HTML form태그

    Html의 form태그는 서버쪽으로 정보를 전달할때 사용하는 태그



    -input 태그의 종류(type)와 기본문법

    text, password, submit, checkbox, radio, reset


    <input type="text" name="이름" size="10">

    >태그 타입은 text, 네임 값은 이름, 최대 글자수 10


    <input type="reset" value="초기화">

    >'초기화' 라는 버튼을 생성하고 클릭하면 입력내용을 초기화


    <input type="submit" value="전송">

    >form태그에 있는 내용이 모두 전송된다.


    <input type="checkbox" name="hobby" value="read">독서

    <input type="checkbox" name="hobby" value="exer">운동

    <input type="checkbox" name="hobby" value="game">게임

    <input type="checkbox" name="hobby" value="movie">영화감상

    >4개의 체크박스 생성(중복 가능)


    <input type="radio" name="major" value="kor">국어

    <input type="radio" name="major" value="eng  checked="checked">영어

    <input type="radio" name="major" value="mat">수학

    <input type="radio" name="major" value="des">디자인

    >4개의 체크박스 중복불가(영어 기본선택)


    <select name="protocol">

    <option value="http">http</option>

    <option value="ftp" selected="selected">ftp</option>

    <option value="smtp">smtp</option>

    <option value="pop">pop</option>

    >클릭하면 리스트가 아래로 펼쳐짐(ftp 기본선택)



    <form action="컴포넌트 이름"(join.jsp, info.html, HW 등) method="처리방식"(get, post 등)>


    >submit을 클릭했을때 form태그의 내용들이 action의 컴포넌트 이름 값으로 전달된다.



    • servlet parameter

    form태그의 submit 버튼을 클릭하면 데이터가 서버로 전송되고, 해당파일(컴포넌트, 예시는 servlet)에서 HttpServletRequest 객체를 이용하여 Parameter 값을 찾는다.


    getParameter(name)

    getParameterValues(name)

    getParameterNames()


    예시) String name = request.getParameter(NAME);


    • 한글처리

    tomcat 서버의 기본 문자 처리방식은 IOS-8869-1 방식이다. 별도로 한글 인코딩을 하지 않으면 문자가 깨져보인다. get방식과 post방식이 서로 다르다.


    -get방식

    server.xml에서 <Connector 옆에 "URIEncoding="EUC-KR" 추가

    위 파일을 수정 후에는 서버의 "publish to server" 버튼을 클릭해서 동기화한다.


    -post방식

    자바 파일의 DoPost()메소드에 아래 코드를 추가한다.


    request.setCharacterEncoding("EUC-KR");



    • Servlet 초기화 파라미터(servlet config)

    특정 Servlet 생성 초기에 필요한 데이터가 있다. (특정 경로, 아이디 정보 등) 이런 데이터를 초기화 파라미터라고 하며, 이것을 web.xml에 기술하면 ServletConfig 클래스를 이용해 사용 가능하다. 또한 초기화 파마리터를 Servlet 파일에 직접 기술하는 방법도 있다.


    -web.xml에 기술

    web.xml 안에서 특정<servlet> </servlet>태그 안에 아래 <init-param> 태그를 기술한다.


      <servlet>

    <servlet-name>InitParam</servlet-name>

    <servlet-class>com.javalec.InitParam</servlet-class>

    <init-param>

    <param-name>id</param-name>

    <param-value>abcde</param-value>

    </init-param>


    <init-param>

    <param-name>pw</param-name>

    <param-value>12345</param-value>

    </init-param>


      </servlet>



    servlet 파일에서 아래와 같이 파라미터 값을 구한다.


    String id = getInitParameter("id");

    String pw = getInitParameter("pw");



    -servlet 파일에서 초기화 파라미터 기술


    import javax.servlet.annotation.WebInitParam;


    @WebServlet(urlPatterns= {"/InitP"}, initParams= {@WebInitParam(name="id", value="aaaa"), @WebInitParam(name="pw", value="1234444")})



    • 데이터 공유, ServletContext

    여러 servlet에서 특정 데이터를 공유해야 할 경우, context parameter로 web.xml에 데이터를 기술한다. ※<servlet> 태그보다 위에 위치해야 한다.


    <context-param>

    <param-name>id</param-name>

    <param-value>aaaabb</param-value>

    </context-param>


    <context-param>

    <param-name>pw</param-name>

    <param-value>123444</param-value>

    </context-param>

      

    <context-param>

    <param-name>path</param-name>

    <param-value>C:\abc/abcd</param-value>

    </context-param>  


    -servlet 파일에서 파마리터 값 구하기

    String id = getServletContext().getInitParameter("id");

    String pw = getServletContext().getInitParameter("pw");

    String path = getServletContext().getInitParameter("path");

    System.out.println("ID:"+id);

    System.out.println("PW:"+pw);

    System.out.println("path:"+path);



    • 웹 어플리케이션 감시, ServletContextListener

    웹 어플리케이션의 생명주기(LifeCycle)를 감시하는 것. 웹 어플의 시작과 종료 시 메소드가 호출 됩니다. 별도의 클래스를 생성하면서 ServletContextListener 인터페이스를 implement 합니다.


    package com.javalec;


    public class ListenerEx implements ServletContextListener {


    @Override

    public void contextDestroyed(ServletContextEvent arg0) {

    // TODO Auto-generated method stub

    System.out.println("contextDestroyed");

    }


    @Override

    public void contextInitialized(ServletContextEvent arg0) {

    // TODO Auto-generated method stub

    System.out.println("contextInitialized");

    }

    }


    ServletContextListener를 호출되게 하려면


    -web.xml 파일에 기술

    <listener>

    <listener-class>com.javalec.ListenerEx</listener-class>

    </listener>


    -ListenerEx 클래스에 어노테이션

    @WebListener




    ※라이프사이클 순서 출력결과

    contextInitialized

    initPostConstruct

    init

    DoGet

    DoPost

    destroy
    destroyPreDestroy
    contextDestroyed