get 방식의 특징
1. url의 header 영역에 데이터들을 포함시켜서 요청한다.
→ 사용자가 입력한 데이터들이 url에 노출되어 보안 유지가 불가능하다.
→ 로그인이나 회원가입과 같이 보안 유지가 필요한 경우에는 get 방식이 부적합하다.
2. header 영역은 전송 길이에 제한이 있다.
→ 방대한 데이터들을 담고 있을 경우엔 초과된 데이터들이 절단되어서 넘어간다.
→ 게시판 작성과 같은 경우엔 get 방식이 부적합하다.
3. url에 입력 데이터가 노출되므로 북마크(즐겨찾기)가 가능하다.
→ 검색 기능을 사용할 땐 get 방식이 적합하다.
<h2>회원 정보 입력</h2>
<form action="/Servlet/test.do" method="get">
<ul>
<li>
이름: <input type="text" name="name">
<!--key값은 name으로 선택된다.-->
</li>
<li>
성별:
<label for="gender">남자</label><input type="radio" name="gender" id="gender" value="M">
<label for="gender">여자</label><input type="radio" name="gender" id="gender" value="F">
<!--radio버튼 사용 시 같은 종류는 name(key)을 동일하게 한다. 넘어갈 value값도 설정-->
</li>
<li>
나이: <input type="number" name="age">
</li>
<li>
거주 지역:
<select name="city">
<option>서울</option>
<option>경기</option>
<option>강원</option>
<option>부산</option>
<option>대구</option>
<option>광주</option>
<option>울산</option>
<option>인천</option>
</select>
</li>
<li>
키: <input type="range" name="height" min="0" max="220">
</li>
<li>
선호하는 음식 선택(최대 5개) <br>
<input type="checkbox" name="food" value="중식">중식 <br>
<input type="checkbox" name="food" value="일식">일식 <br>
<input type="checkbox" name="food" value="양식">양식 <br>
<input type="checkbox" name="food" value="한식">한식 <br>
<input type="checkbox" name="food" value="분식">분식 <br>
<!--checkbox 사용 시 같은 종류는 name(key)을 동일하게 한다.
단, 한 개의 key값이 여러 개의 value가 묶여 넘겨진다.-->
</li>
<li>
<input type="submit" value="전송">
<input type="reset" value="취소">
</li>
</ul>
</form>
form 내의 submit 버튼을 클릭했을 때 form 태그의 속성 중 action에 작성된 url로 요청된다. 이는 mvc에서 Controller를 호출하는 것이라고 보면 된다.(Servlet)
서블릿 요청의 경우에 반드시 해당 요청값이 웹 애플리케이션의 contextPath(처음에 지정했던 context-root) 뒤에 오게 해야 한다. ex) http://localhost:8080/Servlet/test.do
** 절대경로 방식
- /로 시작된다.
- localhost:8080 뒤에 action에 작성한 값이 붙어 요청된다.
** 상대경로 방식
- 문구로 시작된다.
- 현재 해당 페이지가 보여질 때의 url 경로 중 마지막 /에 action에 작성한 값이 붙어 요청된다.
get 방식으로 요청을 보내면 doGet() 메소드가 자동으로 호출된다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
매개변수 HttpServletRequest 객체에 요청 시에 전달된 데이터들(사용자의 입력값, 요청 전송 방식, 요청한 사용자의 ip 등등)이 담긴다. HttpServletResponse는 요청 처리 후에 응답할 때 필요한 객체이다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String gender = request.getParameter("gender");
int age = Integer.parseInt(request.getParameter("age"));
String city = request.getParameter("city");
double height = Double.parseDouble(request.getParameter("height"));
String[] foods = request.getParameterValues("food");
요청을 처리하기 위해선 요청 시에 전달된 값을 꺼내야 한다.
→ request의 parameter 영역에 있는 데이터(key-value 형태로 이뤄짐)
→ request.getParameter("key값")는 자료형 String(문자열)으로 꺼내진다.
→ request.getParameterValues("key값")는 자료형 String[]로 꺼내진다.
- 하나의 key값으로 여러 개의 value값들을 받을 경우에 배열의 형태로 반환된다.
System.out.println(name);
System.out.println(gender);
System.out.println(age);
System.out.println(city);
System.out.println(height);
System.out.println(foods);
if(foods == null) {
System.out.println("선택된 음식이 없습니다.");
} else {
System.out.println(String.join(",", foods));
}
String.join("구분자", 배열) : 구분자를 통해 배열에 있는 모든 값들을 하나의 문자열로 반환시킨다.
response 객체를 통해 사용자에게 응답화면(html)을 전달할 때는
response.setContentType("text/html; charset=UTF-8");
text 형식이 html 형식이고, 인코딩(charset)은 UTF-8이라고 전달한다.
요청한 사용자와의 스트림을 생성하여 사용자와의 연결 통로를 만든다.
PrintWriter out = response.getWriter();
생성된 스트림을 통해 html 구문을 한 줄씩 출력한다.
out.println("<html>");
out.println("<head>");
out.println("<style>");
out.println("h1{color:skyblue}");
out.println("#name{background-color:lightyellow}");
out.println("#age{background-color:aqua}");
out.println("#city{color:purple}");
out.println("span{border:2px solid orange}");
out.println("</style>");
out.println("</head>");
out.println("<body>");
out.println("<h1>개인정보 응답화면</h1>");
out.println("<span id='name'>"+name+"</span>");
out.printf("<span id='age'>%d</span>살이고, ", age);
out.printf("<span id='city'>%s</span>에 살고, ", city);
out.printf("<span id='height'>%.1f</span>cm이고, ", height);
out.print("성별은 ");
if(gender == null) {
out.print("선택되지 않았습니다.");
} else {
if(gender.contentEquals("M")) {
out.print("<span id='gender'>남자</span>입니다.<br>");
} else {
out.print("<span id='gender'>여자</span>입니다.<br>");
}
}
out.print("좋아하는 음식은 ");
if(foods == null) {
out.print("없습니다.");
} else {
out.print("<ul>");
for(int i = 0; i < foods.length; i++) {
out.printf("<li>%s</li>", foods[i]);
}
out.print("</ul>");
}
out.println("<body>");
out.println("</html>");
}
}