서버 측 Java를 시작하는 방법

서블릿 또는 서버 측 애플릿이라고도하는 SSJ (Server-side Java)는 CGI (Common Gateway Interface)와 하위 수준 서버 API 프로그래밍 (예 : Netscape의 NSAPI 및 Microsoft의 ISAPI)의 강력한 하이브리드입니다.

이 기사에서는 Netscape가 서버 측 애플릿 (SSA)이라고 부르는 서버 측 Java의 Netscape 구현에 대한 소개와 단계별 지침을 제공합니다.

SSA는 CGI 스크립트처럼 작동 할 수 있습니다. 웹 페이지 (일반적으로 HTML 형식)를 수신 get하고 post요청하고 반환하지만 SSJ는 NSAPI / ISAPI와 같은 서버에 동적으로로드됩니다. 이것은 우리가 CGI에서 기대했던 시작 지연을 제거합니다. 또한 SSJ는 데이터베이스에 대한 열린 연결을 유지하는 것과 같이 실행 사이에 일부 상태를 유지할 수 있습니다.

SSA는 자체 샌드 박스 에서 실행되어 Java에서 기대하는 보안을 제공합니다. 예를 들어, 충돌하는 애플릿은 NSAPI / ISAPI 프로그래밍에서 발생할 수있는 것처럼 전체 서버를 충돌시키지 않습니다. 이 추가 보안은 또한 클라이언트에서 실행하기 위해 클라이언트 측 Java 애플릿을 다운로드하는 것처럼 서버에서 실행하기 위해 애플릿을 업로드 할 수 있도록합니다.

아마도 SSA의 가장 중요한 측면은 Java로 작성된 SSA가 본질적으로 플랫폼 독립적이고 객체 지향적이라는 것입니다.

역사

Netscape FastTrack 2.0 및 Enterprise 2.0 서버, JavaSoft의 Java Web Server (이전의 Jeeves), World Wide Web Consortium의 Jigsaw, WebLogic의 T3Server, Oracle의 Webserver 및 Peak Technologies의 ExpressO를 포함하여 점점 더 많은 서버가 서버 측 Java를 지원합니다. 이러한 각 서버는 다른 서버 측 Java API를 사용하므로 개발자는 사용할 각 서버에 대해 다른 프로그램을 작성해야합니다.

Netscape 세부 사항 : 서버 준비

Netscape 서버용 첫 번째 서버 측 애플릿을 작성하기 전에 서버를 준비해야합니다. Enterprise 및 FastTrack 서버는 SSA 지원에서 동일합니다.

서버의 Java 인터프리터를 켜서 시작하십시오. 이 작업은 "프로그램-> Java"의 서버 관리자에서 수행 할 수 있습니다. 예 버튼을 클릭하여 Java 인터프리터를 활성화합니다. 서버 관리자는 모든 SSA 클래스 파일의 위치와 SSA 지원 파일을 저장할 위치 인 "Java 애플릿 디렉토리"를 요청합니다. 기본 위치를 제공합니다. Unix 시스템에서는 / usr / ns-home / plugins / java / applets 입니다. Windows 시스템에서는 C : \ Program Files \ Netscape \ Server \ plugins \ Java \ applets입니다.(참고 :이 입력 필드에서 Netscape는 백 슬래시와 슬래시를 혼합하여 일치시키는 경향이 있습니다. Netscape는 두 가지 유형의 슬래시를 동일한 방식으로 처리합니다.) 가능하면 기본 애플릿 디렉토리를 사용하십시오. 기본값을 사용하지 않고 사용자 정의하기로 결정한 경우 서버 루트 아래에있는 디렉토리를 선택하고 기본 위치에서 사용자 정의 위치로 모든 파일을 복사했는지 확인하십시오. 변경 사항을 저장하고 적용합니다. 변경 사항이 적용되도록 서버를 중지하고 다시 시작해야합니다.

실험 할 시간입니다!

