YJ의 새벽

Servlet 이란?( Get, Post 방식 ) 본문

SelfStudy/Server ( Servlet , JSP )

Servlet 이란?( Get, Post 방식 )

YJDawn 2023. 3. 17. 20:20

 

 

 

  • Servlet 이란 ??

-- 동적 웹페이지를 만들때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술 !! 

-- 웹 서비스를 위한 자바 클래스  ( 자바를이용 웹을 만듬 )

--  웹 프로그래밍에서 클라이언트의 요청 (Request) 을 처리하고

       그 결과를 다시 클리이언트에게 응답 (Response) 하는 기술.

 

 

 

  • Servlet Container 

-- 포트 연결, 웹서버통신을위한 소켓, 입/출력 스트림을 생성하는 역할.

-- WAS ( Web Application Server )  가 Servlet container에 해당하면 대표적으로 Tomcat 이 있음.

    Tomcat  =  jsp , servlet 이 작동하게 만들어줌.

 

 

 

 

ex ))  < form action = "주소"  method="get" >  </form>

         < form action = "주소"  method="post" >  </form>

  • Get 과 Post 방식의 차이   :  클라이언트가 서버로 요청을 보내는 방법

--GET 방식  :  데이터를 가져오다, 얻어오다  (주소)   , 페이지 연결이 주 목적.

   - URL에 변수(데이터) 를 포함시켜 요청 .    

   - URL에 보이기때문에 보안이 좋지않다.   ( 캐싱 : 브라우저 히스토리에 남음 )

   - HTTP Header 에 포함하여 전송 .  Body 는 보통 빈 상태로 전송.

--POST 방식  :  데이터를 붙이다.     , 데이터 전달이 주 목적

   - 헤더필드중 Body 데이터를 설명하는 Content-Type 이라는 헤더필드가 들어가고

     어떤 데이터 타입인지 명시해주어야함.

   - 전송하는 길이 제한이없지만 , 페이지요청, 기다리는시간이 존재

   - URL에 노출되지않으므로 캐싱할수없음.

 

 

 

 

 

 

*** VSCode 에서 같은 워크스페이스로 html 을 만들자. 연동된다. 

 

 

 

 

-- form 태그 : 내부에 작성된 input 태그의 값을 지정된 경로(주소)의 서버 또는 페이지로 제출하는 역할.

 

-- input 태그 : 값을 입력하기 위한 입력 양식을 제공하는 태그.

                      제출시 input 태그 name = " key "  .

                                           입력된 값 :   value       ( Map 형식 )

 

 

 

 

 

 

 

 

 

 

  • GET 방식   ( doGet )

-- 요청하는 주소뒤에 전달하려는값을 key-value 형태로 붙여서 전달하는 방식.

--  ex  )   /ServletProject1 / example1.do ? inputName=홍길동 & inputAge=20

              /  프로젝트이름  /  서비스요청주소 ?  key = value  &  key = value  

                          ---> QueryString  이라 한다.

--장점 : 단순함, 캐싱가능 ( 요청주소저장 = 북마크, 즐겨찾기, 링크공유 )

             검색, 게시글, 뉴스 공유등 이용할때 좋음.

--단점 : 보안에 취약, 글자수 제한이 있다.

 

 

 

 

---------------------- GET 방식예제1  ))   HTML   ( index.html )

    <form action = "/ServletProject1/example1.do">
        <!-- 제출시 ServletProject1 프로젝트에 있는 /example1.do 라는 서비스를 요청한다. 
             요청시 내부에 작성된 input태그의 값도 같이 전달한다.   -->
        이름 : <input type="text" name="inputName">  <br>  
        나이 : <input type="number" name="inputAge">  
        <button type="submit">서버로 제출하기</button>
    </form>

 

 

---------------------- GET 방식예제1  ))   JAVA Class 

public class ServletEx1 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// HttpServletRequest : 클라이언트의 정보 + 요청 관련정보가 담긴 객체.
		// HttpServletResponse : 서버가 클라이언트에게 응답하는 방법을 제공하는 객체 .

		// 요청시 함께 전달된 input 태그 값(==파라미터)을 얻어오는 방법
		// req.getParameter("input태그의 name 속성값");
		// ** 얻어온 파라미터는 무조건 String **

		String inputName = req.getParameter("inputName");
		String inputAge = req.getParameter("inputAge");
		System.out.println(inputName + " / " + inputAge);

		// 문서 형식 + 문자 인코딩 지정
		// --> html 문서이고 , UTF-8 로 인코딩 되어있다.
		resp.setContentType("text/html; charset=UTF-8");
        
		// 서버가 클라이언트에게 응답할 수 있는 스트림 얻어오기
		PrintWriter out = resp.getWriter();
		out.print(inputName + "님의 나이는 " + inputAge + "세 입니다.");
	}
}

 

