Server

SERVLET STEP 1 - 기초 셋팅 및 설정

IT의 큰손 2023. 5. 8. 12:18
728x90

★ 이클립스 실행

  • WorkSpace > code/server

 

★ 설정

  • 폰트
  • 인코딩 UTF 8
    • worspace
    • css
    • HTMl
    • JSP
  • 톰캣
    • Runtime
    • Server -> Runtime Environment

톰캣 설정

 

★ 프로젝트 생성

  • Dynamic Web Project
  • Project name : "ServletTest"
  • Target runtime : Apache Tomcat 8.5
  • Dynamic Web Module Version : 3.1
  • Context Root : "ServletTest" -> "servlet" : 외부 시각
                                                 -> src/main/webapps : 내부 시각

셋팅 완료

 

★ Servlet 

  • 웹서버측에서 자바를 사용한 프로그램을 동작시키는 기술
  • 목적 : 클라이언트 요청에 따른 동작으로 웹페이지를 만들기 위해서!!
  • 자바 > 위의 페이지 생산 > 동적 HTML 페이지 > 바리스타 > 주문

 

★ Servlet Class, 서블릿 클래스

  • 자바 클래스
  • 서블릿 (역할 부여) == 알바생 역할

 

★ Servlet Class 작성 규칙

  • 1. 서블릿 클래스 선언
a. javax.servlet.Servlet 인터페이스를 구현한다. > 복잡합 > 사용X
b. javax.servlet.http.HttpServlet 클래스를 상속받는다. > 간편함 > 사용**
  • 2. doGet/doPost 메소드 선언
- 둘 중 하나 선언 or 둘 다 선언
- 클라이언트(브라우저)의 요청이 들어오면 자동으로 호출되는 메소드
- 동적으로 HTML 페이지를 만드는 역할
- 메소드 작성 규칙
    a. 매개 변수 작성(2개)
        1. java.servlet.http.HttpServletRequest
        2. java.servlet.http.HttpServletResponse
    b. 예외 미루기
        1. java.io.IOException			//페이지 동적 생성 - 외부 입출력
        2. java.servlet.ServletException //서블릿 작업
  • 3. 동적 HTML 문서 작성
- HttpServletResponse 객체의 getWriter() 메소드 호출 > PrintWriter 객체 반환
- PrintWriter 객체의 printXXX("<html>") 메소드를 사용 > HTML을 생성
- 페이지 완성 > 브라우저에게 반환
  • 4. 브라우저가 자바 파일(서블릿, 알바생)을 호출할 수 있는 가상 주소 매핑
    • web.xml

 

 

■ 실제 구현

  • src/main/java -> com.test.servelt 패키지 생성
  • Ex01.java 파일 생성
  • 동적으로 HTML 페이지 만들기
  • 소스코드
package com.test.servlet;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

//서블릿(X) -> 일반 클래스(O)
public class Ex01 {

