- 서버상에서 실행되는 프로그램
- RAM 상주 프로그램이였는데 servlet 컨테이너가 커버해준다.
- 수행 속도가 빠르고, 구현도 쉬웠다.
등록과 매핑해줘야한다.
- xml
- annotaion
- 애플릿때문에 생김
- 클라이언트가 html, js, image인지 웹 서버가 뭘 보고 판단 ?
- 요청된 파일의 확장자보고 판단함
- 클라이언트가 html, js, image인지 웹 서버가 뭘 보고 판단 ?
- servlet확장자 .class
- 애플릿이라는 얘가 web에서 널리 사용하고 있었음
- .class이면 다 애플릿으로 인식함
- 애플릿 브라우저에서 실행돼서 java실행 환경을 다 들고있었슴
- servlet은 확장자로는 판단하지 못했음
- 매핑이 만들어짐
- 애플릿이라는 얘가 web에서 널리 사용하고 있었음
- 서블릿마다 태그 넣어주는지 (xml)
- 앞에 @쓰는 것 (annotation)
요청 및 응답 객체 생성
- 톰캣안에 코요태 : web서버
- 매핑보고, 확장자보고 서버에서 실행되는지, 클라이언트에게 줘야하는지 판단
- 서버에서 실행시키고, 결과를 줘야할 때는 카탈리나에게 넘김(서블릿 컨테이너)
- 이미지읽고, 간단한건 코요테 안에서 해결함
- 카탈리나 (서블릿 컨테이너)
- servlet class 메모리에 로딩
- response, request 객체를 만듬
- client가 요청한 servlet이 객체 생성되어있는지 확인 -> 서비스 호출 (클라이언트 요청할 때마다 )
- 자기가 만든 http reponse, http request(요청정보)를 매개변수로 서비스에게 전달
- 서비스는 get인지 host인지 확인
- get방식이면
- doGet 오버라이딩, 호출 안 되어있으면 부모의 do get이 호출 됨
- Post 방식이면
- doPost 오버라이딩
- 자기가 만든 http reponse, http request(요청정보)를 매개변수로 서비스에게 전달
- 객체 생성 안 되어 있으면
- 젤 먼저 호출 init (최초의 한번만 )-> 서비스
- 서비스의 결과가 항상
- 서블릿 객체가 메모리에 사라지는 시점에 destroy 호출
- 매핑보고, 확장자보고 서버에서 실행되는지, 클라이언트에게 줘야하는지 판단
- 정해진 메소드만 수행해야함.
- 구현해야하는 메소드 사양도 정해져있음
- 객체생성을 WAS(Web application Server)가 한다.
- 클라이언트가 보낸 쿼리문자열을 담아서 전달하면, 그걸 우린 쓴다 HttpRequest
- response.getWriter();
response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter();
- response
- 클라이언트 응답과 관련된 일
- io
- readWriter
- 문자 스트링(텍스트)
- input/output
- 바이너리 (이미지)
- readWriter
- response
에러
500 : 실행하다 오류
- getParameterValues
- 리턴값이 문자열 배열
- 하나의 value에 여러개
- getParameter
- 리턴값이 string
- 하나의 value에 하나 올 때
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>입력폼 학습</h1>
<hr>
<!--
method 생략하면 get
localhost니깐, 서버주수랑 포트번호 생략
-->
<form method="get" action = "/edu/query">
이름 <input type="text" name="p1" required>
<br> 나이 <input type="number" name="p2"><br>
<!-- HTML5 -->
좋아하는 음식
<br> 햄버거 <input type="checkbox" name="p3" value="햄버거">
비지찌게 <input type="checkbox" name="p3" value="비지찌게">
회덮밥 <input type="checkbox" name="p3" value="회덮밥">
돈까스 <input type="checkbox" name="p3" value="돈까스"><br>
<input type="submit" value="전송하기">
<input type="reset" value="초기상태로">
</form>
</body>
</html>
package base;
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;
@WebServlet("/query")
public class QueryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
String p1 = request.getParameter("p1");
int p2 = Integer.parseInt(request.getParameter("p2"));
String p3[] = request.getParameterValues("p3");
out.print("<ul>");
out.print("<li>p1 : "+ p1 +"</li>");
out.print("<li>p2 : "+ p2 +"</li>");
for(int i=0; i < p3.length; i++)
out.print("<li>p3["+i+"] : "+ p3[i] +"</li>");
out.print("</ul>");
out.close();
}
}
- String p3[] = request.getParameterValues("p3");
- 아무것도 전달 안 되면 비어있는 배열 리턴함
- <form method="get" action = "/edu/query">
- action에 url 다 주는 것 -> 절대 url
- /edu/query
- 자동으로 html요청했던 서버 정보로 확장시킴
- 서버를 여러 개에서 받으면 절대주소 줘야함
- host방식으로 하면 405에러남
-
-
- doGet 오버라이딩해서
- 부모의 있는 httpServlet에 있는 doPost 호출된 것
- 메소드 속성이 아예 없으면 디폴트 get방식
-
out.print("<a href = '/edu/htmlexam/queryservlettest.html'>입력화면으로</a>");
- 하이퍼링크 작성함 (.java)
querytest.html
더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="GET"
action="http://localhost:8080/edu/querytest">
이름 : <input name="stname" value="luster1031" required><br>
암호 : <input type="password" name="pwd"><br>
나이 : <input type="number" name="age"><br>
성별 : <input type="radio" name="gender" value="남자">남자
<input type="radio" name="gender" value="여자">여자
<br>
취미 :
피아노 <input type="checkbox" name="hobby" value="피아노">
수영 <input type="checkbox" name="hobby" value="수영">
독서 <input type="checkbox" name="hobby" value="독서">
게임 <input type="checkbox" name="hobby" value="게임">
<br>
좋아하는 색 :
<select name="color">
<option value=""></option>
<option value="빨강색">RED</option>
<option value="파랑색">BLUE</option>
<option value="노랑색">YELLOW</option>
</select>
<br>
좋아하는 음식 :
<br>
<select name="food" size="4" multiple>
<!-- multipe : 원하는 만큼 선택 -->
<option value="라면">라면</option>
<option value="냉면">냉면</option>
<option value="짜장면">짜장면</option>
<option value="햄버거">햄버거</option>
<option value="닭강정">닭강정</option>
<option value="육회">육회</option>
</select>
<br>
의견 :
<br>
<textarea name="op" rows="10" cols="50"></textarea><br>
<input type="hidden" name="h_1" value="hidden으로 보낸 첫 번째 내용">
<input type="hidden" name="h_2" value="hidden으로 보낸 두 번째 내용">
<input type="submit" value="보내기">
<input type="reset" value="다시작성하기">
</form>
</body>
</html>
QueryTestServlet.java
더보기
QueryTestServlet.java
package base;
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;
@WebServlet("/querytest")
public class QueryTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("stname");
String pwd = request.getParameter("pwd");
int age = Integer.parseInt(request.getParameter("age"));
String gender = request.getParameter("gender");
String[] hobby = request.getParameterValues("hobby");
String[] food = request.getParameterValues("food");
String color = request.getParameter("color");
String op = request.getParameter("op");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<h2> 전달된 내용 </h2>"); out.print("<hr>");
out.print("<ul>");
out.print("<li> 이름 : " +name+ "</li>");
out.print("<li> 암호 : " +pwd+ "</li>");
out.print("<li> 나이 : " +age+ "</li>");
out.print("<li> 성별 : ");
if (gender == null) {
out.print("선택 제대로 하세요 -ㅅ-");
}
else {
out.print(gender);
}
out.print("</li>");
out.print("<li> 취미 : ");
if (hobby == null) {
out.print("선택 제대로 하세요 -ㅅ-");
}
else {
for (int i=0 ; i<hobby.length ; ++i) {
if (i == hobby.length -1) {
out.print(hobby[i]);
break;
}
out.print(hobby[i] +",");
}
}
out.print("</li>");
out.print("<li> 좋아하는 색 :" +(color == ""?"없음":color) +"</li>");
out.print("<li> 좋아하는 음식 : ");
if (food == null) {
out.print("선택 제대로 하세요 -ㅅ-");
}
else {
for (int i = 0; i < food.length; ++i) {
if (i == food.length - 1) {
out.print(food[i]);
break;
}
out.print(food[i] +",");
}
}
out.print("</li>");
out.print("<li> 의견 : " + op + "</li>");
out.print("<li> 비밀1 : " + request.getParameter("h_1") + "</li>");
out.print("<li> 비밀2 : " + request.getParameter("h_2") + "</li>");
out.print("</ul>"); out.print("<hr>");
out.print("<a href='/edu/htmlexam/querytest.html'>"
+ "입력화면으로</a>");
out.close();
}
}
- hidden 태그
- 사용자에 관계없이 자동으로 전달하는 name, value로 작성할 수 있는 tag
- hidden은 화면에 아무것도 안 나타남
- 이름 : <input name="stname" value="luster1031" required><br>
- 디폴트로 이름이 적혀져 있음
- type은 text
http://localhost:8080/edu/querytest?
stname=luster1031&
pwd=12341&
age=111&
gender=%EB%82%A8%EC%9E%90&
hobby=%ED%94%BC%EC%95%84%EB%85%B8&
hobby=%EB%8F%85%EC%84%9C&
hobby=%EA%B2%8C%EC%9E%84&
color=%ED%8C%8C%EB%9E%91%EC%83%89&
food=%EB%9D%BC%EB%A9%B4&
food=%EB%83%89%EB%A9%B4&
food=%EC%A7%9C%EC%9E%A5%EB%A9%B4&
food=%ED%96%84%EB%B2%84%EA%B1%B0&
food=%EB%8B%AD%EA%B0%95%EC%A0%95&
food=%EC%9C%A1%ED%9A%8C&
op=2021.12.28+%EC%98%A4%EB%8A%98%EC%9D%80+%EC%88%98%EC%9A%94%EC%9D%BC&
h_1=hidden%EC%9C%BC%EB%A1%9C+%EB%B3%B4%EB%82%B8+%EC%B2%AB+%EB%B2%88%EC%A7%B8+%EB%82%B4%EC%9A%A9&
h_2=hidden%EC%9C%BC%EB%A1%9C+%EB%B3%B4%EB%82%B8+%EB%91%90+%EB%B2%88%EC%A7%B8+%EB%82%B4%EC%9A%A9
- '%'기호와 함께 16진수 코드 값으로
- 공백은 '+'문자로 간다.
getpost.html
더보기
getpost.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>서블릿을 요청하는 다양한 방법</h1>
<hr>
<a href="/edu/getpost?name=듀크">하이퍼링크로 요청</a>
<hr>
<form method="get" action="/edu/getpost">
<input type="text" placeholder="이름을입력하세요" name="name"> <input
type="submit" value="GET방식요청">
</form>
<hr>
<form method="post" action="/edu/getpost">
<input type="text" placeholder="이름을입력하세요" name="name"> <input
type="submit" value="POST방식요청">
</form>
</body>
</html>
- a 태그로 요청할 수 있는 대상은 제한이 없다.
- get 방식
- form 작성 안 해도, 물음표 뒤에 추가로 전달 가능
- 사용자가 직접 이름을 요청할 기회가 없음
- form 사용시
- 사용자가 직접 이름 넣기 가능
- 전달되는 쿼리의 길이의 제한이 있다. (서버마다 다름)
- 보안이 안 좋음
- form 작성 안 해도, 물음표 뒤에 추가로 전달 가능
- post
- 전달되는 필드가 주소 필드에 표시가 안 남
- form 태그를 써야만, 가능
- 나머지는 get 방식
- 쿼리가 외부로 안 보임
- 쿼리 문자열의 길이 제한이 없음
- 파일 업로드
- get 방식
GetPostServlet.java
더보기
GetPostServlet.java
package base;
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;
@WebServlet("/getpost")
public class GetPostServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<h2>요청 방식 : " + request.getMethod() + "</h2>");
out.print("<h2>Query 문자열 : " + request.getParameter("name") + "</h2>");
out.close();
System.out.println("GET 방식 수행");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
// request.setCharacterEncoding("UTF-8");
out.print("<h2>요청 방식 : " + request.getMethod() + "</h2>");
out.print("<h2>Query 문자열 : " + request.getParameter("name") + "</h2>");
out.close();
System.out.println("POST 방식 수행");
}
}
- servlet 컨테이너가 get이든 post이든 요청하는 api는 똑같다.
- get방식
- host 방식
- 요청 바디에 입력 값 파라미터 담아서 전달
- 주소창에 입력 값 안 보임
- 한글 깨짐
- 전달되는 방법의 차이
- 요청하기 전에 request.setCharacterEncoding해줘야 함
- 사용자 편의성을 얼만큼 제공하는 사이트인가?
'study > JAVA 전문가' 카테고리의 다른 글
[servlet]요청 재지정 (0) | 2021.12.29 |
---|---|
[servlet] 상태정보 유지 기술 (0) | 2021.12.29 |
[HTML] 연습 (0) | 2021.12.28 |
[Servlet & JSP] 1 (0) | 2021.12.27 |
[tomcat] 실습 - html, servelt (0) | 2021.12.27 |