JAVA개념&실습

WEB : [0602] Servlet(서블릿) + JSP

u_SZero 2023. 6. 6. 22:22

! 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기 바랍니다 !


WebApp21


■■■ Sevlet(서블릿) ■■■

더보기

0. 웹 어플리케이션을 구축하기 위한 웹 프로그램을 구성하는 언어의 한 종류.
   (JAVA 기반)

1. JSP 에서 정적인 부분을 담당하고, Servlet 에서는 동적인 처리를 위한
   부분으로 사용되어 보다 효율적인 웹 어플리케이션을 구축할 수 있다.
   - JSP    → 단점, MVC 패턴을 적용하기 힘들다.
   - Servlet    → 단점, 웹 페이지(view) 작성이 번거롭고 복잡하다.
   - Servlet + JSP → MVC 패턴 적용 및 웹 페이지(view)를 보다 편리하게 작성.
      단점, 구조가 복잡해지게 된다.

2. JSP 는 내부적으로 Web Container 가 Servlet 으로 변경시켜준다.

3. WEB-INF 는 환경 설정 파일이 저장되는 곳
   (→ 외부에서는 접근 불가 / 금지) check~!!!
   - lib : 라이브러리 파일을 저장(ojdbc6.jar, jstl.jar등)
   - J2SE
   - J2EE
   - classes : class 파일이 저장(servlet)
     『classes > com > util > MyUtil.class』
     원래는 이렇게 만들어야 하지만 이클립스가 자동으로 연결
     실제 위치는
     『C:\WebStudy\.metadata\.plugins\org.eclipse.wst.server.core
\tmp0\work\Catalina\localhost\WebApp20\org\apache\jsp』

     *.jar : java
     *.war : web(프로젝트 아래 모든 것을 압축할 때)
     *.ear : jar + war
     web.xml : context path 의 환경 설정

4. 『init()』과 『destroy()』는 단 한 번 호출되며
   『service()』는 클라이언트의 요청이 있을 때 마다 호출된다.
    이제는 JSP 를 『service()』 메소드 내부에 코딩하는 것과 같다.

5. 일반적으로 『GenericServlet』 이나 『HttpServlet』을 활용한다.

6. URL 패턴을 지정하는 방법은 크게 3가지 이다.
   - 『/a』
   - 『/*』 
   - 『.do』 --확장자

7. web.xml 을 수정하면 서버를 꼭 재구동한 이후에 실행해야 한다.

8. JSP를 공부한 지금까지는
   JSP(입력) → JSP(처리, 결과)의 구조였으나
   Servlet 을 다루게 된 이후에는
   JSP(입력) → Servlet(결과를 위한 처리) → JSP(결과) 방식으로 구성된다.

 

 


 

 

SampleServlet.java

: 기본 틀

/*======================
    SampleServlet.java
=======================*/

package com.svt;

import java.io.IOException;

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

public class SampleServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		
	}
	
}

 

WEB-INF > web.xml

<servlet>
    <servlet-name>hongjildong</servlet-name>           3. 이름이 있으면
    <servlet-class>com.svt.Test1</servlet-class>         4. 실행하게 해라
</servlet>

<servlet-mapping>
    <servlet-name>hongildong</servlet-name>            2. 이 이름을 찾아라
    <url-pattern>/test1</url-pattern>                              1. 요청이 들어오면 (실행되는 url이 이런 패턴을 가졌으면)
</servlet-mapping> 

<?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>gogildong</servlet-name>          3. 이름이 있으면
		<servlet-class>com.svt.Test1</servlet-class>    4. 실행하게 해라
	</servlet>
	
	<servlet-mapping>
		<servlet-name>gogildong</servlet-name>          2. 이 이름을 찾아라
		<url-pattern>/test1</url-pattern>               1. 요청이 들어오면
	</servlet-mapping> 
	-->
	
	<!-- Test1 클래스 → Servlet 구성 ② -->
	<!-- 
	<servlet>
		<servlet-name>gogildong</servlet-name>	
		<servlet-class>com.svt.Test1</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>gogildong</servlet-name>	
		<url-pattern>/test1</url-pattern>			
	</servlet-mapping> 
	-->
	
	<!-- Test1 클래스 → Servlet 구성 ③ -->
	<!-- 
	<servlet>
		<servlet-name>gogildong</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>13</param-value>
		</init-param>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>gogildong</servlet-name>	
		<url-pattern>/test1</url-pattern>			
	</servlet-mapping>
	-->
	
	<!-- Test1 클래스 → Servlet 구성 ④ -->
	<servlet>
		<servlet-name>gogildong</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>13</param-value>
		</init-param>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>gogildong</servlet-name>	
		<url-pattern>/test1</url-pattern>			
	</servlet-mapping>
	
	<context-param>
		<param-name>type</param-name>
		<param-value>말썽쟁이</param-value>
	</context-param>
	
	<!-- 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>/test2</url-pattern>
	</servlet-mapping>
	
	<!-- Test2ok 클래스 → Servlet 구성 -->
	<servlet>
		<servlet-name>test2okservlet</servlet-name>
		<servlet-class>com.svt.Test2Ok</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>test2okservlet</servlet-name>
		<url-pattern>/test2ok</url-pattern>
	</servlet-mapping>
</web-app>

 

 

Test1.java

: doGetPost 메소드 작성

