Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[JSP] 20231220 [프로그램 소스] - Test1, Test2(jsp), web.xml, Test2(java), Test2_result 본문

[JSP & Servlet]/Program source (JSP & Servlet)

[JSP] 20231220 [프로그램 소스] - Test1, Test2(jsp), web.xml, Test2(java), Test2_result

Jelly-fish 2023. 12. 26. 00:36

 

전체 실행 화면

 

 

WebApp21


012
Test1.java(/test로 접근) Test2.java, Test2_result.java (Test2.java에서 데이터 입력)


 

【클라이언트가 /test1로 접근했을시, Servlet 페이지에서 html문 작성 후 페이지에 표현】 

 

Test1.java

 

 

Test1.java

 

 

/*========================
 	Test1.java
=========================*/

package com.svt;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Test004.java (Servlet) 에서는
// GenericServlet 을 extends 를 상속하자마자 에러가 났었지만,
// HttpServlet 을 extends 하겠다고 했을 땐, 에러가 나지 않았다.
// ★ 추상 클래스이지만 추상 메소드를 갖고 있지 않은 것이다!!


// [GenericServlet] → service() Overriding
// [HttpServlet] → doGet(), doPost() Overriding



public class Test1 extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	// 사용자의 http 프로토콜 요청이 GET 방식일 경우 호출되는 메소드
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}

	// 사용자의 http 프로토콜 요청이 POST 방식일 경우 호출되는 메소드
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}
	
	// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
	// [잊지마!!!!!!]
	// 서블릿 콘테이너(Servlet Container)가
	// 사용자가 서비스를 요청할 때마다 이 메소드를 호출해 준다...
	// 이 메소드를 호출하는 것, 일을 하는 것, 벌어지는 장소 모두 서블릿 콘테이너.
	// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
	
	// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
	// 사용자의 요청에 따라 처리를 달라지게끔 처리해 주는 것 : web.xml!!!!!!!!!!!
	// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
	
	
	// 사용자 정의 메소드
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// GET 방식이든 POST 방식이든
		// 어떤 방식의 요청에도 모두 처리할 수 있는 사용자 정의 메소드
		
		// ① 
		
		/*
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>" + "Test1.java" + "</title>");
		pw.println("</head>");
		pw.println("<body>");
		pw.println("<div>");
		pw.println("<h1>name : " + "홍길동" + "</h1>");
		pw.println("<h1>age : " + 19 + "</h1>");
		pw.println("</div>");
		pw.println("</body>");
		pw.println("</html>");
		*/
		
		// ②
		/*
		String name = "길현욱";
		int age = 21;
		
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>" + "Test1.java" + "</title>");
		pw.println("</head>");
		pw.println("<body>");
		pw.println("<div>");
		pw.println("<h1>name : " + name + "</h1>");
		pw.println("<h1>age : " + age + "</h1>");
		pw.println("</div>");
		pw.println("</body>");
		pw.println("</html>");
		
		
		
		*▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
		* ①, ② 번 방식으로 진행하려고 할 때
		* java 파일은 없고 배포는 class 파일로 되어 있기 때문에
		* 프로젝트를 새로 해야 한다.
		* 이름과 나이 부분만 수정이 불가능 하다.
		* → 유지보수가 굉장히 어렵다.
		* 
		* 다시 build하고 배포해야 한다.
		* 
		* 하지만, ③ 번 방식은
		* web.xml 파일은 컴파일이 되지 않는 파일 형태이기 때문에
		* 안에다가 name, age를 상수화 시켜둬서 (외부에 그대로)
		* Test1.java에서 불러오게끔 한다면
		* 틀은 그대로 가져가되 변수 값만 다르게 하는 처리가 가능해질 것이다.
		*▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
		*
		*/

		
		// ③
		
		
		// 『ServletConfig』
		//-- 컨테이너가 서블릿을 초기화할 때
		//   서블릿 당 하나씩 ServletConfig 을 생성하게 된다.
		
		// 서블릿으로 만들어진 config를 얻고
		// name이라는 파라미터와 age 라는 파라미터를 가져오도록 한다.
		ServletConfig config = getServletConfig();
		
		
		// 『web.xml』 에 『<init-param>』
		String name = config.getInitParameter("name");
		String age = config.getInitParameter("age");
		
		// 서블릿에 대한 [환경 설정]을 하는 → 『config』
		
		
		
		/*
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>" + "Test1.java" + "</title>");
		pw.println("</head>");
		pw.println("<body>");
		pw.println("<div>");
		pw.println("<h1>name : " + name + "</h1>");
		pw.println("<h1>age : " + age + "</h1>");
		pw.println("</div>");
		pw.println("</body>");
		pw.println("</html>");
		*/
		
		// ④
		
		// 『ServletContext』
		//-- ServletConfig 는 서블릿에 대한 환경을 설정하는 과정에서
		//   필요한 값들을 전달하는 형태로 주요 사용된다면...
		//   ServletContext 는 서블릿에서 사용되는 컨텍스트를
		//   구성하는 형태로 활용된다.
		ServletContext context = getServletContext();
		
		String type = context.getInitParameter("type");
		
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<title>" + "Test1.java" + "</title>");
		pw.println("</head>");
		pw.println("<body>");
		pw.println("<div>");
		pw.println("<h1>name : " + name + "</h1>");
		pw.println("<h1>age : " + age + "</h1>");

		pw.println("<h1>type : " + type + "</h1>");
		
		pw.println("</div>");
		pw.println("</body>");
		pw.println("</html>");	
		
		
	}
	
}

 


 

