Atomic Habits

Java_Web_Study 본문

IT/JAVA

Java_Web_Study

체계성 2022. 4. 26. 21:23

■ 정적 웹 프로그래밍(38)
Apache 같은 웹 서버를 이용해서 웹 페이지들을 브라우저에 표시하는 방식을 정적(static) 웹 프로그래밍이라고 합니다.
정적 웹 프로그래밍 : 보여줄 HTML, CSS, img, js 파일을 웹 저장해 두고 브라우저에서 요청할 경우 '고정된 정보'를 '그대로' 전달만하는 방식이며,
사용자는 페이지가 변경되지 않는 한 고정된 웹 페이지를 보게 된다.
(주기적으로 웹 서버 관리자가 '손으로 직접' HTML의 환율 '정보가 있는 코드를 수정'해야 하는 정적 웹)
환율, 주가 등 실시간으로 변하는 정보를 표시해야 할 일이 많기 때문에 이 방식은 거의 사용되지 않는다.
정적 웹 프로그래밍의 구성 요소는 여전히 JSP에서 화면 디자인과 기능 처리를 담당하므로 알아두어야 한다.

■ 용어 정리
웹 서버 : 각 클라이언트에게 서비스를 제공하는 컴퓨터
클라이언트 : 네트워크로 서버에 접속 후 서버로부터 서비스를 제공받는 컴퓨터
HTTP : 웹 서버 - 클라이언 간 정보를 주고 받을 때 사용하는 통신 규약
JS : HTML 웹 페이지의 여러 동적 기능을 제공하는 스크립트 언어
CSS : 서체, 색상, 정렬 등 디자인 관련 기능 제공


■ 동적 웹 프로그래밍(40)
정적 웹 에서 관리자가 해야 했던 '페이지/코드 상의 정보 업데이트'를 웹 애플리케이션 서버(WAS)가 수행한다.
client 요청이 있을 때마다 웹 서버(WAS)가 환율 정보가 저장되어 있는 DB에 접근하여 실시간 정보를 제공한다.

WAS : Web Application Server

동적 웹 프로그래밍의 종류 - JSP, ASP, PHP

■ 스레드 방식의 JSP
                                        DB ( 환율정보조회  query )
                                                      |
client - 환율 정보 요청/반환 - 웹 서버 - 웹 애플리케이션 서버
                                            (톰캣/제우스/웹로직)
                                                     |   
                                          외부 환율 조회 기능

 

- 환율 조회 기능을 메모리에 로드 후 외부 웹에서 환율정보를 가져옴.
- 타 client가 재요청 시 위 기능이 메모리에 존재하므로 그대로 사용.
    (메모리 부하 방지)

■ JSP, ASP, PHP 동작 방식의 특징
- 프로세스 방식이 아닌 스레드 방식(메모리로 로드 하는 과정에서 프로그램의 수행 속도 저하 유발)
- client의 요구를 처리하는 기능은 최초 한 번만 메모리에 로드
- client가 동일 기능 요구 시 기존에 사용한 기능을 재사용


■ 이클립스 재설치
JavaUninstallTool 를 필히 다운받아서 실행 후 재시작하면 자바, 이클립스 재설치 시 충돌방지 

C:/user/사용자이름의 경로 아래 4개 폴더를 삭제해야 새롭게 설치 된다.
eclipse
eclipse_workspace( 이클립스가 존재하는 지정한 경로에 있을 수 있음 / 사용자가 지정한 경로일 수도 있음 )
.eclipse
.p2
(.이 붙은 경로는 숨긴 항목 표시 필요)

* 이클립스 존재 경로 찾기
이클립스 아이콘 속성에서 확인 가능


■  문제 발생
could not open c:\java\lib\jvm.cfg file error
종종 이클립스에서 Java JDK를 제대로 인식 못해서 이런 경우가 발생한다.
이럴 때에는,   eclipse.ini 파일을 열어서

