고래씌
[Servlet] 1-1. GET 방식 전달 실습 본문
▶ web.xml 파일
- 배포서술자(DD, Deployment Descriptor)라고 해서 웹 애플리케이션의 기본적인 설정을 위해 작성하는 파일
- 현재 웹 애플리케이션을 구동시키는 서버를 start할 때 가장 먼저 읽혀지는 파일
- 개발자가 web.xml을 수정하지 않고도 개발 및 운영이 가능하지만 규모가 커지고 다양한 Filter, Servlet, Wrpper등을 사용하게 되면 직접 수정을 해야하는 경우도 많다.
▶ welcome-file : 처음에 url로 현재 어플리케이션의 루트경로(contextpath)로 요청시 제일 먼저 보여지게 되는 메인페이지를 지정해 놓는것
=> 각자 본인컴퓨터에 구축해놓은 서버로 요청을 보내기(현재 서버의 ip주고 127.0.0.1 = localhost)
=> 서버의 포트번호 : 8081로 설정
→ 서버내의 구동중인 어플리케이션의 루트경로 context root : servlet
=> 합치면 localhost:8081/servlet 으로 요청시 WebContent바로 아래에 있는 index파일이 서비스
1. 서블릿(Servelt)이란?
: 웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해서 웹페이지를 만들기 위해 필요한 기술이다.
- Server + Applet의 합성어로 JAVA언어를 이용하여 사용자의 요청을 받아 처리하고 그 결과를 다시 사용자에게 전송하는 역할의 Class파일을 말함. 즉 웹에서 동적인 페이지를 java로 구현한 서버 측 프로그램
- 사용자의 요청을 받아 처리하고 그에 해당하는 응답페이지를 만들어 다시 사용자에게 전송하는 역할을 하는 자바의 클래스
- 즉, 웹에서 동적인 페이지를 java로 구현할 수 있게 도와주는 서버측 프로그램(WAS서버에 의해 구동됨)
java 클래스에서 웹 페이지 구현을 HTML이 포함된 구조라고 할 수 있다.(Java코드로 HTML을 구현)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Web</h1>
<h2>* Servlet</h2>
<p>
서블릿이란?
웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해서 웹페이지를 만들기 위해 필요한 기술이다.
- 사용자의 요청을 받아 처리하고 그에 해당하는 응답페이지를 만들어 다시 사용자에게 전송하는 역할을 하는
자바의 클래스
- 즉, 웹에서 동적인 페이지를 java로 구현할 수 있게 도와주는 서버측 프로그램(WAS서버에 의해 구동됨)
java 클래스에서 웹 페이지 구현을 HTML이 포함된 구조라고 할 수 있다(Java코드로 HTML을 구현)
</p>
<h3><a href="views/requestTest_GET.html">GET방식 테스트</a></h3>
<h3><a href="">POST방식 테스트</a></h3>
</body>
</html>
2. GET방식으로 요청 후 응답페이지 받아보기
▶ views 폴더 생성후, Get 방식으로 갔을 때 이동하는 파일 생성 (requestTest_GET 파일)
- 특징1. GET방식으로 요청한 데이터는 url의 header영역에 데이터들을 포함시켜 요청함
=> 사용자가 입력한 값이 url에 노출
=> 보안유지 X
=> 즉, 로그인이나 회원가입 같은 경우 GET 방식으로 작업하는게 부적합함
- 특징2. Header영역은 전송하는 데이터의 길이에 제한이 있음
=> 방대한 데이터를 담았을 경우 초과된 데이터는 절단
=> 즉, 게시판 작성같이 방대한 데이터가 포함된 경우 get방식으로 작업하는게 부적합함
- 특징3. URL에 데이터가 노출되기 때문에 즐겨찾기 기능을 사용하는데 있어서 적합하다.
① form내의 제출버튼을 클릭시 form 태그 속성 중 action에 작성된 url로 요청됨(제출)
② Servlet 요청 같은 경우 반드시 그 요청값이 현재 웹 애플리케이션의 contextpath(/servlet)뒤에 작성되어야 함
http://localhost:8081/servlet/test1.do
③-1. 절대경로방식(action속성의 속성값이 /로 시작되는 경우) : localhost:8081 뒤에 action에 지정한 속성값이 이어붙여지면서 요청이 들어감
=> localhost:8081/ 기준으로 뒤에 값이 붙여지면서 요청이 들어간다!
③-2. 상대경로방식(/가 아닌 문구로 시작되는 경우) : 현재 이 페이지가 보여질때의 "url경로"를 기준으로 마지막 위치의 /로부터 그뒤에 action 속성의 속성값이 이어붙여지면서 요청이 들어감
=> 마지막 / 로부터 그뒤에 속성값이 이어붙여지면서 요청이 들어간다!
■ requestTest_GET.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>GET방식으로 요청 후 응답페이지 받아보기</h1>
<h2>개인정보 입력 - GET</h2>
<form action='/servlet/test1.do' method="get">
<ul>
<li>
<!-- input 태그 사용시 key 값은 반드시 서버에 넘겨줘야하는데 key값 설정은 name 속성으로 한다. -->
이름 : <input type="text" name="name">
</li>
<li>
성별 :
남자 <input type="radio" name="gender" value="M">
여자 <input type="radio" name="gender" value="F">
</li>
<li>
나이 : <input type='number' name='age'>
</li>
<li>
사는 도시 :
<select name="city">
<option>서울시</option>
<option>경기도</option>
<option>강원도</option>
<option>인천</option>
</select>
</li>
<li>
키 : <input type="range" name="height" min="140" max="200">
</li>
<li>
좋아하는 음식(모두 고르시오) :
한식 <input type="checkbox" name="food" value="한식">
중식 <input type="checkbox" name="food" value="중식">
일식 <input type="checkbox" name="food" value="일식">
양식 <input type="checkbox" name="food" value="양식">
분식 <input type="checkbox" name="food" value="분식">
</li>
<li>
<input type="submit">
<input type="reset">
</li>
</ul>
</form>
</body>
</html>
=> 제출을 클릭하면 url에 내가 입력했던 정보가 모두 노출됨. ==> 이것이 GET 방식이다!
3. Servlet 프로그래밍
▶ RequestGetServlet 파일 생성
▶ test1.do로 변경
파일을 생성하고 나면 기본으로 이런 코드들이 작성되어있다. 여기서 우리는 test1.do파일로 연결을 해주어야하기 때문에 @WebServlet("/test1.do")로 변경해준다.
▶ protected void doGet => get방식으로 들어왔을 때 응답 결과를 보여줌
▶ protected void doPost => post방식으로 들어왔을 때 응답 결과를 보여줌
=> 먼저 get방식으로 실습을 할 것이기 때문에 portected void doGet 메소드에 작성할 것이다.
▶ Get방식으로 요청했으면 현재 doGet가 호출됨
- 첫번째 매개변수인 HttpServletRequest request에는 요청시 클라이언트가 전달한 내용들이 담김(입력한 값, 전송방식, 요청한 사용자의 ip, 쿠키정보, session 등...)
- 우선, 요청을 처리하기 위해 요청시 전달된 값들을 뽑는다
- request의 parameter 영역 안에 존재 → 데이터들은 key value 세트로 담겨있다.
=> 따라서 request의 parameter 영역으로부터 전달된 데이터를 뽑는 메소드를 사용
- request.getParameter("키값") : String => 무조건 문자열 자료형으로 반환
- request.getParameterValues("키값") : String[] => 무조건 문자열 배열형태로 반환
■ RequestGetServlet.java 파일
package com.kh.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RequestGetServlet
*/
// test1.do로 바꾸어야함
@WebServlet("/test1.do")
public class RequestGetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RequestGetServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
// get방식으로 들어왔을 때 응답 결과를 보여줌
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name"); // "이고래" 이고래 입력하면 이고래가 전달됨, 아무것도 입력안했다면 "" 전달됨
String gender = request.getParameter("gender"); // "M" / "F" // 선택안한경우 NULL
int age = Integer.parseInt(request.getParameter("age")); // 무조건 문자열로 전달되기 때문에 형변환 필요
String city = request.getParameter("city");
double height = Double.parseDouble(request.getParameter("height"));
// 체크박스처럼 여러개의 정보를 동일한 키값으로 전달받는 경우
// 반드시 배열형태로 받아야함
String[] foods = request.getParameterValues("food");
// 체크박스를 하나도 선택하지 않는다면 null 값 반환
System.out.println("name : "+ name);
System.out.println("gender : "+ gender);
System.out.println("age : "+ age);
System.out.println("city : "+ city);
System.out.println("height : "+ height);
if(foods == null) {
System.out.println("foods : 없음");
}else {
System.out.println("foods : " + String.join(",", foods));
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
// post로 들어왔을 때 응답결과
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
☞ 다음과 같이 입력하고 제출 버튼을 클릭한 결과 Console 창에 이와 같은 화면이 출력된 것을 볼 수 있다.
4. 제출 버튼 누른 후 페이지 이동 시, 빈페이지 꾸미기
▶ db와 상호작용후 결과값을 토대로 사용자가 보게될 화면을 꾸며준다.
▶ 사용자가 보게될 응답페이지 만들기
▶ 장점 : java코드 내에서 작성을 하기 때문에 자바에서 활용가능한 다양한 api를 사용하여 html코드를 만들 수 있다.
▶ 단점 : 복잡하고, 혹시라도 html 페이지를 수정하고자 할 때 Java코드 내에서 수정이 이루어지기 때문에 수정된 내용을 다시 반영하고자한다면 서버를 재실행해야한다.
package com.kh.controller;
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;
/**
* Servlet implementation class RequestGetServlet
*/
// test1.do로 바꾸어야함
@WebServlet("/test1.do")
public class RequestGetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RequestGetServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
// get방식으로 들어왔을 때 응답 결과를 보여줌
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println("잘 실행 되나...?");
/*
* Get방식으로 요청했으면 현재 doGet가 호출됨
*
* 첫번째 매개변수인 HttpServletRequest request에는 요청시 클라이언트가 전달한 내용들이 담김
* (입력한 값, 전송방식, 요청한 사용자의 ip, 쿠키정보, session 등...)
*
* 우선, 요청을 처리하기 위해 요청시 전달된 값들을 뽑는다
* request의 parameter 영역 안에 존재 → 데이터들은 key value 세트로 담겨있다.
*
* 따라서 request의 parameter 영역으로부터 전달된 데이터를 뽑는 메소드를 사용
* - request.getParameter("키값") : String => 무조건 문자열 자료형으로 반환
* - request.getParameterValues("키값") : String[] => 무조건 문자열 배열형태로 반환
*/
String name = request.getParameter("name"); // "이고래" 이고래 입력하면 이고래가 전달됨, 아무것도 입력안했다면 "" 전달됨
String gender = request.getParameter("gender"); // "M" / "F" // 선택안한경우 NULL
int age = Integer.parseInt(request.getParameter("age")); // 무조건 문자열로 전달되기 때문에 형변환 필요
String city = request.getParameter("city");
double height = Double.parseDouble(request.getParameter("height"));
// 체크박스처럼 여러개의 정보를 동일한 키값으로 전달받는 경우
// 반드시 배열형태로 받아야함
String[] foods = request.getParameterValues("food");
// 체크박스를 하나도 선택하지 않는다면 null 값 반환
System.out.println("name : "+ name);
System.out.println("gender : "+ gender);
System.out.println("age : "+ age);
System.out.println("city : "+ city);
System.out.println("height : "+ height);
if(foods == null) {
System.out.println("foods : 없음");
}else {
System.out.println("foods : " + String.join(",", foods));
}
/*
* db와 상호작용후 결과값을 토대로 사용자가 보게될 화면을 꾸며준다.
*
* 사용자가 보게될 응답페이지 만들기
*/
// * response객체를 통해 사용자에게 html(응답화면)을 전달
// 1) 출력할 내용은 문서형태의 html파일이고, 문자셋은 utf-8 임을 지정
response.setContentType("text/html; charset=UTF-8");
// 2) 응답하고자하는 사용자와의 스트림을 생성
PrintWriter out = response.getWriter();
// 3) 생성된 스트림을 통해 html 구문을 출력
out.println("<html>");
out.println("<head>");
out.println("<style>");
out.println("h2{color:red}");
out.println("#name{color:orange}");
out.println("#age{color:yellow}");
out.println("#city{color:green}");
out.println("#height{color:blue}");
out.println("#gender{color:navy}");
out.println("</style>");
out.println("</head>");
out.println("<body>");
out.println("<h2>개인정보 응답화면</h2>");
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("선택을 안했습니다. <br>");
}else {
out.printf("<span id='gender'>%s</span> 입니다.",gender.equals("M") ? "남자" : "여자");
}
out.print("<br>좋아하는 음식은 ");
if(foods == null) {
out.print("없습니다.");
}else {
out.print("<ul>");
for(String food:foods) {
out.printf("<li>%s</li>", food);
}
out.print("</ul>");
}
out.println("</body>");
out.println("</html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
// post로 들어왔을 때 응답결과
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
'Server > JSP과 Servlet' 카테고리의 다른 글
[JSP] 피자주문 실습문제 (1) | 2023.12.06 |
---|---|
[JSP] 3-2. include 지시어 (0) | 2023.12.06 |
[JSP] 3-1. JSP (스크립팅 원소, page 지시어) (0) | 2023.12.05 |
[Servlet] 1-2. Post 방식으로 전달 실습 (0) | 2023.12.05 |
[Servlet] 0. 서버 설정 (0) | 2023.12.05 |