이 시점에서 Netscape에서 제공하는 애플릿을 실험 할 수 있어야합니다. 브라우저에서 // servername / server-java / FormApplet? abc = xyz & 123 = 789를 가리 킵니다. Form 애플릿에 의해 처리되고 HTML로 반환 된 "get"데이터가 표시되어야합니다.

서버 오류가 발생하면 서버의 오류 로그 ( / usr / ns-home / httpd-hostname / logs / errors 또는 C : \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ errors )를 확인하십시오. Java 인터프리터를 시작할 수 없다고 표시되면 CLASSPATH가 Netscape를 혼동하고 있기 때문일 수 있습니다. CLASSPATH가없는 환경에서 서버를 시작하십시오.

시도 할 또 다른 애플릿은 // servername / server-java / Connect입니다. //www.meer.net/barn/index.html을로드하고 표시해야합니다. Connect 애플릿은 페이지를 가져 오기 위해 소켓 연결을 설정합니다. 서버가 방화벽 뒤에있는 경우 서버 오류가 발생할 수 있습니다. 다음 단계에서는 방화벽이 소켓을 차단했다고 가정합니다. Connect 애플릿 코드를 편집하여 다른 웹 서버의 다른 페이지에 액세스합니다.

Connect.java 파일은 "Java 애플릿 디렉토리"에서 사용할 수 있습니다. (아래에서도 찾을 수 있습니다.) 먼저 netscape.server.applet. *를 가져옵니다.

import netscape.server.applet. *; 

이 패키지에는 서버 측 애플릿 개발을위한 기본 클래스가 포함되어 있습니다. 이 패키지에서 가장 중요한 클래스는 HttpApplet모든 서버 측 애플릿의 수퍼 클래스입니다. Connect (아래)에서 볼 수 있듯이 서버 측 애플릿이 구현해야하는 유일한 방법은 run방법입니다. 이 메소드는 애플릿이 "적중"을 수신 할 때마다 호출됩니다. run연결을위한 방법은 "호스트"에 소켓을 열고 클라이언트에 출력을 리디렉션하기 전에 "요청"을 가져옵니다. 웹 서버에서 볼 수있는 시스템을 참조하도록 "host"변수를 변경하려고합니다. 또한 "요청"변수를 변경하여 새 "호스트"의 페이지를 참조하도록 할 것입니다.

