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
정리 잘 되어있는 블로그
'개발기록 > 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 |