---------------------- GET 방식예제1  ))   web. xml

JAVA class 와 ,   index.html   을    web.xml   로 연결시켜주자.

	<!-- 특정 클래스를 Servlet으로 등록하고 이름을 지정하는 태그 . -->
	<servlet>
		<!-- 해당 Servlet을 부르기 위한 이름 지정 -->
		<servlet-name>ex1</servlet-name>
		
		<!-- Servlet으로 등록하고자 하는 클래스의 패키지명+클래스명 -->
		<servlet-class>edu.kh.servlet.controllor.ServletEx1</servlet-class>
	</servlet>
	
    
	<!-- 요청 주소를 처리할 Servlet을 지정 -->
	<servlet-mapping>
		<!-- 요청을 처리할 Servlet의 이름 -->
		<servlet-name>ex1</servlet-name>
		
		<!-- 요청 주소 작성 (앞 프로젝트명은 제외) -->
		<!-- [ServletProject1]  /example.do -->
		<url-pattern>/example1.do</url-pattern>
	</servlet-mapping>

 

html 값입력
html 값출력

 

 

 

 

 

 

 

 

 

 

 

 

---------------------- GET 방식예제2  ))   HTML   ( index.html )

    <form action="/ServletProject1/example2.do" method="get">
        주문자 : <input type="text" name="orderer"> <br>
        hot <input type="radio" name="type" value="hot">
        ice <input type="radio" name="type" value="ice">
        <br><br>
        <select name="coffee">
            <option>아메리카노</option>
            <option>카페라떼</option>
            <option>바닐라라떼</option>
            <option>초코프라푸치노</option>
            <option>카라멜마끼야또</option>
        </select>
        <br><br>
        옵션 : <br>
        1샷 추가 <input type="checkbox" name="opt" value="shot1">
        <br>
        2샷 추가 <input type="checkbox" name="opt" value="shot2">
        <br>
        두유변경 <input type="checkbox" name="opt" value="soymilk">
        <br><br>
        <button>주문하기</button>
    </form>

 

---------------------- GET 방식예제2  ))  JAVA Class  

// Servelt 코드작성위해서 HttpServlet 상속,
public class ServletEx2 extends HttpServlet {

	// Get 방식 요청을 처리하는 메서드
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// 전달된 input 태그값을 얻어와 변수에 저장.
		String orderer = req.getParameter("orderer");

		// radio 버튼은 1개만 선택가능 == 값1개만 서버로 제출
		String type = req.getParameter("type");

		// select 박스는 1개의 option 만 선택가능 == 값1개만 서버로 제출
		String coffee = req.getParameter("coffee");

		// checkbox같이 하나의 name에 여러값이 전달될경우
		// 1. req.getParameter() -> 첫번째값만 얻어옴 ( String )
		// 2. req.getParameterValues() -> 여러값 모두 얻어옴 ( String[] )
		// 값이 없으면 null
		String[] opt = req.getParameterValues("opt");

		System.out.println("주문내용을 정상적으로 전달받음");

		// 응답을 위해 준비해야하는것
		// 1) 문서형식 + 문자 인코딩 지정
		resp.setContentType("text/html; charset=UTF-8");

		// 2) 응답을 서버 -> 클라이언트 스트림 얻어오기
		PrintWriter out = resp.getWriter();

		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<title>" + orderer + "님의 주문 내역</title>");
		out.println("</head>");
		out.println("<body>");
		out.printf("<h3>주문자명 : %s</h3>\n", orderer);
		out.println("<h3>");
		out.println("주문한 메뉴 : ");
		if (type.equals("hot")) {
			out.println("따뜻한 ");
		} else {
			out.println("아이스 ");
		}
		out.println(coffee);
		out.println("</h3>");

		// 옵션이 있을 경우에만 출력
		if (opt != null) {
			out.println("<ul>");

			// 향상된 for문
			for (String o : opt) {
				String temp = "";

				switch (o) {
				case "shot1":
					temp = "1샷 추가";
					break;
				case "shot2":
					temp = "2샷 추가";
					break;
				case "softly":
					temp = "연하게";
					break;
				}
				out.printf("<li>%s</li>\n", temp);
			}
			out.println("</ul>");
		}
		out.println("</body>");
		out.println("</html>");
	}
}

 

