На главнуюКонтактыКарта сайта

Размещение Java программ

В какую папку помещать сервлеты?

В рабочей директории пользователя, доступной при входе по FTP, существует поддиректория www являющаяся «домашней директорией» сайта.

Эта директория соответствует корневому приложению Вашего сервера (аналог папки webapps/ROOT в Tomcat).

Именно в папке www должно быть размещено Ваше корневое web-приложение, имеющее стандартную для web-приложений структуру файлов и папок:

структура web-приложения

Папка classes предназначена для размещения Ваших сервлетов, папка lib используется для размещения дополнительных библиотек, необходимых для работы приложения, в том числе сервлетов (при этом не забывайте, что в папке lib могут находиться только файлы формата JAR).

Папке classes автоматически назначается псевдоним /servlet и любые обращения клиентов по адресу: http://имя-сайта/servlet/ИмяСервлета приводят к выполнению класса, находящегося в папке classes. При этом имена всех сервлетов, доступ к которым должен быть предоставлен клиентам, должны быть явно указаны в файле web.xml Вашего приложения.

Пример файла web.xml для сервлета HelloServlet, находящегося в пакете ru.brim.* и доступного для пользователей Интернета по запросу http://имя-сайта/servlet/hello приведен ниже:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
  version="2.4" 
  xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>ru.brim.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/servlet/hello</url-pattern>
  </servlet-mapping>
</web-app>

Опытные разработчики web-приложений знают, что при желании в файле web.xml можно задать любые псевдонимы для сервлетов, однако в случае нашего хостинга необходимость обращения к сервлетам с адресом отличным от адреса вида: http://имя-сайта/servlet/ИмяСервлета требует предварительного обращения в службу технической поддержки, так как в таких случаях требуются дополнительные настройки сервера Apache.

Также в рабочей директории, доступной при входе по FTP, существует папка webapps, предназначенная для размещения дополнительных web-приложений (подробное описание процесса развертывания дополнительных web-приложений находится в статье: «Как развернуть дополнительное web-приложение?»).

Почему я не вижу в логе сообщений об ошибках, выводимых в блоке try - catch?

На нашем хостинге все сообщения об ошибках, генерируемые сервером Tomcat для Вашего хоста, попадают в log-файл с именем «tomcat.дата.log», сохраняемый в папке logs вашего сайта.

В случаях, когда Вы самостоятельно выводите информацию об ошибках, эту информацию необходимо выводить с помощью метода log(), класса javax.servlet.GenericServlet, тогда сообщения об ошибках будут записываться в доступный Вам log-файл.

Пример использования метода log():

try{
  int x=Integer.parseInt("hello");
}catch(Throwable error){
  log("number format error", error);
}

В тех случаях, когда для вывода сообщений об ошибках используются конструкции вида:

try{ ... }catch(Exception error){System.out.println(error);}
try{ ... }catch(Exception error){System.err.println(error);}
try{ ... }catch(Exception error){error.printStackTrace();}

информация об ошибке выводится в log-файл сервера Tomcat, доступный для администраторов хостинг-серверов :), но недоступный для Вас.

Как отправить письмо из сервлета?

Для отправки письма из сервлета используется билиотека JavaMail, уже установленная в JVM на нашем хостинге. Для отправки писем, содержащих вложенные файлы, понадобиться использовать библиотеку Java Activation Framework, также уже установленную в JVM.

Ниже приведен пример кода, используемого для отправки электронного письма:

/*
Импортируем необходимые классы
*/
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Multipart;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.internet.*;
/*
Необходимые библиотеки (JavaMail и Java Activation Framework)
уже установлены в JVM на нашем хостинге
*/

...

/*
код, используемый для отправки письма
----------------------------------------------------------------------------------
SMTP-сервер - имя SMTP-сервера для вашего сайта, например: smtp.mydomen.ru
логин - логин, используемый Вами для доступа к своему почтовому ящику
пароль - пароль, используемый Вами для доступа к почтовому ящику
email - полное название почтового ящика отправителя письма, например: my@email.ru
----------------------------------------------------------------------------------
*/