-vm
C:\현재 자바가 설치된 경로 주소\java\jdk1.6.0_17\bin
를 입력해서 vm을 수동으로 설정해 주면 정상적으로 이클립스가 실행된다.
eclipse.ini의 위치는 eclipse.exe 파일이 있는 위치에 함께 있다.

■ 톰캣 컨테이너 설치하기(54) - 웹 애플리케이션 서버의 일종
DB, API 등 다른 기능과 연동할 수 있게 동작하는 것이 웹 컨테이너(톰캣)
서블릿이나 JSP를 실행하여 웹 페이지에 가격 정보를 
동적으로 표시해주는 톰캣 컨테이너

■ 웹 애플리케이션의 정의(98)
1) 기존 정적 웹 프로그래밍 방식의 기능에
서블릿, JSP, 자바 클래스들을 추가하여 client에게 동적인 서비스를 
제공하는 프로그램

2) 웹 컨테이너에서 실행되는  JSP,  서블릿, 자바 클래스들을 사용해
정적 웹 프로그래밍 방식의 단점을 보완하여 서비스를 제공하는 서버 프로그램을
웹 애플리케이션이라고 한다.


■ 웹 컨테이너(톰캣)에서 실행하는 
웹 애플리케이션의 기본 디렉터리 구조(99)

아래오 다같은 구조를 갖춰야 웹 애플리케이션 실행 시 오류가 나지 않는다.
다른 기능이 추가되면 디렉터리를 추가해서 사용한다.

웹 애플리케이션 폴더명 - 중복 불가  
  ㄴ 기타 폴더명      - JSP HTML 파일 저장
  ㄴ WEB-INF        - 웹 앱 관련 정보가 저장되며 외부에서 접근 불가
       L  classes   - 웹 앱이 수행하는 서블릿, 일반 클래스들 
   L  lib       - 라이브러리(jar)(DB 연동 드라이버, 프레임워크 기능 관련)
   L  web.xml   - 배치 지시자(deployment descriptor)로서 일종의
                  환경 설정 파일
  
■  웹 애플리케이션에 추가된 구성 요소의 기능(105)
bin - 애플리케이션에서 사용되는 각종 실행 파일 저장
conf - 프레임워크에서 사용하는 각종 설정 파일 저장
src - 자바 소스 파일 저장

■ 컨테이너에서 웹 애플리케이션 실행하기
웹 애플리케이션을 만들어 톰캣 컨테이너에서 실행 후 웹 브라우저에서 요청하면
정상적으로 실행되는지 실습해보자.

자바 애플리케이션은 일반 PC에서 단독으로 실행할 수 있지만,
웹 애플리케이션은 톰캣 같은 웹 컨테이너에서 실행되는 구조이다.
따라서 톰캣에 먼저 등록부터 하자.

■ 톰캣에 등록하는 방법 2가지
1) %CATLALINA_HOME%webApp 디렉터리에 애플리케이션을 저장(개발 완료 후 실제 서비스 제공 시에 사용하는 방법)
설치한 톰캣 루트 디렉터리(CATLALINA_HOME)의 하위 디렉터리인 webapps 에
작성한 웹 애플리케이션을 위치시킨 다음 
톰캣(tomcat9/bin/Tomcat9.ext)을 재시작하면 웹 애플리케이션을 인식/등록 후 
웹 브라우저에서 웹 애플리케이션을 요청하면 실행할 수 있다.

http://ip:port/context/요청파일명
http://localhost:8090/webShop/main.html  - 개인 PC에서 할 경우 localhost로 가능
http://192.168...:8090/webShop/main.html


2) server.xml에 직접 웹 애플리케이션을 등록
임의 위치에 있는 웹 애플리케이션을 톰캣의 설정 파일인 server.xml에 등록해서 실행할 수 있다.
개발 과정에서는 1)번 처럼 프로젝트 파일 통째로 복사해야 한다면 불편할 수 있다.
따라서 C 드라이브 내 임의 위치에 웹 애플리케이션(webShop) 폴더를 두고 그 위치를 server.xml에
등록(<Host> 태그 아래)해 두고 톰캣을 실행하는 식으로 개발해야 한다.
(톰캣이 xml에 입력된 곳으로 이동하여 파일을 확인 후 실행)
마찬가지로 bin/Tomcat9.exe를 실행한 후 http://192.168.0.3:8090/webMal/main.html 를 요청한다.