/*=================
    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;

public class Test1 extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// ① _정적
		/*
		response .setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<html>");
		pw.println("<title>" + "Test.java" + "</title>");
		pw.println("</head>");
		pw.println("<h1>name : 강백호</h1>");
		pw.println("<h1>age  : 19</h1>");
		pw.println("<html>");
		pw.println("</body>");
		pw.println("</html>");
		*/
		
		//② _변하는 값
		/*
		String name="강백호";
		String age = "19";
				
		response .setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<html>");
		pw.println("<title>" + "Test.java" + "</title>");
		pw.println("</head>");
		pw.println("<h1>name : " + name + "</h1>");
		pw.println("<h1>age  : " + age + "</h1>");
		pw.println("<html>");
		pw.println("</body>");
		pw.println("</html>");
		*/
		
		// ③ _.xml파일에서 값을 가져와서 출력 ☆
		// 『ServletConfig』
		//-- 컨테이너가 서블릿을 초기화할 때
		//   서블릿 당 하나씩 ServletConfig 을 생성하게 된다.
		/*
		ServletConfig config = getServletConfig();
		
		// 『web.xml』 에 『<init-param>』 사용
		String name = config.getInitParameter("name");
		String age = config.getInitParameter("age");
		
		response .setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<html>");
		pw.println("<title>" + "Test.java" + "</title>");
		pw.println("</head>");
		pw.println("<h1>name : " + name + "</h1>");
		pw.println("<h1>age  : " + age + "</h1>");
		pw.println("<html>");
		pw.println("</body>");
		pw.println("</html>");
		*/
		
		// ④ ☆
		ServletConfig config = getServletConfig();
		
		// 『web.xml』 에 『<init-param>』 사용
		String name = config.getInitParameter("name");
		String age = config.getInitParameter("age");
		
		// 『ServletContext』
		//-- ServletConfig 는 서블릿에 대한 환경을 설정하는 과정에서
		//   필요한 값들을 전달하는 평태로 주로 사용하지만...
		//   ServletContext  는 서블릿에서 사용되는 컨텍스트로
		//   구성하는 형태로 활용된다.
		ServletContext context = getServletContext();
		
		// ”web.xml』 에 <context~prpram>,사용
		String type = context.getInitParameter("type");
		
		response .setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<html>");
		pw.println("<title>" + "Test.java" + "</title>");
		pw.println("</head>");
		pw.println("<h1>name : " + name + "</h1>");
		pw.println("<h1>age  : " + age + "</h1>");
		
		pw.println("<h1>type : " + type + "</h1>");
		
		pw.println("<html>");
		pw.println("</body>");
		pw.println("</html>");
		
	}
	
}

 

 


 

 

WEB-INF 파일에 Test2.jsp와 Test2_ok.jsp를 담아놓으면

더 이상 Test2.jsp 와 Test2_ok.jsp를 직접적으로 실행시킬 때 내용을 보여줄 수 없음

경로를 /WEB-INF/Test2.jsp 나 /WEB-INF/Test2_ok.jsp로 설정하여 넘겨줘야 내용 보기 가능

 

따라서 WebContent 에 test2의 빈 파일을 만들어서 실행시키기만해도(이때의 url 이 /test2이기 때문에)

web.xml에서 만들었던

이 구문을 통해 Test2.java > Test2.jsp > Test2Ok.java > Test2_ok.jsp 가 모두 실행됨.

 

 

Test2.java

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

package com.svt;

import java.io.IOException;

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

public class Test2 extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// 포워딩~!!!
		RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Test2.jsp");
		rd.forward(request, response);
	}
	
}

 

 

 

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>
	<form action="<%=cp %>/test2ok" method="post">
		이름 <input type="text" name="name" class="txt"><br>
		나이 <input type="text" name="age" class="txt"><br>
		<button type="submit" class="btn">확인</button>
	</form>
</div>

</body>
</html>

 

 

Test2ok.java

/*=================
    Test2OK.java
==================*/

package com.svt;

import java.io.IOException;

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

public class Test2Ok extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
	}
	
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// 서블릿 관련 코딩
		
		// 이전 페이지(Test2.jsp)로부터 데이터 수신
		// → name, age
		
		// 한글 깨짐 방지 인코딩 처리
		request.setCharacterEncoding("UTF-8");
		
		// 데이터 수신
		String strName = request.getParameter("name");
		String strAge = request.getParameter("age");
		
		// 업무 처리
		String str = "이름은 " + strName + "이며, 나이는 "  + strAge + "세 입니다.";
		
		// 처리한 업무 넘기기
		request.setAttribute("result", str);
		//-- 포워딩하는 페이지에 처리한 값을 넘기기 위한 준비(설정)
		//   즉, str 값을 result라는 이름으로 Test2_ok.jsp 페이지로 넘길 준비
		
		// 포워딩~!!!
		RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Test2_ok.jsp");
		rd.forward(request, response);

	}
	
}

 

 

 

Test2_ok.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<%
	// 이전 페이지(Test2OK.java)로부터 데이터 수신
	// → result
	
	String result = (String)request.getAttribute("result");
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test02_ok.jsp</title>
<link rel="stylesheet" type="text/CSS" href="css/main.css">
</head>
<body>

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

<div>
	<h2><%=result %></h2>
</div>


</body>
</html>

 

 


! 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기 바랍니다 !