본문 바로가기

개발/Java

[JAVA - WEB] 서블릿 기본

728x90
반응형
서블릿의 기본 기능 수행과정

 

서블릿의 기본 기능 수행과정은 다음과 같습니다.

 

1. 클라이언트로부터 요청을 받습니다.

2. 요청 처리, 데이터베이스 연동 등과 같은 비즈니스 로직을 처리합니다.

3. 처리된 결과를 클라이언트에 돌려줍니다.

 

 

서블릿 요청과 응답 수행 API

 

요청과 응답에 관련된 API 는 모두 javax.servlet.http 패키지에 있습니다.

 

요청 : javax.servlet.http.HttpServletRequest 클래스

 

반환값 메서드 기능
boolean authenticate(HttpServletResponse response) 현재 요청한 사용자가 ServletContext 객체에 대한 인증을 하기 위한 컨테니어 로그인 매커니즘을 사용합니다.
String changeSessionId() 현재 요청과 연관된 현재 세션의 id 를 변경하여 새 세션 id 를 반환합니다.
String getContextPath() 요청한 컨텍스트를 가리키는 URI 를 반환합니다.
Cookie[] getCookies() 클라이언트가 현재의 요청과 함께 보낸 쿠기 객체들에 대한 배열을 반환합니다.
String getHeader(String name) 특정 요청에 대한 헤더 정보를 문자열로 반환합니다.
Enumeration<String> getHeaderNames() 현재의 요청에 포함된 헤더의 name 속성을 enumeration 으로 반환합니다.
String getMethod() 현재 요청이 GET, POST 또는 PUT 방식 중 어떤 HTTP 요청인지를 반환합니다.
String getRequestURI() 요청한 URL 의 컨텍스트 이름과 파일 경로까지 반환합니다.
String getServletPath() 요청한 URL 에서 서블릿이나 JSP 이름을 반환합니다.
HttpSession getSession() 현재의 요청과 연관된 세션을 반환합니다. 만약 세션이 없으면 새로 만들어서 반환합니다.

 

 

- 응답 : javax.servlet.http.HttpServletResponse 클래스

 

반환값 메서드 기능
void addCookie(Cookie cookie) 응답에 쿠기를 추가합니다.
void addHeader(String name, String value) name 과 value 를 헤더에 추가합니다.
String encodeURL(String url) 클라이언트가 쿠기를 지원하지 않을 때 세션 id 를 포함한 특정 URL 을 인코딩합니다.
Collection<String> getHeaderNames() 현재 응답의 헤더에 포함된 name 을 반환합니다.
void sendRedirect(String location) 클라이언트에게 리다이렉트 응답을 보낸 후 특정 URL 로 다시 요청하게 합니다.
String getPathInfo() 클라이언트가 요청 시 보낸 URL 과 관련된 추가 경로 정보를 반환합니다.

 

 

 

<form> 태그로 서블릿 요청

 

사용자의 요청은 HTML 의 <form> 태그나 자바스크립트로부터 전송 받아서 처리합니다.

 

<form> 태그 관련 속성

속성 기능
name <form> 태그의 이름을 지정합니다.
여러 개의 form 이 존재할 경우 구분하는 역할을 합니다.
자바스크립에서 <form> 태그에 접근할 때 사용합니다.
method <form> 태그 안에서 데이터를 전송할 대 전송 방법을 지정합니다.
GET 또는 POST 로 지정합니다(default = GET)
action <form> 태그에서 데이터를 전송할 서블릿이나 JSP 를 지정합니다.
서블릿으로 전송할 때는 매핑 이름을 사용합니다.
encType <form> 태그에서 전송할 데이터의 encoding 타입을 지정합니다.
파일을 업로드 할때는 multipart/form-data 로 지정합니다.

 

 

<form> 태그로 전송된 데이터를 받아오는 메서드

메서드 기능
String getParameter(String name) name 의 값을 알고 있을때 그리고 name 에 대한 전송된 값을 받아오는데 사용합니다.
String[] getParameterValues(String name) 같은 name 에 대해 여러 개의 값을 얻을때 사용합니다.
Enumeration getParameterNames() name 값을 모를때 사용합니다.

 

 

HttpServlerRequest 요청 처리 실습

 

login.html 파일을 작성합니다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
	<form name="frmLogin" method="get" action="login" encType="UTF-8">
		아이디 :<input type="text" name="user_id"><br> 
		비밀번호:<input type="password" name="user_pw"><br> 
		<input type="submit" value="로그인"> <input type="reset" value="다시입력">
	</form>
