JSP 수업 #02 서블릿(Servlet)

sookyoung.k·2022년 12월 14일
0

JSP

목록 보기
2/8

🤯 서블릿 (Servlet)

서블릿이란? 자바 기반의 웹 프로그램 개발을 위해 만들어진 기술!

자바로 개발된 프로그램을 실행할 수 있는 서버 소프트웨어(톰캣)를 통해서 관리된다.

서블릿을 실행하기 위해서는 톰캣과 같은 서블릿 컨테이너가 필요!!!

클라이언트 웹 브라우저웹 서버에 요청(로그인)을 하면 웹 서버는 로그인 서블릿에 서블릿을 호출한다. 그럼 로그인 서블릿은 데이터베이스에서 유저 데이터를 얻은 후 HTML과 데이터를 결합한 결과를 웹 서버에 전달하고, 웹 서버는 클라이언트 웹 브라우저에 응답(HTML)한다.

서블릿은 로그인을 처리하기 위해서 입력한 아이디, 비밀번호를 데이터 베이스에 저장된 내용과 비교한 후, 게시판에 글을 올리기 위해서 데이터 베이스에 저장하는 과정을 수행한다.

서블릿의 문제점... 비효율적이다.

out.println("<h2>"+username+"</h2>");
HTML과 JAVA코드의 문자열을 결합으로 처리하는데... 코드 구성이 너무나... 비효율적이게 됨. 이러한 문제점을 해결하기 위해 등장한 것이 바로 JSP!

😬 JSP

JSP는 HTML을 중심으로 데이터를 처리한다.

HTML에서 JSP를 사용할 수 있다는 이야기다.

HTML에 자바 코드를 더한 형태로 구성!

컨테이너에 의해 서블릿 형태의 자바 코드로 변환한 후 컴파일 되어 컨테이너에 적재된다.

서블릿은 순수 자바 코드

하지만 HttpServlet 클래스를 상속해서 서블릿 등록에 필요한 정보를 추가해야 한다.

😌 서블릿 구조

public class HelloWorldServlet extends HttpServlet {
	public doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	...	
    }

	public doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	
    ...
    
}

HTTP 프로토콜에 최적화되어 있는 HttpServlet 클래스를 상속한 뒤에 구현한다!!

doGet(), doPost()는 상속받은 클래스에서 오버라이딩 된 메소드다.

doGet(): HTTP GET 요청을 처리하기 위한 메소드이다.

request, response를 매개변수로 받는 것을 확인할 수 있다.

doPost(): HTTP POST 요청을 처리하기 위한 메소드이다.

참고로 GET과 POST는 HTML에서 배운 개념인데! 당연히 까먹고 있었음!!

GET방식은 URL에 파라미터(데이터)를 포함시켜서 요청하는 방식이고,
POST방식은 body에 데이터를 넣어서 전송하는 방식이었다. (대용량 데이터 전송이 가능하고, 보안이 됨!)

request, response: 위의 메소드에서 파라미터로 사용된다. 서블릿 컨테이너가 클라이언트 요청과 응답을 처리할 수 있게 서블릿에 제공되는 객체이다!

HttpServletRequest

request 정보를 서블릿에 전달하기 위한 목적으로 사용된다.
이 클래스에는 헤더 정보, 파라미터, URI, URL 등의 정보를 읽어내는 메소드, HTTP Body 부분을 읽어 들이는 메소드가 있다.

자주 사용되는 메소드는

  • getParameter(name): 문자열 name과 같은 이름을 가진 매개변수 값을 가져옴
  • getParameterNames(): 현재 요청에 포함된 매개변수를 열거 형태로 넘겨줌
  • getParmeterValues(name): 위와 같은데 배열 형태로 가져옴

정도가 있다.

HttpServletResponse

요청 클라이언트에 응답하기 위한 목적으로 사용된다.

  • sendRedirect(String location): 클라이언트 리다이렉트 응답을 보낸 후 특정 URL로 다시 요청하게 함
  • getWriter(): 클라이언트로 데이터를 보내기 위한 출력 스트림을 리턴함

https://woojong92.tistory.com/entry/Servlet%EA%B5%AC%EC%A1%B0%EC%99%80-HttpServlet-%ED%81%B4%EB%9E%98%EC%8A%A4

위 블로그에 가보면 HttpServletRequest, HttpServletResponse 클래스의 주요 메소드들을 확인할 수 있다.

서블릿 구조

//애너테이션 방식 
@WebServlet(description="Hello World Servlet", urlPatterns="/hello")
// urlPatterns: 클라이언트 요청 경로 
public class HelloWorldServlet extends HttpServlet {
	...
}

