서블릿의 역할
1) 요청 받기 : HTTP method 요청에 따른 parameter로 전달 받은 데이터 꺼내오기
2) 비즈니스 로직 처리 : DB 접속과 CRUD에 대한 로직 처리
3) 응답하기 : 문자열로 동적인 웹(HTML 태그) 페이지를 만들어서 스트림을 이용해서 내보내기
서블릿 매개변수 객체
HttpServletRequest
: HTTP Servlets을 위한 요청정보(request informaiton)를 제공 메소드 지정
메소드명 | 내용 |
getParameter(String) | client가 보내준 값이 저장된 명칭이 매개변수와 같은 명칭에 저장된 값을 불러오는 매소드 |
getParameterNames() | client가 보내준 값을 저장한 명칭(key)을 불러오는 메소드 |
getParameterValues(String) | client가 보내준 값이 여러개일 경우 그 값을 배열로 불러오는 메소드 (key제외) |
getParameterMap() | client가 보내준 값이 전체를 Map방식으로 불러오는 메소드 |
setAttribute(String.object) | request객체에 전달하고 싶은 값을 String 이름으로 Object타입으로 저장하는 메소드 ex) request.setAttribute("객체명", 객체); key와 value형식으로 전달 |
getAttribute(String) | 매개변수와 동일한 객체 속상값을 불러오는 메소드 ex) request.getAttribute("객체") |
removeAttibute(String) | request객체에 저장되어 매개변수와 동일한 속성값을 삭제하는 메소드 |
setCharacterEncoding(String) | 전송받은 reques객체의 값들의 CharaterSet을 설정해주는 메소드 ex) request.setCharacterEncoding("UTF-8"); |
getRequestDispatcher(String) | 컨데이너내에서 request, response객체를 전송하여 처리할 컨포넌트(jsp 파일 등)를 불러오는 메소드로 forward()메소드와 같이 사용 |
HttpServletResponse
: 요청에 대한 처리결과를 작성하지 위해 사용하는 객체
메소드명 | 내용 |
setContentType(String) | 응답으로 작성하는 페이지의 MIME type을 정하는 메소드 ex) setContentType("text/html"); setContentType("text/plain"); |
setCharacterEncoding(String) | 응답하는 데이터의 characterSet을 지정해주는 메소드 |
getWriter() | 문자를 페이지에 전송을 위한 Stream을 가져오는 메소드 |
getOutputStream() | byte단위로 페이지에 전송을 위한 Stream을 가져오는 메소드 |
sendResdirect(String) | client가 매개변수의 페이지를 다시 서버에 요청하게 하는 메소드 |
사용자 데이터 전송방식
1) get방식
URL창 ? 뒤에 데이터를 입력하는 방법(쿼리스트링)으로 보냄
데이터가 여러 개일 경우 &로 묶어서 보냄
데이터 검색에 많이 사용
데이터 크기 한계, 보안에 취약
HTML에서 a태그의 링크로 연결하거나, method = "get" 로 작성
2) post방식
HTTP헤더의 내용으로 보내는 방식으로 데이터 크기에 제한이 없고, 헤더에 포함되어 보안이 뛰어남
mehtod = "post"로 작성
서블릿 메소드
doGet()
: client에서 데이터를 get방식으로 전송하게 되면 호출되는 메소드
@WebServlet("/querystring") 매핑설정
public class QueryStringTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
GET 요청은 doGET() 메소드를 호출하여 request, response를 전달함.
HttpServletRequest는 요청 시 전달한 값을 getParameter() 메소드로 추출해올 수 있음
태그의 값은 HashMap 형태여서 원하는 값을 찾기 위해서는 key 역할을 하는 문자열이 필요하기 때문에
인자로는 태그에 지정한 name 속성의 값을 문자열 형태로 전달해주어야 함
String name = request.getParameter("name");
String gender = request.getParameter("gender");
String national = request.getParameter("national");
}
}
getParameger()는 리턴 타입이 문자열 형태이기 때문에 문자열 외의 값은 parsing 처리가 필요함
숫자 값 parsing
int age= Integer.parseInt(request.getParameter("age"));
System.out.println("나이 : " + age);
java.sql.Date 타입으로 날짜 데이터 parsing
java.sql.Date birthday = java.sql.Date.valueOf(request.getParameter("birthday"));
System.out.println("생일 : " + birthday)
checkbox 태그
: 다중 입력 될 수 있기 때문에 선택 된 값이 문자열 배열로 전달 되어 getParameterValues() 메소드를 이용해야 함.
String[] hobbies = request.getParameterValues("hobbies");
for(String hobby : hobbies) {
System.out.println("취미 : " + hobby);
}
doPost()
: client에서 데이터를 Post방식으로 전송하게 되면 호출되는 메소드
parameter를 꺼내기 전에 인코딩 방식이 UTF-8임을 setCharacterEncoding() 으로 지정 (한글 깨짐 현상 방지)
@WebServlet("/formdata")
public class FormDataTestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
인코팅 방식 작성
request.setCharacterEncoding("UTF-8");
get 방식으로 꺼내기(doget과 동일)
String name = request.getParameter("name");
모든 데이터의 key를 이용하여 전송 된 값들을 일괄 처리 할 수 있음
Map<String, String[]> requesMap = request.getParameterMap();
Set<String>keySet = requesMap.keySet();
Iterator<String>keyIter = keySet.iterator();
while(keyIter.hasNext()) {
String key = keyIter.next();
String[] value = requesMap.get(key);
System.out.println("key : " + key);
for(String val : value) {
System.out.println("value: " + val);
}
}
getParameterNames()를 이용하여 파라미터로 전달 된 키 목록만 확인 가능
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
System.out.println(names.nextElement());
}
}
}
응답하기
사용자 브라우저에 응답하기 위해 HttpServletResponse가 가지는 getWriter()메소드로 PrintWriter 인스턴스를 반환받는다
@WebServlet("/response")
public class ResponseTestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
response.setContentType("text/html; charset=UTF-8"); 인코딩 지정
PrintWriter out = response.getWriter(); getWriter()
문자열을 이용해서 사용자에게 재보내기할 페이지 작성
StringBuilder responseBuilder = new StringBuilder();
esponseBuilder.append("<!doctype html>\n")
.append("<html>\n")
.append("<head>\n")
.append("</head>\n")
.append("<body>\n")
.append("<h1>안뇽~~~" + name + "</h1>\n")
.append("</body>\n")
.append("</html>");
스트림을 이용해 내보내기
out.print(responseBuilder.toString());
버퍼에 잔류한 데이터를 강제로 내보내기
out.flush();
스트림 닫기
out.close();
}
}
request header 출력
@WebServlet("/headers")
public class HeaderPrintServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
getHeaderNames(); -> 헤더안에 들어있는 여러가지 정보들의 키값을 반환
Enumeration<String> headerName = request.getHeaderNames();
while(headerName.hasMoreElements()){요소가 있나요? 있으면 다음 요소를 반환
System.out.println(headerName.nextElement());
}
request.getHeader()에 name 값(key 값)을 전달해서 value 값을 가져올 수 있음
System.out.println("accept : " + request.getHeader("accept"));
헤더 정보 추가 설정(출력 전에 설정)
response.setHeader("Refresh", "1"); refresh 헤더를 1로 설정 1초마다 값 변경됨
문자를 출력할 수 있는 스트림
PrintWriter out = response.getWriter();
초단위로 현재시간 반환
long currentTime = System.currentTimeMillis();
out.print("<h1>" + currentTime +"</h1>");
out.flush();
out.close();
}
}
response header출력
헤더들의 키값을 가져온다
Collection<String> responseHeaders = response.getHeaderNames();
Iterator<String> iter = responseHeaders.iterator();
while(iter.hasNext()) {
String headerName1 = iter.next();
System.out.println(headerName1 + " : " + response.getHeader(headerName1));
}
=> 컨텐츠 타입, 응답 시간, 설정값들 출력 확인
'프로그래밍 > Servlet&JPS' 카테고리의 다른 글
06 Servlet : Session과 Cookie (0) | 2022.08.23 |
---|---|
05. Servlet : sendRedirect (0) | 2022.08.23 |
04. Servlet : forward (0) | 2022.08.23 |
03 Servlet : Error message 와 page 만들기 (0) | 2022.08.23 |
01. Servlet : 서블릿개념과 동작구조 (0) | 2022.08.23 |