Servlet (Server + let 합성어로 웹서버에서 실행되는 간단한 프로그램)

woom·2022년 11월 28일
0

Servlet

목록 보기
1/3
post-thumbnail

🌼 형상관리서버

  • 형상관리서버(협업툴) : 소스, 버전등 변경 관리 (클라이언트에서는 eclipse를 이용해 작업)

    • CVS, SubVersion(SVN), GitHub
    • CVS 플러그인은 설치되어 있으나 SubVersion은 플러그인을 설치해야 사용 가능
    • repertory(저장소) 역활

📌 형상관리서버 과정

  1. IMPORT : 클라이언트 → 서버 (팀장이 만든 프로젝트를 최초에 한번 전송)

  2. CHECKOUT : 클라이언트 ← 서버 (서버에 존재하는 프로젝트를 팀원이 다운로드)

    • 다른 클라이언트에서 작업하고자 할 경우 : 한번만 전송
  3. COMMIT : 클라이언트 → 서버 (작업한 파일을 서버로 전송 : 자주 실행 - UPLOAD)

  4. UPDATE(PATCH) : 클라이언트 ← 서버 (서버에 변경된 파일을 클라이언트로 전송 : 자주 실행)


📕 SVN Server 서버 설치


📕 SVN 접속 플러그인 설치 (기본)

  1. Help - Eclipse Marketplace 클릭

  2. [Find] : svn 검색 → [Subversive - SVN Team Provider 4.0.5] → Install (전체 선택 후 confirm → yes → finish)

  3. [Subversive - SVN Team Provider 4.0.5] 설치 후 Eclipse 재실행 (restart)

  4. Window → Preferences → Version Control(Team) → SVN → SVN Connector → [Get Connectors] → [SVN Kit 1.8.14] 선택 → Finish

  5. [SVN Kit 1.8.14] Connector 설치 후 이클립스 재실행

  6. 확인 : Window → Preferences → Version Control(Team) → SVN → SVN Connector 확인


📕 SVN 접속 플러그인 설치 (강제)

  1. eclipse → 메뉴 → Help → install New Software...
  2. 팝업창의 work with : https://community.polarion.com/projects/subversive/download/eclipse/6.0/update-site/
  3. Subversive SVN Connectors, Subversive SVN Connectors Sources 체크 후 next
  4. keep my installation..... (첫번째메뉴) click 후 next → 모두 accept 후 finish → 설치 후 재시작
  5. 확인 : window → preferences → Version Control (Team) → SVN 클릭 → SVN Connector : SVNKit 1.8.14 r10627 .....

📕 이클립스를 이용한 SVN 사용 방법 (협업툴)

  1. IMPORT 작업 : 프로젝트를 서버에 전송하는 작업(한번만 실행) - 팀장이 실행

프로젝트 생성(메인페이지 작성) → 프로젝트 오른쪽 버튼 → Team → Share Project → SVN 선택 → URL, 계정, 암호 입력 (sava authentication ... 체크 , browse에서 url주소 확인 후 항상 trust) → next → simple mode 체크 (참고: trunk(현재폴더), branches(향후폴더) and tags(백업폴더)) → finish → import(서버에 파일 전송) → Visual SVN Server 또는 웹브라우저에서 확인

  • revision number : 파일에 붙은 숫자 → commit 할 때 마다 숫자가 증가

  • 전송하고자 하는 디렉토리에 파일이 하나도 없다면 전송되지 않는다.

  • 미전송 파일을 계속 업로드 하지 않도록 설정

  • window → preferences → Version Control(team) → ignored Resources 를 통해 불필요한 파일 생성 방지 가능
  • repertory 관리 (팀장만 하는 것 권장) : window → show view → other... → SVN 폴더 → svn repertories
  1. CHEKOUT 작업 : IMPORT된 프로젝트를 클라이언트로 전송(클라이언트가 틀린 경우에만 사용) - 팀원만 적용