web.xml - Test1.java에 해당하는 부분

 

<?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" id="WebApp_ID" version="3.1">
  <display-name>WebApp00</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>
  
  	<!-- Test1 클래스 → Servlet 구성 ① -->
  	<!-- ① 사용자의 이름, 나이를 직접 작성하여 넣었을 때 -->
	<!-- 	
	<servlet>
		<servlet-name>lys</servlet-name>
		<servlet-class>com.svt.Test1</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>lys</servlet-name>
		<url-pattern>/test1</url-pattern>
	</servlet-mapping>
  
 	-->
 	  
  	<!-- Test1 클래스 → Servlet 구성 ② -->
  	<!-- ② 사용자의 이름, 나이를 변수에 담은 후 넣었을 때  -->
	<!-- 
	<servlet>
		<servlet-name>lys</servlet-name>
		<servlet-class>com.svt.Test1</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>lys</servlet-name>
		<url-pattern>/test1</url-pattern>
	</servlet-mapping>
   -->
   
  	<!-- Test1 클래스 → Servlet 구성 ③ -->
  	<!-- ③ 사용자의 이름, 나이를 『ServletConfig』 를 통해 넣었을 때 -->
  	<!-- [ServletConfig] : 서블릿에 대한 환경 설정 값 세팅시 이용. -->
	
	<servlet>
		<servlet-name>lys</servlet-name>
		<servlet-class>com.svt.Test1</servlet-class>
		<init-param>
			<param-name>name</param-name>
			<param-value>최혜인</param-value>
		</init-param>
		<init-param>
			<param-name>age</param-name>
			<param-value>21</param-value>
		</init-param>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>lys</servlet-name>
		<url-pattern>/test1</url-pattern>
	</servlet-mapping>
   
  	<!-- Test1 클래스 → Servlet 구성 ④ 추가 -->
  	<!-- ④ 사용자의 이름, 나이를 『ServletContext』 를 통해 넣었을 때 -->
  	<!-- [ServletContext] : 서블릿에서 사용되는 컨텍스트를 구성할 때 사용. -->
  	
  	<context-param>
  		<param-name>type</param-name>
  		<param-value>유머러스</param-value>
  	</context-param>

 

 


 

 

【Test2.jsp를 통해 접근했을 때, form의 action="<%=cp%>/abc"로 접근하여 Test2_result.jsp 페이지로 전송】 

 

01
Test2.jsp, Test2_result.jsp, Test2.java(Servlet)

 

【페이지 이동 과정 정리】
- `Test2.jsp` → `web.xml` → `Test2.java` → `Test2_result.jsp`

 

 

① `Test2.jsp`

<form action="<%=cp %>/abc" method="post">
		이름
		<input type="text" name="name" class="txt"><br>
		나이
		<input type="text" name="age" class="txt"><br><br>
		
		<button type="submit" class="btn">확인</button>
</form>

② `web.xml`

	<!-- /abc로 접근시, Test2.java 클래스 동작 -->
    <servlet>
   		<servlet-name>test2servlet</servlet-name>
   		<servlet-class>com.svt.Test2</servlet-class>
   </servlet>
   
   <servlet-mapping>
   		<servlet-name>test2servlet</servlet-name>
   		<url-pattern>/abc</url-pattern>
   </servlet-mapping>

