서블릿(Servlet)이란?
오직 웹서버에서만 해석 및 실행될 수 있는 JavaEE기반의 클래스이다.
서블릿의 생명주기
생명주기는 init(), service(), destory() 로 이해할 수 있다.
- init() : 생성자 호출 후, 서블릿의 초기화 작업때문에 톰캣에 의해
호출 - service() : 동시에 많은 클라이언트의 요청을 처리하는 메서드이고,
동시에 호출되려면, 쓰레드에 의해 호출됨 - destory() : 서블릿 소멸시점에 호출, 주로 서블릿이 보유하고 있는 자원들을
반납하는 용도에 사용..
서블릿의 계보
자식 부모 할아버지
HttpServlet ( 웹용, 추상클래스) -> GenericServlet(추상클래스) -> Servlet(인터페이스)
쉽게 말하면 위와 같이 설명할 수 있다.
Servlet인터페이스는 간단한 추상메서드들로만 구성되어있다.
GenericServlet은 Servlet보다 더 많은 메서드들로 구성되어있으며, Sun사에서 서블릿을 개발할 때 단순히 Http 즉 웹용으로만 개발하는 것이 아니라 더 방범위한 분야에서 사용할 수 있도록 GenericServlet과 같은 틀을 제공한다.
HttpServlet은 웹용의 서블릿을 개발할 때 사용되는 클래스이며, get, post.. 등 다양한 요청에 대해 대응할 수 있는 doGet, doPost.. doXXXX와 같은 메서드들을 지원해준다.
JSP는 서블릿이다.
JSP는 사실 서블릿이였다.
JSP에는 지시영역, 선언부, 스크립틀릿, 표현식의 영역이 존재한다. 사실 서블릿의 영역들 중 한 부분인 것이였다.
<%@ page contentType="text/html;charset=utf-8"%>
<%!
//멤버메서드, 멤버변수 .. 멤버란? 클래스에서 인스턴스가 갖는 변수, 메서드 작성하는 영역
int x=5;
public void test(){
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
<style></style>
<script></script>
</head>
<body>
난 jsp야!!
</body>
</html>
위와 같은 JSP파일이 사실은
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.61
* Generated at: 2020-12-15 02:23:06 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
//멤버메서드, 멤버변수 .. 멤버란? 클래스에서 인스턴스가 갖는 변수, 메서드 작성하는 영역
int x=5;
public void test(){
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP들은 오직 GET, POST 또는 HEAD 메소드만을 허용합니다. Jasper는 OPTIONS 메소드 또한 허용합니다.");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=utf-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('\r');
out.write('\n');
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"utf-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("<style></style>\r\n");
out.write("<script></script>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("난 jsp야!!\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
서블릿 클래스로 웹컨테이너가 변환시켜 실행하는 것이다!!! 놀라지 않을 수가 없다!!
단지 JSP는 디자인적인 코드를 편히 하기위해 만들어낸 기술일 뿐이다!!!
'프로그래밍 > JSP' 카테고리의 다른 글
JSP | MVC패턴에 대한 이해 (0) | 2020.12.16 |
---|---|
JSP | session (0) | 2020.12.16 |
JSP | 커넥션풀(Connection Pool) (0) | 2020.12.11 |
JSP | MyBatis 사용해보기 (0) | 2020.12.10 |
JSP - 페이징 이해 (0) | 2020.12.08 |