YJ의 새벽
Servlet 이란?( Get, Post 방식 ) 본문
- Servlet 이란 ??
-- 동적 웹페이지를 만들때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술 !!
-- 웹 서비스를 위한 자바 클래스 ( 자바를이용 웹을 만듬 )
-- 웹 프로그래밍에서 클라이언트의 요청 (Request) 을 처리하고
그 결과를 다시 클리이언트에게 응답 (Response) 하는 기술.
- Servlet Container
-- 포트 연결, 웹서버통신을위한 소켓, 입/출력 스트림을 생성하는 역할.
-- WAS ( Web Application Server ) 가 Servlet container에 해당하면 대표적으로 Tomcat 이 있음.
Tomcat = jsp , servlet 이 작동하게 만들어줌.
ex )) < form action = "주소" method="get" > </form>
< form action = "주소" method="post" > </form>
- Get 과 Post 방식의 차이 : 클라이언트가 서버로 요청을 보내는 방법
--GET 방식 : 데이터를 가져오다, 얻어오다 (주소) , 페이지 연결이 주 목적.
- URL에 변수(데이터) 를 포함시켜 요청 .
- URL에 보이기때문에 보안이 좋지않다. ( 캐싱 : 브라우저 히스토리에 남음 )
- HTTP Header 에 포함하여 전송 . Body 는 보통 빈 상태로 전송.
--POST 방식 : 데이터를 붙이다. , 데이터 전달이 주 목적
- 헤더필드중 Body 데이터를 설명하는 Content-Type 이라는 헤더필드가 들어가고
어떤 데이터 타입인지 명시해주어야함.
- 전송하는 길이 제한이없지만 , 페이지요청, 기다리는시간이 존재
- URL에 노출되지않으므로 캐싱할수없음.
*** VSCode 에서 같은 워크스페이스로 html 을 만들자. 연동된다.
-- form 태그 : 내부에 작성된 input 태그의 값을 지정된 경로(주소)의 서버 또는 페이지로 제출하는 역할.
-- input 태그 : 값을 입력하기 위한 입력 양식을 제공하는 태그.
제출시 input 태그 name = " key " .
입력된 값 : value ( Map 형식 )
- GET 방식 ( doGet )
-- 요청하는 주소뒤에 전달하려는값을 key-value 형태로 붙여서 전달하는 방식.
-- ex ) /ServletProject1 / example1.do ? inputName=홍길동 & inputAge=20
/ 프로젝트이름 / 서비스요청주소 ? key = value & key = value
---> QueryString 이라 한다.
--장점 : 단순함, 캐싱가능 ( 요청주소저장 = 북마크, 즐겨찾기, 링크공유 )
검색, 게시글, 뉴스 공유등 이용할때 좋음.
--단점 : 보안에 취약, 글자수 제한이 있다.
---------------------- GET 방식예제1 )) HTML ( index.html )
<form action = "/ServletProject1/example1.do">
<!-- 제출시 ServletProject1 프로젝트에 있는 /example1.do 라는 서비스를 요청한다.
요청시 내부에 작성된 input태그의 값도 같이 전달한다. -->
이름 : <input type="text" name="inputName"> <br>
나이 : <input type="number" name="inputAge">
<button type="submit">서버로 제출하기</button>
</form>
---------------------- GET 방식예제1 )) JAVA Class
public class ServletEx1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// HttpServletRequest : 클라이언트의 정보 + 요청 관련정보가 담긴 객체.
// HttpServletResponse : 서버가 클라이언트에게 응답하는 방법을 제공하는 객체 .
// 요청시 함께 전달된 input 태그 값(==파라미터)을 얻어오는 방법
// req.getParameter("input태그의 name 속성값");
// ** 얻어온 파라미터는 무조건 String **
String inputName = req.getParameter("inputName");
String inputAge = req.getParameter("inputAge");
System.out.println(inputName + " / " + inputAge);
// 문서 형식 + 문자 인코딩 지정
// --> html 문서이고 , UTF-8 로 인코딩 되어있다.
resp.setContentType("text/html; charset=UTF-8");
// 서버가 클라이언트에게 응답할 수 있는 스트림 얻어오기
PrintWriter out = resp.getWriter();
out.print(inputName + "님의 나이는 " + inputAge + "세 입니다.");
}
}
---------------------- GET 방식예제1 )) web. xml
JAVA class 와 , index.html 을 web.xml 로 연결시켜주자.
<!-- 특정 클래스를 Servlet으로 등록하고 이름을 지정하는 태그 . -->
<servlet>
<!-- 해당 Servlet을 부르기 위한 이름 지정 -->
<servlet-name>ex1</servlet-name>
<!-- Servlet으로 등록하고자 하는 클래스의 패키지명+클래스명 -->
<servlet-class>edu.kh.servlet.controllor.ServletEx1</servlet-class>
</servlet>
<!-- 요청 주소를 처리할 Servlet을 지정 -->
<servlet-mapping>
<!-- 요청을 처리할 Servlet의 이름 -->
<servlet-name>ex1</servlet-name>
<!-- 요청 주소 작성 (앞 프로젝트명은 제외) -->
<!-- [ServletProject1] /example.do -->
<url-pattern>/example1.do</url-pattern>
</servlet-mapping>
---------------------- GET 방식예제2 )) HTML ( index.html )
<form action="/ServletProject1/example2.do" method="get">
주문자 : <input type="text" name="orderer"> <br>
hot <input type="radio" name="type" value="hot">
ice <input type="radio" name="type" value="ice">
<br><br>
<select name="coffee">
<option>아메리카노</option>
<option>카페라떼</option>
<option>바닐라라떼</option>
<option>초코프라푸치노</option>
<option>카라멜마끼야또</option>
</select>
<br><br>
옵션 : <br>
1샷 추가 <input type="checkbox" name="opt" value="shot1">
<br>
2샷 추가 <input type="checkbox" name="opt" value="shot2">
<br>
두유변경 <input type="checkbox" name="opt" value="soymilk">
<br><br>
<button>주문하기</button>
</form>
---------------------- GET 방식예제2 )) JAVA Class
// Servelt 코드작성위해서 HttpServlet 상속,
public class ServletEx2 extends HttpServlet {
// Get 방식 요청을 처리하는 메서드
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 전달된 input 태그값을 얻어와 변수에 저장.
String orderer = req.getParameter("orderer");
// radio 버튼은 1개만 선택가능 == 값1개만 서버로 제출
String type = req.getParameter("type");
// select 박스는 1개의 option 만 선택가능 == 값1개만 서버로 제출
String coffee = req.getParameter("coffee");
// checkbox같이 하나의 name에 여러값이 전달될경우
// 1. req.getParameter() -> 첫번째값만 얻어옴 ( String )
// 2. req.getParameterValues() -> 여러값 모두 얻어옴 ( String[] )
// 값이 없으면 null
String[] opt = req.getParameterValues("opt");
System.out.println("주문내용을 정상적으로 전달받음");
// 응답을 위해 준비해야하는것
// 1) 문서형식 + 문자 인코딩 지정
resp.setContentType("text/html; charset=UTF-8");
// 2) 응답을 서버 -> 클라이언트 스트림 얻어오기
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>" + orderer + "님의 주문 내역</title>");
out.println("</head>");
out.println("<body>");
out.printf("<h3>주문자명 : %s</h3>\n", orderer);
out.println("<h3>");
out.println("주문한 메뉴 : ");
if (type.equals("hot")) {
out.println("따뜻한 ");
} else {
out.println("아이스 ");
}
out.println(coffee);
out.println("</h3>");
// 옵션이 있을 경우에만 출력
if (opt != null) {
out.println("<ul>");
// 향상된 for문
for (String o : opt) {
String temp = "";
switch (o) {
case "shot1":
temp = "1샷 추가";
break;
case "shot2":
temp = "2샷 추가";
break;
case "softly":
temp = "연하게";
break;
}
out.printf("<li>%s</li>\n", temp);
}
out.println("</ul>");
}
out.println("</body>");
out.println("</html>");
}
}
---------------------- GET 방식예제1 )) web. xml
<servlet>
<servlet-name>ex2</servlet-name>
<servlet-class>edu.kh.servlet.controllor.ServletEx2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ex2</servlet-name>
<url-pattern>/example2.do</url-pattern>
</servlet-mapping>
- POST 방식 !! ( doPost )
-- POST방식 : GET 방식과는 다르게 주소뒤에 전달하는값이 붙는것이 아니라
HTTP Protocol 의 Body 부분에 숨겨져서 전달되는 방식.
-- 장점 : 길이제한 x , 보안성 향상 (데이터가 직접적으로 보이지않음)
-- 단점 : 캐싱 불가능 , 추가적인 문자 인코딩 처리가 필요함.
-- POST 방식은 문자데이터가 깨질수 있다 .
-- 왜 ? 브라우저, 서버간 문자 인코딩 차이때문에.
-- 해결법 ? 요청 정보에 담긴 데이터의 문자 인코딩을 UTF-8 로 미리 변경.
--> req.setCharacterEncodin( "UTF-8" )
---------------------- POST 방식예제1 )) HTML ( index.html )
<form action="/ServletProject1/signUp" method="post">
아이디 : <input type="text" name="inputId"> <br>
비밀번호 : <input type="password" name="inputPw"><br>
비밀번호 확인 : <input type="password" name="inputPw"><br>
이메일 : <input type="email" name="inputEmail"><br>
이메일 수신동의(선택) : <input type="checkbox" name="agree"><br>
<button>가입하기</button>
</form>
---------------------- POST 방식예제1 )) JAVA Class
---- @ 어노테이션 이용. web.xml 파일에 따로 작성하지않아도 ok
--- @Webservlet ( " 요청주소" ) , 이방식을 이용하자.
// @WebServlet ( "요청주소" )
// -- 해당클래스를 Servlet 으로 등록하고 , ( <servlet> )
// 어떤 요청주소 처리할지 지정 ( <servlet-mapping> )
// -모든내용을 한번에 작성할수있는 어노테이션.
@WebServlet("/signUp")
public class ServletEx3 extends HttpServlet{
// doPost() : Post 방식 요청을 처리하는 메서드
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//요청 정보에 담긴 데이터의 문자인코딩을 UTF-8 로 미리 변경.
req.setCharacterEncoding("UTF-8");
//파라미터 얻어와 변수에 저장
String inputId = req.getParameter("inputId");
String[] inputPw = req.getParameterValues("inputPw");
String inputEmail = req.getParameter("inputEmail");
String agree = req.getParameter("agree");
System.out.println(inputId);
System.out.println(inputPw[0]);
System.out.println(inputPw[1]);
System.out.println(inputEmail);
System.out.println(agree);
// 응답데이터 문서형식, 문자인코딩 지정
resp.setContentType("text/html; charset=UTF-8");
//응답용 스트림 얻어오기
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head> <title> 회원 가입 결과 </title> </head>");
out.println("<body>");
if(inputPw[0].equals(inputPw[1])) { // 비밀번호가 같을 경우
// 정상 가입한 경우에 대한 화면
// user01님 환영 합니다.
// 이메일 수신 동의 여부 : O / X
// (동의 O인 경우)
// 수신할 이메일 : user01@naver.com
out.printf("<h3>%s님 환영합니다.</h3>", inputId);
// checkbox는 별도의 value가 없을 때
// 체크 O : "on"
// 체크 X : null
if(agree != null) {
out.println("<h3>이메일 동의 수신 여부 : O</h3>");
out.printf("<h3>수신할 이메일 : %s</h3>", inputEmail);
} else {
out.println("<h3>이메일 동의 수신 여부 : X</h3>");
}
} else {
out.println("<h1 style='color:red;'>비밀번호가 일치하지 않습니다.</h1>");
}
out.println("</body>");
out.println("</html>");
}
}
'SelfStudy > Server ( Servlet , JSP )' 카테고리의 다른 글
Servlet( EL ) (0) | 2023.03.21 |
---|---|
Servlet vs JSP ( 차이점 ) (0) | 2023.03.20 |
JSP (Java Server Pages) 란 ? (0) | 2023.03.20 |
오라클 포트:8080 다른걸로 바꾸기 !! (0) | 2023.03.17 |
이클립스와 톰캣 연동하기 !! (0) | 2023.03.17 |