Properties mailProps=new Properties();
mailProps.put("mail.smtp.host","SMTP-сервер");
mailProps.put("mail.smtp.auth", "true");
Session mailSession=Session.getInstance(mailProps,new Authenticator(){
	protected PasswordAuthentication getPasswordAuthentication(){
		return(new PasswordAuthentication("логин","пароль"));
	}
});
MimeMessage message=new MimeMessage(mailSession);
message.setFrom(new InternetAddress("email"));
String[] emails={"email1", "email2"}; //адреса получателей
InternetAddress dests[]=new InternetAddress[emails.length];
for(int i=0; i<emails.length; i++){
	dests[i]=new InternetAddress(emails[i].trim().toLowerCase());
}
message.setRecipients(Message.RecipientType.TO, dests);
message.setSubject("тема письма","KOI8-R");
Multipart mp=new MimeMultipart();
MimeBodyPart mbp1=new MimeBodyPart();
mbp1.setText("текст письма","KOI8-R");
mp.addBodyPart(mbp1);
message.setContent(mp);
message.setSentDate(new java.util.Date());
Transport.send(message);

...

//не забудьте обработать возможные исключительные ситуации!

Как создать страницу для обработки 404 ошибки?

На нашем хостинге используется связка серверов Apache+Tomcat, которая позволяет использовать функциональность обоих серверов. При использовании такой системы часть клиентских запросов обрабатывается сервером Apache (запросы к статическим ресурсам, PHP и SSI документам), а часть запросов передается для обработки серверу Tomcat (запросы к файлам из папки /servlet/, файлам с расширением *.jsp и файлам с расширением *.do).

В случае необходимости создания специальной страницы для обработки ошибок типа 404 и т. п., понадобится осуществить настройки обоих серверов.

Для обработки ошибки 404 сервера Apache поместите в главную папку своего web-приложения файл с именем .htaccess, содержащий следующую строку:

ErrorDocument  404  /error.html

Для обработки аналогичной ошибки, возникающей в сервере Tomcat, поместите в файл web.xml своего web-приложения, следующую директиву:

<error-page>
    <error-code>404</error-code>
    <location>/error.html</location>
</error-page>

Обратите внимание на место расположения этой настройки - она должна находиться в пределах контейнера <web-app> ниже настройки <servlet-mapping>.