서블릿의 생명 주기

init(): 서블릿 초기화! 서블릿의 일생동안 단 한 번 호출된다. 서블릿 객체를 생성함으로 init() 메소드를 사용해서 객체를 초기화한다.

service(): HTTP 메소드를 참조해서 doGet()/doPost()를 호출할지 결정하고, 요청이 있을 때마다 호출된다. 여기에서 request, response 객체를 처리한다.

destroy(): 서블릿이 소멸될 때 호출된다. 마찬가지로 일생동안 단 한 번 호출된다.

서블릿 실행

/**
 * Servlet implementation class HelloWorld
 */
@WebServlet(description = "My first servlet", urlPatterns = { "/hello" })
public class HelloWorld extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloWorld() {
        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 {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

서블릿으로 로그인 기능 만들기

  1. 먼저 src > webapp 에 폴더를 만들어주고 (ch05) loginForm.html을 만들어준다.

  2. 여기에서 html 폼을... 만들면 됩니다... 나 html 너무 까먹어서... 당황했자너... 사실 배울 때도 못했음 😏 그래서 전부 구글링 해서 찾아보고 겨우 만들었다. 사실 방금 혼자 다시 해보려고 했는데 존나 까먹어서 걍 코드 복붙했다. 망함. 난 망했어.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="/jwbook/login">
		<label>ID</label>
		<input type="text" name="id" size="10" placeholder="아이디"> 
		
		<lable>PW</lable>
		<input type="password" name="pw" size="10" placeholder="패스워드">
		
		<br>
		<input type="submit" value="로그인">
	</form>
</body>
</html>

input 태그의 name 속성: input 요소의 이름을 명시한다. 이후 서버에서 폼 데이터를 참조할 때 사용된다! 서블릿에서 어떻게 사용되는지 보세요!

input 태그의 value 속성: input 요소의 초기값을 명시한다.

form 태그의 method 속성: 폼 데이터가 서버로 제출될 때 사용되는 HTTP 메소드를 명시한다. GET과 POST 두 가지 방식이 있는데 현재 POST 방식을 선택한 것!

form 태그의 action 속성: 폼 데이터를 서버로 보낼 때 해당 데이터가 도착할 URL을 명시한 것이다. 우리는 jwbook>login으로 가주라고 명시한 것임.

다들... 처음보는 것 같았는데... 놀랍게도 다 배웠던 것들이었다...

여기에서 아이디와 비밀번호를 입력받는다.

  1. 그리고 LoginServlet.java에서 처리한다! Java Resources > src/main/java에 패키지(ch05)를 만들어준 후 LoginServlet.java를 만들어준다. (서블렛은 순수 자바코드임을 기억하자.)
/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		int pw = Integer.parseInt(request.getParameter("pw")); 
		
		String lg = null;
		
		if (id.equals("person") && pw == 1234) {
			lg = "peson 님 반갑습니다.";
		} else {
			lg = "로그인 실패.";
		}
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.append("<!doctype html><html><head><title>Hello World Servlet</title></head><body>")
		.append("<h1>로그인 서블릿</h1><hr>"+ lg +"</body></html>");
	}
	}

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

}

doPost방식을 사용했지만 다시 doGet()메소드를 호출한다!

doGet()메소드에 가면 request, response를 파라미터로 받고, 안에 자바 코드를 작성한 것을 확인할 수 있다.

String id, int pw를 선언한 후 request 객체에서 getParmeter()메소드를 호출하여 값을 받아온다. (id, pw)
getParmeter(): HTTP요청의 파라미터 값을 얻기 위해 사용한다. 클라이언트가 입력한 ID가 무엇이었는지, PW가 무엇이었는지 알아낼 수 있게 해준다!

if문을 통해 아이디 person 비밀번호 1234를 입력했을 때의 결과, 그렇지 않았을 때의 결과를 입력해준다.

그리고 응답을 전달해야 함! response.getWriter() 메소드를 통해 인스턴스를 얻는다. PrintWriter 클래스는 는 바이트를 문자 형태를 가진 객체로 바꿔주는 역할을 한다.

.append를 통해서... 코드를 붙여줌. 아무래도 남들이 잘 알아들을 수 있게 요약하는 재주는 없는 것 같다. getWriter()메소드를 통해서 텍스트를 기록할 수 있다는 것을 기억하면 될 것 같다. (ServletResponse 인터페이스가 가지고 있는 메소드)

하... 어렵다... 진짜 망했다... 힘내보자... 파이팅...

profile
영차영차 😎

0개의 댓글