본문 바로가기
교육, 학습/멀티캠퍼스_풀 스택

Servlet - form태그로 로그인하고 서블릿으로 받기 :: HttpServletRequest, HttpServletResponse

by 개발하는 경제학도 2022. 3. 10.

강의 소개

현재 수강하고 있는 멀티캠퍼스 k-digital 지능형 웹서비스 풀 스택 과정을 수강하며 적은 내용입니다.

교재로는 자바 웹을 다루는 기술을 사용하고 있습니다.


서블릿의 3가지 기본 기능

서블릿은 3가지 기본 기능이 있는데 요약하자면 아래 표와 같은 방식으로 요청을 받고, 응답해준다.

1. 클라이언트의 요청 받기 - request.getParameter("name속성값"); // 리턴타입 String
- request.getParameterValues("name속성값"); // 리턴타입 String[]
2. 처리(자바 로직)  
3. 클라이언트에게 응답 response.setContentType("text/html;charset=utf-8");
Printer out = response.getWriter();
out.println("<h1></h1>"); // 브라우저 출력
System.out.println(""); // 서버가 실행되고 있는 이클립스 콘솔창에 출력

더욱 자세한 내용은 아래에서 추가로 설명한다.


 

서블릿에서 클라이언트의 요청 얻기

HttpServletRequest 클래스의 getParameter메서드

form 태그로 전송된 데이터를 서블릿으로 받아오기 위한  HttpServletRequest 클래스의 메서드들은 아래와 같다. doGet혹은 doPost메서드의 1번째 매개변수로 사용되는 HttpServletRequest를 이용한다.

 

String getParameter(String name) name의 값을 알고 있을 때 name에 전송된 값을 받아오기 위해 사용
String[] getParameter(String name) 같은 name에 대해 여러 개의 값을 얻을 때 사용
Enumeration getParameterNames() names값을 모를 때 사용

 

3가지 메서드 중 일반적으로 getParameter메서드가 가장 많이 사용된다. 리턴 타입은 String이다.

String id = request.getParameter("id");

getParameter메서드는 input 태그의 name속성 값을 매개변수로 사용한다. (서버 쪽에서는 name속성을 사용하여 읽어온다.)

 

getParameterValues메서드는 1개 name으로 여러 값을 가져오고 싶을 때 사용하며 리턴타입은 String배열이다. 보통 input타입의 checkbox나 select태그의 option등의 값을 가져올 때 사용한다.

 

서블릿에서 응답하기

서블릿이 처리한 결과를 클라이언트에게 응답하는 순서는 아래와 같다. 응답 시에는 doGet혹은 doPost메서드의 2번째 매개변수로 사용되는 HttpServletResponse를 이용한다.

1. HttpServletResponse의 setContentType메서드를 이용해 클라이언트에게 전송할 데이터 타입(MINE-TYPE)을 지정한다.

response.setContentType("text/html;charset=utf-8");

보낼 내용이 html 문서이고, 보낼 데이터를 utf-8으로 인코딩할 것임을 알려주는 것이다.

웹 브라우저는 보통 html만 인식하므로 대부분 MINE-TYPE은 위와 같이 설정한다.

2. 데이터를 출력할 PrintWriter객체를 생성한다.

PrintWriter out = response.getWriter();

HttpServletResponse객체의 getWriter메서드를 이용해 출력 스트림 PrintWriter객체를 받아온다.

 

3. 출력할 데이터를 html형식으로 만들고, PrintWriter의 print메서드 혹은 println메서드로 출력한다.

out.println("<h3>정상적으로 로그인되셨습니다.<h3>");

 


 

form태그를 통해 로그인하고 서블릿으로 받아오기

아래에는 위에서 설명한 내용들을 바탕으로 로그인값을 서블릿으로 받아오는 예제이다.

html의 form태그로 사용자의 로그인 값을 입력받은 후 서블릿으로 로그인 값을 가져와 응답결과를 다시 클라이언트에게 전달한다.

[html]

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<title>Insert title here</title>
</head>
<body>

<!-- 경로 똑같으면 http://localhost:8080/servlettest/ 같은 절대경로 생략 가능  -->
<form action="login" method = "get">
아이디 입력<input type = text name = "id"><br>
암호 입력<input type = password name = "pw"><br>
<input type = submit value = "로그인">
</form>

</body>
</html>

form태그의 method속성에서 get 또는 post방식 중 하나를 선택할 수 있다. 만약 아무것도 지정하지 않으면 전송방식은 get이 된다.

또한, input 태그의 name 속성은 자바스크립트에서 form태그에 접근할 때 자주 사용된다.

 

사용자가 아이디와 패스워드를 입력한 후 submit을 누르면 form태그의 action속성에 지정된 login 서블릿으로 이동한다.

 

[서블릿]

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 요청자로부터 사용자가 입력한 id, pw추출
		String id = request.getParameter("id"); 
		String pw = request.getParameter("pw"); 
		
		// 처리
		// 결과 응답 내용
		response.setContentType("text/html;charset=utf-8"); 
		PrintWriter out = response.getWriter(); // 서버 출력 = 클라이언트로 전송. 
		out.println("<h3 style ='color:green'> 입력하신 아이디는" + id + "이고 암호는 " 
		+ pw + "입니다. <h3>");
		out.println("<h3>정상적으로 로그인되셨습니다.<h3>");
		
		response.getWriter().append("<p>append입니다</p>"); // append함수: println메서드와 같은 역할
		
	}

}

댓글