	public static void main(String[] args) {
		
		//동적으로 HTML 페이지 만들기
		// - test.txt
		// - test.dat
		// - test.html
		
		try {
			BufferedWriter writer = new BufferedWriter(new FileWriter(".\\src\\main\\webapp\\ex01.html"));
			
			writer.write("<html>");
			writer.write("<head>");
			writer.write("<meta charset='UTF-8'>");
			writer.write("</head>");
			writer.write("<body>");
			writer.write("<h1>서블릿 페이지</h1>");
			writer.write("<p>안녕하세요.</p>");
			writer.write("<p>자바로 만든 페이지입니다.</p>");
			writer.write("</body>");
			writer.write("</html>");
			
			writer.close();
			
			System.out.println("complete");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
  • 실행

java Application 으로 선택 후, 실행

  • 파일이 생성

webapps에 파일 생성

  • 페이지 실행

실행 결과

 

 

■ 서블릿 클래스 선언 사용

  • Ex02.java 파일 생성
  • 동적으로 HTML 페이지 만들기 -> 서블릿 클래스 사용
  • 소스코드 
package com.test.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
//
//1. 서블릿 클래스 선언
//a. javax.servlet.Servlet 인터페이스를 구현한다. > 복잡합 > 사용X
//b. javax.servlet.http.HttpServlet 클래스를 상속받는다. > 간편함 > 사용**
import javax.servlet.http.HttpServletResponse;

public class Ex02 extends HttpServlet {

//	2. doGet/doPost 메소드 선언
//	- 둘 중 하나 선언 or 둘 다 선언
//	- 클라이언트(브라우저)의 요청이 들어오면 자동으로 호출되는 메소드
//	- 동적으로 HTML 페이지를 만드는 역할
//	
//	- 메소드 작성 규칙
//	a. 매개 변수 작성(2개)
//		1. java.servlet.http.HttpServletRequest
//		2. java.servlet.http.HttpServletReponse
//	b. 예외 미루기
//		1. java.io.IOException			//페이지 동적 생성 - 외부 입출력
//		2. java.servlet.ServletException //서블릿 작업
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
//		
//		3. 동적 HTML 문서 작성
//		- HttpServletResponse 객체의 getWriter() 메소드 호출 > PrintWriter 객체 반환
//		- PrintWriter 객체의 printXXX("<html>") 메소드를 사용 > HTML을 생성
//		- 페이지 완성 > 브라우저에게 반환
		
		//BufferedWriter > 생성된 파일 > HDD에 저장
		//PrintWriter > 생선된 파일 > 톰캣을 통해서 브라우저에게 반환
		
		PrintWriter writer = response.getWriter();
		
		writer.println("<html>");
		writer.println("<head>");		
		writer.println("<meta charset='UTF-8'>");		
		writer.println("</head>");		
		writer.println("<body>");		
		writer.println("<h1>서블릿 페이지</h1>");		
		writer.println("<p>서블릿을 사용해서 만들었습니다.</p>");
		writer.println("</body>");		
		writer.println("</html>");
		
		writer.close();
		
	}
	
	
}
  • 파일이 생성 된 후, 실행

실행 불가

  • 자바 파일은 웹에서 호출이 불가.
  • 해결 방법 
    • 자바 파일을 브라우저를 통해 웹에서 호출할 수 있는 방법이 필요!!
    • 가상 주소
    • web-app > web-inf > web.xml
    • web.xml == Deployment Descriptor == 배포 서술자
    • 아파치 톰캣이 웹 사이트 운영에 필요한 여러가지 설정하는 파일  
    • 브라우저가 웹을 통해서 자바 파일을 직접 호출이 불가능!!
         > 가상 주소 생성 > 대신 자바 파일을 호출하게 설정!!
    • 코드
<servlet>
    <servlet-name>ex02</servlet-name>
    <servlet-class>com.test.servlet.Ex02</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>ex02</servlet-name>
    <url-pattern>/ex02</url-pattern>
</servlet-mapping>
  • 다시 실행

동작 성공, but encoding 문제로 한글이 깨짐

 

  • UTF-8 안깨지게 하려면
    • doGet메소드 안에 가장 상위에 적용
response.setCharacterEncoding("UTF-8");
  • 실행 결과

실행 결과

 

■ 랜덤 > 구구단 페이지 만들기

  • 소스코드
package com.test.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

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

//자동 import = Ctrl + 1
public class Ex03 extends HttpServlet {

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		
		//랜덤 > 구구단 페이지 만들기
		Random rnd = new Random();
		int dan = rnd.nextInt(8) + 2;
		
		String temp = "<!DOCTYPE html>\r\n"
				+ "<html lang=\"en\">\r\n"
				+ "<head>\r\n"
				+ "    <meta charset=\"UTF-8\">\r\n"
				+ "    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n"
				+ "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n"
				+ "    <title>Document</title>\r\n"
				+ "    <style>\r\n"
				+ "        .box {\r\n"
				+ "            border : 1px solid #CCC;\r\n"
				+ "            width : 120px;\r\n"
				+ "            padding : 20px;\r\n"
				+ "        }\r\n"
				+ "\r\n"
				+ "        .box .item {\r\n"
				+ "            font-size : 1.5rem;\r\n"
				+ "        }\r\n"
				+ "    </style>\r\n"
				+ "</head>\r\n"
				+ "<body>\r\n";
		
	
		   temp += String.format("    <h1>구구단 %d단</h1>\r\n", dan);
		   
		   temp += "\r\n"
				+ "    <div class=\"box\">\r\n";
		   
		   for (int i=1; i<=9; i++) {
			   temp += String.format("        <div class=\"item\">%d x %d = %d</div>\r\n", dan, i, dan*i) ;
		   }
		   
		   
		   temp +="\r\n"
				+ "    </div>\r\n"
				+ "</body>\r\n"
				+ "</html>";
		   
		   resp.setCharacterEncoding("UTF-8");
		   
		   PrintWriter writer = resp.getWriter();
		   writer.print(temp);
		   writer.close();
		
	}
	
	
}
  • 실행 결과

실행 결과

 

728x90