Напишете CGI програми в Java

Common Gateway Interface (CGI) е стандарт за писане на програми, които могат да взаимодействат чрез уеб сървър с клиент, работещ с уеб браузър. Тези програми позволяват на уеб разработчик да доставя динамична информация (обикновено под формата на HTML) чрез браузъра. Програма CGI може да бъде написана на всеки език, включително Java, който може да бъде изпълнен от вашия уеб сървър. Програмите CGI обикновено се използват за добавяне към уеб сайтове на търсачки, приложения за книги за гости, двигатели за заявки към бази данни, интерактивни потребителски форуми и други интерактивни приложения.

Най-елементарно, програмата CGI трябва да интерпретира изпратената до нея информация, да я обработи по някакъв начин и да генерира отговор, който ще бъде изпратен обратно на клиента.

По-голямата част от входа към CGI програма се предава в нея чрез променливи на околната среда. Тази статия ще покаже как да изпратите тези променливи на средата към програма Java CGI. Останалата част от входа (ако има такъв) се предава в CGI програма като стандартен вход, който може да се чете директно от вашата програма.

Обработката може да бъде толкова проста, колкото добавяне на информация към файл или толкова сложна, колкото искането на данни от база данни.

Тъй като програмата CGI може да върне безброй типове документи, програмата CGI трябва да постави кратък заглавие (ASCII текст) на изхода си, така че клиентът да знае как да тълкува информацията, която генерира. Най-често програмите CGI генерират HTML. По-долу ще намерите библиотека от функции, включително такава, която генерира подходящия заглавие за HTML. След заглавката програма CGI просто генерира тялото на изхода в неговата естествена форма.

Предаване на CGI средата в програмата Java

Написването на CGI програма в Java е доста лесно да се направи, след като разберете проблемите. Първо и най-важно, трябва да обгърнете изпълнението на програмата Java в друг скрипт. И така, действителният скрипт, извикан на вашия уеб сървър, ще бъде скрипт на обвивка на Unix или команден файл на Windows (или еквивалент), който просто предава променливите на средата CGI във вашата програма Java.

Тъй като Java вече не предоставя метод за директен достъп до променливи на средата ( System.getenv()методът е деактивиран в последната версия на JDK), предлагам да се предаде всяка променлива на средата на CGI в програмата Java с помощта на параметъра -D на командния ред на интерпретатора на Java . Ще ви покажа как да използвате параметъра -D по-долу.

Библиотеката от функции, които предоставям по-долу, предполага, че сте използвали описания по-горе подход; той използва System.getProperty()метода за достъп до тези параметри на командния ред. Ако вашата програма трябва да използва някоя от променливите на средата на CGI, можете да получите достъп до тях по същия начин. Например, ако искате да получите достъп до променливата на средата SERVER_NAME, можете да го направите, както следва:

 Низ server_name = System.getProperty ("cgi.server_name"); 

Имайте предвид, че не предавам всички променливи на средата CGI в моята програма Java. Подминавам само основните. Ще оставя включването на останалите като упражнение за читателя.

Следващият пример показва Unix скриптов файл, наречен hello.cgiизвикване на Java програма, наречена hello. Обърнете внимание, че параметърът -D на командния ред предава променливите на средата CGI в програмата Java:

#! / bin / sh java -Dcgi.content_type = $ CONTENT_TYPE -Dcgi.content_length = $ CONTENT_LENGTH -Dcgi.request_method = $ REQUEST_METHOD -Dcgi.query_string = $ QUERY_STRING -Dcgi.server_name = $ SERVER_NAME -PORT = $ SERVER_NAME -PORT Dcgi.script_name = $ SCRIPT_NAME -Dcgi.path_info = $ PATH_INFO здравей 

Това решение не работи добре на платформите Windows 95 и NT, тъй като може да има ограничения за броя символи, разрешени в командния ред. Алтернативен подход може да бъде просто писане на всяка от променливите на средата и свързаните с тях стойности във временен файл (с уникално име на файл, разбира се). След това можете да предадете името на този файл във вашата Java програма и да го накарате да го прочете и да анализира двойките променлива / стойност на средата. Не забравяйте да изтриете временния файл, когато приключите с използването му! Отново това упражнение е оставено на читателя.

Библиотека на CGI на Java

За да облекча досадната задача за обработка на CGI входовете, написах клас Java (наистина библиотека от функции), който можете да използвате, за да намалите част от мръсната работа. Тази библиотека се опитва да дублира функционалността в много популярната cgi-lib.plбиблиотека на Perl . Документирах кода по-долу, използвайки коментари в стил javadoc, така че да можете да генерирате HTML документация директно от кода. (Използвайте javadoc cgi_lib.javaза генериране cgi_lib.html.)

Ето изходния код и документацията за библиотеката.

Написване на първата ви Java CGI програма

Ето пример, който показва как cgi_lib.javaбиблиотеката може да се използва за писане на CGI програма. Ще напишем проста програма, която обработва моята форма "Hello There". Тази проста форма ще подкани потребителя за име и имейл адрес. Ето формата ( hello.html), която искаме да обработим:

