В какую папку помещать сервлеты?
В рабочей директории пользователя, доступной при входе по FTP, существует поддиректория www являющаяся «домашней директорией» сайта.
Эта директория соответствует корневому приложению Вашего сервера (аналог папки webapps/ROOT в Tomcat).
Именно в папке www должно быть размещено Ваше корневое 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.*;
...
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.*;
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/домен");
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.
В случае необходимости передавать для обработки в 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
Любые материалы с данного сайта не могут быть использованы без разрешения владельцев ресурса.
|