C:\Tomcat 9.0\conf 아래 server.xml의 <Host>태그 아래 <Context> 태그를 추가한다.

<Context path="/컨텍스트 이름"                                   
              docBase="실제 웹 애플리케이션의 WEB_INF 디렉터리 위치" - 
  reloadable="true 또는 false" /> - 
path : 웹 브라우저에서 실제 웹 애플리케이션을 요청하는 이름
docBase : 해당 컨텍스트에 대한 실제 웹 애플리케이션이 위치한 경로이며 컨테이너 상위 폴더까지 명시
reloadable : 실행 중 소스 코드가 수정될 경우 바로 갱신할지 설정( false : 톰캣 재실행 해야 변경된 코드 반영 )

<Context path="/webMal"
              docBase="C:\WebApp\shoppingMall"
  reloadable="true" />

* Context(110)
server.xml에 등록하는 웹 애플리케이션을 컨텍스트라고 하는데, 
톰캣 입장에서 인식하는 한 개의 웹 애플리케이션이라고 볼 수 있다.

컨터이너 실행 시 웹 애플리케이션당 하나의 컨텍스트가 생성된다.
웹 애플리케이션과 컨텍스트 이름을 같게 만드는 것이 일반적이나 보안상 이유 또는
웹 애플리케이션 이름이 긴 경우 등은 다르게 만들 수도 있다.


[이클립스 웹 애플리케이션 실습]

- 이클립스에서는 한 개의 프로젝트가 한 개의 웹 애플리케이션이며, 프로젝트명이 웹 애플리케이션 이름이다.
1) 프로젝트 생성 > New Dynamic web Project
  Project name : webShop / 3.0 / Default Configuration 
  Source project on build path : src
  Context root : webShop
  Content directory : WebContent 
  (WebContent 대신 기본값인 src/main/java로 둘 경우 java/ 아래에 META_INF, WEB-INF 가 생성됨)
  
2) HTML 생성
 WebContent 바로 아래 main.html 생성
 
3) 이클립스 - 톰캣 연동
 이클립스는 통합 개발 환경 도구이므로 일일이 직접 경로를 만들고 톰캣에 등록할 필요가 없다.
 이클립스에서 설정만 해주면 톰캣이 컨테이너에 알아서 등록을 해주기 때문에 간편하다.
 Server > 우클릭 New > Server > v9.0 > 생성한 프로젝트를 Add할 경우 server.xml에 <Context> 태그로
 등록이 된다. 즉, 톰캣 서버에 webShop 프로젝트가 등록된 것이다.
 
■ 웹 애플리케이션 배포하기(130)
실제 서비스에서는 이클립스에 등록된 톰캣에서 실행하는 것이 아니다. 
웹 애플리케이션 전체 소스를 리눅스 서버에 설치된 톰캣으로 이동시켜서 실행하는데, 이 과정을 배치(deploy)라고 한다.
실제로 서비스한다라는 의미이다.

- 이클립스에서 배치할 프로젝트를 war 압축 파일로 만들고 톰캣 컨테이너의 webapps 폴더에 저장해보자.

개발을 마친 후 프로젝트를 war 압축 파일로 만든 후 FTP를 이용해 톰캣이 미리 설치된 리눅스 운영 서버에 업로드한다. 
그리고 텔넷(telnet)을이용해 bin 폴더의 Tomcat.exe를 다시 실행하면 톰캣 실행 시 war 파일의 압축이 해제되면서
동시에 톰캣에 자동으로 등록되어 웹 애플리케이션이 실행된다.

