Everything has an expiration date
★ JSP & Servlet 20231206 [프로그램소스 (JSP → Servlet)] - index(html), jsptest001, jsptest002, jsptest003, web.xml, Test004(Servlet) 본문
[JSP & Servlet]/Program source (JSP & Servlet)
★ JSP & Servlet 20231206 [프로그램소스 (JSP → Servlet)] - index(html), jsptest001, jsptest002, jsptest003, web.xml, Test004(Servlet)
Jelly-fish 2023. 12. 6. 17:47
WebApp04
index.html
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.html</title>
</head>
<body>
<!-- [web.xml] : <welcome-file>index.html</welcome-file> 이 있기 때문에 가능! -->
<!-- 뒤에 index.html 을 삭제하더라도, 이 html 페이지가 메인 페이지가 된다!! -->
<!-- http://localhost:3306/WebApp04/ 까지만 입력해도 서버로 접근할 수 있게 하는 페이지~ -->
<div>
<h1>welcome-file-list</h1>
<hr>
</div>
<div>
<h2>김지민</h2>
</div>
</body>
</html>
jsptest001.jsp
jsptest001.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%
//Scriptlet(스크립트릿) 영역 (자바코드가 오는 영역)
// 이 영역은, 웹 페이지가 알아들을 수 없는 영역이기 때문에
// 웹 페이지의 소스에서 보이지가 않는다!!!
// ▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤
// <h2>김지민은 홍길동이 아니다.</h2>
// <h2>30</h2>
// ▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤
String name = "김지민";
name += "은 홍길동이 아니다.";
int result;
result = 10 + 20;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jsptest001.jsp</title>
</head>
<body>
<div>
<h1>JSP 관찰하기</h1>
<hr>
</div>
<div>
<h2><%=name %></h2>
<h2><%=result %></h2>
<!--  ̄ ̄  ̄ ̄표현식!! 표현식을 통해 스크립트릿의 자바 변수를 웹페이지에 표현할 수 있다! -->
</div>
</body>
</html>
<!-- 1. 디렉티브(지시어)
- 페이지에 대한 설정 정보 지정, 클래스 속성을 변경,
생긴 모양새는 html과 굉장히 유사하지만, 전혀 다르다!
HTML 은 내가 직접 만든 것을 서버에 얹어놓기만 하지만...
서블릿 컨테이너는 내가 만든 문서를 JSP가 읽어서 보고(작업 지시서임)
JSP 가 새롭게 HTML을 작성해서 서버 클라이언트에게 전달한다!
-->
jsptest002.jsp
jsptest002.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// 스크립 릿 영역 → JSP 에서 JAVA 코드를 기술하는(사용하는) 영역
int a = 10, b = 5, c;
c = a + b;
//-- 스크립 릿 영역에서 수행된 자바 코드의 실행 결과는
// 표현식에 의해 HTML 브라우저 영역에 출력된다.
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jsptest002.jsp</title>
</head>
<body>
<div>
<h1>JSP 관찰하기</h1>
<hr>
</div>
<div>
<!-- 표현식 (여러 번 사용 가능하다) -->
<h2>합 : <%=a %> + <%=b %> = <%=c %></h2>
</div>
<%
// 스크립 릿 영역
// ※ 『out』은 내장 객체로서 출력 스트림이다.
out.print("합 : " + a + " + " + b + " = " + c);
out.println("합 : " + a + " + " + b + " = " + c);
out.println("합 : " + a + " + " + b + " = " + c);
//--==>> 개행이 이루어지지 않았다!
// html Document 를 향한 출력 스트림이다.
// 듣는 사람 : Survlet Contaner
// 실제 이 안에 \n 이 들어있겠지만.. HTML 웹 페이지에 적용되지 않은 것이다.
// 관찰 결과, 개행을 했을 경우에는, 빈 공백이 사이에 들어가는 것을 확인할 수 있다.
// 합 : 10 + 5 = 15합 : 10 + 5 = 15 합 : 10 + 5 = 15
// === check!!★
out.println("<br><br>");
out.println("합 : " + a + " + " + b + " = " + c + "<br>");
out.println("합 : " + a + " + " + b + " = " + c );
out.println("<br><br>");
// HTML 의 문법에 맞춰서 Suvlet Contaner에게 전달해 주면
// 제대로 개행되는 것을 확인할 수 있다.
/*
합 : 10 + 5 = 15
합 : 10 + 5 = 15
*/
//=========================================================
// ① [개행 없음]
//=========================================================
String str = String.format("합 : %d + %d = %d", a, b, c);
// 개행을 아예 하지 않았을 때, 공백 없이 이어붙여져서 나온다.
out.print(str);
out.print(str);
out.println("<br><br>");
//=========================================================
//=========================================================
// ② [개행을 \n으로 처리]
//=========================================================
str = String.format("합 : %d + %d = %d\n", a, b, c);
// String.format에 \n을 넣어도 개행이 되지 않는다.
out.print(str);
out.print(str);
out.println("<br><br>");
//=========================================================
//=========================================================
// ③ [개행을 <br>로 처리]
//=========================================================
str = String.format("합 : %d + %d = %d<br>", a, b, c);
// String.format에 <br> 을 넣어주자
// HTML 웹 페이지에서 정상적으로 개행이 이루어 진 것을 확인할 수 있다!
out.print(str);
out.print(str);
//=========================================================
%>
</body>
</html>
jsptest003.jsp
jsptest003.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%!
//▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
//▩▩▩▩▩▩▩▩▩▩ 선언부 = 클래스 영역 ▩▩▩▩▩▩▩▩▩▩▩▩▩▩
//▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
// ○ 선언부 영역 → 함수 정의가 가능한 영역
// 선언부에서 선연한 변수 a
int a = 10;
// 선언부에서 정의한 함수 sum()
int sum(int x)
{
int s = 0;
for (int i = 0; i <= x; i ++)
s += i;
return s;
}
//▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
%>
<%
//▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
//▩▩▩▩▩▩▩▩▩ 스크립 릿 = 메소드 영역 ▩▩▩▩▩▩▩▩▩▩▩▩▩▩
//▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
// JSP에서, 스크립 릿 영역은 실제 Java의 메소드 영역에 해당한다.
// 따라서, 여기에 선언한 변수 b는 [지역 변수]이고
// 메소드가 호출 될 때마다 b는 0으로 초기화 되기 때문에
// 새로고침을 여러 번 해봐도
// 【 b : 메소드 호출시 0 초기화 → +1 증가 = 1 】 과정을
// 반복하기 때문에 b는 1값으로 고정되는 것이다.
// 선언부에 선언한 a의 경우,
// 클래스에 선언한 전역 변수이기 때문에
// 페이지를 새로 고침 할 때마다 1씩 증가하는 것을 관찰할 수 있다.
//▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
// 함수 정의 불가능 (메소드 내부 영역이므로!!!!)
// ○ 스크립 릿 영역
// 스크립릿 영역에서 선언한 변수 b
int b = 0;
a++;
b++;
//▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
// JAVA → 항상 main 메소드가 시작 지점이고, 우리가 정할 수 있었다.
// 프로그램의 시작 지점을 우리가 결정하지 않고 있다.
// 누군가에 의해서 메소드 호출 → 실행되는 것이다.
// Servlet Container가 알아서 구성하는 것이다!!
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jsptest003.jsp</title>
</head>
<body>
<div>
<h1>JSP 관찰하기</h1>
<hr>
</div>
<div>
<h2>변수의 값 확인</h2>
<h3>a : <%=a %></h3>
<h3>b : <%=b %></h3>
</div>
<!--
※ 요청한 페이지(jsptest003.jsp)의 결과를 확인한 후 새로고침을 반복해보면...
a 변수 (선언부에 선언한 변수) 값만 계속 증가하는 것을 확인할 수 있다.
a 변수 값만 계속 증가하는 이유를 확인하기 위해서는
서블릿(servlet) 코드를 분석해 보아야 한다.
즉, jsptest003.jsp 의 서블릿 코드를 분석해야 한다.
- 경로
C:\WebStudy\.metadata\.plugins\org.eclipse.wst.server.core
\tmp0\work\Catalina\localhost\WebApp04\org\apache\jsp
----------- --------
workspace project
- 파일
jsptest003_jsp.java
-------------- ----
jsp 파일명 서블릿(servlet)의 확장자 → 컴파일 이전
==> 변수 a 는 클래스(jsptest003_jsp)의 전역변수로 선언된 것을 확인할 수 있다.
이는 객체가 소멸되기 전까지는 계속 값이 유지된다는 것을 의미한다.
변수 b 는 메소드(jsptest003_jsp 클래스의 _jspService() 메소드) 내의
지역변수로 선언된 것을 확인할 수 있다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
『_jspInit()』 메소드와 『_jspDestroy()』 메소드는
서비스가 시작될 때와 끝날 때 한 번씩만 실행되는 메소드이다.
반면... 『_jspService()』 메소드는
브라우저에 의해 페이지가 요청될 때 마다 매번 실행되는 메소드이다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Init() : 최초
Destroy() : 종료
Service() : 클라이언트 요청
이 메소드 호출 → Servlet Container
이로 인해 변수 b는 페이지에 대한 요청이 발생할 때 마다
새롭게 초기화 되는 과정을 거치게 되는 것이다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
JSP 페이지의 스크립릿 영역에서 선언된 모든 변수는
이 『_jspService()』 메소드의 지역변수가 된다.
━━━━┬━━━
└ ★(클라이언트가 요청할 때마다 jspService() 메소드를 호출한다.)
이렇게 메소드 호출하는 주체는 → ☆【Servlet Container】☆
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
또한, JSP 페이지의 선언부 영역에서 선언된 모든 변수는
클래스의 전역변수(인스턴스 변수) 가 된다.
JSP 페이지에서 메소드 정의 시
스크립릿 영역 내부에서는 정의할 수 없다.
서블릿으로 변환되는 과정에서
메소드 내부에 또 다른 메소드가 다시 정의되는 상황이 되어버리기 때문에
문법적으로 잘못된 표현이 되는 것이다.
선언부는... 비록 사용 빈도가 낮지만...
메소드는 선언부 내부에서만 정의할 수 있는 것이다.
-->
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>WebApp04</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Test004</servlet-name>
<servlet-class>com.test.Test004</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test004</servlet-name>
<url-pattern>/test004</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Test005</servlet-name> <!-- 사이트 이름 -->
<servlet-class>com.test.Test005</servlet-class> <!-- 기능해야 하는 클래스 -->
</servlet>
<servlet-mapping>
<servlet-name>Test005</servlet-name> <!-- 사이트 이름(<servlet>태그와 동일) -->
<url-pattern>/login</url-pattern> <!-- 사용자가 해당 url을 입력했을 때 연결 -->
</servlet-mapping>
</web-app>
Test004.java (Servlet)
Test004.java (Servlet)
/*====================
Test004.java
- Servlet 실습
======================*/
// 현재... 자바의 기본 클래스 Test004
// 이를... Servlet 으로 구성하는 방법
// ① Servlet implements 하기.
// ② Generic Servlet 상속받기. extends
// ③ Http Servlet
// GenericServlet 을 상속받는 클래스로 설계 → Servlet
package com.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//① import javax.servlet.Servlet;
//① public class Test004 implements Servlet
// [GenericServlet → 추상 클래스 (◎ 위에 A 마크 표시)]
//public abstract class Test004 extends GenericServlet
// [GenericServlet 이 가지고 있는 추상 메소드를 Overriding!!]
//public abstract class Test004 extends GenericServlet
public class Test004 extends GenericServlet
{
private static final long serialVersionUID = 1L;
// GenericServlet 의 추상메소드 재정의~!!!
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException
{
// [요청, 응답] → 모두 객체!! (서블릿 컨테이너가 전달)
// 요청에 대한 응답 방법
response.setContentType("text/html; charset=UTF-8");
try
{
// 출력 스트림 구성
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>");
out.print("Test004.java");
out.print("</title>");
out.print("</head>");
out.print("<body>");
out.print("<div>");
out.print("<h1>");
out.print("서블릿 관련 실습");
out.print("</h1>");
out.print("<hr>");
out.print("</div>");
out.print("<div>");
out.print("<h2>");
out.print("GenericServlet 클래스를 이용한 서블릿 테스트");
out.print("</h2>");
out.print("</div>");
out.print("</body>");
out.print("</html>");
} catch (Exception e)
{
System.out.println(e.toString());
}
}
}