-
request, header - 22.06.09웹프로그래밍 2022. 6. 10. 00:15728x90
<오늘의 복습>

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'웹프로그래밍' 카테고리의 다른 글
Maven 설정환경-22.06.14 (0) 2022.06.14 인코딩, 학생 등록하기 예제 -22.06.10 (0) 2022.06.10 모델1 모델2 책임 분리, JSON, Header-22.06.07~22.06.08 (0) 2022.06.08 JQuery 보강-22.06.07 (0) 2022.06.07 모델1, 모델2 방식의 JSP -22.06.03 (0) 2022.06.03