프로젝트 exlplore 오른쪽 버튼 → New → Other → SVN → Project From SVN → Next → 인증 → URL(서버)입력 후 Browse 클릭 하여 확인 → user, password 입력 → save authentication 체크 → next → 원하는 프로젝트 선택 후 head revision 체크 → finish

  1. COMMIT 작업 : 프로젝트에서 파일을 변경한 후 서버로 파일을 전송
  • 변경된 파일(앞에 > 표시가 됨) → 오른쪽 버튼 → Team → Commit 선택 → comment 작성 후 commit
  • 단축키 : Ctrl + Alt + C
  1. UPDATE 작업 : 서버에 저장된 파일을 전송 받는 작업(프로그램 변경 전에 한 번 실행한 후 사용하는 것이 좋다.)
  • 프로젝트 → 오른쪽 버튼 → Team → Update 선택
  • 단축키 : Ctrl + Alt + U

주의). Commit 할 경우 상위 revision number가 존재하는 경우 Commit 에러 발생 (충돌 발생)

  • 작업디렉토리 백업 필수!

  • 해결1 : Window → Show View → Other → Team → Synchronize View 선택 → 오른쪽 버튼 → Synchronize 선택

    → 문제가 되는 파일이 존재 → 오른쪽 버튼 → Override and Commit(또는 Override and Update) 선택

  • 해결2 : 문제가 되는 파일이 존재 → 더블 클릭 → 화면에서 프로그램 비교후 파일 내용 변경 → Make as Merged
    → commit 가능(나중에 수정 가능)

  • package explorer에서 update한 경우 동일한 라인의 데이타를 변경한 경우 충돌 발생 → 문제 파일 수정 후 오른쪽 버튼

  • incomming(update 목록) 또는 outgoing(commit 목록) 확인 → Synchronize View에서 선택하여 전체 update 또는 commit 가능

SVN 영역

  • trunk : 소스의 주 개발 작업을 진행하는 폴더

  • branches : 소스의 실험적인 작업을 진행하는 폴더

    • 소스의 현재 버전을 유지보수 하고, 현재 버전을 기반으로 차기 버전을 개발할 경우 이 폴더 이용
  • tags : 현재 릴리즈된 소스를 관리하기 쉽게 따로 보관하는데 사용

    • 개발을 위한 것이 아니라 보관을 위한 것이기 때문에 export만 해야 한다

    • 체크아웃하여 커밋 할 경우 경고 메시지가 출력된다.

  • 다른 작업으로 변환

    • 프로젝트 → 오른쪽 버튼 → Team → switch → URL 또는 revision 변경 후 finish

    • 프로젝트 완성하면 프로젝트를 war파일로 저장하여 서버의 webapps에 전송하면 된다.


📌 웹 프로그램 동작원리

  • client가 매핑된 url주소로 웹프로그램(servlet)을 request메세지에 담아 요청
  • 요청 받은 WAS 프로그램(web.xml실행해서 매핑된 url주소로 Servlet 클래스 생성)은 Servlet 클래스(웹프로그램으로 만듦-java)를 객체로 생성하여 메소드 호출(실행) 해서 결과를 웹문서(html)로 저장(결과)
  • 결과는 리스펀스 메세지에 담아서 clent에 전달(응답)하면 client는 받아서 해석(파싱) 및 실행(랜더링)

🌼 Servlet

  • Servlet (Java Web Server Program) : Server + let 합성어로 웹서버에서 실행되는 간단한 프로그램
    • 웹프로그램은 클라이언트 요청에 의해 WAS(Web Application Server)로 실행되며 실행결과는 웹문서(웹프로그램)를 동적으로 생성하여 응답 - Servlet 프로그램은 WAS에 의해 관리(생성,사용,소멸)
    • WAS(Web Application Server) : Web Server(요청과 응답) + Web Container(서블릿 관리)

💡 웹 프로젝트 생성 시 주의사항

  • new project → web → dynamic web project → 프로젝트 이름 설정 후 next → generate web.xml deployment descriptor 필수 선택 !


