JSP

Byung Seon Kang·2022년 10월 4일
0

서블릿에 대해

목록 보기
6/9

이 글은 Head First Servlet and JSP 책을 참고하여 작성하였습니다.

서블릿과 JSP에 무슨 관계가.. 있습니다!

JSP가 서블릿으로 변환되는 과정

  • Container에서 해줍니다.
  • JSP life cycle
  1. 컨테이너가 web.xml 파일(DD)를 읽는다.
  2. client가 JSP파일을 요청.

    Container가 jsp파일을 .java 소스 파일로 translate한다.
    여기서 JSP syntax error가 잡힘.

  3. Container는 생성한 java 소스 파일을 .class 로 컴파일한다.

    여기서 java language/syntax error가 잡힘.

  4. Container는 새롭게 생성된(generated) 서블릿 클래스를 불러옵니다.
  5. Container는 servlet을 인스턴스화해서 그 서블릿의 jspInit() method를 실행.
  6. 이후 _jspService() method를 호출해서 쓰레드 만들고 클라이언트의 요청 처리.
  • Translation과 compilation은 생명주기동안 오직 한번만 일어납니다.
  • 참고로 첫 request때 translation과 compilation이 일어나는 경우도 있지만 미리 해줄수도.. vendor마다 다릅니다.

변환된 코드 실제 예시

기존 JSP 코드

<html><body>
  <%! int count=0; %>
    The page count is now:
  <%= ++count %>
</body></html>

java로 translate한 뒤 코드

package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class BasicCounter_jsp extends org.apache.jasper.runtime.HttpJspBase 
	implements org.apache.jasper.runtime.JspSourceDependent {
	int count = 0;
    private static java.util.Vector _jspx_dependants;
    
    public java.util.List getDependants() {
    	return _jspx_dependants;
    }
    
    public void _jspService(HttpServletRequest request, HttpServletResponse response)
    										throws java.io.IOException, ServletException {
		JspFactory _jspxFactory = null;
 		PageContext pageContext = null;
 		HttpSession session = null;
 		ServletContext application = null;
 		ServletConfig config = null;
 		JspWriter out = null;
 		Object page = this;
 		JspWriter _jspx_out = null;
 		PageContext _jspx_page_context = null;
 		try {
 			_jspxFactory = JspFactory.getDefaultFactory();
 			response.setContentType(“text/html”);
 			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<html>\r<body>\r”);
  			out.write(“\rThe page count is now: \r”);
  			out.print( ++count );
  			out.write(“\r</body>\r</html>\r”);
  		} catch (Throwable t) {
  			if (!(t instanceof SkipPageException)){
  				out = _jspx_out;
  				if (out != null && out.getBufferSize() != 0)
  					out.clearBuffer();
  				if (_jspx_page_context != null) 
            		_jspx_page_context.handlePageException(t);
 			}
 		} finally {
 			if (_jspxFactory != null) 
            	_jspxFactory.releasePageContext(_jspx_page_context);
		} 
}

DD에 설정하기

<web-app ...>
	<servlet>
  		<servlet-name>blabla</servlet-name>
      	<jsp-file>/TestInit.jsp</jsp-file> ->요거.
    </servlet>
  	<servlet-mapping>
    	<servlet-name>blabla</servlet-name>
      	<url-pattern>/blablaTest.jsp</url-attern>
  	</servlet-mapping>
  
</web-app>

JSP element type

  1. Scriptlet
    <% %>
  2. Directive
    <%@ %>
  3. Expression
    <%= %>
    -> print할때
  • 추가적으로 JSP 2.0 spec부터 EL(Expression Language)이라는게 지원되기 시작해서 좀 더 편하게 쓰실 수 있다고 하네요.
    ex)
EL
Please contact: ${applicationScope.mail}

일반 표현
Please contact: <%= application.getAttribute("mail") %>
profile
왜 필요한지 질문하기

0개의 댓글