본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 65일차 (2023-08-24) 자바 프로그래밍_JSP 사용법(ex01~ex04), Servlet 사용법(ex12)

by prometedor 2023. 8. 24.
- 서블릿 프로그래밍
  - JSP 사용법

 

JSP 사용법

JSP 구동 원리

1) 웹브라우저 ==> 서블릿 컨테이너 
   - JSP 실행 요청
     예) http://localhost:8080/java-web/jsp/ex01.jsp
2) 서블릿 컨테이너가 실행
   2.1 JSP의 서블릿 객체를 찾는다
   2.2 있으면,
     2.2.1 그 서블릿 객체를 호출한다. service() ---> _jspService()
   2.3 없으면,
     2.3.1 JSP 엔진을 이용하여 JSP 파일을 가지고 서블릿 자바 소스 파일을 생성한다.
     2.3.2 자바 컴파일러를 이용하여 소스 파일을 컴파일 한다.
     2.3.3 서블릿 객체를 생성한다. - init() 호출 ---> jspInit()
     2.3.4 그 서블릿 객체를 호출한다. - service() 호출 ---> _jspService()
   2.4 JSP 파일이 변경된 상태라면,
     2.4.1 다시 "2.3"을 반복한다.
3) 서블릿 컨테이너 ==> 웹브라우저 
   - 서블릿 실행 결과를 응답

 

JSP 파일을 가지고 생성한 서블릿 소스(.java)와 클래스 파일(.class)의 위치

servlet-app/app/temp/work/Tomcat/localhost/ROOT/org/apache/... 아래에 클래스 파일 생성됨

 

 

- JSP 파일은 Python이나 PHP 처럼 직접 그 스크립트가 인터프리팅 되는 것이 아니다.
- JSP 엔진의 역할은 JSP 파일을 분석하여 서블릿 클래스를 생성하는 것이다.
- 즉 JSP 파일이 직접 실행되지 않는다!

 

 

JSP 
- 자바 서블릿 클래스를 만드는 재료로 사용된다.
- 그래서 서블릿 클래스를 만드는 "틀"이라 해서 "템플릿(template)"이라 부른다.
- JSP를 템플릿 기술이라 부르기도 한다.

JSP 공부법
- JSP를 작성할 때 사용하는 특정 태그들이 어떤 자바 코드를 생성하는지 이해하는 것이 중요하다.

JSP 실행을 요청하기
- JSP 파일이 있는 위치를 지정한다.
  예) http://localhost:8080/java-web/jsp/ex01.jsp

JSP를 변경한 후 실행을 요청하기
- 그냥 JSP 파일이 있는 위치를 지정하면 된다.
- 위에서 설명한대로 JSP 구동 원리에 따라 동작된다.

JSP 엔진이 서블릿을 만들 때 지켜야할 규칙:
- JSP 파일을 가지고 서블릿을 만들 때 HttpJspPage를 구현해야 한다.
- 클래스 계층도
  Servlet
    - init(ServletConfig):void
    - destroy():void
    - service(ServletRequest, ServletResponse):void
    - getServletInfo():String
    - getServletConfig():ServletConfig
    +---> JspPage
      - jspInit():void
      - jspDestroy():void
      +---> HttpJspPage
        - _jspService(HttpServletRequest, HttpServletResponse):void

 

jsp/ex01.jsp

=>

ex01_jsp

ㄴ HttpJspBase 를 상속받음

=>

ㄴ tomcat9 선택

=>

ㄴ zip (pgp, sha512) 선택

=>

ㄴ 톰캣 위치에 해당 소스 zip 파일 저장

=>

ㄴ 저장한 zip 파일 더블클릭하여 압축 풀기

=>

VsCode

=>

ㄴ Add Folder to Workspace... 선택 > 압축 푼 폴더 선택

=>

=>

HttpJspBase.java

 

템플릿 데이터

jsp/ex02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02</title>
</head>
<body>
<h1>템플릿 데이터(template data)</h1>
<!--오호라...주석이네-->
<pre>
- JSP 파일에 그냥 작성하는 텍스트는 자바 출력 코드를 생성한다.
- 예) 
  out.write("템플릿 데이터")
  out.print("템플릿 데이터")
</pre>
</body>
</html>

=>

ㄴ 실행 시 보이지 않음

=>

=>

ㄴ 하지만, 페이지 소스 보기 시  노출됨

=>

jsp/ex02.jsp

ㄴ <%-- .. --%> 이용하기

=>

ㄴ 주석 노출되지 않음

 

스크립트릿과 JSP 주석

jsp/ex03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<% // _jspService() 메서드에 안에 넣을 코드를 작성하라!
int i;
%>
<html>
<head>
<meta charset="UTF-8">
<title>ex03</title>
</head>
<%
i = 5;
%>
<body>
<h1>스크립트릿(scriptlet)과 JSP 주석<%out.print(i);%></h1>
<!-- 
  이것은 HTML 주석이다.
  JSP 엔진 입장에서는
  단지 출력문으로 바꿀 템플릿 데이터일 뿐이다. 
 -->
<%-- 
JSP 주석 
- 이 태그는 JSP 주석이다. JSP 엔진이 무시한다.
- 이 태그 안에 작성한 것은 자바 클래스를 생성할 때 제거된다.

스크립트릿
- JSP 파일 안에 실행할 자바 코드를 넣은 태그
- 예)
  <%  자바 코드 %>
- 스크립트릿 안에 작성한 코드는 자바 클래스를 생성할 때 
  _jspService() 메서드 안에 작성한 순서 그대로 복사된다. 
--%>
<%
if (i < 10) {
  for (int x = 0; x < i; x++) {
    out.println("<p>" + x + "</p>");
  }
}
%>
</body>
</html>

=>

=>

ex03_jsp.java

 

스크립트릿(scriptlet) 응용

jsp/ex04.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String[] names = {"홍길동", "임꺽정", "유관순"};
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex04</title>
</head>
<body>
<h1>스크립트릿(scriptlet) 응용</h1>
<ul>
<%
for (String name : names) {
  out.println("<li>" + name + "</li>");
}
%>
</ul>
</body>
</html>

=>

=>

ex04.jsp

ㄴ 같은 결과가 출력됨

=>

ex04_jsp.java

 

 

Servlet 사용법 ex12

ㄴ ex12 패키지 추가 

=>

ㄴ /Users/사용자명/git/eomcs-java/eomcs-servlet/app/src/main/java/com/eomcs/web/ex12 에 존재하는 파일 모두 복사하기

=>

ㄴ 인텔리제이에서 생성한 ex12 패키지에 복사한 파일 모두 붙여넣기

=>

Listener01.java (ex12)

ㄴ @WebListener 애노테이션을 주석 처리

=>

=>

서블릿 배치: 1) web.xml 에 배치 정보를 등록

web.xml

ㄴ 해당 코드 복사

=>

web.xml

ㄴ 복사한 코드 붙여넣은 후 ex06.s4 -> ex12.s1 으로 수정

=>

Servlet01.java (ex12)

=>

App 실행

=>

 

서블릿 배치: 2) 애노테이션으로 배치 정보를 등록

Servlet02.java (ex12)

=>

 

서블릿 배치: 3) 객체를 직접 생성하여 등록 : 웹 애플리케이션을 시작할 때

servlet03.java (ex12)

=>

Listener01.java

ㄴ 객체를 직접 생성하여 등록하도록 함

=>