* Servlet 이란 ?
: 웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해서 웹페이지를 만들기 위해 필요한 기술이다.
- 사용자의 요청을 받아 처리하고 그에 해당하는 응답페이지를 만들어
다시 사용자에게 전달하는 역할을 하는 자바의 클래스
- 즉, 웹에서동적인 페이지를 java로 구현할 수 있게 도와주는 서버측 프로그램(WAS서버에 의해 구동됨)
java클래스에서 웹 페이지 구현을 위한 HTML이 포함된 구조라고 할 수 있다(Java코드로 HTML을 구현)
<!-- 절대경로 -->
action속성의 속성값이 '/'로 시작되는 경우
: localhost:8081 뒤에 action에 지정한 속성값이 이어붙여지면서 요청이 들어감
<h3><a href="views/requestTest_GET.html">GET방식 테스트</a></h3>
<!-- 상대경로 -->
'/'가 아닌 문구로 시작되는 경우
: 현재 이 페이지가 보여질 때의 "URL경로"를 기준으로
마지막 위치의 /로부터 그 뒤에 action속성의 속성값이 이어붙여지면서 요청이 들어감
<h3><a href="/servlet/views/requestTest_POST.html">POST방식 테스트</a></h3>
1. Get방식
특징1. GET방식으로 요청한 데이터는 URL의 header영역에 데이터들을 포함시켜서 요청한다
=> 사용자가 입력한 값이 URL에 노출됨
=> 보안유지 X
=> 즉, 로그인이나 회원가입 같은 경우 GET방식으로 작업하는 것이 부적합하다.
특징2. Header영역은 전송하는 데이터의 길이에 제한이 있다.
=> 방대한 데이터를 담았을 경우 초고된 데이터는 절단
=> 즉, 게시판 작성 같이 방대한 데이터가 포함된 경우 GET방식은 부적합하다.
특징3. URL에 데이터가 노출되기 때문에 즐겨찾기 기능을 사용하는데 있어서 적합하다.
// 1_Servlet\WebContent\views\requestTest_GET.html 생성하기
<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>
// 1_Servlet\src\Servlet 생성하기
@WebServlet("/test1.do")
public class RequestGetServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public RequestGetServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name"); // "홍길동" or ""
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>");
/*
장점: java 코드 내에서 작성을 하기 때문에 자바에서 활용가능한 다양한 api를 사용하여 html 코드를 만들 수 있다.
단점: 복잡하고, 혹시라도 html페이지를 수정하고자 할때 java코드 내에서 수정이 이루어지기 때문에
수정된 내용을 다시 반영하고자 한다면 서버를 재실행해야한다.
*/
}
2. POST방식
특징1. POST방식으로 요청한 데이터는 URL의 Body영역에 데이터를 포함시켜서 요청
=> 사용자가 입력한 값들이 URL에 노출되지 않는다.
=> 보안유지가 가능함
=> 로그인이나 회원가입 같은 경우 POST방식이 적합함
특징2. Body영역은 전송하는 길이에 제한이 없음
=> 게시판 작성 같은 경우 POST방식이 적합함
특징3. 즐겨찾기는 가능하나 전달되는 데이터가 URL에 노출되지 않음
특징4. 최대 요청받는 시간이 존재해서 페이지 요청 및 대기시간이 있다.
<h2>개인정보 입력 - POST</h2>
<form action='../test2.do' method="post">
// .. 이하 GET방식과 동일(생략)
@WebServlet("/test2.do")
public class RequestPostServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
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");
/*
요청처리 : Service - DAO - SQL문 실행
위의 요청처리를 다 했다는 가정하에 사용자가 보게될 응답페이지 출력
- 순수 Servlet : Java코드 내에 html코드를 작성
- JSP(Java Server Page) : html내에 Java코드를 쓸 수 있는 기술
응답페이지 만드는 과정을 JSP에게 위임(forward)
단, 응답화면에서 필요로 하는 데이터들을 꾸미기 위해 JSP에게 필요한 데이터를 넘겨줘야 함.
=> request에 attribute영역에 담아서 보내준다.
(attribute는 Object이기 때문에 모든 자료형을 받아준다)
*/
// request.setAttribute("키", "밸류"); // 키=String, 밸류=Object
request.setAttribute("name", name);
request.setAttribute("gender", gender);
request.setAttribute("age", age);
request.setAttribute("city", city);
request.setAttribute("height", height);
request.setAttribute("foods", foods);
// 위임시 필요한 객체
// 1) 응답하고자 하는 뷰를 선택하면서 RequestDispatcher객체 생성
RequestDispatcher view = request.getRequestDispatcher("views/responsePage.jsp");
// 2) 포워딩(JSP에게 위임)
view.forward(request, response);
}
}
// Servlet에서 위임한 responsePage.jsp 작성하기
<%
// 이 구문은 스클립트릿으로 JSP 문서 내에 자바코드를 쓸 수 있는 영역
// 현재 이 jsp에서 필요로 하는 데이터들 request의 attribute에 담겨있음
// request.getAttribute("키값") : Object
// Object 형식에서 내가 받고자 하는 자료형으로 강제형변환해서 담아주면 된다.
String name = (String) request.getAttribute("name");
int age = (int) request.getAttribute("age");
String gender = (String) request.getAttribute("gender");
String city = (String) request.getAttribute("city");
double height = (double) request.getAttribute("height");
String[] foods = (String[]) request.getAttribute("foods");
%>
<head>
<style>
h2{color:red;}
span{font-weight:bold;}
#name{color:orange;}
#age{color:yellow;}
#city{color:green;}
#height{color:navy;}
#gender{color:blue;}
li{color:purple;}
</style>
</head>
<body>
<h2>개인정보 응답화면</h2>
<span id = 'name'><%= name %></span>님은
<span id = 'age'><%= age %></span>살이며,
<span id = 'city'><%= city %></span>에 사는,
<span id = 'height'><%= height %></span> cm이고
성별은
<% if(gender == null) { %>
선택을 안했습니다. <br>
<%} else { %>
<span id = 'gender'><%= gender.equals("M") ? "남자" : "여자" %></span>
<% } %>
좋아하는 음식은
<%
if (foods == null) {
out.print("없습니다.");
} else {
out.print("<ul>");
for(String food : foods){
out.print("<li>"+food+"</li>");
}
out.print("</ul>");
}
%>
</body>