📙 servlet 프로그램 작성 방법1

  1. HttpServlet 클래스 (J2EE or Apache Tomcat)를 상속받은 자식클래스 작성 (서블릿 클래스)
  • HttpServlet 클래스를 상속받은 자식클래스는 객체직렬화 클래스로 serialVersionUID 필드를 선언하는 것을 권장
    public class Servlet extends HttpServlet {private static final long serialVersionUID = 1L;}
  1. doGet() 메소드 또는 doPost() 메소드(요청처리메소드)를 오버라이드 선언
  • 클라이언트 요청에 대한 처리와 처리결과를 동적으로 웹문서로 생성하여 응답하기 위한 메소드
  • WAS(Web Application Server) 프로그램에 의해 자동 호출되는 메소드
  • doGet() : 클라이언트가 해당 웹프로그램을 GET 방식으로 요청한 경우 호출되는 메소드
  • doPost() : 클라이언트가 해당 웹프로그램을 POST 방식으로 요청한 경우 호출되는 메소드
  • doGet() 메소드 또는 doPost() 메소드 대신 service() 메소드 오버라이드 선언 가능
  • service() : 클라이언트가 해당 웹프로그램을 모든 방식으로 요청한 경우 호출되는 메소드
    (service() 메소드가 doGet()메소드 또는 doPost()메소드보다 호출 우선순위가 높게 설정)
  • WAS 프로그램에 의해 메소드가 호출될 때 HttpServletRequest 객체와 HttpServletResponse 객체가 매개변수에 저장되어 제공
    @Override//doGet 메소드 오버라이드
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException { }
  • HttpServletRequest : 리퀘스트 메세지(요청 관련 정보)를 표현한 객체 → 입력
  • HttpServletResponse : 리스폰즈 메세지(응답 관련 정보)를 표현한 객체 → 출력
  1. 클라이언트에게 응답할 결과에 대한 파일의 형식(MimeType)을 설정(변경)
  • 형식) HttpServletResponse.setContentType(String mimeType[;charset=encoding])
  • 응답파일이 문서파일인 경우 문자의 형태(캐릭터셋 : CharacterSet : 인코딩) 설정
  • 기본 응답파일 형식 : text/html, 캐릭터셋 : ISO-8859-1(서유럽어)
     response.setContentType("text/html;charset=utf-8");
  1. 클라이언트 요청에 의해 생성될 응답파일에 대한 출력스트림을 반환받아 저장
  • 형식) HttpServletResponse.getOutputStream() : 원시데이타(1Byte)를 전달할 수 있는 출력스트림(ServletOutputStream 객체)를 반환하는 메소드
  • 그림, 소리, 동영상 파일 등과 같은 이진파일을 생성하여 클라이언트에게 응답하기 위한 출력스트림
  • 형식) HttpServletResponse.getWriter() : 인코딩 처리된 문자데이타(2Byte)를 전달할 수 있는 출력스트림(PrintWriter 객체)를 반환하는 메소드
  • PlanText, HTML, XML, JSON 파일등과 같은 문서파일을 생성하여 클라이언트에게 응답하기 위한 출력스트림
    PrintWriter out=response.getWriter();
  1. 요청에 대한 처리와 처리에 대한 결과를 출력스트림을 사용하여 응답파일 생성
  • 출력스트림으로 문자열(HTML 태그)을 전달하여 문서파일 작성
    out.println("<!DOCTYPE html>");
  1. 서블릿 클래스를 서블릿(웹프로그램)으로 실행되도록 설정
  • [web.xml] 파일에서 서블릿 클래스를 서블릿으로 등록하여 서블릿을 요청할 수 있는 URL 주소를 매핑 설정
  • 클라이언트가 매핑된 URL 주소로 서블릿을 요청하면 WAS 프로그램은 서블릿 클래스를 객체로 생성하여 요청 처리 메소드를 호출하여 요청에 대한 처리와 응답결과 생성
  • 서블릿 클래스가 이미 객체로 생성된 경우에는 요청 처리 메소드만 호출하여 실행

🐣 servlet 클래스


