Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

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