개발기록/Java

Servlet(서블릿) + 예제

100'S 2022. 1. 12. 23:58

Servlet이란?

Server + Applet의 합성어

JAVA언어를 이용하여 사용자의 요청을 받아 처리하고 그 결과를 다시 사용자에게 전송하는 역할의 Class파일.

즉, 웹에서 동적인 페이지를 java로 구현한 서버 측 프로그램이다.

 

# 관련 패키지 및 클래스는 tomcat에서 제공하는 API문서에서 확인 가능
https://tomcat.apache.org/tomcat-8.5-doc/servletapi/

 

 


 

 

서블릿 설계 규약

 

- 모든 서블릿은 javax.servlet.Servlet 인터페이스를 상속 받아 구현한다.


- 서블릿 구현 시 Servlet 인터페이스와 ServletConfig 인터페이스를 javax.servlet.GenericServlet에 구현한다.


- HTTP프로토콜을 사용하는 서블릿은 javax.servlet.http.HttpServlet 클래스는 javax.servlet.GenericServlet을 

  상속한 클래스로 서블릿은 HttpServlet클래스를 상속 받는다.


- 서블릿 Exception처리를 하기 위해서는 javax.servlet.ServletException을 상속 받아야 한다.

 

 


 

서블릿 동작 구조

서블릿 컨테이너란?
웹 서버 또는 응용 프로그램 서버의 일부.

웹 서버에서 온 요청을 받아 서블릿 class를 관리하는 역할(생명주기)

컨테이너의 서블릿에 대한 설정은 Deployment Descriptor(web.xml)파일 이용

 

 


 

배포 서술자 (DD, Deployment Descriptor)

애플리케이션에 대한 전체 설정 정보를 가지고 있는 파일.

이 정보를 가지고 웹 컨테이너가 서블릿 구동, xml파일로 요소(태그)로 이루어져 있다.
애플리케이션 폴더의 WEB-INF 폴더에 web.xml파일이 배포 서술자다.

 

# 설정 정보

- Servlet 정의, Servlet 초기화 파라미터
- Session 설정 파라미터
- Servlet/JSP 매핑, MIME type 매핑
- 보안 설정
- Welcome file list 설정
- 에러 페이지 리스트, 리소스, 환경 변수

 

# xml 세부 작성 내용

<web-app>  :  루트 속성, 문법 식별자 및 버전 정보를 속성 값으로 설정


<context-param>  :  웹 애플리케이션에서 공유하기 위한 파라미터 설정


<mime-mapping> : 특정 파일 다운로드 시 파일이 깨지는 현상 방지

 

<servlet> ~ <servlet-class>/<servlet-mapping> : 서블릿 매핑

 

<servlet> ~ <servlet-class> : 컨테이너에 서블릿 설정

 

<welcome-file-list> : 시작 페이지 설정

 

<filter> : 필터 정보 등록

 

<error-page> : 에러 발생 시 안내 페이지 설정

 

<session-config> : session 기간 설정

 

<listener> : 이벤트 처리 설정

 

 


 

서블릿 맵핑

클라이언트가 servlet에 접근할 때 원본 클래스 명이 아닌 다른 명칭으로 접근 시 사용한다.
설정 방법은 web.xml@annotation을 이용하는 방법이 있다.

 

- web.xml 

<servlet>
<servlet-name>mapping 명칭</servlet-name>
<servlet-class>실제 클래스 명칭</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mapping 명칭</servlet-name>
<url-pattern>사용자 접근 명칭</url-pattern>
</servlet-mapping>

 

- @annotaion 

@web-Servlet(“/매핑명칭”)
public class 서블릿명칭 extends HttpServlet{
// servlet code
}

 

 


 

WAS 서버 설정 변경

- server.xml은 WAS 서버에 대한 설정을 변경할 수 있는 파일이다.

 

- 설정 정보

Context path설정(서버 내 애플리케이션 설정), 애플리케이션 포트 설정, default 접속 경로 설정(localhost 설정),

특정 이벤트 설정 등

 

 

 


Context Path

 

애플리케이션에 접근하는 경로 (컨테이너에서 애플리케이션 구분)

즉, 애플리케이션의 root경로

http://localhost:[port번호]/[프로젝트 별칭]/[servlet 명]
ex. http://localhost:9080/first/test1.do

<Context docBase="test" path="/" reloadable="false" reloadable="true"
source="org.eclipse.jst.jee.server:test"/>

* 프로젝트의 별칭은 톰캣 서버 설정의 server.xml 내  설정을 따름

 

 


 

Servlet Life-Cycle

 

1. 첫 번째 요청일 경우, 객체를 생성하며 init()메소드를 호출한다.


2. 이 후 작업이 실행될 때마다 service()메소드가 요청한 HTTP Type에 따른 doGet(), doPost() 호출한다.


3. 최종적으로 서블릿이 서비스 되지 않았을 때 destroy() 호출한다.


* destroy()는 보통 서버가 종료되었을 때, 서블릿의 내용이 변경되어 재 컴파일 될 때 호출

 

 

 

 


 

Servlet 구동

 

 

 

 


 

사용자 데이터 전송 방식

 

# get 방식

URL창에 “?” 뒤에 데이터를 입력하는 방법(쿼리스트링).
데이터가 여러 개일 경우 &로 묶어서 보낸다.
데이터 검색에 많이 사용하고 데이터 크기에 한계가 있으며 보안 취약하다.

 

 

# post 방식

BODY에 내용을 보내는 방식으로 데이터 크기에 제한이 없고, get방식에 비해 보안이 뛰어나다.

(숄더 서핑(Shoulder Surfing) 방지)

 

