ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • request, header - 22.06.09
    웹프로그래밍 2022. 6. 10. 00:15
    728x90

    <오늘의 복습>

     

     

    body에서 전달되는 파라미터에 대해 공부해보자

    => form 태그에 action이 없다면 현재 브라우저가 가지고 있는 주소가 사용됨


    Line

    인코딩된 것들이 Line에  들어가있음

    즉 편지 봉투에 담아져있고 이 특수문자는 누가해석?  이 데이터를 전달할 사람 바꿔말하면 우편배달부...

    즉 라인에 있냐 바디에 있느냐에 따라 해석방법이 달라짐 

    우리가 할필요 없음, 즉 서버가 해석하게됨

    header

    라인과 헤더만 가지고 get방식 하고있음


    <get>

    =>실은 크롬이 디코딩해줘서 보이는것임

    <post>

    =>바디에 데이터 들어가있음

    편지 봉투안에 편지가 숨어있고 편지안에 특수문자가 숨어있네 그걸 읽는 사람이 해석하게 되고 

    데이터가 바디에 우편배달부는 안열어봐 서버는 내용을 안읽어봐 즉 개발자가 해결을 해야하는것임


    getParameterMap() : 이름하나 벨류2개 들어가있을 수 있으므로 String[] 배열로 되어있는것이다.

    만약에 그냥  getParameter를 쓰면 처리해지는것이 모호해지고 어떤 데이터는 누락 될 수도...

    getParameterNames() : 파라미터 모든 이름을 컬렉션 뷰 형태로 가져올 수 있음 , 스레드 안전성 보장

    getParamterValues() : 모든데이터를 온전히 받을 수 있음, 몇개의 데이터가 오는지 모르는 상황일때 사용함.

     

    <%@page import="java.util.Map"%>
    <%@page import="java.util.Arrays"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>06/parameterDesc.jsp</title>
    </head>
    <body>
    <h4>요청 파라미터 전달 방식과 사용 방법</h4>
    <form method="post" >
    	<input type="text" name="param1" value="value1"/>
    	<input type="text" name="param1" value="value2"/>
    	<input type="number" name="param2" value="234"/>
    	<input type="text" name="param3" value="한글파라미터"/>
    	<input type="submit" value="전송"/>
    </form>
    <%	
    	
    	Map<String,String[]> parameyerMap = request.getParameterMap();
    	if(parameyerMap.size()>0){
    %>
    <pre>
    	param1 :<%=Arrays.toString(request.getParameterValues("param1")) %>	
    	param2 :<%=Integer.parseInt(request.getParameter("param2"))%>
    	param3 :<%=request.getParameter("param3") %>
    </pre>
    <%
    	}
    %>
    </body>
    </html>


    <post , 개발자가 직접 인코딩작업>

    <%@page import="java.util.Map"%>
    <%@page import="java.util.Arrays"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>06/parameterDesc.jsp</title>
    </head>
    <body>
    <h4>요청 파라미터 전달 방식과 사용 방법</h4>
    <form method="post" >
    	<input type="text" name="param1" value="value1"/>
    	<input type="text" name="param1" value="value2"/>
    	<input type="number" name="param2" value="234"/>
    	<input type="text" name="param3" value="한글파라미터"/>
    	<input type="submit" value="전송"/>
    </form>
    <%	
    	request.setCharacterEncoding("UTF-8");
    	Map<String,String[]> parameyerMap = request.getParameterMap();
    	if(parameyerMap.size()>0){
    %>
    <pre>
    	param1 :<%=Arrays.toString(request.getParameterValues("param1")) %>	
    	param2 :<%=Integer.parseInt(request.getParameter("param2"))%>
    	param3 :<%=request.getParameter("param3") %>
    </pre>
    <%
    	}
    %>
    </body>
    </html>

    =>바디가 있을 때만 사용해라~


    <get 일때>

    =>톰켓이 먼저 처리해서 한글 제대로 나옴 

    8.0대라서 가능한것임 

     

    ->7.0버전 찾아서 apply

    그다음 server view에서 ctrl+N 서버 찾고 추가 

    port 번호 바꿔주기

    <post>

    톰켓7.0 에서 post 잘됨 (인코딩 처리 해줬으니..)

    <get>

    톰켓7.0의 get은 깨짐

     

    그래서 7.0버전에 추가해주기  8.0버전은 사실 기본값으로 가지고 있었기에..

    => connector가 제일먼저 포장지를 뜯어보니까 여기에 인코딩해준것임


    =>server.xml에 해줘서 될거같았는데 안됨

    바디가 있을때는 무조건 request.setCharacterEncoding("UTF-8"); 처리해줘야함

     

    중요 -라인,바디 누가먼저 데이터 접근하는지에 따라 먼저 접근하는 애가 해석을 해줘야한다.

     

    utf-8만 처리 좀더 유연하게 바꿔보자 


    무조건 한글처리하고자 하면 request.setCharacterEncoding("UTF-8");이렇게

    메소드에 상관없이 통일화 됨 

    왜? 아까 처리해준거 때문에 => useBodyEncodingForURI="true" (라인에 있는 특수문자를 해석하는것이 나중에 해석이 되기에 get이어도 body에 설정이 적용되는원리)

     

    서버는 이전체를 해석하지않고 즉  쿼리 리퀘스트 빼고 해석하고 나중에  파라미터맵만들어질때 해석하게 됨


    메소드에 상관업싱 통일화 된다.

    => 8.0톰켓도 바꿔주기 그러면 get방식일때도 

    =>이것을 사용할 수 있게됨

     

    만약에 데이터가 깨지는현상이 발생했을경우 

    1.메소드뭔지get,post일때 깨지는지 파악 

    그러면 post라면 request.setCharacterEncoding("UTF-8"); 이거 잘 넣어줘

    get이라면 일단 먼저 설정(request.setCharacterEncoding("UTF-8");) 넣어봐 근데 안돼.... 그러면 그때 서버 설정확인해보자 

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>05/requestDesc.jsp</title>
    </head>
    <body>
    <h4>HTTP 요청 (command) 패키징 방식</h4>
    <form method="get">
    	<!--<input type="hidden" name="_method" value="PUT">  -->
    	<input type="text" name="param" value="TEST">
    	<input type="submit"  value="전송">
    </form>
    <pre>
    	1.Request Line : Protocol/version URL Method
    	  Request Method (Http Method) : 요청의 목적, 요청의 포장 방식(body 생성 여부 결정)
          1)GET     (R) -서버의 데이터 조회
          2)POST    (C) -서버쪽에 새로운 데이터 생성
          3)PUT     (U) -수정(바디 필요할수도 없을 수도)
          4)DELETE  (D) -삭제(바디 필요할수도 없을 수도)
          5)OPTION : 서버가 현재 method를 지원하는지 여부를 확인하는 preFlight 요청에 사용되는 메소드.
          6)HEAD : 응답데이터를 body가 없는 메타 데이터만 받기 위한 요청에 사용.
          7)TRACE : 서버를 트래킹해서 디버깅하는 경우 사용.
          
    	2.Request Header : client에 대한 부가 정보(meta data)
    	3.Request Body(Message Body, Content Body) : 클라이언트가 서버로 전송하는 컨텐츠(내용)
    	   method 가 Post인 경우에만, 한정적으로 생성되는 영역.
    	   **method가 GET인 경우, 모든 데이터는 Request line을 통해  Query String(**)의 형태로 전송됨
    	   
    	HttpServletRequest request -http 프로토콜로 패키징된 요청에 관한 모든 정보를 캡슐화한 객체;
    	line - <%=request.getProtocol() %> <%=request.getMethod() %>
    			<%=request.getRequestURI() %>
    			<%=request.getRequestURL() %>
    	header - <%=request.getHeaderNames() %>
    	body- <%=request.getInputStream().available()%>
    </pre>
    </body>
    </html>

    <form method="post"> 일때

    <form method="post" >만 있을 때

    <form method="post" enctype="multipart/form-data"> 있을 때

    바디안 데이터 못꺼냄 왜

    =>이렇게 변해버려서 getprarmter사용 못함 

    경계선 문자를 통해서 복원 멀티파트이므로 쪼개져 있는것임 당연히 서버에서 파라미터가 아니라 파트를 꺼내는 작업이필요함 

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>05/requestDesc.jsp</title>
    </head>
    <body>
    <h4>HTTP 요청 (command) 패키징 방식</h4>
    <form method="post" enctype="multipart/form-data">
    	<!--<input type="hidden" name="_method" value="PUT">  -->
    	<input type="text" name="param" value="TEST">
    	<input type="submit"  value="전송">
    </form>
    <pre>
    	1.Request Line : Protocol/version URL Method
    	  Request Method (Http Method) : 요청의 목적, 요청의 포장 방식(body 생성 여부 결정)
          1)GET     (R) -서버의 데이터 조회
          2)POST    (C) -서버쪽에 새로운 데이터 생성
          3)PUT     (U) -수정(바디 필요할수도 없을 수도)
          4)DELETE  (D) -삭제(바디 필요할수도 없을 수도)
          5)OPTION : 서버가 현재 method를 지원하는지 여부를 확인하는 preFlight 요청에 사용되는 메소드.
          6)HEAD : 응답데이터를 body가 없는 메타 데이터만 받기 위한 요청에 사용.
          7)TRACE : 서버를 트래킹해서 디버깅하는 경우 사용.
          
    	2.Request Header : client에 대한 부가 정보(meta data)
    	3.Request Body(Message Body, Content Body) : 클라이언트가 서버로 전송하는 컨텐츠(내용)
    	   method 가 Post인 경우에만, 한정적으로 생성되는 영역.
    	   **method가 GET인 경우, 모든 데이터는 Request line을 통해  Query String(**)의 형태로 전송됨
    	   
    	HttpServletRequest request -http 프로토콜로 패키징된 요청에 관한 모든 정보를 캡슐화한 객체;
    	line - <%=request.getProtocol() %> <%=request.getMethod() %>
    			<%=request.getRequestURI() %>
    			<%=request.getRequestURL() %>
    	header - <%=request.getHeaderNames() %>
    	파라미터 데이터??? <%=request.getParameter("param") %>
    	파트 데이터 ??? <%=request.getPart("param") %>
    	body- <%=request.getInputStream().available()%>
    	
    	클라이언트가 입력한 데이터가 파라미터 형태로 전달되는 경우,
    	-> getParameter 계열의 메소드를 사용함.
    	클라이언트가 입력한 데이터가 파트의 형태로 전달되는 경우,
    	-> getPart 계열 메소드 사용 
    	
    </pre>
    </body>
    </html>

     


    <ParameterDexServlet.java>

    package kr.or.ddit.servlet05;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/05/parameterDesc.do")
    @MultipartConfig
    public class ParameterDescServlet extends HttpServlet {
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println(req.getProtocol()               );
    	      System.out.println(req.getMethod()                 );
    	      System.out.println(req.getRequestURI()             );
    	      System.out.println(req.getRequestURL()             );
    	      System.out.println(req.getHeaderNames()            );
    	      System.out.println("파라미터:" +req.getParameter("param")       );
    	      System.out.println("파트:" +req.getPart("param")            );
    	      System.out.println(req.getInputStream().available());
    	}
    }

    <requestDesc.jsp>

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>05/requestDesc.jsp</title>
    </head>
    <body>
    <h4>HTTP 요청 (command) 패키징 방식</h4>
    <form action="parameterDesc.do" method="post" enctype="multipart/form-data">
    	<!--<input type="hidden" name="_method" value="PUT">  -->
    	<input type="text" name="param" value="TEST">
    	<input type="submit"  value="전송">
    </form>
    <pre>
    	1.Request Line : Protocol/version URL Method
    	  Request Method (Http Method) : 요청의 목적, 요청의 포장 방식(body 생성 여부 결정)
          1)GET     (R) -서버의 데이터 조회
          2)POST    (C) -서버쪽에 새로운 데이터 생성
          3)PUT     (U) -수정(바디 필요할수도 없을 수도)
          4)DELETE  (D) -삭제(바디 필요할수도 없을 수도)
          5)OPTION : 서버가 현재 method를 지원하는지 여부를 확인하는 preFlight 요청에 사용되는 메소드.
          6)HEAD : 응답데이터를 body가 없는 메타 데이터만 받기 위한 요청에 사용.
          7)TRACE : 서버를 트래킹해서 디버깅하는 경우 사용.
          
    	2.Request Header : client에 대한 부가 정보(meta data)
    	3.Request Body(Message Body, Content Body) : 클라이언트가 서버로 전송하는 컨텐츠(내용)
    	   method 가 Post인 경우에만, 한정적으로 생성되는 영역.
    	   **method가 GET인 경우, 모든 데이터는 Request line을 통해  Query String(**)의 형태로 전송됨
    	   
    	HttpServletRequest request -http 프로토콜로 패키징된 요청에 관한 모든 정보를 캡슐화한 객체;
    	line - <%=request.getProtocol() %> <%=request.getMethod() %>
    			<%=request.getRequestURI() %>
    			<%=request.getRequestURL() %>
    	header - <%=request.getHeaderNames() %>
    	파라미터 데이터??? <%=request.getParameter("param") %>
    	<%-- 파트 데이터 ??? <%=request.getPart("param") %> --%>
    	body- <%=request.getInputStream().available()%>
    	
    	
    	클라이언트가 입력한 데이터가 파라미터 형태로 전달되는 경우(enctype="application/x-www-form-urlencoded"),
    	-> getParameter 계열의 메소드를 사용함.모든 파라미터가 Map(getParameterMap사용)의 형태로 관리됨. 
    	클라이언트가 입력한 데이터가 파트의 형태로 전달되는 경우(enctype="multipart/form-data|multipart.mixed"),
    	-> getPart 계열 메소드 사용  
    	
    </pre>
    </body>
    </html>
        클라이언트가 입력한 데이터가 파라미터 형태로 전달되는 경우(enctype="application/x-www-form-urlencoded"),
    	-> getParameter 계열의 메소드를 사용함.
    	클라이언트가 입력한 데이터가 파트의 형태로 전달되는 경우(enctype="multipart/form-data|multipart.mixed"),
    	-> getPart 계열 메소드 사용

     

    728x90
Designed by Tistory.