처음부터 차근차근

JSP 본문

프로그래밍/JSP

JSP

_soyoung 2022. 1. 6. 16:59
반응형

jsp

jsp란 html 코드를 servlet class 파일로 변환해주는 스크립트 언어이다.

html 코드 안에 java 코드를 삽입하여 동적 웹 페이지를 만들 수 있다.

 

 

 

jsp를 사용하는 이유

jsp를 사용하지 않고 servlet class에서 html 코드를 화면에 출력하려면 아래와 같이 반복 작업을 해야한다.

화면에 한 줄 출력할 때마다 out.write를 써야함

 

 

이런 반복작업을 대신해주는 소프트웨어가 바로 jasper이다.

jasper은 jsp 파일을 만들면 사용자가 해당 jsp 파일을 요청할 때 알아서 html코드을 위의 이미지 처럼 servelt class로 변환해서 만들어준다.

즉, test.jsp 파일을 url로 요청하면 test_jsp.java 라는 이름으로 새로운 java 파일이 만들어 진다는 뜻이다.

 

 

 

심화

<위의 test_jsp.java 파일 볼 수 있는 곳>

jsp 파일 java 파일로 변환한 뒤 저장해두는 경로 : 톰캣디렉토리\work\Catalina\localhost\프로젝트명\org\apache\jsp

(* catalina : tomcat의 옛날 프로젝트 명)

배포할 파일을 임시 저장해두는 경로 : workspace디렉토리\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\프로젝트명\org\apache\jsp

 

 

이랬던 jsp 파일의 html 코드를&amp;amp;nbsp;

위 경로로 가면 

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/9.0.48
 * Generated at: 2022-01-10 08:02:57 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 first_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

  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("\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);
    }
  }
}

이렇게 servlet 클래스로 바꿔준 것을 볼 수 있다.

 

 

 

jsp 코드 블록 종류

● <%%> : 코드블럭. 지역 변수 만들 때 사용

 

● <=%%> : 코드 블럭. 

<%=a%> == <% out.print(a); %>

 

● <%! %> : 선언부. 멤버 변수 멤버 함수 만들 때 사용(함수 안에 함수를 작성할 수 없음)

 

● <%@ %> : 페이지 지시자. 

대표적인 예시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

== 같은 뜻

<%
	response.setCharacterEncoding("UTF-8");
	response.setContentType("text/html; charset=UTF-8");
%>

그렇다면 jsp 파일 맨 위에 저 파일 지시자 대신 아래의 자바 코드를 써도 되는가?

-> no

아무리 jsp 파일 맨 위에다 써도 내부적으로 serviece 함수의 이 코드 윗단에 printWriter이 실행되기 때문에 error가 뜬다.

 

 

 

jsp 내장 객체

 

 

request

 

response

 

session

 

application

 

 

 

스파게티 코드

스파게티 코드는 복잡하게 만들어진 코드를 말한다.

소스 코드가 복잡하게 얽힌 모습을 스파게티의 면발에 비유한 표현이다.

스파게티 코드는 정상적으로 작동하지만, 사람이 코드를 읽으면서 그 코드의 작동을 파악하기 어렵다.

 

jsp 스파게티 코드 예시

html 코드 사이사이에 자바 코드가 들어간 모습을 보고 스파게티 코드라고 부른다.

(<%= %> 이 코드는 제외한다... 이건 )

여기 저기 흩어져 있는 자바 코드를 jsp 웹문서 맨위에다가 몰아서 쓰던가 아니면 mvc 패턴으로 아예 자바 코드를 다른 파일로 옮겨버려서 해결해야한다.

 

 

 

 

Model2 

controller와 view가 물리적으로 분리된 방식

 

 

 

 

출처 : https://www.youtube.com/playlist?list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd 변형 및 요약 

반응형
Comments