국비 48-2

냐아암·2023년 6월 28일
0

국비

목록 보기
61/114

Servlet

웹 서비스를 위한 자바 클래스
웹 프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 응답하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술

📍 GET 방식 : 가져오다, 얻어오다

  • URL에 변수를 포함시켜 요청(보안 단점)
  • 전송 길이 제한
  • 캐싱 가능

📍 POST 방식 : 붙이다

  • 데이터를 서버로 제출하여 추가 또는 수정하기 위해 데이터를 전송하는 방식
  • 전송 길이 제한 없음
  • 캐싱 불가능

Servlet 클래스 만들기 -> HttpServlet 추상클래스 상속(오버라이딩 필수) -> web.xml에 연결 작업

🔑 getParameter() : 전달된 input 태그의 값(name이 하나일 때만 사용 가능)

🔑 getParameterValues()


🔑 HttpServletRequest : 클라이언트 정보 + 전달된 값

🔑 HttpServletResponse : 서버가 클라이언트에게 응답할 방법 제공

📍 Dynamic Web project(동적 웹 프로젝트)

  • 요청에 따라서 응답하는 화면(HTML)을 실시간으로 만들어내서(동적) 클라이언트에게 응답하는 프로젝트
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <h1>index라는 이름이 붙은 파일은 메인 페이지 역할을 합니다.</h1>

    <hr>

    <h3>테스트1</h3>

    <pre>
        form 태그 : 내부에 작성된 input 태그의 값을 지정된 서버 또는 페이지로
                    제출(전달)하는 역할

        * 이때 어떤 input 태그에 작성된 값이 제출된 건지 알 수 있도록
          input 태그에 name 속성을 반드시 작성한다<!DOCTYPE html>
        
        * form 태그 속성
        - action : input 태그 값을 전달할 서버 또는 페이지 주소를 작성하는 속성
        - method : 데이터 전달 방식을 지정하는 속성(get/post)
    </pre>
    <!-- http://localhost:8080      /ServletProject1/ 
            
            - http://아이피:포트번호 : 통신 규약, 서버 컴퓨터 위치를 지정(고정)

            - /ServletProject1/ : 요청하고자 하는 내용을 나타내는 주소
    -->

    <form action="/ServletProject1/example1.do">
        <!-- ServletProject1 프로젝트에 example1.do 라는 요청을 전달한다.
                -> 예제 1번을 수행해서 결과를 응답할 예정
        -->

        이름 : <input type="text" name="inputName">
        <br>
        나이 : <input type="text" name="inputAge">
        <br>
        <button>서버로 제출하기</button>

    </form>

    <hr>

    <form action="/ServletProject1/example2.do">
        주문자 : <input type="text" name="orderer">

        <br>

        <label>
            <input type="checkbox" name="coffee" value="아이스 아메리카노">
            아이스 아메리카노
        </label>
        <label>
            <input type="checkbox" name="coffee" value="카라멜 마끼아또">
            카라멜 마끼아또
        </label>
        <label>
            <input type="checkbox" name="coffee" value="녹차 라떼">
            녹차 라떼
        </label>
        <label>
            <input type="checkbox" name="coffee" value="초코칩 프라페">
            초코칩 프라페
        </label>
        <label>
            <input type="checkbox" name="coffee" value="민트초코 프라페">
            민트초코 프라페
        </label>

        <br>
        <button>주문서 제출하기</button>
    </form>

    
</body>
</html>

ServletEx1

package edu.kh.servlet;

import java.io.IOException;

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

// Servlet 클래스 만들기 위해서는
// java.servlet.http.Httpservlet 추상 클래스를
// 반드시 상속받아야 한다.
// -> doGet() / doPost()를 필요한 형태로 오버라이딩 진행

public class ServletEx1 extends HttpServlet{
			// /ServletProject1/example1.do주소로 요청이 왔을 때
			// 해당 클래스가 응답할 수 있도록 연결하는 작업이 필요함
	
			// -> web.xml 파일에서 연결 작업 수행
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// HttpServletRequest : 클라이언트 + 요청 정보가 담긴 객체
		// HttpServletResponse : 서버가 클라이언트에게 응답하는 방법을 제공하는 객체
		
