프로그래밍/Servlet&JPS

02 . Servlet : 서블릿 메소드

pupu91 2022. 8. 23. 18:57
반응형

 

 

서블릿의 역할

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