■ 이클립스 HTML, JSP 한글 인코딩 UTF-8 설정(136)


■ 서블릿(140)
클라이언트 요청에 따라 서버 쪽에서 동작하여 동적으로 서비스를 제공하는 자바 클래스
서블릿은 자바로 작성되어 자바의 일반적인 특징을 모두 가진다. 
하지만 서블릿은 톰캣과 같은 JSP/Servlet 컨테이너에서만 실행된다.

- 서블릿 동작 과정
  클라이언트의 요청을 받은 웹 서버는 그 요청을 웹 애플리케이션 서버(WAS) 즉, 톰캣으로 위임한다.
  그러면 WAS는 각 요청에 대한 서블릿을 실행한다. 
  그리고 서블릿은 요청에 대한 기능(가격 조회 후 할인가 적용 등)을 수행한 후 결과를 반환하여 클라이언트에 전송한다.
  
  서블릿의 특징
  서버 내에서 기능 수행하고, 컨테이너에서 실행됨.  스레드 방식, 컨테이너 종류에 상관없이 실행됨.
  웹 브라우저에서 요청 시 기능을 수행함. 보안 기능 적용 용이함.


■ 톰캣 servlet_api.jar 클래스 패스 설정(145)
톰캣의 서블릿 API 들은 servlet_api.jar 라이브러리로 제공되므로, 이클립스의 프로젝트에서 클래스 path를 설정해야 한다.

1) 프로젝트 생성
2) 프로젝트 우클릭 > Build Path > Java Build Path > Libraries >
tomcat 설치 폴더 > lib > servlet_api.jar


■ 첫 서블릿 생성(152)
1) Package 생성
 src 우클릭 > New > Package > 
 Source folder : pro05/src 
 Name : sec01.ex01
2) Class 생성
 위 패키지 내에 FirstServlet.java로 생성

3) 서블릿 메서드 작성
public class FirstServlet extends HttpServlet{

@Override
public void init() throws ServletException {
System.out.println("init 메서드 호출");
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet 메서드 호출");
}

@Override
public void destroy() {
System.out.println("destroy 메서드 호출");
}

}

4) 서블릿 매핑하기
 - 브라우저에서 서블릿 이름으로 요청하는 방법
   프로젝트 이름 뒤에 패키지 이름이 포함된 클래스 이름을 입력한다.
   http://IP:port/프로젝트명/전체패키지명.클래스명
   http://192...:8090/pro05/sec01.ex01.FirstSeverlet
   -> 너무 길고, 클래스명의 기능을 짐작할 수 있으므로 보안에도 취약
   
   위 주소를 대체할 수 있는 서블릿 매핑 명칭을 만들자.
   
 - 방법
  1) 각 프로젝트 내 web.xml에서 설정
  2) <servelt> 태그와 <servlet_mapping> 태그를 이용
  3) 여러 서블릿 매핑 시 <servlet> 태그 먼저 정의 후
     <servlet_mapping> 태그를 정의한다.
 
  * servlet_name이 <servlet> 태그와 <servlet_mapping> 태그의 연결 역할
  
  <servlet>
   <servlet-name>aaa</servlet-name>
   <servlet-class>sec01.ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>aaa</servlet-name>
   <url-pattern>/first</url-pattern>
  </servlet-mapping>
  
  * 웹에서 /first로 요청 시 aaa 로 연결되는 
    실제 서블릿 sec01.ex01.FirstServlet 을 실행한다.

http://ip:8090/프로젝트명(context name)/서블릿매핑이름
http://localhost:8090/pro05/first
(톰캣이 로컬 pc에 설치된 경우 localhost 도 가능)


■ 다수의 서블릿 매핑하기
- 주문, 회원 관리, 게시판 등 여러 기능을 한 서블릿에 만들면 소스가 복잡해지고 관리가 어렵다.
실제 웹 서비스에서는 한 프로젝트에서 여러 개의 서블릿을 만들어 사용한다.