</body>
</html>

로그인 창에서 아이디와 비밀번호를 입력 받아서 서블릿으로 전송합니다.

 

 

Loginservlet.java 파일을 작성합니다.

 

package Login;

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	public void init() throws ServletException {
		// TODO
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
	}

	public void destroy() {
		// TODO
	}
}

 

웹 브라우저로부터 전송된 아이디와 비밀번호를 콘솔창에 출력합니다.

아이디와 비밀번호는 각각 HTML 에서 작성된 input 태그의 name 으로 getParameter 를 요청하여 값을 받아옵니다.

 

작성한 HTML 과 서블릿을 저장하고 톰캣을 실행한 후 웹 브라우저에 다음과 같이 요청합니다.

http://localhost:8090/pro06/login.html

참고로 pro06 은 프로젝트 이름입니다.

 

웹 브라우저에 로그인 창에 나타나면 아이디와 비밀번호를 입력 후 로그인 버튼을 클릭합니다.

 

 

로그인 버튼을 클릭하면 웹 브라우저에는 아무것도 출력되지 않지만 이클립스 콘솔창에는 로그인 창에서 입력한 아이디와 비밀번호가 출력됩니다.

 

 

HTML 의 input type 을 checkbox 등으로 하여 여러 개의 값을 전송할 때는 getParameterValues() 로 값을 받아옵니다.

 

HTML 코드를 작성합니다.(input.html)

 

...
<form name="frmInput" method="get" action="input">
		아이디 :<input type="text" name="user_id"><br> 
		비밀번호:<input type="password" name="user_pw"><br> 
		<input type="checkbox" name="subject" value="JAVA" checked>자바 
		<input type="checkbox" name="subject" value="C언어">C언어 
		<input type="checkbox" name="subject" value="JSP">JSP 
		<input type="checkbox" name="subject" value="PYTHON">PYTHON 
		<br><br> 
		<input type="submit" value="전송"> <input type="reset" value="초기화">
</form>
...

 

서블릿 코드를 작성합니다.(InputServlet.java)

 

...
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
		String[] subject = request.getParameterValues("subject");
		for (String str : subject) {
			System.out.println("선택한 과목 : " + str);
		}
	}
...

 

웹 브라우저에 아래의 주소를 요청한 후 아이디, 비밀번호, 과목을 선택한 다음 전송 버튼을 클릭합니다.

 

 

이클립스 콘솔창에 입력한 값들이 모두 출력되는 것을 확인할 수 있습니다.

 

 

 

 

HttpServletResponse 응답 처리 실습

 

서블릿에서 응답처리 방법은 다음과 같습니다.

 

1. doGet() or doPost() 메서드 안에서 처리합니다.

2. javax.servlet.http.HttpServletResponse 객체를 이용합니다.

3. setContentType() 을 이용해 클라이언트에게 전송할 데이터 종류(MIME-TYPE) 를 지정합니다.

4. 클라이언트와 서블릿의 통신은 자바 I/O 의 스트림을 이용합니다.

 

톰캣 컨테이너에서 미리 설정해놓은 데이터 종류들을 MIME-TYPE 이라고 합니다.

톰캣 컨테이너에서는 자주 사용하는 데이터 종류를 MIME-TYPE 으로 지정해놓고 있으므로 서블릿에서 종류를 지정해서 사용하면 되고, 새로운 종류의 데이터를 지정하고 싶다면 CATALINA_HOME/conf/web.xml 에 추가하면 됩니다.

 

앞에서 작성한 login.html 은 그대로 사용하고 처리하는 Servlet 만 수정합니다.

 

...
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter(); // 출력 스트림 객체

		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");

		String data = "<html>";
		data += "<body>";
		data += "아이디 : " + id;
		data += "<br>";
		data += "비밀번호 : " + pw;
		data += "</html>";
		data += "</body>";
		out.print(data);
	}
...

 

앞에서 ... /login.html 로 요청을 한 후 아이디와 비밀번호를 입력한 후 로그인을 클릭합니다.

 

 

아이디와 비밀번호가 웹 브라우저에 표시되는 것을 확인하실 수 있습니다.

PrintWriter 객체를 이용하여 웹 브라우저에 표기할 내용을 작성할 수 있는 것이오니 참고 하시기 바랍니다.

 

 

여기까지 임미다.

728x90