01_Get type

김정욱·2023년 3월 17일
0

Server 복습

목록 보기
1/13
post-thumbnail

Get 방식의 요청 및 응답

✔️ VS code로 Servlet 작업하는 폴더를 오픈하여 html 파일 생성
✔️ index 또는 default라는 이름이 붙은 html, jsp 파일은 메인페이지 역할을 한다

✔️ 이름과 나이를 입력 받아 서버(Java쪽으로 )로 전달(제출)
 - form 태그 : 내부에 작성된 input 태그의 값을 지정된 경로(주소)의 서버 또는 
			  페이지로 제출하는 역할 ➡️ 제출 == 클라이언트 요청

 - input 태그 : 값을 입력하기 위한 입력 양식을 제공하는 태그 제출시
			   input 태그의 name 속성 값이 key
			   입력된 값이 value (Map 형식)
✔️ Get 방식 : 요청하는 주소 뒤에 전달하려는 값을 key=value 형태로 붙여서 전달하는 방식

✔️ /ServletProject1/example1.do?inputName=홍길동&inputAge=20
   / 프로젝트 이름   / 서비스 요청 주소? key=value&key=value...
   ➡️ 전달하려는 값이 작성된 문자열 : QueryString

✔️ 장점 : 단순함, 주소창에 값을 임의로 작성할 수 있다.
		  캐싱 가능(요청 주소 저장 == 북마크, 증겨찾기, 링크 공유)

✔️ 단점 : 보안에 취약하다. 글자수 제한이 있다.

💡 검색, 게시글, 뉴스 공유 등을 이용할 때 용이하다.

이름 나이 출력하기

1) index.html 생성하기

<!-- action속성 : 제출할 서버 또는 페이지 경로(주소)를 작성하는 속성 -->
<!-- 
	http://192.168.40.3:8000 : 
	프로토콜, IP, Port -> 서버컴퓨터의 배포된 웹앱 위치(고정)

	/ServletProject1/ + 요청할 서비스 주소 : 클라이언트 서비스 요청
	(자바에서 만든 Dynamic Web Project 이름)
-->

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

2) Java 코드 짜기

[코드 작성]
public class ServletEx1 extends HttpServlet{
// HttpServlet을 상속 받아서 사용한다.

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

	// 요청 시 함께 전달된 input 태그의 값(==Parameter)을 얻어오는 방법
	// req.getParameter("input태그의 name속성 값");
	// ➡️ String 형태로 입력된 값 반환
	// ** 얻어온 파라미터는 무조건 String **
	String inputName = req.getParameter("inputName");
	String inputAge = req.getParameter("inputAge");

	// resp.getWriter() : 서버가 클라이언트에게 응답할 수 있는 스트림을 얻어옴
	// ➡️ PrintWriter : 출력 전용 스트림	

	// ➡️ html 문서이고 문자는 UTF-8 형식으로 인코딩 되어있다.
	// ➡️➡️ 브라우저에 해당하는 내용에 맞게 해석
	resp.setContentType("text/html; charset=UTF-8");
	PrintWriter out = resp.getWriter();
	out.print(inputName +"님의 나이는" + inputAge + "세 입니다");
[web.xml 작성하기]
<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>
<!-- 위의 순서대로 메인페이지를 찾는다 -->

<!-- 특정 클래스를 Servlet으로 등록하고 이름을 지정하는 태그 -->
<servlet>
  <!-- 해당 Servlet을 부르기 위한 이름 지정 -->
  <servlet-name>ex1</servlet-name>

  <!-- Servlet으로 등록하고자 하는 클래스의 패키지명 + 클래스명 -->
  <servlet-class>edu.kh.servlet.controller.ServletEx1</servlet-class>
</servlet>

<!-- 요청 주소를 처리할 Servlet을 지정 -->
<servlet-mapping>
  <!-- 요청을 처리할 Servlet의 이름 -->
  <servlet-name>ex1</servlet-name>

  <!-- 요청 주소 작성(앞에 프로젝트명까지는 제외) -->
  <!-- [/ServletProject1] (제외) / example1.do -->
  <url-pattern>/example1.do</url-pattern>
</servlet-mapping>



카페 주문 페이지 만들기

1) index.html 생성하기

<!-- method 속성 : 데이터 전달 방식 지정 속성 -->
<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>
 
  커피 : 
  <select name="coffe">
    <option>아메리카노</option>
    <option>카페라떼</option>
    <option>초코칩프라페</option>
    <option>카푸치노</option>
  </select>

  옵션 : <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="softly">
 
  <br><br>
  <button>주문하기</button>
</form>
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();

        // HTML 코드를 응답용 스트림을 이용해서 출력 -> HTML 코드로 해석되서 보여진다
        // (HTML, CSS, JS 등 브라우저가 해석할 수 있는 코드는 모두 해석되어 보여진다)

  		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>");
	
		
		/* Dynamic Web Project(동적 웹 프로젝트, 동적 웹 애플리케이션)
		 * 
		 * - 요청에 따라서 응답되는 화면(HTML)을 
		 *   실시간으로 만들어내서 (동적)
		 *   클라이언트에게 응답하는 프로젝트
		 */
[web.xml 작성하기]
<!-- example2.do 요청에 대한 Servlet 연결 -->
<servlet>
  <servlet-name>ex2</servlet-name>
  <servlet-class>edu.kh.servlet.controller.ServletEx2</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>ex2</servlet-name>
  <url-pattern>/example2.do</url-pattern>
</servlet-mapping>

profile
절박한 마음을 갖고 하루를 보내자!!

0개의 댓글