---------------------- GET 방식예제1  ))   web. xml

	<servlet>
		<servlet-name>ex2</servlet-name>
		<servlet-class>edu.kh.servlet.controllor.ServletEx2</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>ex2</servlet-name>
		<url-pattern>/example2.do</url-pattern>
	</servlet-mapping>

 

값을 넣어주면
값을 받아온다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • POST 방식 !!      ( doPost )

-- POST방식 : GET 방식과는 다르게 주소뒤에 전달하는값이 붙는것이 아니라

                      HTTP Protocol 의 Body 부분에 숨겨져서 전달되는 방식.

-- 장점 : 길이제한 x  , 보안성 향상 (데이터가 직접적으로 보이지않음)

-- 단점 : 캐싱 불가능 , 추가적인 문자 인코딩 처리가 필요함.

 

-- POST 방식은 문자데이터가 깨질수 있다 .

--  왜 ?  브라우저, 서버간 문자 인코딩 차이때문에.

--  해결법 ?  요청 정보에 담긴 데이터의 문자 인코딩을 UTF-8 로 미리 변경.

        -->   req.setCharacterEncodin( "UTF-8" )

 

 

 

 

---------------------- POST 방식예제1  ))   HTML   ( index.html )

        <form action="/ServletProject1/signUp" method="post">
            아이디 : <input type="text" name="inputId"> <br>
            비밀번호 : <input type="password" name="inputPw"><br>
            비밀번호 확인 : <input type="password" name="inputPw"><br>
            
            이메일 : <input type="email" name="inputEmail"><br>
            이메일 수신동의(선택) : <input type="checkbox" name="agree"><br>
            <button>가입하기</button>
        </form>

 

---------------------- POST 방식예제1  ))  JAVA Class  

----  @ 어노테이션 이용.     web.xml 파일에 따로 작성하지않아도 ok

--- @Webservlet ( " 요청주소" )      , 이방식을 이용하자.

// @WebServlet ( "요청주소" )
// -- 해당클래스를 Servlet 으로 등록하고 , ( <servlet> )
//    어떤 요청주소 처리할지 지정      ( <servlet-mapping> )
//   -모든내용을 한번에 작성할수있는 어노테이션.
@WebServlet("/signUp")
public class ServletEx3 extends HttpServlet{
	
	// doPost() : Post 방식 요청을 처리하는 메서드
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
        //요청 정보에 담긴 데이터의 문자인코딩을 UTF-8 로 미리 변경.
		req.setCharacterEncoding("UTF-8");
		
		//파라미터 얻어와 변수에 저장
		String inputId = req.getParameter("inputId");
		String[] inputPw = req.getParameterValues("inputPw");
		String inputEmail = req.getParameter("inputEmail");
		String agree = req.getParameter("agree");
		
		System.out.println(inputId);
		System.out.println(inputPw[0]);
		System.out.println(inputPw[1]);
		System.out.println(inputEmail);
		System.out.println(agree);
		
		// 응답데이터 문서형식, 문자인코딩 지정
		resp.setContentType("text/html; charset=UTF-8");
		
		//응답용 스트림 얻어오기
		PrintWriter out = resp.getWriter();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head> <title> 회원 가입 결과 </title> </head>");
		
		out.println("<body>");
		
		if(inputPw[0].equals(inputPw[1])) { // 비밀번호가 같을 경우
			// 정상 가입한 경우에 대한 화면

			// user01님 환영 합니다.
			
			// 이메일 수신 동의 여부 : O / X
			// (동의 O인 경우)
			// 수신할 이메일 : user01@naver.com
			
			out.printf("<h3>%s님 환영합니다.</h3>", inputId);
			
			// checkbox는 별도의 value가 없을 때
			// 체크 O : "on"
			// 체크 X : null
			
			if(agree != null) {
				out.println("<h3>이메일 동의 수신 여부 : O</h3>");
				
				out.printf("<h3>수신할 이메일 : %s</h3>", inputEmail);
				
			} else {
				out.println("<h3>이메일 동의 수신 여부 : X</h3>");
			}
		} else {
			out.println("<h1 style='color:red;'>비밀번호가 일치하지 않습니다.</h1>");
		}
		out.println("</body>");
		out.println("</html>");
	}
}

 

 

 

 

 

 

 

 

 

'SelfStudy > Server ( Servlet , JSP )' 카테고리의 다른 글

Servlet( EL )  (0) 2023.03.21
Servlet vs JSP ( 차이점 )  (0) 2023.03.20
JSP (Java Server Pages) 란 ?  (0) 2023.03.20
오라클 포트:8080 다른걸로 바꾸기 !!  (0) 2023.03.17
이클립스와 톰캣 연동하기 !!  (0) 2023.03.17
Comments