& ltHTML> & ltHEAD> & ltTITLE & gtЗдравейте и добре дошли! & ltBODY> & ltH1 ALIGN = ЦЕНТЪР & gtЗдравейте и добре дошли & lthr> & ltFORM METHOD = "POST" ACTION = "/ cgi-bin / hello.cgi"> Как се казвате? & ltINPUT TYPE = "text" NAME = "name"> & ltp> Какъв е вашият имейл адрес? & ltINPUT SIZE = 40 TYPE = "text" NAME = "email"> & ltINPUT TYPE = "submit" VALUE = "Submit">. & ltP> & lthr>

Нека напишем програма за Java, за да обработим формуляра "Hello There".

Първо, трябва да уведомим клиента, че нашата програма ще генерира HTML. В Header()метода в cgi_lib.javaсъздава низ имаме нужда, така че ние ще започнем, като се обадите на този метод и изпращане на низа за стандарт, като се използва System.out.printlnсистема за повикване.

// // Отпечатваме необходимия CGI хедър. // System.out.println (cgi_lib.Header ());

Второ, искаме да обработим данните от формуляра, изпратени ни от браузъра. В ReadParseметода на cgi_lib.javaправи всичко, което се грижи за нас и се връща резултата в случай на по-Hashtable. В този случай Hashtable ще съдържа две ключови стойности след анализиране на данните на формуляра. Едното ще бъде полето за въвеждане "име", а другото ще бъде полето за въвеждане "имейл". Стойностите, свързани с всеки от тези ключове, ще бъдат каквито потребителят е въвел в тези полета за въвеждане във формуляра "Hello There".

// // Анализираме данните на формуляра в Hashtable. // Hashtable form_data = cgi_lib.ReadParse (System.in);

След като анализирахме данните на формуляра, можем да направим каквато обработка пожелаем с изпратените ни данни. След това можем да генерираме HTML, който да изпратим обратно в браузъра на потребителя. В тази проста програма няма да правим никаква обработка с данните; ние просто ще повторим информацията, предоставена от потребителя. Ще използваме getметода на обекта Hashtable, за да извлечем стойностите на формата в низове, които можем да използваме в нашата програма. Следващият пример показва как бихме извлекли името, което потребителят е въвел в String обект.

 Име на низ = (Низ) form_data.get ("име"); 

Сега, нека да съберем всичко това в проста програма. Ето приложение на Java, което можем да използваме за обработка на формуляра „Hello There“ ( hello.java):

импортиране на java.util. *; импортиране на java.io. *; class hello {public static void main (String args []) {// // Ето една минималистична CGI програма, която използва cgi_lib // // // Отпечатва необходимия CGI хедър. // System.out.println (cgi_lib.Header ()); // // Анализираме данните на формуляра в Hashtable. // Hashtable form_data = cgi_lib.ReadParse (System.in); // // Създаване на върха на върнатата HTML страница // Име на низ = (Низ) form_data.get ("име"); System.out.println (cgi_lib.HtmlTop ("Здравейте там" + име + "!")); System.out.println ("& lth1 align = center & gtЗдравейте там" + име + "!"); System.out.println ("Ето двойките име / стойност от формуляра:"); // // Отпечатваме двойките име / стойност, изпратени от браузъра. // System.out.println (cgi_lib.Variables (form_data));// // Отпечатваме променливите на околната среда, изпратени от скрипта на Unix. // System.out.println ("Тук са променливите / стойностите на двойките CGI на средата / стойност" + ", предадени от UNIX скрипта:"); System.out.println (cgi_lib.Environment ()); // // Създайте дъното на върнатата HTML страница, за да я затворите чисто. // System.out.println (cgi_lib.HtmlBot ()); }}

Заключение

С това въведение в CGI програмирането в Java трябва да сте на път към съвсем нов начин за програмиране на сървърната страна на вашите уеб приложения. Имайте предвид, че протоколът CGI предоставя само един начин за комуникация между клиентски браузър и уеб сървър. Jigsaw на консорциума на World Wide Web (вижте раздела „Ресурси“ по-долу) и други като Sun's Jeeves предлагат по-добри решения, които включват писане на Java сървлети, които можете да окачите на вашия уеб сървър. Но това е тема за друг ден. Забавлявай се!

Пат Дюранте е старши софтуерен инженер в TASC, Inc. в Рединг, Масачузетс. TASC е компания за приложни информационни технологии от 00 милиона, която е специализирана в разработването и интеграцията на усъвършенствани информационни системи и услуги. Пат проектира обектно-ориентирани приложения от четири години. Той е лидер на обектно-ориентираната група за специални интереси на TASC и съосновател на Java Interest Group на TASC. Адресът на уебсайта на Пат е: //members.aol.com/durante.

Научете повече за тази тема

  • Информация за общия интерфейс на шлюза (CGI) може да бъде намерена на:

    //hoohoo.ncsa.uiuc.edu/cgi

  • Мозайката на консорциума на World Wide Web е описана в:

    //www.w3.org/pub/WWW/Jigsaw

  • За повече информация относно Sun's Jeeves вижте:

    //www.javasoft.com/products/jeeves/index.html

Тази история „Писане на CGI програми в Java“ първоначално е публикувана от JavaWorld.