		// 요청 시 전달된 input 태그 값(==Parameter)을 얻어오는 방법
		// req.getParameter("input 태그 name 속성값")
		
		String inputName = req.getParameter("inputName");
		String inputAge = req.getParameter("inputAge");
		
		System.out.println(inputName);
		System.out.println(inputAge);
	}

}

ServletEx2

package edu.kh.servlet;

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

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

// Servlet 클래스를 만들 때는
// 반드시 HttpServlet을 상속받아야 한다.

public class ServletEx2 extends HttpServlet{
	
	// Get 방식 요청을 처리하는 (do) 메소드
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 파라미터(Parameter) == 요청 시 전달된 input 태그의 값이다.
		
		String orderer = req.getParameter("orderer");
		
		// getParameter()는 전달된 input 태그의 name이 하나일 때만 가능
		
		// -> 같은 name이 여러 개면 String[]으로 반환해주는
		//	  getParameterValues()를 사용하면 된다.
		
		String[] coffee = req.getParameterValues("coffee");
		// 체크박스에 체크된 메뉴들이 모두 배열에 담김
		// -> 체크가 안 되면 배열에 하나도 담기지 않음
		
		if(coffee != null) {
			
			// 향상된 for문 사용
			for(String c : coffee) {
				System.out.println(c);
			}
		}
		
System.out.println("주문자 : " + orderer);
		
		// HttpServletRequest : 클라이언트 정보 + 전달된 값
		// HttpServletResponse : 서버가 클라이언트에게 응답할 방법을 제공
		
		// Write : 서버가 클라이언트에게 쓰다 == 출력
		// resp.getWriter() : 서버가 클라이언트에게 응답할 수 있는
		//					  출력 전용 스트림을 얻어옴
		resp.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = resp.getWriter();
		
//		out.print("응답 되나?");
		
		// ** 스트림을 통해서 그냥 문자열을 내보내면 정상 출력되지 않는 문제 발생 **
		// 왜? 전달되는 응답 데이터가
		//     어떤 형식인지, 문자 인코딩은 어떤 건지를 지정해주지 않아서
		
		// ***********************************************************
		/* Dynamic Web project(동적 웹 프로젝트)
		 * 
		 * - 요청에 따라서 응답되는 화면 (HTML)을 실시간으로 만들어 내서(동적)
		 *   클라이언트에게 응답하는 프로젝트
		 */
		// ***********************************************************
		
		// HTML 코드를 자바(Servlet)에서 작성하여 
		// 클라이언트와 연결된 응답 출력용 스트림(out)을 이용해서 출력
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		
		out.println("<head>");
		out.println("<title>"+ orderer +"님의 주문 목록</title>");
		out.println("</head>");
		
		out.println("<body>");
		
		out.println("<ul>");
		if(coffee != null) {
			for(String c:coffee) {
				out.println("<li>"+ c +"</li>");
			}
		}
		out.println("</ul>");
		
		out.println("</body>");
		
		out.println("</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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>ServletProject1</display-name>
  
  <!-- 메인 페이지 목록 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
  <!-- ServletEx1 클래스를 Servlet으로 등록(자격 부여) -->
  <servlet>
  	<servlet-name>example1</servlet-name>
  	<!-- Servlet으로 등록하고자 하는 클래스 파일의 패키지명 + 클래스명 -->
  	<servlet-class>edu.kh.servlet.ServletEx1</servlet-class>
  </servlet>
  
  <!-- 요청 주소를 처리할 Servlet과 연결을 지정 -->
  <servlet-mapping>
  	<servlet-name>example1</servlet-name>
  	<url-pattern>/example1.do</url-pattern>
  </servlet-mapping>
  
  <!-- ============================================================ -->
  
  <!-- 클래스를 Servlet으로 등록하고 Servlet 이름 지정 -->
  <servlet>
  	<servlet-name>example2</servlet-name>
  	<servlet-class>edu.kh.servlet.ServletEx2</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>example2</servlet-name>
  	<url-pattern>/example2.do</url-pattern>
  </servlet-mapping>
</web-app>

profile
개발 일지

0개의 댓글