- 여러 서블릿 매핑 시 <servlet>, <servlet-mapping>를 각각 분리해서 작성한다.
  <servlet>
   <servlet-name>aaa</servlet-name>
   <servlet-class>sec01.ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet>
   <servlet-name>bbb</servlet-name>
   <servlet-class>sec01.ex01.SecondServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
   <servlet-name>aaa</servlet-name>
   <url-pattern>/first</url-pattern>
  </servlet-mapping>
   <servlet-mapping>
  <servlet-name>bbb</servlet-name>
   <url-pattern>/second</url-pattern>
  </servlet-mapping>
  
  * web.xml 수정 시 톰캣 재실행 필요.
  
- 클라이언트 1이 특정 요청을 하면 톰캣은 해당 서블릿이 메모리에 로드되어 있는지 판단해서, 메모리에 로드 시키고, 최초의 요청이므로 init() 메서드를 호출하여
해당 서블릿의 인스턴스를 로드한다. 그 다음 doGet(), doPost() 메서드를 호출하여 
클라이언트에게 제공한다.

- 클라이언트 2가 위와 같은 특정 요청을 하면, 톰캣이 해당 서블릿이 메모리에 로드되어 있는지 확인하는데, 클라이언트 1이 먼저 요청해서 이미 존재한다면 최초 요청이 아니므로 init()은 호출하지 않고
바로 doGet(), doPost() 메서드를 호출하여 서비스한다.

- 이처럼 서블릿은 스레드 방식으로 작동해서 메모리에 존재하는 특정 서블릿을 재사용하여 훨씬 빠르고 효율적으로 동작한다.a

■ 애너테이션을 이용한 서블릿 매핑
- 여러 서블릿을 web.xml에 설정할 경우 서비스의 규모가 커질수록 복잡해진다는 단점이 있다.
  따라서 각 서블릿 클래스에 (@)기호를 사용해 서블릿 표시를 해주면 훨씬 가독성이 좋아진다.
  이처럼 소스 코드에 직접 기능을 설정하는 방식을 애너테이션(annotation)이라 한다.
  
방법 1) 자바 클래스 생성 후 (@) 명시로 서블릿 형태로 만들기
annotation 을 사용하려면 HttpServlet 클래스를 상속받아야 하며, @WebServlet을 명시한다.

@WebServlet("/third")
public class ThirdServlet extends HttpServlet{

}

  
방법 2) 서블릿 생성으로 (@) 바로 적용하기(175)
pakage 우클릭 > New > Servlet > Class Name 적고 URL mappings 수정(브라우저에서 요청할 주소)

* 주의 : annotation이 중복될 경우 에러 발생

■ 서블릿의 세 가지 기본 기능(176)
서블릿 ? -> 웹 브라우저의 요청을 스레드 방식으로 처리하는 기술

1) 클라이언트로부터 요청을 받는다.(ID, PW 입력)
2) WAS 서버 내에서 DB 연동과 같은 비즈니스 로직을 처리한다. 
   (여러 메서드를 이용해 요청 시 전송한 데이터를 받아서, 
    DB에 조회 후 메인 페이지로 이동/오류 메세지 생성 등을 클라이언트에게 전송한다.)
3) 처리된 결과를 클라이언트에게 돌려준다.

■ 서블릿 응답/요청 API(177)
- HttpServletRequest, HttpServletResponse
  doGet(), doPost() 메서드의 매개변수로 사용한다.

- 수행 과정
  WAS(톰캣)에서 클라이언트의 요청을 받고, 요청/응답에 대한 HttpServletRequest, HttpServletResponse 객체 생성 후 
  요청에 대한 정보를 HttpServletRequest의 속성으로 담아 전달하는데,
  서블릿의 doGet(), doPost() 메서드를 호출하면서 매개변수로 위 2개 객체들을 전달한다.
  
- HttpServletRequest, HttpServletResponse 객체의 여러 메서드를 이용해서 요청/응답 관련 작업을 한다.