public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
//1. HttpServlet 클래스 상속, serialVersionUID 필드 선언

	@Override//2.doGet 메소드 오버라이드 
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		//HttpServletRequest : 리퀘스트 메세지(요청 관련 정보)를 표현한 객체 - 입력 
		//HttpServletResponse : 리스폰즈 메세지(응답 관련 정보)를 표현한 객체 - 출력
		
		//3.클라이언트에게 응답할 결과에 대한 파일의 형식(MimeType)을 설정
		response.setContentType("text/html;charset=utf-8");
		
		//4.클라이언트 요청에 의해 생성될 응답파일에 대한 출력스트림을 반환받아 저장
		PrintWriter out=response.getWriter();
		
		//5.요청에 대한 처리와 처리에 대한 결과를 출력스트림을 사용하여 응답파일 생성
		out.println("<!DOCTYPE html>");
        //출력스트림으로 문자열(HTML 태그)을 전달하여 문서파일 작성
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿(Servlet)</h1>");
		out.println("<hr>");
		out.println("<p>Hello, Servelt!!!</p>");
		out.println("</body>");
		out.println("</html>");
		
		//6.서블릿 클래스를 서블릿(웹프로그램)으로 실행되도록 설정
		// → [web.xml] 파일에서 URL 주소를 매핑 설정
	}
}





🐣 web.xml 파일

  • web.xml 더블클릭 해서 하단 source 확인

  • web.xml : 현재 프로젝트가 WAS 프로그램에 의해 웹자원(WebContext)로 변형될 때 필요한 정보를 제공하기 위한 환경설정파일 - XSD 파일(XML 스키마 파일)에 선언된 태그(엘리먼트)만 사용 가능(web-app_4_0.xsd)

    • WAS 프로그램에 실행될 때 자동으로 읽어 필요한 설정에 맞게 동작
  • servlet : 서블릿 클래스를 서블릿(웹프로그램)으로 등록하기 위한 엘리먼트

    • servlet-name : 서블릿을 구분하기 위한 식별자를 설정하는 엘리먼트
      (고유한 식별자로 중복 되지 않음)
    • <servlet-name>hello</servlet-name>
    • servlet-class : 서블릿으로 등록될 서블릿 클래스를 설정하는 엘리먼트
      (패키지이름을 포함하여 클래스를 설정)
    • <servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>
  • servlet-mapping : 서블릿을 실행하기 위한 요청 URL 주소의 패턴을 등록하기 위한 엘리먼트

    • servlet-name : 요청 URL 주소에 의해 실행될 서블릿의 이름을 설정하는 엘리먼트
    • <servlet-name>hello</servlet-name>
    • url-pattern : 서블릿을 실행하기 위한 URL 주소의 패턴을 설정하는 엘리먼트
    • / : context root directory, .확장자 생략 가능
    • <url-pattern>/hello.itwill</url-pattern>
  • welcome-file-list : 기본 웹프로그램을 등록하기 위한 엘리먼트

    • 기본 웹프로그램 : client가 서버에 접속하여 웹프로그램을 요청하지 않은 경우 기본적으로 실행되어 응답될 웹프로그램(메인페이지)
    • 순차적으로 진행 (첫번째페이 없으면 두번째페이지로 이동...)


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns=
         "http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation=
         "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/
          javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>servlet</display-name><!-- 보여지는 이름으로 의미없음 -->
  
  <!-- servlet : 서블릿 클래스를 서블릿(웹프로그램)으로 등록하기 위한 엘리먼트 -->
  <servlet>
  	<!-- servlet-name : 서블릿을 구분하기 위한 식별자(중복x)를 설정하는 엘리먼트 -->
  	<servlet-name>hello</servlet-name>
  	<!-- servlet-class : 서블릿으로 등록될 서블릿 클래스를 설정하는 엘리먼트 -->
  	<servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>
  </servlet>
  
  <!-- servlet-mapping : 서블릿을 실행하기 위한 요청 URL 주소의 패턴을 등록 -->
  <servlet-mapping>
  	<!-- servlet-name : 요청 URL 주소에 의해 실행될 서블릿의 이름을 설정 -->
  	<servlet-name>hello</servlet-name>
  	<!-- url-pattern : 서블릿을 실행하기 위한 URL 주소의 패턴을 설정 -->
    <!-- / : context root -->
  	<url-pattern>/hello.itwill</url-pattern>
  </servlet-mapping>
  
  <!-- welcome-file-list : 기본 웹프로그램을 등록하기 위한 엘리먼트-->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
