본문 바로가기
WEB

[WEB] 01. Servlet

by ssunooo 2024. 8. 6.

 

 

JAVA 라는 언어속에 HTML 태그들을 끼워넣어서 동작시키려는 시도에

WEB 환경에서도 동작하는 .java 클래스 파일을 생성하게 되었는데 이것을 Servlet이라고 부른다.

 

Servlet 클래스 생성

 

Java Resources 폴더에서 우클릭 후 밑에서 3번 째 있는 Servlet을 클릭하면 새로운 Servlet 클래스를 생성가능 하다.

 

Web에서 모든 요청 방식은 GET 이거나 POST이다.

  • GET은 주로 검색에 활용되고 CRUD중 Read인 selectOne selectAll으로 활용된다.
    데이터 변화가 없을 때 주로 활용하고 모든 전송 정보를 URL에 오픈한다.
  • POST는 주로 CUD에 활용된다.
    데이터에 변화가 있을 때 주로 활용되고 전송 정보를 보호한다.

Servlet 의 단점

  1. 잦은 오류(오타) 유발
  2. 프론트 개발자들이 반드시 JAVA를 배워야 함


Servlet 클래스를 만들어 보았다.

 

<Servlet 클래스>

package test01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;

/*
 모든 Servlet 클래스 파일은 extends HttpServlet을 상속받는다.
 가볍지 않음 == not POJO
 */
public class Test01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /*
     모든 Servlet 은 기본 생성자로 생성됨
     */
    public Test01() { // 멤버변수가 없기 때문에 아무것도 없다.
        
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8"); // 페이지 관련 설정
		
		PrintWriter out=response.getWriter(); // 페이지 안에 들어갈 태그들을 설정
		out.println("<HTML>");
		out.println("<HEAD>");		
		out.println("<TITLE>실습 탭</TITLE>");		
		out.println("</HEAD>");
		out.println("<BODY>");
		out.println("<H1>Servlet 으로 작성한 웹 페이지</H1>");
		out.println("</BODY>");
		out.println("</HTML>");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 

 

배웠던 Servlet과 HTML을 활용해서 계산기를 만들어 보았다.

 

<HTML>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<form action="/day026/Calc01" method="GET"> <!-- 요청방식(method) default - get -->
		정수 01<input type="number" name="num1"> <br>
		연산자<select name="op">
			<option>+</option>
			<option>-</option>
			<option>x</option>			
		</select> <br> <!-- 선택목록을 주려면 -->
		정수 02<input type="number" name="num2"> <br>
		<input type="submit" value="계산하기">
	</form>
	
</body>
</html>

 

위와 같은 코드로 정수, 연산자, 정수 순으로 입력을 받은 뒤

요청방식을 GET으로 설정해서 계산하게 되면 Servlet에서 받은 뒤

또 하나의 페이지를 통해 결과값을 보여줄 수 있게 제작했다.

 

<Servlet>

package calc;


import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Servlet implementation class Calc01
 */
public class Calc01 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Calc01() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    // Servlet 안에 기능을 넣지않고 클래스를 따로 판다.
    
    
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("GET 요청");
		
		int num1,num2,res;
		String op;
		
		num1=Integer.parseInt(request.getParameter("num1")); // 자료형 문제로 불러올수 없다. parameter는 String이기 때문에
		num2=Integer.parseInt(request.getParameter("num2"));
		op=request.getParameter("op");
		
		Calc calc=new Calc(num1,num2,op);
		res=calc.getRes();
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		out.println("<HTML>");
		out.println("<HEAD>");		
		out.println("<TITLE>계산결과는?</TITLE>");		
		out.println("</HEAD>");
		out.println("<BODY>");
		out.println("<H1>계산결과 : "+res+"</H1>");
		out.println("</BODY>");
		out.println("</HTML>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

doGet()을 사용해 계산 결과값을 또다른 페이지에 출력 시켰다.

 

두번째로 POST를 사용해 ID와 PW를 입력 한 뒤 로그인 성공 실패를 보여주는

HTML과 Servlet을 작성해 보았다.

 

<HTML>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시작 페이지</title>
</head>
<body>
	
	<form action="/day026/Test02" method="POST"> <!-- 데이터 전송을 할 것이다. -->
		아이디 <input type="text" name="id" required> <br> <!-- 아이디(TEXT)랑 -->
		비밀번호 <input type="password" name="password" required> <br> <!-- 비밀번호(화면에 가려지게 PASSWORD) 입력받을 것이다. -->
		<input type="submit" value="로그인">
	</form>
	
</body>
</html>

 

id와 password를 required를 통해 무조건 입력 받아야 submit을 할 수 있게 설정하였다.

그 후 Servlet으로 넘겨주어 성공 실패 화면을 출력 할 수 있게 하였다.

 

<Servlet>

package test02;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Servlet implementation class Test02
 */
public class Test02 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Test02() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("POST 요청");
		
		// 변수 선언부
		String id,passWord,res; 
		
		// 요청입력받는부
		id=request.getParameter("id"); // parameter == html의 name에서 받아오는 역할
		passWord=request.getParameter("password"); // controller파트 view와 소통을 해야지 변수가 통일된다.
		
		// 기능 수행부
		if(id.equals("teemo") && passWord.equals("1234")) {
			System.out.println("로그인 성공");
			res="로그인 성공";
		}
		else {
			System.out.println("로그인 실패");
			res="로그인 실패";
		}
		
		// 응답 부 == 화면 출력
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		out.println("<HTML>");
		out.println("<HEAD>");		
		out.println("<TITLE>로그인~~~</TITLE>");		
		out.println("</HEAD>");
		out.println("<BODY>");
		out.println("<H1>"+res+"</H1>");
		out.println("</BODY>");
		out.println("</HTML>");
	}

}

 

 

 

Servlet 의 단점

  1. 잦은 오류(오타) 유발
  2. 프론트 개발자들이 반드시 JAVA를 배워야 함

 

 

2024.08.06