Notice
Recent Posts
Recent Comments
Link
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로 접근했을시, Servlet 페이지에서 html문 작성 후 페이지에 표현】
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` → `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>