</web-app>





📌 Servlet 클래스 생성

  • 패키지 오른쪽 버튼 → new → servlet → create Servlet class name 작성 후 next (class name은 중복 되지 않도록만 작성)

→ URL mappings: /first.itwill 을 등록하면 자동적으로 FirstServlet 클래스와 매핑됨

→ 선언할 메소드 선택

→ finish


📙 servlet 프로그램 작성 방법2

  • 어노테이션(Annotation) : API 문서에 특별한 설명을 제공하기 위해 만들어진 기능

    • 프로그램에 작성에 필요한 특별한 의미를 제공하거나 실행에 필요한 정보를 제공하는 기능
  • @WebServlet : 서블릿 클래스를 서블릿으로 등록하고 URL 주소를 매핑하기 위한 어노테이션

    • [web.xml] 파일의 servlet 엘리먼트와 servlet-mapping 엘리먼트가 제공하는 기능과 동일한 효과 제공
    • @WebServlet 어노테이션의 속성을 사용하여 서블릿 이름과 요청 URL 주소 설정 가능
    • @WebServlet(name = "first",value = "/first.itwill")
    • name 속성(선택) : 서블릿의 이름을 속성값으로 설정 - 속성 설정을 생략하면 클래스명을 서블릿 이름으로 자동 설정
    • value 속성(필수) : 요청 URL 주소를 속성값으로 설정 - 다른 속성이 없는 경우 속성값만 설정 가능
  • 클라이언트의 모든 요청방식에 의한 요청을 처리하기 위해 자동 호출되는 메소드 (요청 처리 메소드)
    • 클라이언트 요청에 대한 처리 명령과 응답결과를 생성하기 위한 명령 작성
    • protected void service(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException { 명령; }
  • 요청에 대한 처리와 응답을 위한 결과파일 생성 (명령 작성)
    • 서블릿은 모든 클라이언트에게 일관성 있는 처리결과를 동적으로 생성하여 제공

🐣 예제 (시계)

package xyz.itwill.servlet;

//@WebServlet : 서블릿 클래스를 서블릿으로 등록하고 URL 주소를 매핑하기 위한 어노테이션
//@WebServlet 어노테이션의 속성을 사용하여 서블릿 이름과 요청 URL 주소 설정
//@WebServlet(name = "first",value = "/first.itwill")
@WebServlet("/first.itwill")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	//클라이언트의 모든 요청방식에 의한 요청을 처리하기 위해 자동 호출되는 메소드 (요청 처리 메소드)
	// → 클라이언트 요청에 대한 처리 명령과 응답결과를 생성하기 위한 명령 작성
	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		//클라이언트에게 응답할 결과에 대한 파일형식과 응답파일을 생성하기 위한 출력스트림을 반환
		//→ 클라이언트 요청에 대한 응답결과를 파일로 생성하지 않을 경우 생략 가능
        //(클라이언트에게 URL 주소로 응답)
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//요청에 대한 처리와 응답을 위한 결과파일 생성
		//→ 서블릿은 모든 클라이언트에게 일관성 있는 처리결과를 동적으로 생성하여 제공
		Date now=new Date();//서버 시스템의 날짜와 시간이 저장된 Date 객체 생성
		
		//날짜와 시간 관련 패턴정보가 저장된 SimpleDateFormat 객체 생성
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
		
		//SimpleDateFormat 객체의 format() 메소드를 호출하여 매개변수로 전달받은 Date 객체를
		//SimpleDateFormat 객체에 저장된 패턴의 날짜와 시간 형식의 문자열로 변환하여 반환
		String displayNow=dateFormat.format(now);
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("<style type=\"text/css\">");
		out.println("p {");
		out.println("width: 600px;");
		out.println("margin: 0 auto;");
		out.println("padding: 30px 0;");
		out.println("font-size: 2em;");
		out.println("font-weight: bold;");
		out.println("text-align: center;");
		out.println("border: 2px solid black;");
		out.println("}");
		out.println("</style>");
		out.println("<script type='text/javascript'>");
		out.println("setInterval(function() { location.reload(); }, 1000);");
		out.println("</script>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿 시계</h1>");
		out.println("<hr>");
		out.println("<p>"+displayNow+"</p>");
		out.println("</body>");
		out.println("</html>");
	}
}





