[학습일지]JAVA교육일지 62일차 (SERVER)⭐
1. Servlet
2. Servlet Class
1. Servlet
[ 정의 ]
- (서버측) 기술, Server-side Programming
- 자바를 사용해서 동적으로 웹페이지를 만드는 기술이다.
- 자바 진영에서 처음으로 시도한 웹서버 기술이다.
- Server + Applet 합성어
2. Servlet Class
[ 정의 ]
- 순수 자바 클래스를 기반으로 웹 어플리케이션(웹사이트, 웹페이지)를 제작하는 기능을 추가한 클래스
[ 작성 규칙 ]
- 해당 규칙을 준수하여 클래스를 작성해야만 서블릿 클래스의 역할을 할 수 있고 WAS에 의해서 관리/운영 될 수 있다.
1) 서블릿 클래스 선언
- 방법1 ) javax.servlet.Servlet 인터페이스를 구현한다.(복잡함) -> 잘 사용 안함
- 방법2 ) javax.servlet.HttpServlet 클래스를 상속한다.(간편함) -> 주로 사용함
- 위 두 방법중 하나만 쓰면 된다.
2) doGet/doPost 메소드 선언
- 둘 중 하나 or 둘 다 선언 필요
- 둘 중 하나라도 없으면 서블릿이 아니다.
- 클라이언트(브라우저)의 요청이 들어오면, 서버측에서 자동으로 미 메소드가 실행된다. (일종의 이벤트 메소드 or 콜백 메소드)
- 동적으로 HTML 페이지를 생성하는 역할의 메소드이다.
- 카페의 바리스타(알바생)으로 따지면 커피를 만드는 일
- 메소드 작성 규칙
매개 변수 작성(2개 전부 필요) | 1) javax.servlet.http.HttpServletReqeust 2) javax.servlet.http.HttpServletResponse |
예외 미루기(2개 전부 필요) | 1) java.io.IOEception : 페이지를 동적으로 만드는 작업(외부 입출력 발생) 2) javax.servlet.ServletException : 서블릿과 관련 예외 처리 |
3) 동적 HTML 문서 작성 구현
- HttpServletResponse 객체의 getWriter() 메소드 호출을 하면 PrintWriter 객체를 반환한다.
- PrintWriter 객체의 printXXX(), write() 등의 메소드를 보유한다.
--> 이 메소드를 사용해서 브라우저에게 돌려줄 HTML 페이지 소스를 작성한다.
- PrintWriter의 작성 내용이 브라우저에게 돌려줄 페이지 소스가 된다.
4) 가상 주소 매핑
- http://localhost:8090/ServletTest/servlet/com.test.servlet.Hello (수업용 예제 주소)
- 자바 파일(*.java)은 웹에서 사용하는 용도의 파일이 아니다.
- 브라우저를 통해서 자바 파일을 실행할 수 없다.
- 브라우저가 자바 파일을 직접 호출할 수 있도록 가상 주소를 만들어서 서로 연결해야 한다.
- Tomcat(웹 서버)에게 설정한다. > web.xml(Deployment Descriptor, 배포 서술자)
[ 예제 ]
- A페이지, B페이지 2개의 페이지의 데이터 주고받기
- A페이지 -> 사용자에게 정보 입력 -> (전송) -> B페이지 -> 데이터 수집 + 가공 + 화면 출력
- A 페이지(java 파일)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("<!DOCTYPE html>\r\n"
+ "<html lang=\"en\">\r\n"
+ "<head>\r\n"
+ " <meta charset=\"UTF-8\">\r\n"
+ " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n"
+ " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n"
+ " <title>Document</title>\r\n"
+ " <style>"
+ " label { display: block; margin-bottom: 10px; }"
+ " </style>"
+ "</head>\r\n"
+ "<body>\r\n"
+ " <h1>데이터 입력</h1>\r\n"
+ "\r\n"
+ " <form method=\"GET\" action=\"/ServletTest/ex03_receive.do\">\r\n"
+ " <label>이름: <input type=\"text\" name=\"name\"></label>\r\n"
+ " <label>나이: <input type=\"number\" name=\"age\"></label>\r\n"
+ "\r\n"
+ " <div><input type=\"submit\" value=\"서버로 전송하기\"></div>\r\n"
+ " </form>\r\n"
+ "</body>\r\n"
+ "</html>");
writer.close();
}
- B 페이지(java 파일)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 사용자가 입력한 한글이 깨지지 않는 방법
req.setCharacterEncoding("UTF-8");
// 사용자가 보낸 데이터를 서버에서 수신하는 방법
String name = req.getParameter("name"); // <input type="text" name="name">
String age = req.getParameter("age"); // <input type="number" name="age">
// 브라우저에게 돌려줄 페이지의 한글이 깨지지 않는 방법
resp.setCharacterEncoding("UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("<!DOCTYPE html>\r\n"
+ "<html lang=\"en\">\r\n"
+ "<head>\r\n"
+ " <meta charset=\"UTF-8\">\r\n"
+ " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\r\n"
+ " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n"
+ " <title>Document</title>\r\n"
+ "</head>\r\n"
+ "<body>\r\n"
+ " <h1>결과 페이지</h1>\r\n"
+ "\r\n"
+ " <div>이름: " + name + "</div>\r\n"
+ " <div>나이: " + age + "세</div>\r\n"
+ " <div>성인여부: " + (Integer.parseInt(age) >= 19 ? "성인" : "미성년") + "</div>\r\n"
+ "</body>\r\n"
+ "</html>");
writer.close();
}
- web.xml 가상 매핑 (xml 파일)
<!-- A페이지 가상주소 -->
<servlet>
<servlet-name>Ex03</servlet-name>
<servlet-class>com.test.servlet.Ex03_Send</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ex03</servlet-name>
<url-pattern>/ex03_send.do</url-pattern>
</servlet-mapping>
<!-- B페이지 가상주소 -->
<servlet>
<servlet-name>Ex03r</servlet-name>
<servlet-class>com.test.servlet.Ex03_Receive</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ex03r</servlet-name>
<url-pattern>/ex03_receive.do</url-pattern>
</servlet-mapping>
- 결과
A페이지에서 이름, 나이 입력시 B페이지로 데이터를 이동하는 웹 페이지 구현
MEMO>
# 웹페이지 작동 시 405 Error 발생 시 GET -> doGet() / POST -> doPost() 이 규칙이 어긋나면 발생한다.
# doGet(), doPost() 메소드는 자바에서 인텔리센스(Ctrl+Space)가 존재한다.
# Servlet을 하루 배웠지만, HTML 파일을 불러와서 수정하는 부분이 너무 불편한것 같다...
# + 가상 주소 매핑도 번거롭고 귀찮은 부분이 있는것 같다!