-
질의 문자열(Query String)Servlet 2019. 2. 21. 13:06
질의 문자열은 클라이언트가 우베서버에 서비스르 요청할때 추가로 전달하는 데이터를 의미 검색사이트에서
검색어를 입력하거나 개인정보를 입력하여 등록하는 등 질이 문자열을 활용해서 웹서버와 클라이언트가 상호작용한다.
우리가 클라이언트 즉 웹 브라우저에서 직법요청하는 파일은 모두 GET 방식으로 간주한다.
GET방식에는 몇가지 제한이 있어서 이를 보완하기 위한방식이 POST 방식
질의 문자열이란?
웹서버에 정보를 요청할때 정해진방식으로 전달하는 데 이때 사용하는 문자열을 질의 문자열이라한다.
대부분 from 태그를 통해 질의 문자열을 전달받음
질의 문자열 전송규칙
클라이언트에서 서버로 질의 문자열들 전달될때의 특성그대로 전달되는 것이 아니라 인코딩 되서 전달됨이 규칙은 요청방식과 관계없이 동일하게 전달됨.질의 문자열이 클라이언트 쪽에서 네트워크를 통해 서버로 전달될 때 다음과 같은 규칙이 있다.1.name = value 형식으로 전달되며, 여러개의 name = value 쌍이 있을때는 &를 구분자로 사용한다.예)id=guset&name=Army질의 문자열들이 서버로 전달 될때는 사용자가 입력한 값만 전달되는 것이 아니라 항상 name= value 형태의 쌍이 만들어져서 전달됨.여기서 value는 사용자가 입력하거 선택하는 값이다.name 은 개발자가 프로그램을 구현 할때 정해진다.대소문자를 구분하므로 주의2.영문자, 숫자, 일부 특수문자는 그대로 전달되고 , 이를 제외한 나머지 문자는 %기호와 함깨 16진수로 바뀌어 전달된다.예)id=guest&name%C8%AB%E6%BF3.공백 문자는 +기호로 변경되어 전달된다.예)id=guest&name=Jhon+SmithURL에는 공백을 포함할수 없는 특성이 있어서 +로 대체HTML 입력양식<form> 태그<form action="서버프로그램 경로" method="요청 방식">action: <from>태그 사이에 입력한 질의 문자열들을 전달받아 처리할 프로그램을 지정한다.action속성으로 지정할 수있는 서버측 프로그램으로 서블릿이나 JSP가 있는데 해당 프로그램이 있는 서버의 경로를 지정한다.method: method 속성값으로 GET 이나 POST 등을 지정 할 수 있다. 다른 값도 더 있지만 일반적으로 GET과 POST를 사용한다.method 속성값은 클라이언트가 서버프로그램을 어떠한 방식으로 요청할지 지정한다.HTML 태그 사용시 주의사항1. 태그의 속성값은 대소문자를 구분한다.2. HTML 태그의 속성값은 ""를 사용한다.3. 태그의 시작과 끝의 짝을 맞춘다.1234567891011121314151617181920212223242526272829303132333435<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><h3>회원정보</h3><form action="queryTest">ID : <input type="text" name="id"/><br>비밀번호 : <input type="password" name="pwd"/><br>취미 :<input type="checkbox" name="hobby" value="climbing">등산<input type="checkbox" name="hobby" value="sports">운동<input type="checkbox" name="hobby" value="reading">독서<input type="checkbox" name="hobby" value="traveling">여행<br>성별 :<input type="radio" name="gender" value="male">남자<input type="radio" name="gender" value="female">여자<br>종교 :<select name="religion"><option value="chris">기독교<option value="buddi">불교<option value="catholic">천주교<option value="atheism">무교</select><br>자기소개:<br><textarea rows="10" cols="30" name="introdution"></textarea><br><input type="submit" value="전송"><input type="reset" value="지우기"></form></body></html>cs 요청방식에 따른 처리
GET 방식으로처리
GET 방식은 255바이트 미만이고 외부에 노출되어도 상관 없는 데이터를 전달할때 적합한 요청 방식GET 방식은 질의 문자열이 URI에 포함되어 전달되므로질의 문자열들을 인코딩/디코딩하는 추가작업이 필요없어서 처리속도면에서 빠르다는 장점이 있다.GET 요청방식의 특성을 요약1.전달되는 질의 문자열이 요청 헤더의 URI에 추가되어 전달된다.2. 전달되는 질의 문자열이 내용이 외무에 노출3. 전달되는 질의 문자열의 길이가 제한적4. 전달되는 질의 문자열이 인코딩/디코딩 작업이 필요없어서 처리속도가 빠름5. 전달되는 질의 문자열을 직접 URI추가 할수 있다.GET방식으로 요청되는 상황
1. <a>태그를 틀릭하여 요창하는 경우2. 브라우저 주소줄에 URL을 입력하는 경우3.<form>태그에서 method속성을 생략하는 경우POST방식으로 처리
POST방식의 요청방식은 다음과 같은 특성이 있다.1. 전달되는 질의 문자열이 요청정보의 몸체에 포함되지 않는다.2. 전달되느 질의 무낮열이 외부에 노출되지 않는다.3. 전달되는 질의 문자열의 길의 제한이없다.4. <form>태그를 사용해야만 요청할 수 있다.요청방식의 목적에 맞게 사용
GET는 서베의 데이터를 단순히 데이터를 가져오는 작업을 수행하기 위한 방식단순히 선택해서 추출하는 작업을 위한방식POST는 서버의 데이터값 수정이나 상태 변화를 일으키는 방식예 )게시판 글조회는 GET방식글쓰고 수정 삭제는 POST방식으로 처리게시판에 새글을 쓰는 방식이라면 PUT방식 기존의 글을 수정하는 작업이면 POST 방식글을 삭제하는 작업은 DELETE방식으로 처리해야함서블릿 작성
클라이언트가 보낸 정보를 서버에서 추출1234567891011121314151617181920212223242526272829303132333435363738package com.edu.test;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/queryTest")public class QueryTestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF=8");PrintWriter out = resp.getWriter();out.print("<html><head><title>Query 문자열 테스트 </title></head>");out.print("<body>");out.print("<h1> GET방식으로 요청되었습니다</h1>");out.println("</body></html>");out.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF=8");PrintWriter out = resp.getWriter();out.print("<html><head><title>Query 문자열 테스트 </title></head>");out.print("<body>");out.print("<h1> POST방식으로 요청되었습니다</h1>");out.println("</body></html>");out.close();}}cs 각각 요청시 다르게 나온다 .질의 문자열 추출
클라이언트로 전달된 질의 문자열을 서블릿에서 추출한다.HttpServletRequest를 통해 추출1. String getParameter(String name)
이 메소드는 질의 문자열로 넘어온 값을 하나씩 추출할때 사용하는데 , name에서 값이 중복되지 않고 유일할때 사용한다.반환 타입이 String 이므로 숫자라면 int변환이 필요2. String[] getParameterValues(String name)
이 메소드는 여러개 변수가 전달되었을때 한버에 모든값을 추출하여 String 배열로 받고 싶을때 사용input type="checkbox"에 사용한다.3. String getQueryString()
이 메소드는 클라이언트가 전달한 질의 문자열을 하나의 String으로 추출한다.
그리고 GET방식의 요청에만 사용이 가능함
GET방식의 ? 다음에 나오는 문자열을 추출
4. ServletInputStream getInputStream() throws IOException
이 메소드는 HTTP 요청정보 몸체와 연결된 입력 스트림을 생성하여 반환한다.
getQueryString과 같은 작업을 POST방식에서 처리하고자 할때 입력스트림을 반환받은다음ServletInputStream의 readLine( ) 메소드를 사용하면 된다.실습1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950package com.edu.test;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/queryTest")public class QueryTestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String query=req.getQueryString();resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();out.print("<html><head><title>Query 문자열 테스트 </title></head>");out.print("<body>");out.print("<h1> GET방식으로 요청되었습니다</h1>");out.print("<h1> 쿼리 스트링</h1> :"+query);out.println("</body></html>");out.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletInputStream in=req.getInputStream();int len = req.getContentLength();byte[] buf = new byte[len];in.readLine(buf, 0, len);String s = new String(buf);resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();out.print("<html><head><title>Query 문자열 테스트 </title></head>");out.print("<body>");out.print("<h1> POST방식으로 요청되었습니다</h1>");out.print("<h1>전체 문자열 : </h1>"+s);out.println("</body></html>");out.close();}}cs member로 요청시 쿼리 스트링이 나타난다.한글처리
post 방식 - 서블릿에 setCharacterIncoding()메소드 사용get 방식 : 클라이언트가 입력하는 질의 문자열의 인코딩코드와 서버에서 처리하는 URI인코딩코드를 맞춰야한다.1. 클라이언트가 입력하는 문자코드- <meta charset="UTF-8"> 태그를 사용한다.이클립스라면 window preferences web HTML Files 에서 문자코드 지정여러타입으로 된 문서의 인코딩을 한번에 설저하려면Preferences General ContentType Text 선택후Default encoding 에 원하는 문자코드 입력후 OK 를 누름2. 서버에서 URI를 인코딩하는 문자코드는 무엇인가?톰캣 8버전에는 UTF-8이 기본값으로 적용됨URI문자코드를 지정하고 싶다면server.xml 파일에 인코딩 문자코드를 설정한다.servers하위의 server.xml선택source모드<Connector 태그>태그에 URIEncoding="UTF-8">속성을 추가한다.'Servlet' 카테고리의 다른 글
JSP프로그래밍 (0) 2019.03.02 상태정보 유지 기술 (0) 2019.02.25 서블릿 디렉터리를 WEB-INF/classes 로지정하는 이유 (0) 2019.02.21 요청정보와 응답정보 (0) 2019.02.20 서블릿 구현및 실행 (0) 2019.02.20