📒 Servlet 객체 생성 (초기화)

  • 서블릿(웹프로그램)은 클라이언트 요청에 의해 WAS 프로그램에 등록된 서블릿 클래스를 읽어 메모리에 저장하고 서블릿 객체로 생성하여 요청 처리 메소드를 호출

    • 클라이언트 요청에 의한 서블릿 객체가 이미 생성되어 있는 경우 새로운 서블릿 객체를 생성하지 않고 기존 서블릿 객체를 사용하여 요청 처리 메소드 호출
    • WAS 프로그램 종료되면 WAS 프로그램에 의해 관리되는 모든 서블릿 객체 소멸
  • WAS 프로그램의 주요 기능 중 하나는 서블릿 객체를 관리하는 웹컨테이너(WebContainer) 기능 제공

    • 컨테이너(Container) : 프로그램 관련 객체(Component)의 생명주기(LifeCycle)를 관리(생성,사용,소멸)하는 프로그램

  • 생성자(Constructor) : 클래스 자료형으로 객체를 생성하기 위한 특별한 메소드

    • 초기화 작업 관련 명령 작성 (객체 생성시 필드에 필요한 초기값 저장)
    • 서블릿을 클라이언트가 요청한 경우 WAS 프로그램이 서블릿 클래스로 서블릿 객체를 생성하기 위해 한번만 호출
  • 클라이언트 요청에 대한 처리와 처리 결과를 파일로 응답하기 위한 명령을 작성하는 메소드

    • 클라이언트 요청마다 WAS 프로그램에 의해 서블릿 객체로 반복 호출되는 메소드
    protected void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {명령;}

📌 init 오버라이드

  • WAS 프로그램에 의해 서블릿 객체를 생성한 후 가장 먼저 한번만 자동 호출되는 메소드

    • public void init(ServletConfig config) throws ServletException{}
    • 초기화 작업 관련 명령 작성 (객체 생성시 필드에 필요한 초기값 저장)
    • 서블릿은 생성자 대신 init() 메소드를 이용하여 초기화 작업 명령을 작성하는 것을 권장
  • 생성자 대신 init() 메소드로 초기화 작업 명령을 작성하는 이유

    • init() 메소드의 매개변수로 ServletConfig 객체를 전달받아 메소드에서 사용 가능
    • ServletConfig 객체 : 웹자원(WebContext)을 생성하기 위한 환경설정 관련 정보를 저장한 객체
    • [web.xml] 파일에서 제공되는 값을 얻어와 서블릿 클래스에서 사용 가능 (유지보수의 효율성 증가)
  • ServletConfig.getServletContext() : ServletContext 객체를 반환하는 메소드

    • ServletContext 객체 : 웹자원 관련 정보를 저장한 객체
  • ServletContext.getInitParameter(String name) : [web.xml] 파일에서 context-param 엘리먼트로 제공되는 값을 얻어와 반환하는 메소드

    • value=config.getServletContext().getInitParameter("name");

📌 destroy 오버라이드

  • WAS 프로그램에 의해 서블릿 객체가 소멸되기전 마지막으로 한번만 자동 호출되는 메소드
    • 마무리 작업 관련 명령 작성
    • WAS 프로그램이 종료될 경우 WAS 프로그램에 의해 관리된 모든 서블릿 객체 소멸

🐣 servlet 객체

package xyz.itwill.servlet;