■ HTML <form> 태그 이용해 서블릿에 요청하기(178)
- 브라우저에서 여러 입력 서식을 이용해 '전송'을 클릭하면 입력한 데이터가 서블릿으로 전송된다.
  서블릿은 여러 메서드를 이용해 전송된 데이터를 받아온다.
  
 <form name = "frmLogin" method="get" action="login" encType="UTF-8">
 아이디 :  <input type="text" name ="user_id"><br>
 비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
 </form>
 
 action : 데이터를 전송받을 서블릿, JSP의 매핑 이름
 encType : 인코딩 타입으로 파일 업로드 시  multipart/form-data 로 지정
 
■ 서블릿에서 클라이언트 요청 얻는 방법(182)
- HttpServletRequest 클래스에서 <form> 태그로 전송된 데이터를 받는 메서드
  String getParameter(String name) : 특정 name 으로 전송된 데이터 수신
  String[] getParmeterValues(String name) : 특정 name 으로 여러 데이터 수신
  Enumeration getParameterNames() : name 값을 알지 못할 때 사용
 
[login.html]
 <!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <form name = "frmLogin" method="get" action="login" encType="UTF-8">
 아이디 :  <input type="text" name ="user_id"><br>
 비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
 </form>
</body>
</html>

[LoginServlet]
package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
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 LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init 메서드 호출");
}

public void destroy() {
System.out.println("destroy 메서드 호출");
}

// 톰캣 컨테이너는 HttpServletRequest 객체를 생성한 후 웹에서 전송된 정보를 doGet 메서드로 넘겨준다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.getWriter().append("Served at: ").append(request.getContextPath());

request.setCharacterEncoding("utf-8"); // 전송된 데이터를 UTF-8로 인코딩한다.
String user_id = request.getParameter("user_id"); // form 태그의 name 속성에 해당하는 value를 가져온다.
String user_pw = request.getParameter("user_pw");

System.out.println("ID : "+ user_id);
System.out.println("PW : "+ user_pw);
}

}

■ 여러 개의 값을 한번에 전송받을 때(186)
[input.html]
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <form name = "frmLogin" method="get" action="input" encType="UTF-8">
 아이디 :  <input type="text" name ="user_id"><br>
 비밀번호 : <input type="password" name="user_pw"><br>
 <input type="checkbox" name="subject" value="java" checked>자바
 <input type="checkbox" name="subject" value="C">C
 <input type="checkbox" name="subject" value="JSP">JSP
   <input type="checkbox" name="subject" value="HTML">HTML
   <input type="checkbox" name="subject" value="CSS">CSS
 <br><br>
 
<input type="submit" value="전송">
<input type="reset" value="초기화">
 </form>
</body>
</html>

[InputServlet.java]
package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
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 InputServlet
 */
@WebServlet("/input")
public class InputServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public InputServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

/**
 * @see Servlet#init(ServletConfig)
 */
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}

/**
 * @see Servlet#destroy()
 */
public void destroy() {
// TODO Auto-generated method stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());

request.setCharacterEncoding("utf-8");
String user_id = request.getParameter("user_id"); // form 태그의 name 속성에 해당하는 value를 가져온다.
String user_pw = request.getParameter("user_pw");

System.out.println("ID : "+ user_id);
System.out.println("PW : "+ user_pw);

String[] subject = request.getParameterValues("subject"); // 하나의 name("subject")으로 여러 값을 전송받는 경우 사용한다.

for (String str : subject)
{
System.out.println("선택한 과목: "+str);
}
}
}

■ getParameter()를 이용하기에는 매개변수가 너무 많을 경우(186)
- getParameterNames() 메서드 사용


[InputServlet2.java]
package sec01.ex01;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
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 InputServlet
 */
@WebServlet("/input2")
public class InputServlet2 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());

request.setCharacterEncoding("utf-8");
// String user_id = request.getParameter("user_id"); // form 태그의 name 속성에 해당하는 value를 가져온다.
// String user_pw = request.getParameter("user_pw");
//
// System.out.println("ID : "+ user_id);
// System.out.println("PW : "+ user_pw);

