본문 바로가기
서버/spring

JSP/서블릿 기초

by Jason95 2021. 1. 1.

<JSP 파일 내 소스 코드의 종류>

1. html 소스 (html 문법)

  서블릿으로 변환시 _jspService() 메서드 내부에, 한 줄 단위로 out.write("소스"); 삽입

2. Scriptlet(스크립트릿) : <% (연산식) %> (java 문법)

  서블릿으로 변환시 _jspService() 메서드 내부에, 연산식을 그대로 삽입.

3. Expression(표현식) : <%= (변수) %> (java 문법)

  서블릿으로 변환시 _jspService() 메서드 내부에, out.print("변수"); 삽입

4. Declaration(선언문) : <%! public void methodName(){} %> (java 문법)

  서블릿으로 변환시 _jspService() 메서드 내부가 아닌 외부에 필드나 메서드로 변환될 코드

  jspInit()이나 jspDestroy() 등을 오버라이딩 가능

  

<서블릿 라이프사이클 관련 메서드>

* _jspService()는 페이지를 새로고침할 때마다 호출

* jspInit()은 페이지 최초 접속 시 서블릿 객체가 생성되어 메모리에 할당되면서 호출

  또는 서블릿 코드 변경으로 새로운 서블릿 객체가 생성되어 메모리에 재할당되면서 호출

* jspDestory()는 서블릿 코드 변경 시, 서블릿 객체 재할당을 위해, 기존 서블릿 객체가 제거되면서 호출

 

<JSP가 변환된 서블릿 파일 위치>

내 컴퓨터 기준으로,

C:\Projects\Java Projects\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost

이 경로로 가서 프로젝트명과 일치하는 폴더에 들어가고

계속 끝까지 들어가면 서블릿 파일(.java)이 있음

(빨간색은 모든 컴퓨터 동일)

 

<예제 소스>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%!
	String field;

	public void jspInit(){
		setField();
		System.out.println("초기화");
		// System.out.println("수정 후 재실행");
	}
	
	public void jspDestroy(){ 
		System.out.println("종료");
	}

	public String getField(){
		return this.field;
	}	
	
	public void setField(){;
		this.field = "1~10까지 합";
	}	
	%>
	
	<%
	System.out.println("_jspService() 내부 코드");
	int localVariable = 0;
	for(int i=0; i<10; i++) localVariable += i;
	%>
	
	이 줄을 포함한 아랫 줄은 _jspService 내부에 삽입되는 코드입니다. <br>
	<%= getField() + " = " + localVariable %> <br> 
	이 줄을 포함한 윗 줄은 _jspService 내부에 삽입되는 코드입니다.
	
</body>
</html>

test.jsp (JSP 원본 파일)

 

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/9.0.34
 * Generated at: 2021-01-01 11:29:26 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 {

    String field;

    public void jspInit() {
        setField();
        // System.out.println("초기화");
        System.out.println("수정 후 재실행");
    }

    public void jspDestroy() {
        System.out.println("종료");
    }

    public String getField() {
        return this.field;
    }

    public void setField() {
        ;
        this.field = "1~10까지 합";
    }

    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 {

        if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
            final java.lang.String _jspx_method = request.getMethod();
            if ("OPTIONS".equals(_jspx_method)) {
                response.setHeader("Allow", "GET, HEAD, POST, OPTIONS");
                return;
            }
            if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
                response.setHeader("Allow", "GET, HEAD, POST, OPTIONS");
                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\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("</head>\r\n");
            out.write("<body>\r\n");
            out.write("\t");
            out.write("\r\n");
            out.write("\t\r\n");
            out.write("\t");

            System.out.println("_jspService() 내부 코드");
            int localVariable = 0;
            for (int i = 0; i < 10; i++)
                localVariable += i;

            out.write("\r\n");
            out.write("\t\r\n");
            out.write("\t이 줄을 포함한 아랫 줄은 _jspService 내부에 삽입되는 코드입니다. <br>\r\n");
            out.write("\t");
            out.print(getField() + " = " + localVariable);
            out.write(" <br> \r\n");
            out.write("\t이 줄을 포함한 윗 줄은 _jspService 내부에 삽입되는 코드입니다.\r\n");
            out.write("\t\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);
        }
    }
}

test_jsp.java (변환된 서블릿 파일)

 

<JSP 내장 객체>

출처 : www.boostcourse.org/web316/lecture/19882/

서블릿 소스에 선언이 되어 있기 때문에, JSP 소스에서 별도의 선언 없이 바로 사용 가능

'서버 > spring' 카테고리의 다른 글

p namespace / c namespace  (0) 2021.08.07
DAO, DTO, Entity  (0) 2021.08.04
start.spring.io로 gradle import 했을 때 오류 해결  (0) 2021.08.04
JDK와 JRE 설정  (0) 2021.02.28