@WebServlet("/life.itwill")
public class LifeCycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private String name;

	//기본생성자 : 클래스 자료형으로 객체를 생성하기 위한 특별한 메소드 (한번만 호출)
	public LifeCycleServlet() {
		System.out.println("서블릿 객체 생성");
		//name="홍길동";
	}
	
    
	//init 메소드 오버라이드 : 서블릿 객체를 생성한 후 가장 먼저 한번만 자동 호출
	//서블릿은 생성자 대신 init() 메소드를 이용하여 초기화 작업 명령을 작성하는 것을 권장
	//init() 메소드의 매개변수로 ServletConfig 객체를 전달받아 메소드에서 사용 가능
	//[web.xml] 파일에서 제공되는 값을 얻어와 서블릿 클래스에서 사용 가능
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 메소드 호출");
		//name="홍길동";
		
		//ServletConfig.getServletContext() : ServletContext 객체를 반환
		//ServletContext.getInitParameter(String name) : [web.xml] 파일에서
        //context-param 엘리먼트로 제공되는 값을 얻어와 반환 (name=임꺽정)
		name=config.getServletContext().getInitParameter("name");
	}


	//destroy 메소드 오버라이드 : 서블릿 객체가 소멸되기전 마지막으로 한번만 자동 호출
	@Override
	public void destroy() {
		System.out.println("destroy() 메소드 호출");
	}
	
    
	//client 요청에 대한 결과를 응답하기 위한 명령을 작성하는 메소드 (요청마다 반복 호출)
	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		System.out.println("service() 메소드 호출");
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>서블릿의 생명주기(LifeCycle)</h1>");
		out.println("<hr>");
		out.println("<p>"+name+"님, 안녕하세요.</p>");//임꺽정님 안녕하세요
		out.println("</body>");
		out.println("</html>");
	}
}





🐣 web.xml (context-param)

  • web.xml : 현재 프로젝트가 WAS 프로그램에 의해 웹자원(WebContext)로 변형될 때 필요한 정보를 제공하기 위한 환경설정파일 - XSD 파일(XML 스키마 파일)에 선언된 태그(엘리먼트)만 사용 가능

    • WAS 프로그램에 실행될 때 자동으로 읽어 필요한 설정에 맞게 동작
  • context-param : 현재 프로젝트에 작성된 모든 웹프로그램에게 필요한 값을 제공하기 위한 엘리먼트

    • param-name : 제공값을 구분하기 위한 이름(식별자)를 설정하는 엘리먼트
    • param-value : 제공될 을 설정하는 엘리먼트
  • init-param : 현재 서블릿(웹프로그램)에게 필요한 값을 제공하기 위한 엘리먼트

    • param-name : 제공값을 구분하기 위한 이름(식별자)를 설정하는 엘리먼트
    • param-value : 제공될 을 설정하는 엘리먼트
    • url주소로 매핑된 servlet클래스에서만 적용 가능
  • servlet : 서블릿 클래스를 서블릿(웹프로그램)으로 등록하기 위한 엘리먼트

    • servlet-name : 서블릿을 구분하기 위한 이름(식별자)을 설정하는 엘리먼트
    • servlet-class : 서블릿으로 등록될 서블릿 클래스를 설정하는 엘리먼트
  • servlet-mapping : 서블릿을 실행하기 위한 요청 URL 주소의 패턴을 등록하기 위한 엘리먼트

    • servlet-name : 요청 URL 주소에 의해 실행될 서블릿의 이름을 설정하는 엘리먼트
    • url-pattern : 서블릿을 실행하기 위한 URL 주소의 패턴을 설정하는 엘리먼트


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation=
         "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns
          /javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>servlet</display-name><!-- 보여지는 이름으로 의미없음 -->
  
  <!-- context-param : 현재 프로젝트에 작성된 모든 웹프로그램에게 필요한 값을 제공 -->
  <context-param>
  	<param-name>name</param-name>
  	<param-value>임꺽정</param-value>
  </context-param>
  
  <!-- servlet : 서블릿 클래스를 서블릿(웹프로그램)으로 등록하기 위한 엘리먼트 -->
  <servlet>
  	<servlet-name>hello</servlet-name>
  	<servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>

	<!-- init-param : 현재 서블릿에게 필요한 값을 제공하기 위한 엘리먼트 -->  	
  	<init-param>
  		<param-name>title</param-name>
  		<param-value>서블릿</param-value>
  	</init-param>
    
  </servlet>
  
  <!-- servlet-mapping : URL 주소의 패턴을 등록하기 위한 엘리먼트 -->
  <servlet-mapping>
  	<servlet-name>hello</servlet-name>
  	<url-pattern>/hello.itwill</url-pattern>
  </servlet-mapping>
  

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
</web-app>