③ `Test2.java`

		String str = "이름은 " + name + "이며, 나이는 " + age + "세 입니다.";
		
		// 처리한 업무 넘기기
		request.setAttribute("result", str);
		
		// 포워딩~!!!
        	// Test2_result.jsp 페이지로 이동시킨다. (서버에서)
		RequestDispatcher dispatcher = request.getRequestDispatcher("/Test2_result.jsp");
		dispatcher.forward(request, response);

④ `Test2_result.jsp`

<div>
	<!-- <h2>결과 처리</h2> -->
	<h2><%=result %></h2>
</div>

 


 

 

Test2.jsp

 

 

<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test2.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>

<div>
	<h1>서블릿에서 데이터 흐름</h1>
	<hr>
</div>

<div>
<!-- 요청하는 url이 필요한데... 그 url을 구성하지 못했다 → web.xml에서 처리. -->
	<form action="<%=cp %>/abc" method="post">
		이름
		<input type="text" name="name" class="txt"><br>
		나이
		<input type="text" name="age" class="txt"><br><br>
		
		<button type="submit" class="btn">확인</button>
	</form>
</div>


<!-- 주문 받기 : Test2.jsp
	 서빙 : Test2_result.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" id="WebApp_ID" version="3.1">
  <display-name>WebApp00</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>
  
   <!-- Test2 클래스 → Servlet 구성 -->
   <servlet>
   		<servlet-name>test2servlet</servlet-name>
   		<servlet-class>com.svt.Test2</servlet-class>
   </servlet>
   
   <servlet-mapping>
   		<servlet-name>test2servlet</servlet-name>
   		<url-pattern>/abc</url-pattern>
   </servlet-mapping>
   
   
</web-app>

 

 


 

Test2.java (Servlet)

 

/*========================
 	Test2.java
=========================*/

package com.svt;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Test004.java (Servlet) 에서는
// GenericServlet 을 extends 를 상속하자마자 에러가 났었지만,
// HttpServlet 을 extends 하겠다고 했을 땐, 에러가 나지 않았다.
// ★ 추상 클래스이지만 추상 메소드를 갖고 있지 않은 것이다!!


// [GenericServlet] → service() Overriding
// [HttpServlet] → doGet(), doPost() Overriding



public class Test2 extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	// 사용자의 http 프로토콜 요청이 GET 방식일 경우 호출되는 메소드
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}

	// 사용자의 http 프로토콜 요청이 POST 방식일 경우 호출되는 메소드
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}
	
	// 사용자 정의 메소드
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// GET 방식이든 POST 방식이든
		// 어떤 방식의 요청에도 모두 처리할 수 있는 사용자 정의 메소드
		
		// 서블릿 관련 코딩
		
		// 이전 페이지(Test2.jsp)로부터 넘어온 데이터 수신
		// → name, age
		
		// 한글 깨짐 방지 인코딩 처리
		request.setCharacterEncoding("UTF-8");
		
		// 데이터 수신
		String name = request.getParameter("name");
		String age = request.getParameter("age");
		
		// 업무 처리
		String str = "이름은 " + name + "이며, 나이는 " + age + "세 입니다.";
		
		// 처리한 업무 넘기기
		request.setAttribute("result", str);
		//-- 포워딩 하는 페이지에 값을 넘기기 위한 준비(설정)
		//   즉, str 값을 result 라는 이름으로 Test2_result.jsp 페이지로
		//   넘기기 위한 준비
		
		
		// 포워딩~!!!
		RequestDispatcher dispatcher = request.getRequestDispatcher("/Test2_result.jsp");
		dispatcher.forward(request, response);
		
		// 서버 → 서버 로 넘기는 것이기 때문에
		// A 주방장 → B 주방장... 개념이다.
		// 클라이언트에게 다른 페이지를 요청하라는 처리가 아니므로 포워딩 처리를 한 것이다.
		
		
	}
	
}

 


 

Test2_result.jsp

 

<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<%
	String result =  (String)request.getAttribute("result");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test2_result.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>

<div>
	<h1>최종 결과값 수신</h1>
	<hr>
</div>

<div>
	<!-- <h2>결과 처리</h2> -->
	<h2><%=result %></h2>
</div>

</body>
</html>