Если все необходимые настройки выполнены верно и web-приложение успешно перезапустилось (состояние web-приложения можно контролировать в контрольной панели http://cp.brim.ru), но ошибки относящиеся к серверу Tomcat не приводят к перенаправлению запроса на страницу error.html, возможно проблема заключается в используемом браузере.

В случае, если описанная проблема возникает только в MS Internet Explorer, попробуйте увеличить размер файла error.html до 1 Кб.

Почему при использовании библиотеки FileUpload происходят ошибки?

Наш контейнер сервлетов Tomcat работает с поддержкой библиотеки FileUpload, которую мы рекомендуем использовать для загрузки файлов web-приложением.

Для нормальной работы этой библиотеки, ей необходим доступ на чтение и запись к папке для временно сохраняемых при upload-е файлов.

По умолчанию библиотека FileUpload использует путь к временной папке контейнера сервлетов (т. е. папке /temp сервера Tomcat).

Настройки безопасности сервера Tomcat нашего хостинга ограничивают доступ web-приложений к данной папке, поэтому для нормальной работы библиотеки FileUpload необходимо явно указать путь к папке для временного размещения загружаемых файлов.

Ниже приведена часть кода сервлета, выполняющего сохранение загружаемых файлов:

/*
Импортируем необходимые классы
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import org.apache.commons.fileupload.*;
/*
Библиотека FileUpload уже установлена на нашем хостинге
*/

public class FileUploadServlet extends HttpServlet{

  public void doPost(HttpServletRequest request, HttpServletResponse response)
     throws IOException,ServletException{
         
   DiskFileUpload upload = new DiskFileUpload();
   upload.setSizeMax(1024*50); //максимальный объем принимаемых
   данных в байтах
   upload.setRepositoryPath("/home/web/аккаунт/home/домен"); //путь
   к временной директории
   /*
   Путь к временной директории должен задаваться с учетом реального
   расположения Вашего сайта на жестком диске сервера. Для определения
   реального пути к домашней директории своего сайта можно использовать
   следующую конструкцию:
   ServletContext context=getServletContext();
   String path=context.getRealPath("/");
   После чего путь к временной папке Вы можете задавать относительно
   домашней директории своего сайта.
   */
    try{
      List list = upload.parseRequest( request );
      Iterator it = list.iterator();
      while ( it.hasNext() ) {
	    ...
      }
    } catch ( Exception e ) {
      log( "Upload Error" , e);
    }
  }
}

Почему время в сервере Tomcat «неправильное»?

Клиентами нашего хостинга являются жители различных регионов России и граждане других стран, поэтому, расчитывать на то, что в настройках Java-машины будет задана именно Ваша временная зона, не стоит.

При написании Java-приложений, работающих с датой и временем, имеет смысл самостоятельно задавать необходимые приложению настройки локализации. Для получения «местного» времени, с учетом его сдвига относительно «времени по Гринвичу», можно использовать класс java.util.TimeZone.

Ниже приведен фрагмент кода для получения «московского» времени:

TimeZone tz = TimeZone.getTimeZone("Europe/Moscow");
Calendar calendar = Calendar.getInstance(tz);
int hour = calendar.get(Calendar.HOUR_OF_DAY);

Почему запросы к некоторым файлам не обрабатываются сервером Tomcat?

Наш хостинг использует связку серверов Apache и Tomcat, что существенно расширяет возможности Java-хостинга за счет прибавления к функциональности сервера Tomcat всех элементов функциональности сервера Apache (поддержка PHP, CGI, SSI, mod_rewrite и т. п.).

Кроме того такое решение повышает производительность сайтов за счет обработки статического контента сайтов сервером Apache.

Решение о том, какие запросы будут обрабатываться сервером Apache, а какие запросы будут передаваться для обработки серверу Tomcat, принимается на основе расширения файла, к которому обращен запрос, или папке, в которой находится запрашиваемый файл.

По умолчанию настройки сервера таковы, что серверу Tomcat передаются для обработки запросы, адресованые к файлам с расширениями *.jsp, *.do и к файлам, URL которых содержит имя папки /servlet/*. Все остальные запросы обрабатываются сервером Apache и «не доходят» до Tomcat.

связка Apache-Tomcat

В случае необходимости передавать для обработки в Tomcat другие запросы, сообщите в службу поддержки какие именно запросы должны передаваться в Tomcat (расширения файлов или имена папок), и необходимые настройки будут произведены.

Почему не работает настройка «welcome-file»?

При использовании настроек «welcome-file-list» и «welcome-file» в файле web.xml, обратите внимание на то, что Tomcat обрабатывает только те запросы, которые ему передал web-сервер Apache, т. е. некоторые запросы до web-сервера Tomcat «не доходят» (подробнее в статье: «Почему запросы к некоторым файлам не обрабатываются сервером Tomcat?»). Т. е. определение какой файл будет использован по умолчанию производится в web-сервере Apache и, если это файл с именем «index.jsp» и он действительно существует в папке www сайта, то запрос передается в web-сервер Tomcat для дальнейшей обработки, в противном случае web-сервер Apache возвращает ошибку 403 (нет доступа для просмотра директории).

Если необходимо использовать имя файла по умолчанию отличное от «index.jsp» (уже заданное в настройках Apache), разместите в папке www сайта файл с именем .htaccess и укажите с помощью настройки DirectoryIndex соответствующее имя файла по умолчанию (подробнее в статье «Как изменить имя файла по умолчанию?»), совпадающее с именем, указанным в настройке «welcome-file» файла web.xml.

Пример файла .htaccess для случая, когда файл по умолчанию называется «Home.jsp»:

DirectoryIndex Home.jsp

Пример фрагмента файла web.xml, в котором указано имя файла по умолчанию:

<welcome-file-list>
	<welcome-file>Home.jsp</welcome-file>
</welcome-file-list>

Как закрыть доступ к папке WEB-INF?

Для предотвращения доступа Интернет-пользователей к содержимому, находящемуся в папке WEB-INF Вашего web-приложения, разместите в этой папке файл с именем .htaccess следующего содержания:

Deny from all

Служба поддержки:
E-Mail: support@brim.ru
Тел.: (495) 517-70-64
Адрес:
115419, г. Москва,
ул. Орджоникидзе, д.11, стр.11,
бизнес-центр «АВС-Эстэйт»