💡 webapp 내 private 폴더 참고!

  • private 폴더로 웹서버(관리자)에서만 접근 가능, client는 접근 불가
  • META-INF : 데이터베이스에 관련되어 있는 정보들 저장
  • WEB-INF : 웹프로그램에 관련된 정보들 저장 (web.xml, 웹프로그램을 이용해서 전달받을 이미지 파일 등)
  • eclipse에서 작업하는 결과물들은 workspace에 저장되고, WAS는 동기화 된 webapps(web directory) context root에 있는 실제경로를 찾아서 사용
  • web자원은 webapp에 있어야 web context로 저장 가능

📗 이미지 파일 처리

  • 클라이언트에게 이미지 파일이 응답되도록 설정 (응답될 파일형식(MimeType) 변경)
    • 이미지 파일(이진 파일 - Binary File)로 응답하므로 캐릭터셋 미설정
    • response.setContentType("image/jpeg");
  • 응답될 이미지 파일을 생성하기 위한 값(원시데이타 - 1Byte)를 전달하는 출력스트림(ServletOutputStream 객체)을 반환받아 저장
    • ServletOutputStream out=response.getOutputStream();```
  • 서버에 저장된 이미지 파일의 파일 시스템 경로를 반환받아 저장
    • HttpServletRequest.getServletContext() : ServletContext 객체를 반환하는 메소드
    • ServletContext 객체 : 웹자원(WebContext)을 관리하기 위한 객체 (WAS)
    • 웹자원(WebContext) : 웹서버(WebServer)가 사용할 수 있는 자원 (웹에서 사용 가능한 리소스 파일)
    • ServletContext.getRealPath(String contextPath) : 매개변수로 전달받은 웹자원 관련 파일의 시스템 경로를 반환하는 메소드
    • String filePath=request.getServletContext().getRealPath("/WEB-INF/abc.jpg");
  • 이미지 파일을 읽기 위한 입력스트림 생성
    • FileInputStream in=new FileInputStream(filePath);
  • 입력스트림으로 원시데이타를 읽어서 출력스트림으로 전달 (반복 처리)
    • 서버에 저장된 이미지 파일을 읽어 클라이언트에게 응답되도록 생성
    • while(true){int readByte=in.read(); if(readByte==-1) break; out.write(readByte);}
  • 파일 입력스트림 제거
    • in.close();

🐣 예제

package xyz.itwill.servlet;

//클라이언트 요청에 대해 이미지 파일로 응답하기 위한 서블릿
@WebServlet("/image.itwill")
public class SendImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
		//클라이언트에게 이미지 파일이 응답되도록 설정 - 응답될 파일형식(MimeType) 변경
		response.setContentType("image/jpeg");
		
		//이미지 파일을 생성하기 위한 값(원시데이타)을 전달하는 출력스트림을 반환받아 저장
		ServletOutputStream out=response.getOutputStream();
		
		//서버에 저장된 이미지 파일의 파일 시스템 경로를 반환받아 저장
		//HttpServletRequest.getServletContext() : ServletContext 객체를 반환하는 메소드
		//ServletContext.getRealPath(String contextPath):웹자원 관련 파일의 시스템 경로 반환
		String filePath=request.getServletContext().getRealPath("/WEB-INF/Koala.jpg");
		//System.out.println("filePath = "+filePath);
		
		//이미지 파일을 읽기 위한 입력스트림 생성
		FileInputStream in=new FileInputStream(filePath);
		
		//입력스트림으로 원시데이타를 읽어서 출력스트림으로 전달 (반복 처리)
		while(true) {
			int readByte=in.read();
			if(readByte==-1) break;
			out.write(readByte);
		}
		
		//파일 입력스트림 제거
		in.close();
	}
}





profile
Study Log 📂

0개의 댓글