[Servlet] 서블릿이란 & 기본 예제

sireal·2024년 3월 8일

servlet

목록 보기
1/2

서블릿 (Servlet)

--> 클라이언트와 소통하기 위함

특징

  • 자바로 만든 Application (서버에서만 실행)
  • 클라이언트와 소통
  • JavaEE 스펙이 필요, 별도의 라이브러리가 필요 : servlet-api.jar
  • javax.servlet.http.HttpServlet 을 상속받아 작성

서블릿을 구성하는 3대 클래스

  • HttpServlet > GenericServlet
  • HttpServletRequest > ServletRequest
  • HttpServletResponse > ServletResponse

요청 방식

  • GET
    • 기본 전송 방식
    • 전송방법이 다양
    • 소량의 데이터를 전송
    • 전송되는 데이터가 노출 ( 그대로 주소에 노출 )
    • 하이퍼링크 전송방식
    • 조회 목적
  • POST
    • 전송 방법이 단 한가지
    • 대량의 데이터를 전송
    • 전송되는 데이터가 노출되지 않는다
    • 폼 전송방식
    • 주로 데이터를 변경하기 위한 목적

서블릿에서 제공하는 클래스 찾아보기

https://tomcat.apache.org/
-->
Documentation 에서 설치한 버전 Tomcat 9.0 선택
-->
Reference에서 Servlet 4.0 Specification and Javadoc 이 있는데 Javadoc 클릭 ~
-->
서블릿에서 제공하는 클래스들이므로 링크 저장해두고 보기

https://javaee.github.io/javaee-spec/javadocs/javax/servlet/package-summary.html

ex) 만약 HttpServlet 관련해서 찾아보려면
CLASS --> FRAMES --> packages 에서 javax.servlet.http 클릭
--> Classes의 HttpServlet 클릭


이클립스에 톰캣 설정하기

  1. File --> New --> Other --> Server 선택 후 Next

  2. 톰캣 서버를 선택후 Next

  3. Available 에 있는 프로젝트를 Configured 로 Add 시키고 Finish


이클립스에서 Servlet 사용하기

  1. File --> New --> Dynamic web project

  2. 프로젝트 이름과 버전 설정후 Next 를 하다보면 Generate web.xml deployment descriptor 에 체크하는 부분이 있는데 이를 체크하고 Finish

  3. File --> Dynamic web project --> 프로젝트 이름과 버전 설정 --> Finish

  4. 좌측에서 Servers 폴더를 누르면 Tomcat 폴더가 있는데 그 안의 파일중 web.xml 을 복사해서 ServletTest/src/main/webapp/WEB-INF/lib 위치에 붙여넣어주기

***
- src\main\java 에 java 파일이 저장
- webapp 안에는 나머지 모든 파일이 저장 - 이클립스에서 servlet 관련 태그 실행시 ctrl+space 로 하기


***
프로젝트 생성후 Build Path 설정해주기
--> 일단, 사전에 `webapp/WEB-INF/lib` 위치에 `tomcat9/lib/servlet-api.jar` 을 복사해서 가져다둬야함 !
--> 프로젝트위에서 마우스 오른쪽 클릭 후 Build Path
--> Libraries 에서 우측에 Add JARs
--> lib에 미리 가져다둔 servlet-api-jar 추가 후 적용

예제 1 : 이름과 주소를 입력해보고 전송하기

WEB-INF 폴더에 html 파일 만들기

<test1.html>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form action="/ServletTest/test1" method="GET">
		이름 : <input type="text" name="name"/><br/><br/>
		주소 : <input type="text" name="addr"/><br/><br/>
		<input type="submit" value="전송"/>
	</form>
	
	<br/><br/>
	
	<form action="/ServletTest/test1" method="POST">
		이름 : <input type="text" name="name"/><br/><br/>
		주소 : <input type="text" name="addr"/><br/><br/>
		<input type="submit" value="전송"/>
	</form>
	
</body>
</html>

ServletTest 에 class 생성하기
--> class 생성하면 자동적으로 소스파일이 ServletTest/src/main/java 위치로 생성됨 !

<Test1Servlet.java>

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;

public class Test1Servlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		PrintWriter out = null;
		
		try{
        	// 인코딩 설정
			req.setCharacterEncoding("euc-kr");
			resp.setCharacterEncoding("euc-kr");
			
            // 클라이언트에서 전달받은 데이터 가져오기
			String name = req.getParameter("name");
			String addr = req.getParameter("addr");
			
            // 응답을 위한 PrintWriter 객체 생성
			out = resp.getWriter();
			out.println("<html><body>");
			out.println("<h1>Request Test</h1>");
			
            // 페이지에 출력할 내용 작성
			if(req.getMethod().equals("POST")){
				out.println("이것은 Post방식으로 처리된 내용입니다.<br>");
			}
			
			out.println("당신이 보낸 데이터는 다음과 같습니다");
			out.println("이름은 " + name + "이고 주소는 " + addr + "이다. ");
			out.println("</body></html>");
		}
		catch(Exception e) {}
		finally{
			out.close();
			}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
	}
	
}

web.xml 에서 서블릿 매핑하기

<?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>ServletTest</display-name>
  <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>
  
  <servlet>
  <!-- TestServlet1 test1 = new Test1Servlet() -->
  	<servlet-name>test1</servlet-name>
  	<servlet-class>Test1Servlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test1</servlet-name>
  	<url-pattern>/test1</url-pattern>
  </servlet-mapping>
  
</web-app>

-->




예제 2 : 성적 처리 프로그램

WEB-INF 폴더에 html 파일 만들기

<test2.html>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1> 성적 처리 프로그램 </h1>
	<form action="/ServletTest/sungjuk">
		
      	<!-- 각각의 성적 입력 필드 + 필드이름 + 빈값이 입력되면 알림이 뜨도록 하는 required -->
		국어 : <input type="text" name="kor" required="required"/><br/><br/>
		영어 : <input type="text" name="eng" required="required"/><br/><br/>
		수학 : <input type="text" name="mat" required="required"/><br/><br/>
      
      	<!-- 체크된 상태로 초기화 시키는 checked -->
		<input type="radio" name="calc" value="tot" checked="checked"> 총점 &nbsp;&nbsp;&nbsp;&nbsp;
		<input type="radio" name="calc" value="avg"> 평균 <br><br>
		<input type="submit" name="전송"/>
		
	</form>
</body>
</html>

ServletTest 에 class 생성하기

<SungjukServlet.java>

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;

public class SungjukServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		int kor = Integer.parseInt(req.getParameter("kor"));
		int eng = Integer.parseInt(req.getParameter("eng"));
		int mat = Integer.parseInt(req.getParameter("mat"));
		String calc = req.getParameter("calc");
		
		int result = 0;
		if(calc.equals("tot"))
			result = (kor+eng+mat);
		else
			result = (kor+eng+mat) / 3;
		
		PrintWriter out = resp.getWriter();
		out.println("<html><body>");
		out.println("결과 : " + result);
		out.println("</body></html>");
		
		out.close();
	}

}

web.xml 에서 서블릿 매핑하기

<?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>ServletTest</display-name>
  <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>
  
  <!-- SungjukServlet test2 = new SungjukServlet() -->
  <servlet>
  	<servlet-name>test2</servlet-name>
  	<servlet-class>SungjukServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test2</servlet-name>
  	<url-pattern>/sungjuk</url-pattern>
  </servlet-mapping>

</web-app>

0개의 댓글