SOCO

get요청(쿼리스트링, 사용자 입력을 통한 get요청) 본문

백/Servlet,JSP(잠시 pause)

get요청(쿼리스트링, 사용자 입력을 통한 get요청)

ssooda 2021. 7. 1. 10:13

지난 포스팅 => 출력방법 : 서블릿이라는 플랫폼 api를 이용해서 사용자에게 어떻게 출력할 것인가

-------------

이번 시간 내용 => 입력방법(get 요청)

사용자가 어떤 값을 입력하는 것을 어떻게 처리할 것인가

사용자의 입력 -> 나에게 요청할 때 입력이 이루어짐

입력과 요청은 맞닿아있다!

 

그럼 사용자가 요청을 원할 때 전달하는 값을 어떻게 받을 것인가

 

사용자의 요청은 get요청이 기본적임 

 

---------------

 

기본적으로 이라고 하는 것은

브라우저를 사용하는 클라이언트가 뭔가를 요청하고

서버가 그에 대한 응답을 하게 됨

 

----------------

1. 쿼리스트링

클라이언트가 요청하는 것은 기본적으로 문서임

문서를 요청할 때 추가적인 인자를 전달할 수 있음.

키 값에 해당되는 값을 전달할 수 있음. 이것을 쿼리 스트링이라고 함

 

예를 들어, hello를 100번 반복하는 문서가 있는데, 3번만 반복해달라는 요청을 할 수 있는 것임http://localhost:8080/hello?cnt=3 라고 요청을 할 수 있음 (쿼리스트링 : ?cnt=3)

 

이렇게 추가적인 인자를 전달하면 서버쪽에서는 단순하게 일괄적인 정적인 문서를 돌려주는 것이 아니라

추가적인 옵션을 읽어서 추가적인 옵션에 맞는 문서를 만들어줘야함

 

http://localhost:8080/hello : 추가적인 옵션이 없으니, 100번 그대로 실행 (기본값)

http://localhost:8080/hello?cnt=3 : 추가적인 옵션에 따라 3번만 실행

 

------------------

/hello?cnt=3 이것 전체도 요청임

?cnt=3 이 부분은 쿼리스트링임

 

예상 가능한 요청 방식

/hello?cnt=3 => "3"                                        => 사용자 입력대로 실행

/hello?cnt=   => ""      ->Integer.parseInt 불가능  => 기본값대로 실행

/hello?         => null    ->Integer.parseInt 불가능  => 기본값대로 실행

/hello           => null   ->Integer.parseInt 불가능  => 기본값대로 실행

 

@WebServlet("/hello")
public class Nana extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//request : 입력도구, response : 출력도구
		response.setCharacterEncoding("UTF-8"); //인코딩 방식 지정 (문제2 이유1 해결)
		response.setContentType("text/html; charset=UTF-8"); //문제1,문제2 이유2 해결
		
		PrintWriter out = response.getWriter();
		
		String cnt_ = request.getParameter("cnt");
		
		int cnt = 100; //기본값
		if(cnt_!=null && !cnt_.equals("")) //문자열은 equals사용(자바의 정석)
			cnt = Integer.parseInt(cnt_);
		
		for(int i=0; i<cnt ; i++) 
			out.println((i+1)+ ": 안녕 Servlet!<br />") ;
	
		
	}

}

 

2. 사용자 입력을 통한 get 요청

반복횟수를 사용자로부터 입력 받으려면 입력폼(form태그)을 준비해야한다. => html 파일 만들어야함(webapp 폴더에)

//html

<body>
	<div> 
    	<form action="hello"> //서블릿 매핑주소
        	<div> 
            	<label>"안녕하세요를 몇 번 듣고 싶으세요?" </label>
            </div>
            <div>
            	<input type="text" name="cnt"/>
                <input type="submit" value="출력" />
            </div>
        </form>
    </div>
</body>

 

submit 버튼을 누르면

1. 브라우저는 form 태그에 입력된 action명을 보고 url을 작성

http://localhost:8080/hello

(hello에 매핑된 서블릿에게 요청이 감)

 

2. input 태그에 사용자가 입력한 값이 있으면 name에 해당되는 key값으로 쿼리스트링을 만듦

왜 방향이 저럴까? 변수에 대입한다는 게 아니니까? 왜 value가 아니라 name일까?

입력된 input이 있으면 그 name값이 cnt키의 값이 됨

?cnt=name