JSP

JSP 서블릿

요리하다그만둠 2022. 7. 20. 12:19
package example;
/*
 * 일반적인 서블릿 개발 과정
 * 1. 서블릿 규약에 따라 자바 코드를 작성합니다.
 * 2. 자바 코드를 컴파일해서 클래스 파일을 생성합니다.
 * 3./WEB-INF/classes 폴더에 클래스 파일을 패키지에 알맞게 위치시킵니다.
 * 4.web.xml파일에 서블릿 클래스를 설정합니다.
 * 5.톰캣 등의 컨테이너를 실행합니다.
 * 6.웹 브라우저에서 확인합니다.
 * */
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 서블릿 구현
public class NowServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException{
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		out.print("<html>");
		out.print("<head><title>현재시간</title></head>");
		out.print("<body>");
		out.print("<현재 시간은>");
		out.print(new Date());
		out.print("입니다.");
		out.print("</body></html>");
		/*
		 * 서블릿을 구현할려면 먼저 HttpServlet 클래스를 상속받아야 서블릿으로 동작합니다.
		 * HttpServlet 클래스를 상속받아야 서블릿으로 동작합니다.
		 * 
		 * HttpServlet 클래스를 상속받았다면, 처리하고자 하는 HTTP 방식(method) 에 따라 알맞은 메서드를 재정의해서
		 * 구현해야 합니다.
		 * 
		 * PrintWriter는 println() 메서드르 제공하는데, 이 메서드를 이용해서 전송할 응답 데이터를 전달합니다.
		 * println() 메서드에 절달한 데이터는 웹 브라우저에 전송되어 화면에 출력됩니다.
		 * 
		 * 
		 *
		 * */
		
	}
}

예를 들어 서블릿이 GET 방식의 요청을 처리해야 한다면 , 

protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException{

여기 처럼 doGet() 메서드를 재정의 하면됩니다. doGet() 메서드는 HttpServletRequest와 HttpServletResponse의 두 파라미터를 갖는데, 이 두 파라미터는 각각 JSP의 request 기본 객체와 response 기본 객체에 해당합니다.

 

재정의한 메서드는 request를 이용해서 웹 브라우저의 요청 정보를 읽어오던가 response를 이용해서 응답을 전송할 수 있습니다. 응답을 전송하려면 먼저 아래 코드와 같이 response.setContentType() 메서드를 이용해서 응답의 컨텐츠 타입을 지정해야 합니다.

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

 

위의 예제의 경우 응답 컨텐츠 타입이 text/html 이고 캐릭터 셋이 utf-8이라고 지정하고 있습니다. 여기서 setContentType() 메서드에 전달되는 값은 JSP 에서 page 디렉티브의 contentType 속성값과 동일합니다.

 

응답의 컨텐츠 타입을 지정했다면, 그 다음으로 할 작업은 실제로 응답 결과를 웹 브라우저에 전송하는 것입니다.

웹 브라우저에 데이터를 전송하려면 

PrintWriter out = response.getWriter();

위에 코드와 같이 response.getWriter() 로 문자열 데이터를 출력할 수 있는 PrintWriter를 구해야합니다.

PrintWriter은 어디에 있는것이냐 할수있는데 PrintWriter는 println() 메서드를 제공하는데, 이 메서드를 이용해서 전송할 응답 데이터를 전달합니다.

out.print("<html>");
		out.print("<head><title>현재시간</title></head>");
		out.print("<body>");
		out.print("<현재 시간은>");
		out.print(new Date());
		out.print("입니다.");
		out.print("</body></html>");

 

web.xml로 매핑하기

서블릿 클래스를 생성했다면, 그다음으로 할 작업은 WEB-INF 폴더의 web.xml 파일에 서블릿 클래스를 등록하는 것입니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
	http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">

	<servlet> <!-- 서블릿으로 사용할 클래스  -->
		<servlet-name>now</servlet-name>
		<servlet-class>example.NowServlet</servlet-class>
	</servlet>

	<servlet-mapping> <!-- 서블릿과 URL 간의 매핑 -->
		<servlet-name>now</servlet-name>
		<url-pattern>/now</url-pattern>
	</servlet-mapping>

</web-app>

사용할 서블릿을 지정했다면 그 다음으로 할 작업은 해당 서블릿이 어떤 URL을 처리할지에 대한 매핑 정보를 등록하는 것입니다.

<servlet-mapping> 태그를 이용해서 지정합니다.

<servlet-mapping> 태그에서 <servlet-name>은 매핑할 서블릿의 이름을 지정하며, <url-pattern>은 매핑할 URL의 패턴을 지정합니다. 

<servlet-mapping> <!-- 서블릿과 URL 간의 매핑 -->
		<servlet-name>now</servlet-name>
		<url-pattern>/now</url-pattern>
	</servlet-mapping>

보면 now라는 이름의 서블릿이 /now 라는 URL 패턴을 처리한다고 지정하고 있습니다. 앞의 코드

	<servlet> <!-- 서블릿으로 사용할 클래스  -->
		<servlet-name>now</servlet-name>
		<servlet-class>example.NowServlet</servlet-class>
	</servlet>

NowServlet 클래스를 now라는 이름의 서블릿으로 등록했으므로. 결과적으로 /now 라는 URL을 NowServlet이 처리하게 됩니다.

예제 파일NowServlet 실행결과.

<url-pattern>은 다음과 같이 한 번 이상을 사용할 수 있습니다. 이 경우 각각의 URL 패턴에 해당 서블릿을 매핑 합니다.

	<servlet-mapping>
		<servlet-name>now</servlet-name>
		<url-pattern>/now</url-pattern>
		<url-pattern>/now2</url-pattern>
	</servlet-mapping>

서블릿 매핑할 때 사용하는 <url-patten>은 웹 어플리케이션 경로를 제외한 나머지 경로를 기준으로 적용됩니다.