카테고리 없음

[Servlet / JSP] 서블릿 기초

seandoesdev 2023. 8. 18. 08:09

서블릿 기본 기능 수행 과정

  • 클라이언트로부터 요청을 받는다.
  • 데이터베이스 연동과 같은 비즈니스 로직을 처리한다.
  • 처리된 결과를 클라이언트에 돌려준다.

서블릿 응답과 요청 수행 API 기능

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

  • 요청 관련 API : javax.serlet.http.HttpServletRequest class
  • 응답 관련 API : javax.servlet.http.HttpServletResponse class

클라이언트가 서블릿에 요청하면 먼저 톰캣 컨테이너가 받은 다음, 사용자의 요청이나 응답에 대한 HttpServletRequest 객체와 HttpServletResponse 객체를 만들고 서블릿의 doGet()이나 doPost() 메서드를 호출하면서 이 객체들을 전달한다.

톰캣이 사용자의 요청에 대한 정보를 모든 HttpServletRequest 객체의 속성으로 담아 메서드로 전달하므로 각 HttpServletRequest에서 제공하는 메서드들은 매개변수로 넘어온 객체들을 이용하여 사용자가 전송한 데이터를 받아 오거나 응답할 수 있는 것이다.

HttpServletRequest의 메서드

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

HttpServletResponse의 메서드

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

 

<form> 태그 속성

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

 

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

HttpServletRequest 클래스에서 <form> 태그로 전송된 데이터를 가져오는 메서드를 살펴보자.

<form> 태그에 전송된 데이터 가져오는 메서드

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

예제

<!DOCTYPE html>
<html>
<head>
	<meta charest="UTF-8">
	<title>로그인 창</title>
</head>
<body>
<!-- 단일 입력 -->
	<form>
		아이디 :<input type="text" name="user_id"><br>
		비밀번호 :<input type="password" name="user_pw"><br>
		<input type="submit" value="로그인"> <input type="reset" values="다시입력">
	</form>

<!-- 다중 입력 -->
	<form>
		아이디 :<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="submit" value="전송"> 
		<input type="reset" values="초기화">
	</form>
</body>
</html>
// LoginServlet.java
...

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

// 단일 입력
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncdoing("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);
}

// 다중 입력
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncdoing("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);
}

// 다중 입력
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncdoing("utf-8");
		Enumeration enu = request.getParameterNames();
		while (enu.hasMoreElements()) {
			String name = (String) enu.enxtElement();
			String[] values = request.getParameterValues(name);
			
			for(String value : values)
				System.out.println("name=" + name + ", value=" + value);
		}
}