* Servlet이 두 방식 중 하나로 전달 받으면 해당하는 메소드 호출
html의 <form>에서method속성을 이용해 방식 결정(default : get)

 


 

Servlet Method

 

- doGet( ) : client에서 데이터 전송 방식을 get방식으로 전송하면 호출되는 메소드

 

- doPost( ) : client에서 데이터 전송 방식을 post방식으로 전송하면 호출되는 메소드

* 반드시 ServletException 처리 해야 함

 

 

 

 

HttpServletRequest

HTTP Serlvet을 위한 요청 정보(request information) 제공
* 인터페이스나 인터페이스 구현은 컨테이너가 알아서 설정하므로 메소드만 이용
상속 : javax.servlet.ServletRequest

 

 

[ 매개변수 객체 ]

 

◆ getParameter(String)
client가 보내준 값이 저장된 명칭이 매개변수와 같은명칭에 저장된 값을 불러오는 메소드

 

 getParameterNames()

client가 보내준 값을 저장한 명칭을 불러오는 메소드

 

 getParameterValues(String)
client가 보내준 값이 여러 개일 경우 그 값을 배열로 불러오는 메소드

 

 getParameterMap()
client가 보내준 값이 전체를 Map방식으로 불러오는 메소드

 

 setAttribute(String, object)
request객체에 전달하고 싶은 값을 String 이름으로 Object저장하는 메소드

 

 getAttribute(String) 

매개변수와 동일한 객체 속성값 불러오는 메소드

 

 removeAttribute(String)
request객체에 저장되어 매개변수와 동일한 속성값 삭제하는 메소드

 

 setCharacterEncoding(String)
전송 받은 request객체의 값들의 CharaterSet을 설정 해주는 메소드

 

 getRequestDispatcher(String)
컨테이너 내에서 request, response객체를 전송하여 처리할 컨포넌트(jsp파일 등)를 불러오는 메소드
forward()메소드와 같이 사용

 

 

 

HttpServletResponse

요청에 대한 처리 결과를 작성하기 위해 사용하는 객체
* 인터페이스나 인터페이스 구현은 컨테이너가 알아서 설정하므로 메소드만 이용
상속 : javax.servlet.ServletResponse

 

 

[ 매개변수 객체 ]

 setContentType(String)
응답으로 작성하는 페이지의 MIME type을 정하는 메소드


 setCharacterEncoding(String)
응답하는 데이터의 CharacterSet을 지정해주는 메소드


 getWriter()
문자를 페이지에 전송을 위한 Stream을 가져오는 메소드


 getOutputStream()
byte단위로 페이지에 전송을 위한 Stream을 가져오는 메소드


 sendRedirect(String)
client가 매개변수의 페이지를 다시 서버에 요청하게 하는 메소드

 

 

+ 예제

 

public class DispatcherSerlvet extends HttpServlet {
	// 스프링에서 혼자만 서블릿의 역할을 수행하는 객체
	// 어떠한 요청이 전달되더라도 반드시 이 서블릿을 거치며, 
	// 어떠한 응답이 전달되더라도 반드시 이 서블릿을 거치는 
	// 화면과의 문지기 역할을 감당한다.
	// 제일 앞에 놓여있어서 Front Controller 라고도 한다.
	
	private HandlerMapping handlerMapping;
	private ViewResolver viewResolver;
	
	public DispatcherSerlvet() {
		super();
		// TODO Auto-generated constructor stub
	}

	// 
	@Override
	public void init() throws ServletException {
		
		handlerMapping = new HandlerMapping();
		viewResolver = new ViewResolver();
		viewResolver.setPrefix("./");  // --> './' 는 ???
		viewResolver.setSuffix(".jsp"); 		
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			process(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		process(req, resp);
	}
	
	private void process(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		// 1. 사용자의 요청 url 정보 추출하기
		String url = req.getRequestURI();  // url == uri
		// --> http://localhost:8088/spring/login.do
		// --> login.do
		
		String path = url.substring(url.lastIndexOf("/")); // 마지막 '/'이거만 짤라내는 코드
		
		// 2. HandlerMapping에게 path 정보를 보내고, 담당 Controller 호출하기
		// 로그인 정보를 주고 받고 할 수 있다.
		Controller controller = handlerMapping.setController(path);
		
		// 3. 가져온 컨트롤러 실행하기
		String viewName = controller.handleRequest(req, resp);
		
		// 4. viewResolver에게 화면 이름을 전달하여 JSP 경로로 만들기
		String view = null;
		
		if(viewName.contains(".do")) {
			// 결과가 다른 컨트롤러에게 가야한다.
			view = viewName;
		} else {
			// 결과가 일반 JSP 페이지로 전달되어야 한다.
			view = viewResolver.getView(viewName);		
		}
		
		// 5. 화면 응답 전송하기
		resp.sendRedirect(view);	
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

https://ckddn9496.tistory.com/34?category=391769

 

Servlet 이란?

Servlet에 대해 찾아보고 공부하면서 작성한 글입니다. 내용 중 잘못된 설명이 있다면 짚어주시면 감사드리겠습니다~ Servlet 자바로 구현된 CGI 자바를 이용하여 웹페이지를 동적으로 생성하는 서

ckddn9496.tistory.com

정리 잘 되어있는 블로그

'개발기록 > Java' 카테고리의 다른 글

서블릿 리스너 ( Servlet Listner)  (0) 2022.01.13
Filter와 Wrapper  (0) 2022.01.13
HttpServletRequest, HttpServletResponse 개념 이해  (0) 2022.01.13
HTTP란?  (0) 2022.01.13
web Server  (0) 2022.01.12