import netscape.server.applet. *; import java.io.PrintStream; import java.io.InputStream; import java.io.OutputStream; import java.io.DataInputStream; import java.net.Socket; class Connect extends HttpApplet {public void run () throws Exception {String host = "www.meer.net"; //이 int 포트 변경 = 80; String request = "GET /barn/index.html HTTP / 1.0 \ n"; // 이것도 Socket s = new Socket (host, port); OutputStream os = s.getOutputStream (); PrintStream op = new PrintStream (os); op.println (요청); InputStream은 = sam (); DataInputStream di = 새 DataInputStream (is); 줄 줄; if (returnNormalResponse ( "text / html")) {PrintStream out = getOutputStream (); out.println ( "& lth1 & gt"+ host + "포트"+ port + ""의 데이터); out.println ( "요청 :"+ 요청 + "
   
"); while ((line = di.readLine ())! = null) out.println (line);}}}

"호스트"및 "요청"을 변경 한 후 다음 단계는 Connect를 다시 컴파일하는 것입니다.

Windows에서는 serv2_0.zip을 포함하도록 설정된 클래스 경로와 함께 표준 javac 컴파일러를 사용하십시오. javac -classpath ..\classes\serv2_0.zip Connect.java.

Unix에서 Netscape는 Java 애플릿 디렉토리 위의 디렉토리에 Java 컴파일러 (javac)를 제공합니다. 이 javac는 실제로 java sun.tools.javac.Main컴파일을 수행하기 위해 호출하는 스크립트입니다 . 일부 시스템에서 sun.tools.javac.Main컴파일러는와 같은 새로운 1.1 JDK 메서드를 사용하므로 1.1 JDK가 java.lang.Character.isJavaLetterOrDigit()없는 개발자에게는 상당한 문제가 발생할 수 있습니다. 완벽하게 훌륭한 대안은 항상 사용했던 표준 javac 컴파일러 인 javac -classpath ../classes/serv2_0.zip Connect.java. 제공된 javac 스크립트를 사용하려면 " javac"을 ""로 바꾸십시오 ../javac.

이 컴파일 중에 다음과 같은 오류가 표시 될 수 있습니다.

Connect.java:1 : 가져 오기에서 패키지 netscape.server.applet을 찾을 수 없습니다. import netscape.server.applet. *; ^ 1 오류

이 오류는 걱정할 필요가 없습니다. 클래스 파일이 정상적으로 생성되고 정상적으로 실행됩니다. import 문에서 와일드 카드를 제거하면이 오류를 방지 할 수 있습니다.

Unix에서 Netscape는 애플릿 컴파일을 처리하기 위해 Java 애플릿 디렉토리에 메이크 파일을 제공합니다. 불행히도 makefile은 mk / nmake 확장자 인 '%'와일드 카드를 사용하며 항상 사용할 수있는 것은 아닙니다. 문제 코드는 아래와 같습니다.

% .class : % .java ../javac -classpath ../classes/serv2_0.zip $ *. java 

대안은 .suffixes 규칙을 사용하는 것입니다. makefile의 첫 번째 행을 다음과 같이 편집하십시오.

.SUFFIXES : .java .class 및 % .class 대상 행을 .java.class : javac -classpath ../classes/serv2_0.zip $ < 

../makefile이 표준 javac 컴파일러를 호출하도록를 제거했습니다 . 이 새 메이크 파일을 테스트하려면 Connect.java 파일을 다시 저장하고 "make"를 시도하십시오.

// servername / server-java / Connect 페이지를 지금 다시로드하면 "Barn"페이지가 계속 표시됩니다. 이는 Java 클래스가 obj.conf 파일의 init 함수를 통해 시작시 서버에로드되기 때문입니다. 새 변경 사항을로드하려면 서버를 중지 한 다음 다시 시작해야합니다. 일부 시스템에서는 서버 관리자를 사용하여 중지 및 시작해야합니다. 명령 줄을 다시 시작하면 후속 애플릿 요청에 대해 "서버 오류"가 발생하는 경우가 있습니다. 서버를 중지하고 시작한 후에는 Connect 애플릿을 다시 시도하십시오. Netscape는 선택한 페이지를 표시하기 위해 새 연결 코드를로드해야합니다.

API에 대해 진지하게 살펴 보겠습니다.

축하합니다! 방금 첫 번째 서버 측 Java 코드를 컴파일하고 테스트했습니다. 이제 사용 가능한 몇 가지 방법을 제공합니다.

다음 방법을 사용하면 대부분의 작업을 수행 할 수 있습니다.

PrintStream getOutputStream ()에서 IOException이 발생합니다. 

PrintStream클라이언트에 대한 응답을 인쇄하는 데 사용할 수 있는를 반환합니다 . 그것은 대체합니다 System.out.

Hashtable getFormData ()에서 IOException이 발생합니다. 

HTTP 요청의 이름-값 쌍을 저장하는 Hashtable을 반환합니다. 값 문자열은 URI 인코딩 형식에서 디코딩됩니다. IOException양식 데이터가 없으면를 던집니다 .

String getFormField (String fieldName)에서 IOException이 발생합니다. 

getFormField하나의 필드 만 검색 하는 데 사용할 수 있습니다 . 너무 발생 IOException어떤 형태의 데이터가없는 경우.

boolean returnNormalResponse (String contentType) throws IOException; 

매개 변수로 지정한대로 컨텐츠 유형이 설정된 HTTP 응답을 시작합니다. 이것이 "get"또는 "post"요청이면 true를 반환하고 "head"요청이면 false를 반환합니다.

public boolean returnErrorResponse (String contentType, int status, String reason) throws IOException public boolean returnErrorResponse (String contentType, int status) throws IOException 

HTTP 응답을 시작하여 오류를보고합니다. 콘텐츠 유형, 상태 (예 : HttpApplet.BAD_REQUEST표준 오류 코드 400을 나타내는) 및 오류 이유를 제공하는 선택적 문자열을 사용합니다.

서버 측 애플릿 개발에 사용할 수있는 다른 방법은 수십 가지가 있습니다. Netscape는 서버와 함께 API 가이드를 설치합니다. 가이드는 Unix의 /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm 또는 C : \ Program Files \ Netscape \ Server \ bin \ httpd \ admin \ html \에서 찾을 수 있습니다. Windows에서 manual \ pg \ javapi.htm .

안녕하세요!

이제 우리가 배운 모든 것을 사용하여 Hello World 서버 측 애플릿을 작성해 보겠습니다. 다음 애플릿은 필드가 제공 World되지 않는 한 hello to를 표시합니다 target.이 경우 대신 대상에게 hello라고 표시됩니다.

import netscape.server.applet.HttpApplet; import java.io.IOException; import java.io.PrintStream; class Hello extends HttpApplet {/ * 기본적으로 "World"에 인사합니다 * / String helloTarget = "World"; / * 요청을 처리하기 위해 run ()이 호출됩니다. * / public void run () throws Exception {/ * getOutputStream ()을 사용하면 클라이언트와 대화 할 수 있습니다. * / PrintStream out = getOutputStream (); / * getFormField ()를 사용하여 "World"가 아닌 다른 사람에게 * 인사 할 것인지 알아 내십시오. * / 문자열 formTarget = null; 시도 {formTarget = getFormField ( "target"); if (formTarget! = null) {helloTarget = formTarget; }} catch (IOException e) {/ * "쿼리 문자열 누락"으로 인한 예외 무시 * / if (! e.getMessage (). startsWith ( "쿼리 문자열 누락")) {handleException (e, out) ;}} / * 인사하기 * / if (returnNormalResponse ( "text / html")) {try {out.println ( "Hello,"+ helloTarget + "!"); } catch (예외 e) {handleException (e, out); }}} private void handleException (Exception e, PrintStream out) {try {returnErrorResponse ( "text / html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // 원본 예외 인쇄 시도 out.print ( "& lth1>"); out.print (e); out.print ( "\ n"); out.print ( "& ltpre>"); e.printStackTrace (out); // 대체 PrintStream을 지정해야합니다. out.print ( "PrintStream out) {try {returnErrorResponse ( "text / html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // 원래 예외를 인쇄하려고합니다. out.print ( "& lth1>"); out.print (e); out.print ( "\ n"); out.print ( "& ltpre>"); e.printStackTrace (out); // 대체 PrintStream을 지정해야합니다. out.print ( "PrintStream out) {try {returnErrorResponse ( "text / html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // 원본 예외 인쇄 시도 out.print ( "& lth1>"); out.print (e); out.print ( "\ n"); out.print ( "& ltpre>"); e.printStackTrace (out); // 대체 PrintStream을 지정해야합니다. out.print ( "
"); 반환;}}

이 서버 측 애플릿은 netscape.server.applet.HttpApplet에서 하위 클래스를 만들고 run()Netscape의 모든 서버 측 애플릿과 마찬가지로 메서드를 재정의합니다 . 를 호출하여 출력 스트림을 빠르게 가져 getOutputStream오며, "Hello"를 인쇄하는 데 사용합니다 (또는 실패 이유를 인쇄하는 데 사용합니다). getFormField사용할 대체 대상이 있는지 확인하기 위해 호출 한 다음 일반 "text / html"응답을 반환하고 마지막으로 "Hello"를 인쇄하는 실제 작업을 수행합니다. returnNormalResponse()호출 에서 반환 값을 확인하고 false를 반환하면 아무 작업도 수행하지 않습니다. 이렇게하지 않으면 head요청에 대해서도 데이터가 반환됩니다 .