Enumeration enu = request.getParameterNames();

while (enu.hasMoreElements())
{
String name = (String) enu.nextElement();
System.out.println("        name : "+ name);
String[] values = request.getParameterValues(name);
for (String value : values)
{
System.out.println("name = "+name + ", value = "+value);
}}}}


■ 서블릿의 응답 처리 방법(191)
1) doGet()/doPost() 메서드 안에서 처리
2) HttpServletResponse 객체 활용
3) setContentType()로 클라이언트에게 전송할 데이터 종류(MIME-TYPE)를 지정
4) 클라이언트(브라우저)와 서블릿의 통신은 자바 I/O의 스트림을 이용

브라우저(클라이언트 측)와 서블릿(서버 측)은 네트워크를 통해 데이터를 주고 받는다.
서버(서블릿)에서 웹 브라우저로 데이터를 전송할 때는 어떤 종류의 데이터를 전송하는지 알려줘야 한다.
브라우저가 그 정보를 알고 있을 때 더 빨리 처리할 수 있기 때문이다.
서버(서블릿)에서 자바 I/O 스트림 클래스 웹 브라우저로 데이터를 전송할 때 
톰캣 컨테이너에서 미리 설정해 놓은 데이터 종류(=MIME-TYPE) 중 하나를 지정해서 브라우저로 전송한다.
HTML로 전송 시 : text/html
일반 텍스트로 전송 시 : text/plain
XML 데이터로 전송 시 : apllication/xml

웹 브라우저는 기본적으로 HTML만 인식하므로 서블릿에서 전송하는 대부분의 데이터는  text/html로 지정한다.
새로운 종류의 데이터를 지정하고 싶다면 CATALINA_HOME\conf\web.xml에 추가한다.

■ HttpServletResponse를 이용한 서블릿 응답 실습
1) setContentType()로 MIME-TYPE 지정
2) 데이터를 출력할 PrintWriter 객체 생성
3) 출력 데이터를 HTML 형식으로 만듦
4) PrintWriter 의 print()/println() 를 이용해 데이터 출력

시작 페이지 : http://localhost:8090/pro06/login.html
요청 페이지 : http://localhost:8090/pro06/login2?user_id=abc&user_pw=5555

[login.html]
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
 <form name = "frmLogin" method="get" action="input2" encType="UTF-8">
 아이디 :  <input type="text" name ="user_id"><br>
 비밀번호 : <input type="password" name="user_pw"><br>
 <input type="checkbox" name="subject" value="java" checked>자바
 <input type="checkbox" name="subject" value="C">C
 <input type="checkbox" name="subject" value="JSP">JSP
   <input type="checkbox" name="subject" value="HTML">HTML
   <input type="checkbox" name="subject" value="CSS">CSS
 <br><br>
 
<input type="submit" value="전송">
<input type="reset" value="초기화">
 </form>
</body>
</html>


package sec01.ex01;

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;

[LoginServlet2.java]
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("----------------------수신1");
request.setCharacterEncoding("utf-8");              // 요청 데이터 인코딩 설정
response.setContentType("text/html;charset=utf-8"); // 응답 데이터 종류 지정

PrintWriter out = response.getWriter(); 
// HttpServletResponse 객체의 getWriter() 로 출력 스트림 PrintWriter 객체를 받는다.

System.out.println("----------------------수신2");

String id = request.getParameter("user_id");
String pw = request.getParameter("user_pw");

String data = "<html>"; // 브라우저로 출력할 데이터를 HTML 태그로 만듦
data += "<body>";
data += "<body>";
data += "ID : "+id;
data += "<br>";
data += "PW : "+pw;
data += "</body>";
data += "</html>";
System.out.println("----------------------수신3");
out.print(data); // PrintWriter 의 print()로 HTML 양식을 웹 브라우저에 출력
}
}

Comments