Статьи

Топ-100 вопросов о Java-сервлетах

1) Это каталог «сервлетов» или каталог «сервлетов»?

Ответ:

Для веб-сервера Java:

  • в файловой системе это «сервлеты»

    C: \ JavaWebServer1.1 \ сервлеты \ DateServlet.class

  • в пути URL это «сервлет»: http://www.stinky.com/servlet/DateServlet

2) Как я могу поддерживать протокол GET и POST от одного и того же сервлета?

Ответ:

Самый простой способ — просто поддержать POST, а затем вызвать метод doGet для вызова метода doPost:

1
2
3
4
5
public void doGet(HttpServletRequest req, HttpServletResponse res)
               throws ServletException, IOException
               {
                  doPost(req, res);
               }

3) Как я могу убедиться, что мой сервлет является потокобезопасным?

Ответ:

На самом деле это очень сложный вопрос. Несколько рекомендаций:

  1. Метод init () гарантированно вызывается один раз для каждого экземпляра сервлета, когда сервлет загружен. Вам не нужно беспокоиться о безопасности потоков внутри этого метода, поскольку он вызывается только одним потоком, и веб-сервер будет ожидать выхода из этого потока, прежде чем отправлять больше потоков в ваш метод service ().
  2. Каждый новый клиентский запрос генерирует (или выделяет) новый поток; этот поток вызывает метод service () вашего сервлета (который, в свою очередь, может вызывать doPost (), doGet () и т. д.).
  3. В большинстве случаев существует только один экземпляр вашего сервлета, независимо от того, сколько клиентских запросов обрабатывается. Это означает, что в любой данный момент может быть много потоков, работающих внутри метода service () вашего экземпляра соло, и все они совместно используют одни и те же данные экземпляра и потенциально наступают друг другу на ноги. Это означает, что вы должны соблюдать осторожность при синхронизации доступа к общим данным (переменным экземпляра) с помощью ключевого слова synchronized.

(Обратите внимание, что сервер также выделит новый экземпляр, если вы зарегистрируете сервлет с новым именем и, например, новыми параметрами init.)

  1. Обратите внимание, что вам не нужно (и не следует) синхронизировать локальные данные или параметры. И особенно вы не должны синхронизировать метод service ()! (Или doPost (), doGet () и др.)
  2. Простое решение для синхронизации состоит в том, чтобы всегда синхронизироваться на самом экземпляре сервлета, используя & quot; синхронизированный (это) {…} & quot ;. Однако это может привести к узким местам производительности; обычно вам лучше синхронизировать сами объекты данных.
  3. Если вы абсолютно не можете справиться с синхронизацией, вы можете объявить, что ваш сервлет & quot; реализует SingleThreadModel & quot ;. Этот пустой интерфейс говорит веб-серверу отправлять только один клиентский запрос за раз в ваш сервлет. Из JavaDoc: & quot; Если целевой сервлет помечен этим интерфейсом, программисту сервлета гарантируется, что никакие два потока не будут одновременно выполнять метод обслуживания этого сервлета. Эта гарантия обеспечивается поддержанием пула экземпляров сервлета для каждого такого сервлета и отправкой каждого вызова службы бесплатному сервлету. По сути, если сервлет реализует этот интерфейс, сервлет будет потокобезопасным. & Quot; Обратите внимание, что это не идеальное решение, так как производительность может пострадать (в зависимости от размера пула экземпляров), а также более сложно обмениваться данными между экземплярами, чем внутри одного экземпляра.

См. Также Каков лучший подход для включения поточно-ориентированных сервлетов и JSP? Интерфейс SingleThreadModel или синхронизация?

  1. Чтобы обмениваться данными между последовательными или параллельными запросами, вы можете использовать либо переменные экземпляра, либо статические переменные класса, либо использовать отслеживание сеансов.
  2. Метод destroy () не обязательно такой же чистый, как метод init (). Вызовы сервера уничтожаются либо после завершения всех вызовов службы, либо по истечении определенного количества секунд, в зависимости от того, что наступит раньше. Это означает, что другие потоки могут выполнять запросы на обслуживание одновременно с вызовом вашего метода destroy ()! Поэтому обязательно синхронизируйте и / или дождитесь завершения других запросов. В руководстве Sun Servlet Tutorial есть пример того, как сделать это с помощью подсчета ссылок.
  3. destroy () не может выдать исключение, поэтому, если что-то плохое происходит, вызовите log () с полезным сообщением (например, об исключении). См. Раздел «Закрытие соединения JDBC». пример в уроке Sun.

4) В чем разница между кодировкой URL, перезаписью URL, экранированием HTML и кодировкой сущностей?

Ответ:

Кодировка URL
это процесс преобразования пользовательского ввода в форму CGI, чтобы он был пригоден для перемещения по сети — в основном, для удаления пробелов и знаков пунктуации и замены на escape-символы. Декодирование URL — обратный процесс. Чтобы выполнить эти операции, вызовите java.net.URLEncoder.encode () и java.net.URLDecoder.decode () (последний был (наконец-то!) Добавлен в JDK 1.2, он же Java 2).

Пример:

меняется «Мы # 1!» в «Мы% 27re +% 231% 21»

Перезапись URL
метод сохранения информации о состоянии в браузере пользователя между посещениями страницы. Это похоже на куки, только информация хранится внутри URL, как дополнительный параметр. HttpSession API, являющийся частью Servlet API, иногда использует перезапись URL-адресов, когда файлы cookie недоступны.

Пример:

изменение <A HREF=velopernextpage.html книг> на

<A HREF=velopernextpage.html;$sessionid$=DSJFSDKFSLDFEEKOEgoti>> (или каков бы ни был фактический синтаксис; я забыл это несущественно) (К сожалению, метод в API сервлетов для перезаписи URL для управления сеансами называется encodeURL (). Вздох…)

Существует также функция веб-сервера Apache, которая называется перезапись URL; он включен модулем mod_rewrite. Он переписывает URL-адреса по пути на сервер, что позволяет вам делать такие вещи, как автоматическое добавление косой черты в имя каталога или сопоставление старых имен файлов с новыми именами файлов. Это не имеет ничего общего с сервлетами.

5) Как загрузить файл в мой сервлет или JSP?

Ответ:

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

1
2
3
4
<FORM ENCTYPE='multipart/form-data'  method='POST' action='/myservlet'>
                  <INPUT TYPE='file' NAME='mptest'>
                  <INPUT TYPE='submit' VALUE='upload'>
               </FORM>

Тип ввода & quot; файл & quot; вызывает в браузере кнопку для выбора файла в браузере вместе с текстовым полем, которое принимает имя файла после его выбора. Сервлет может использовать параметры метода GET, чтобы решить, что делать с загрузкой, в то время как тело запроса POST содержит данные файла для анализа.

Когда пользователь нажимает кнопку «Загрузить», клиентский браузер находит локальный файл и отправляет его, используя HTTP POST, закодированный с использованием MIME-типа multipart / form-data. Когда он достигает вашего сервлета, ваш сервлет должен обработать данные POST, чтобы извлечь закодированный файл. Вы можете узнать все об этом формате в RFC 1867 .

К сожалению, в Servlet API нет способа сделать это. К счастью, есть ряд доступных библиотек. Некоторые из них предполагают, что вы будете записывать файл на диск; другие возвращают данные как InputStream.

После обработки потока данных формы в загруженном файле вы можете либо записать его на диск, записать в базу данных или обработать как InputStream, в зависимости от ваших потребностей. См. Как я могу получить доступ или создать файл или папку в текущем каталоге из сервлета? и другие вопросы в Servlets: Files Тема для получения информации о записи файлов из Servlet.

Обратите внимание, что вы не можете получить доступ к файлу в клиентской системе напрямую из сервлета; это было бы огромной дырой в безопасности. Вы должны запросить у пользователя разрешение, и в настоящее время загрузка на основе форм является единственным способом сделать это.

6) Как сервлет взаимодействует со страницей JSP?

Ответ:

В следующем фрагменте кода показано, как сервлет создает экземпляр компонента и инициализирует его данными FORM, опубликованными браузером. Затем компонент помещается в запрос, а затем вызов перенаправляется на страницу JSP, Bean1.jsp, с помощью диспетчера запросов для последующей обработки.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
public void doPost (HttpServletRequest request,
                                              HttpServletResponse response) {
 
                  try {
                    govi.FormBean f = new govi.FormBean();
                    String id = request.getParameter("id");
                    f.setName(request.getParameter("name"));
                    f.setAddr(request.getParameter("addr"));
                    f.setAge(request.getParameter("age"));
                              //use the id to compute
                              //additional bean properties like info
                               //maybe perform a db query, etc.
                              // . . .
                              f.setPersonalizationInfo(info);
                    request.setAttribute("fBean",f);
                    getServletConfig().getServletContext().getRequestDispatcher
                                              ("/jsp/Bean1.jsp").forward(request, response);
                  } catch (Exception ex) {
                    . . .
                  }
               }

Страница JSP Bean1.jsp может затем обработать fBean, предварительно извлекая его из области запроса по умолчанию с помощью действия useBean.

1
2
3
4
5
<jsp:useBean id="fBean" class="govi.FormBean" scope="request"/>
              <jsp:getProperty name="fBean" property="name" />
              <jsp:getProperty name="fBean" property="addr" />
              <jsp:getProperty name="fBean" property="age" />
              <jsp:getProperty name="fBean" property="personalizationInfo" />

7) Какой лучший подход для включения поточно-ориентированных сервлетов и JSP? Интерфейс SingleThreadModel или синхронизация?

Ответ:

Хотя метод SingleThreadModel прост в использовании и хорошо работает для сайтов с небольшим объемом, он плохо масштабируется. Если вы ожидаете, что количество ваших пользователей увеличится в будущем, возможно, вам лучше реализовать явную синхронизацию для ваших общих данных. Однако ключевой момент заключается в том, чтобы эффективно минимизировать объем синхронизируемого кода, чтобы вы могли максимально использовать многопоточность.

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

8) Может ли сервлет поддерживать объект JTA UserTransaction в нескольких вызовах сервлета?

Ответ:

Нет. Транзакция JTA должна начинаться и заканчиваться в течение одного вызова (метода service ()). Обратите внимание, что этот вопрос не касается сервлетов, которые поддерживают и управляют JDBC-соединениями, включая обработку транзакций соединения.

9) Как производительность страниц JSP отличается от производительности сервлетов? Как это соотносится со скриптами Perl?

Ответ:

Производительность страниц JSP очень близка к производительности сервлетов. Однако пользователи могут испытывать ощутимую задержку при первом доступе к странице JSP. Это связано с тем, что страница JSP проходит «фазу трансляции», когда механизм JSP преобразует ее в сервлет. Как только этот сервлет динамически компилируется и загружается в память, он следует жизненному циклу сервлета для обработки запроса. Здесь метод jspInit () автоматически вызывается механизмом JSP при загрузке сервлета, за которым следует метод _jspService (), который отвечает за обработку запроса и ответ клиенту. Обратите внимание, что срок службы этого сервлета недетерминирован — он может быть в любое время удален из памяти механизмом JSP по причинам, связанным с ресурсами. Когда это происходит, механизм JSP автоматически вызывает метод jspDestroy (), позволяя сервлету освободить любые ранее выделенные ресурсы.

Последующие запросы клиента на страницу JSP не приводят к повторению фазы перевода, пока сервлет кэшируется в памяти, и напрямую обрабатываются методом service () сервлета параллельным способом (т. Е. Обрабатывается метод service ()). каждый клиентский запрос в отдельном потоке одновременно.)

В последнее время было проведено несколько исследований, сравнивающих производительность сервлетов со скриптами Perl, работающими в «реальной» среде. Результаты благоприятны для сервлетов, особенно когда они работают в кластерной среде.

10) Как мне вызвать один сервлет из другого сервлета?

Ответ:

[Краткий ответ: есть несколько способов сделать это, в том числе

  • используйте RequestDispatcher
  • использовать URLConnection или HTTPClient
  • отправить редирект
  • вызовите getServletContext (). getServlet (name) (устарело, не работает в 2.1+)

— Алекс]

Это зависит от того, что вы подразумеваете под «вызовом» и что вы пытаетесь сделать, и почему вы пытаетесь это сделать.

Если конечный результат необходим для вызова методов, то самым простым механизмом будет обработка сервлета как любого объекта Java, создание экземпляра и вызов метода.

Если идея состоит в том, чтобы вызвать метод service из метода service другого сервлета, AKA, перенаправляющего запрос, вы можете использовать объект RequestDispatcher.

Однако, если вы хотите получить доступ к экземпляру сервлета, который был загружен в память механизмом сервлета, вы должны знать псевдоним сервлета. (То, как это определено, зависит от движка.) Например, чтобы вызвать сервлет в JSDK, сервлет может быть назван по свойству

1
myname.code=com.sameer.servlets.MyServlet

Код ниже показывает, как этот именованный сервлет может быть доступен в методе обслуживания другого сервлета.

1
2
3
4
5
6
public void service (HttpServletRequest request, HttpServletResponse response)
                                throws ServletException, IOException {
                  ...
                  MyServlet ms=(MyServlet) getServletConfig().getServletContext().getServlet("myname");
                  ...
               }

Тем не менее, вся эта проблема доступа к сервлетам в других сервлетах устарела в версии 2.1 сервлетов API из-за проблем безопасности. Более чистое и лучшее решение — просто избегать прямого доступа к другим сервлетам и использовать вместо этого RequestDispatcher.

11) Каковы все различные виды серверов? (Например, веб-серверы, серверы приложений и т. Д.)

Ответ:

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

Начиная с базового уровня, пользователь обычно отправляет запрос в систему через веб-браузер. (Для удобства мы пока игнорируем все другие типы клиентов (RMI, CORBA, COM / DCOM, Custom и т. Д.).) Веб-запрос должен быть получен веб-сервером (иначе называемым HTTP-сервер ) какой-то. Этот веб-сервер должен обрабатывать стандартные HTTP-запросы и ответы, обычно возвращая HTML вызывающему пользователю. Код, который выполняется в серверной среде, может быть CGI-управляемым, сервлетом, ASP или каким-либо другим серверным языком программирования, но в результате веб-сервер передает HTML пользователю.

Веб-серверу может потребоваться выполнить приложение в ответ на запрос пользователя. Это может быть создание списка новостей или обработка отправки формы в гостевую книгу. Если серверное приложение написано как сервлет Java, ему потребуется место для выполнения, и это место обычно называется механизмом сервлетов . В зависимости от веб-сервера этот механизм может быть внутренним, внешним или совершенно другим продуктом. Этот механизм работает постоянно, в отличие от традиционной среды CGI, где сценарий CGI запускается при каждом запросе к серверу. Это постоянство дает соединение сервлета и пул потоков, а также простой способ поддерживать состояние между каждым HTTP-запросом. Страницы JSP обычно связаны с механизмом сервлетов и выполняются в том же пространстве / приложении, что и сервлеты.

Есть много продуктов, которые обрабатывают веб-обслуживание и механизм сервлетов по-разному. Netscape / iPlanet Enterprise Server встраивает механизм сервлетов непосредственно в веб-сервер и работает в том же пространстве процессов. Apache требует, чтобы механизм сервлета работал во внешнем процессе и связывался с ним через сокеты TCP / IP. Другие серверы, такие как MS IIS, официально не поддерживают сервлеты, и для добавления этой возможности требуются дополнительные продукты.

Когда вы переходите к Enterprise JavaBeans (и другим компонентам J2EE, таким как JMS и CORBA), вы переходите в пространство сервера приложений. Сервер приложений — это любой сервер, который предоставляет дополнительные функции, связанные с корпоративными вычислениями, например, балансировку нагрузки, классы доступа к базе данных, обработку транзакций, обмен сообщениями и т. Д.

Серверы приложений EJB предоставляют контейнер EJB, представляющий собой среду, в которой будут выполняться bean-компоненты, и этот контейнер будет управлять транзакциями, пулами потоков и другими проблемами по мере необходимости. Эти серверы приложений, как правило, являются автономными продуктами, и разработчики связывают свои страницы сервлетов / JSP с компонентами EJB через API доступа к удаленным объектам. В зависимости от сервера приложений, программисты могут использовать CORBA или RMI для связи со своими компонентами, но базовый стандарт — это использование JNDI для поиска и создания ссылок EJB по мере необходимости.

Теперь одна вещь, которая смущает проблему, состоит в том, что многие поставщики серверов приложений включают некоторые или все эти компоненты в свой продукт. Если вы посмотрите на WebLogic (http://www.beasys.com/), то обнаружите, что WebLogic содержит веб-сервер, механизм сервлетов, процессор JSP, средство JMS, а также контейнер EJB. Теоретически такой продукт можно использовать для управления всеми аспектами разработки сайта. На практике вы, скорее всего, будете использовать этот тип продукта для управления / обслуживания экземпляров EJB, в то время как выделенные веб-серверы обрабатывают определенные HTTP-запросы.

12) Должен ли я переопределить метод service ()?

Ответ:

Нет. Это обеспечивает большую часть уборки, которую вы должны были бы сделать сами. Если вам нужно что-то сделать независимо от того, является ли запрос, например, POST или GET, создайте вспомогательный метод и вызовите его в начале, например, doPost () и doGet ().

13) Как моё приложение может узнать, когда удаляется HttpSession (когда истекает время ожидания)?

Ответ:

Определите класс, скажем SessionTimeoutNotifier, который реализует javax.servlet.http.HttpSessionBindingListener. Создайте объект SessionTimeoutNotifier и добавьте его в сеанс пользователя. Когда сеанс удаляется, механизм сервлета вызывает SessionTimeoutNotifier.valueUnbound (). Вы можете реализовать valueUnbound (), чтобы делать все, что вы хотите.

14) Зачем использовать JSP, когда мы можем сделать то же самое с сервлетами?

[Оригинальный вопрос: почему я должен использовать JSP, когда уже есть технология сервлетов, доступная для обслуживания динамического контента?]

Ответ:

Хотя JSP может отлично подойти для обслуживания динамического веб-контента и отделения контента от представления, некоторые могут все еще задаться вопросом, почему сервлеты следует отбрасывать для JSP. Полезность сервлетов не обсуждается. Они отлично подходят для обработки на стороне сервера, и с их значительной установленной базой, здесь, чтобы остаться. Фактически, с точки зрения архитектуры, вы можете рассматривать JSP как высокоуровневую абстракцию сервлетов, которая реализована как расширение API Servlet 2.1. Тем не менее, вы не должны использовать сервлеты без разбора; они могут не подходить для всех. Например, в то время как дизайнеры страниц могут легко написать страницу JSP с помощью обычных инструментов HTML или XML, сервлеты больше подходят для внутренних разработчиков, поскольку они часто пишутся с использованием IDE — процесс, который обычно требует более высокого уровня опыта программирования.

При развертывании сервлетов даже разработчики должны быть осторожны и следить за тем, чтобы между презентацией и контентом не было тесной связи. Обычно это можно сделать, добавив сторонний пакет HTML-оболочки, такой как htmlKona, в смесь. Но даже этот подход, хотя и обеспечивает некоторую гибкость при простых изменениях экрана, все же не оградит вас от изменения самого формата презентации. Например, если ваша презентация изменилась с HTML на DHTML, вам все равно необходимо убедиться, что пакеты-оболочки соответствуют новому формату. В худшем случае, если пакет-обертка недоступен, вы можете в конечном итоге жестко закодировать презентацию в динамическом контенте. Итак, каково решение? Один из подходов заключается в использовании технологий JSP и сервлетов для построения систем приложений.

15) Как я могу передавать информацию и данные между апплетом и сервлетом по протоколу HTTP?

Ответ:

Используйте стандартный класс java.net.URL или «сверните свой собственный» с помощью java.net.Socket. Смотрите спецификации HTTP
на W3C для более подробной информации.

Примечание: сервлет не может инициировать это соединение! Если сервлету необходимо асинхронно отправить сообщение апплету, вы должны открыть постоянный сокет, используя java.net.Socket (на стороне апплета) и java.net.ServerSocket и Threads (на стороне сервера).

16) Могу ли я получить путь к текущему сервлету, где он находится в файловой системе (не его URL)?

Ответ:

Попробуйте использовать:

1
request.getRealPath(request.getServletPath())

Примером может быть:

1
out.println(request.getRealPath(request.getServletPath()));

17) Как я могу объединить сервлеты в цепочку, чтобы выход одного сервлета служил входом для следующего?

Ответ:

Существует два распространенных способа связывания вывода одного сервлета с другим сервлетом:

  1. первый метод — это псевдоним, который описывает серию сервлетов, которые должны быть выполнены
  2. Второй — определить новый MIME-тип и связать сервлет как обработчик. Поскольку я на самом деле не использую второй, я сосредоточусь на псевдонимах.

Чтобы объединить сервлеты в цепочку, вы должны указать последовательный список сервлетов и связать его с псевдонимом. Когда к этому псевдониму делается запрос, первый сервлет в списке вызывается, обрабатывает свою задачу и отправляет выход следующему сервлету в списке в качестве объекта запроса. Вывод может быть снова отправлен другим сервлетам.

Чтобы выполнить этот метод, вам нужно настроить свой движок сервлетов (JRun, сервер JavaWeb, JServ…).

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

Пусть скажем / servlets / chainServlet для виртуального пути и список сервлетов через запятую как srvA, srvB.

Поэтому, когда вы вызываете запрос, такой как http: // localhost / servlets / chainServlet, сначала будет вызван внутренний сервлет srvA, а его результаты будут переданы в сервлет srvB.

Код сервлета srvA должен выглядеть следующим образом:

1
2
3
4
5
6
7
8
9
public class srvA extends HttpServlet {
                  ...
                  public void doGet (...) {
                    PrintWriter out =res.getWriter();
                    rest.setContentType("text/html");
                    ...
                    out.println("Hello Chaining servlet");
                  }
               }

Все, что нужно сделать сервлету srvB — открыть поток ввода для объекта запроса и прочитать данные в объект BufferedReader, например:

1
2
3
BufferedReader b = new BufferedReader( new InputStreamReader(req.getInputStream() ) );
               String data = b.readLine();
               b.close();

После этого вы можете отформатировать вывод с данными.

Это должно работать прямо с Java Web Server или Jserv тоже. Просто посмотрите в их документации, чтобы определить псевдоним. Надеюсь, что это поможет.

18) Почему в сервлетах нет конструкторов?

Ответ:

Сервлет подобен апплету в том смысле, что он имеет метод init (), который действует как constrcutor. Поскольку среда сервлета заботится о создании экземпляра сервлета, явный конструктор не нужен. Любой код инициализации, который вам нужно запустить, должен быть помещен в метод init (), так как он вызывается при первой загрузке сервлета контейнером сервлета.

19) Как обрабатывать несколько одновременных запросов / обновлений базы данных при использовании JDBC с сервлетами?

Ответ:

Все базы данных обеспечивают блокировку при изменении данных. Возможны два сценария:

  1. Несколько обновлений базы данных в разных строках. Если вы используете сервлеты, сервлеты откроют несколько соединений для разных пользователей. В этом случае нет необходимости выполнять дополнительное программирование.
  2. Если обновления базы данных находятся в одной и той же строке, то строки автоматически блокируются dbms, поэтому мы должны повторять запросы к dbms, пока блокировка не будет снята dbms.

Эта проблема рассматривается в документации JDBC; ищите «Транзакции» и «Авто-фиксация». Это может стать довольно запутанным.

20) В чем разница между GenericServlet и HttpServlet?

Ответ:

GenericServlet предназначен для сервлетов, которые могут не использовать HTTP, например, для сервлетов FTP. Конечно, оказывается, что нет такой вещи, как FTP-сервлеты, но они пытались планировать будущий рост, когда разрабатывали спецификацию. Возможно, когда-нибудь появится другой подкласс, но сейчас всегда используйте HttpServlet.

21) Как вы разделяете сеансовые объекты между сервлетами и JSP?

Ответ:

Совместное использование сеансов между сервлетом и страницей JSP просто. JSP делает это немного проще, создав объект сеанса и сделав его уже доступным. В сервлете вы должны сделать это сами. Вот как:

1
2
3
4
//create a session if one is not created already now
              HttpSession session = request.getSession(true);
              //assign the session variable to a value.
              session.putValue("variable","value");

на странице JSP это, как вы получите значение сеанса:

1
2
3
<%
              session.getValue("varible");
              %>

22) Что такое сервлет?

Ответ:

Сервлет — это способ расширения вашего веб-сервера с помощью Java-программы для выполнения задач, ранее решаемых с помощью сценариев CGI или собственных платформ расширения сервера.

23) Есть ли способ выгрузить сервлет из памяти веб-сервера без перезагрузки сервера?

Ответ:

Не существует стандартного метода / механизма для выгрузки сервлета из памяти. Некоторые серверы, такие как JWS, предоставляют средства для загрузки и выгрузки сервлетов из их модуля администрирования. Другие, такие как Tomcat, требуют, чтобы вы просто заменили файл WAR.

24) Что отличает JavaBean от сервлета?

Ответ:

JavaBeans — это набор правил, которым необходимо следовать при создании программных компонентов многократного использования или компонентов. Это содержит свойства и события. В конце у вас есть компонент, который может быть проверен программой (например, IDE), чтобы позволить пользователю вашего компонента JavaBean настроить его и запустить в своих программах Java.

Сервлеты — это Java-классы, работающие на движке Servlet, реализующем определенный интерфейс: Servlet, заставляющий вас реализовать некоторые методы (service ()). Сервлет является расширением вашего веб-сервера, на котором работает этот сервлет, и позволяет узнать только, когда пользователь запрашивает вызовы GET или POST с веб-страницы на ваш сервлет.

Итак, оба не имеют ничего общего, кроме Java.

25) Сколько данных мы можем хранить в объекте сеанса?

Ответ:

Любой объем данных может храниться там, потому что сеанс хранится на стороне сервера.

Единственным ограничением является длина sessionId, которая не должна превышать ~ 4000 байт — это ограничение подразумевается ограничением длины заголовка HTTP до 4 КБ, поскольку sessionId может храниться в файле cookie или кодироваться в URL (с использованием « перезаписи URL ») и в спецификации файла cookie. говорит, что размер cookie, а также HTTP-запроса (например, GET /document.html\n) не может превышать 4 КБ.

26) В чем разница между методами doGet и doPost?

Ответ:

doGet вызывается в ответ на запрос HTTP GET. Это происходит, когда пользователи нажимают на ссылку или вводят URL-адрес в адресную строку браузера. Это также происходит с некоторыми HTML-формами (те, у которых METHOD = ”GET” указан в теге FORM).

doPost вызывается в ответ на запрос HTTP POST. Это происходит с некоторыми HTML-формами (те, у которых METHOD = ”POST” указано в теге FORM).

Оба метода вызываются реализацией службы по умолчанию (суперкласс) в базовом классе HttpServlet. Вы должны переопределить один или оба для выполнения действий вашего сервлета. Вы, вероятно, не должны переопределять службу ().

27) В чем разница между encodeRedirectUrl и encodeURL?

Ответ:

encodeURL и encodeRedirectURL являются методами объекта HttpResponse. Оба перезаписывают необработанный URL-адрес, чтобы при необходимости включить данные сеанса. (Если файлы cookie включены, оба не работают).

encodeURL для обычных ссылок внутри ваших HTML-страниц.

encodeRedirectURL для ссылки, которую вы передаете response.sendRedirect (). У него немного другие требования к синтаксису.

28) Могу ли я использовать System.exit () в сервлетах?

Ответ:

Gack! Нет-нет-нет-нет-нет…

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

29) Я открываю одно соединение JDBC в моем методе init (). Нужно ли выполнять синхронизацию на объекте Connection или Statement?

Ответ:

Тебе не нужно это делать. Если ваш драйвер JDBC поддерживает несколько соединений, то различные методы createStatement предоставят вам потокобезопасный, повторно входящий, независимый оператор, который должен работать нормально, даже если другие запросы / потоки также обращаются к другим операторам в том же соединении.

Конечно, скрещивание пальцев никогда не повредит … Многие ранние водители JDBC не были повторно. Современные версии драйверов JDBC должны работать нормально, но никаких гарантий нет.

Использование пула соединений позволит избежать всей проблемы, плюс приведет к повышению производительности.

30) Как я могу определить имя и номер версии используемого сервлета или механизма JSP?

Ответ:

Из сервлета вы можете вызвать метод ServletContext.getServerInfo () следующим образом:

1
String thisServer= getServletConfig().getServletContext().getServerInfo();

Если вы используете JSP, вы можете использовать это выражение:

1
<%= application.getServerInfo() %>

31) Как я могу получить абсолютный URL страницы сервлета / JSP во время выполнения?

Ответ:

Вы можете получить всю необходимую информацию для определения URL из объекта запроса. Чтобы восстановить абсолютный URL из схемы, имени сервера, порта, URI и строки запроса, вы можете использовать класс URL из java.net. Следующий фрагмент кода определит абсолютный URL вашей страницы:

1
2
3
4
5
6
7
8
9
String file = request.getRequestURI();
               if (request.getQueryString() != null) {
                  file += '?' + request.getQueryString();
               }
               URL reconstructedURL = new URL(request.getScheme(),
                                                             request.getServerName(),
                                                             request.getServerPort(),
                                                             file);
               out.println(URL.toString());

32) Почему GenericServlet и HttpServlet реализуют интерфейс Serializable?

Ответ:

GenericServlet и HttpServlet реализуют интерфейс Serializable, так что подсистемы сервлетов могут «гибридизировать» состояние сервлета, когда сервлет не используется, и переустанавливать его при необходимости или дублировать экземпляры сервлета для лучшей балансировки нагрузки. Я не знаю, делают ли или как текущие движки сервлетов это, и это может иметь серьезные последствия, такие как разрыв ссылок на объекты, полученные в методе init (), без знания программиста. Программисты должны знать об этой ловушке и реализовывать сервлеты, которые по возможности не имеют состояния, делегируя хранилище данных объектам Session или ServletContext. В целом сервлеты без сохранения состояния лучше, потому что они масштабируются намного лучше и являются более чистым кодом.

33) Как выбрать между переопределением методов doGet (), doPost () и service ()?

Ответ:

Различия между методами doGet () и doPost () заключаются в том, что они вызываются в HttpServlet, который ваш сервлет расширяет методом service (), когда он получает запрос GET или POST из запроса протокола HTTP.

GET-запрос — это запрос на получение ресурса с сервера. Это тот случай, когда браузер запрашивает веб-страницу. Также возможно указать параметры в запросе, но длина параметров в целом ограничена. Это случай формы на веб-странице, объявленной таким образом в html: <form method = ”GET”> или <form>.

POST-запрос — это запрос на публикацию (отправку) данных формы на ресурс на сервере. Это случай формы на веб-странице, объявленной таким образом в html: <form method = ”POST”>. В этом случае размер параметров может быть намного больше.

GenericServlet имеет метод service (), который вызывается при выполнении запроса клиента. Это означает, что он вызывается как входящими запросами, так и HTTP-запросы передаются сервлету в том виде, в каком они есть (вы должны выполнить синтаксический анализ самостоятельно).

Вместо этого HttpServlet имеет методы doGet () и doPost (), которые вызываются при запросе клиента GET или POST. Это означает, что синтаксический анализ запроса выполняется сервлетом: у вас вызван соответствующий метод и есть удобные методы для чтения параметров запроса.

ПРИМЕЧАНИЕ: методы doGet () и doPost () (а также другие методы HttpServlet) вызываются методом service ().

В заключение, если вы должны отвечать на запросы GET или POST, сделанные клиентом протокола HTTP (обычно браузером), не стесняйтесь расширять HttpServlet и использовать его удобные методы.

Если вы должны отвечать на запросы, сделанные клиентом, который не использует протокол HTTP, вы должны использовать service ().

34) Чем сервлеты отличаются от RMI? Каковы преимущества и недостатки каждой технологии?

Ответ:

Сервлеты расширяют функциональность веб-сайта на стороне сервера. Сервлеты взаимодействуют с другими приложениями на этом сервере (или любом другом сервере) и выполняют задачи, выходящие за рамки «обычного» статического HTML-документа. Сервлет может получить запрос на получение некоторой информации через EJB из одной или нескольких баз данных, а затем преобразовать эти данные в статическую страницу HTML / WML, которую клиент, например, сможет увидеть. Даже если сервлет общается со многими другими приложениями по всему миру, чтобы получить эту информацию, все равно похоже, что это произошло на этом сайте.

RMI (Remote Method Invocation) — это просто способ вызова методов на удаленных машинах. Для приложения это способ общаться с другим удаленным компьютером и выполнять другие методы, при этом все время выглядит так, как будто действие выполняется на локальном компьютере.

Сервлеты (или JSP) в основном используются для любой деятельности, связанной с Интернетом, такой как онлайн-банкинг, онлайн-магазины, торговля акциями и т. Д. С сервлетами вам нужно знать только веб-адрес и отображаемые страницы, чтобы позаботиться о вызове различные сервлеты (или действия внутри сервлета) для вас. Используя RMI, вы должны связать сервер RMI с IP-адресом и портом, а клиент, желающий общаться с удаленным сервером, должен знать этот IP-адрес и порт, если, конечно, вы не использовали какую-либо промежуточную утилиту поиска, которую вы могли бы использовать. делать с (всех вещей) сервлетами.

35) Как мы можем использовать сервлет в качестве прокси для связи между двумя апплетами?

Ответ:

Один из способов добиться этого — заставить апплеты взаимодействовать через сервлет через сокеты TCP / IP. Затем сервлет будет использовать собственный протокол для получения и передачи информации между апплетами. Тем не менее, это решение имеет проблемы с брандмауэром, если система будет использоваться поверх, а Интернет использует Интранет.

36) Как я могу спроектировать свой сервлет / JSP так, чтобы результаты запроса отображались на нескольких страницах, например результаты поисковой системы? Каждая страница должна отображать, скажем, 10 записей каждая, и когда нажимается следующая ссылка, я должен видеть следующие / предыдущие 10 записей и так далее.

Ответ:

Используйте Java Bean, чтобы сохранить весь результат поиска, который вы нашли. Затем сервлет установит указатель на первую строку, которая будет отображаться на странице, и количество строк, которые нужно отобразить, и принудительно отобразит страницу. Действие в форме будет указывать на сервлет на странице JSP, который будет определять, была ли нажата следующая или предыдущая кнопка, и сбрасывать указатель на предыдущий указатель + количество строк и снова отображать страницу. Страница JSP будет иметь сценарий для отображения данных из Java Bean из указателя начала, установленного на максимальное количество строк с кнопками, позволяющими выбрать предыдущую или следующую страницу. Эти кнопки будут отображаться в зависимости от номера страницы (то есть, если сначала, то не отображать предыдущую кнопку).

37) Как мне работать с многозначными параметрами в сервлете?

Ответ:

Вместо использования getParameter () с ServletRequest, как если бы вы использовали однозначные параметры, используйте метод getParameterValues ​​(). Это возвращает массив строк (или ноль), содержащий все значения запрошенного параметра.

38) Как я могу передать данные, полученные из базы данных сервлетом, на страницу JSP?

Ответ:

Один из лучших подходов для передачи данных, полученных из сервлета в JSP, заключается в использовании архитектуры Model 2, как показано ниже:

По сути, вам необходимо сначала разработать bean-компонент, который может выступать в качестве оболочки для хранения результирующего набора, возвращаемого запросом базы данных в сервлете. После того, как компонент был создан и инициализирован путем вызова его методов установки сервлетом, он может быть помещен в объект запроса и перенаправлен на отображаемую страницу JSP следующим образом:

1
2
3
4
5
6
7
com.foo.dbBean bean = new com.foo.dbBean();
               //call setters to initialize bean
               req.setAttribute("dbBean", bean);
               url="..."; //relative url for display jsp page
               ServletContext sc = getServletContext();
               RequestDispatcher rd = sc.getRequestDispatcher(url);
               rd.forward(req, res);

Затем к бобу можно получить доступ на странице JSP через тег useBean:

1
2
3
4
5
6
<jsp:useBean id="dbBean" class="com.foo.dbBean" scope="request"/>
               ...
               <%
                  //iterate through the rows within dbBean and
                  //access the values using a scriptlet
               %>

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

39) Как я могу использовать сервлет для создания сайта с использованием фреймов?

Ответ:

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
---------------------- SAMPLE ----------------------
              
              public void doGet(HttpServletRequest request,
              HttpServletResponse response) throws ServletException, IOException {
              response.setContentType("text/html");
              PrintWriter out = new PrintWriter (response.getWriter());
              
              out.println("");
              out.println("Your Title");
              
              // definingthe three rows of Frames for the main page
              // top : frm_1
              // middle : frm_2
              // bottom : frm_3
              
              out.println("");
              out.println("");
              out.println("");
              out.println("");
              out.println("");
              
              out.println("");
              out.println("");
              out.close();
              -------------------------- END ------------------------------------------

Где MenuServlet и DummyServlet предоставляют контент и поведение для кадров, сгенерированных FrameServlet.

40) Что такое HTTP туннелирование в общем смысле?

Ответ:

HTTP-туннелирование — это общая методика, при которой произвольные данные могут отправляться через HTTP-соединение в сценарии CGI или сервлеты Java на веб-сервере и из них. Это выполняется путем сериализации данных, которые должны быть переданы в поток байтов, и отправки сообщения HTTP с типом контента «application / octet-stream».

HTTP туннелирование также называют туннелированием брандмауэра.

41) Как мне обрабатывать формы с несколькими элементами формы (например, переключателями), используя одно и то же имя?

Ответ:

Для переключателей в спецификации HTML предполагается, что данная группа кнопок будет иметь одно и то же ИМЯ и разные ЗНАЧЕНИЯ; браузер гарантирует, что будет выбрана только одна кнопка для каждого имени группы (не более). Таким образом, вы можете просто вызвать request.getParameter («имя группы»).

1
2
3
<input type="radio" name="topping" value="cheese" checked>Cheese
               <input type="radio" name="topping" value="pepperoni">Pepperoni
               <input type="radio" name="topping" value="anchovies">Anchovies

Если пользователь выбирает «Pepperoni», то request.getParameter («topping») вернет строку «pepperoni».

Для списков, использующих тег <select Несколько> FORM, могут быть возвращены несколько значений для одного и того же имени параметра. Когда это может произойти, используйте request.getParameterValues ​​(«param»), который возвращает String [], через который вы можете перебирать.

Это плохая форма (так сказать), но вы также можете дублировать другие типы элементов, такие как

1
2
Name 1: <input type="text" name="name" value="Dick">
               Name 2: <input type="text" name="name" value="Jane">

Они также возвращаются в массиве методом request.getParameterValues ​​().

42) Как отделить представление (HTML) от бизнес-логики (Java) при использовании сервлетов?

Ответ:

Почти любой, кто когда-либо писал сервлет, может идентифицировать себя с этим. Мы все знаем, что вставлять HTML-код в наш Java-код плохо; Жаль, что приходится перекомпилировать и повторно развертывать каждый раз, когда вы хотите, чтобы элемент HTML выглядел немного иначе. Но каков наш выбор здесь? Есть два основных варианта;

1. Используйте JSP:
Страницы сервера Java позволяют вам встраивать код Java или результаты сервлета в ваш HTML. Вы можете, например, определить сервлет, который дает котировки акций, а затем использовать тег на странице JSP для встраивания вывода. Но тогда это поднимает ту же проблему; без дисциплины ваш контент / презентация и программная логика снова будут связаны. Я думаю, что идеал здесь — полностью отделить их.

2. Используйте систему шаблонов / синтаксический анализ:
Хм … Я знаю, что вы собираетесь разглагольствовать о изобретении колеса, но это не так уж плохо (см. Ниже). Плюс, действительно стоит заплатить такой подход; у вас может быть группа программистов, работающих над кодом Java, и группа производителей HTML, поддерживающих интерфейс. Так что теперь вы, вероятно, хотите знать, как это сделать … так что читайте дальше.

Используйте SSI!

Помните SSI? В последние годы на него не обращали особого внимания из-за встраиваемых языков сценариев, таких как ASP и JSP, но он все еще остается жизнеспособным вариантом. Я считаю, что для использования его в мире сервлетов лучше всего использовать API под названием SSI для Java от Areane. Этот API позволит вам эмулировать команды SSI из системы шаблонов и многое другое. Это позволит вам выполнить любую команду в любой системе, включая выполнение классов Java! Он также поставляется с несколькими вспомогательными классами для создания элементов HTML-форм с сохранением состояния, таблиц для использования с итерациями и многим другим. Это также с открытым исходным кодом, так что это бесплатно, и вы можете настроить его на свое усмотрение! Для получения подробной информации вы можете прочитать документацию по SSI для Java, но ниже приведен пример ее использования.

Вот сервлет:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.areane.www.ssi.*;
 
public class SSITemplatingServlet extends HttpServlet {
   private String templateFilesDirectory = "d:\\projects\\idemo\\templates\\"; //Holds path to template files
 
   /**Handles GET requests; defers every request to the POST processor*/
   public void doGet(HttpServletRequest req, HttpServletResponse res)
                throws ServletException, IOException, FileNotFoundException {doPost(req, res);}
    
   /**Handles all requests. Processes the request,
     *saves the values, parses the file, then feeds the file to the out stream*/
   public void doPost(HttpServletRequest req, HttpServletResponse res)
     throws ServletException, IOException, FileNotFoundException {
     HttpSession ses = req.getSession(true);
                  
     Properties context = null;
     if((context = (Properties)ses.getValue("user.context")) == null) { //if properties doesn't already exist, create it.
                context = new Properties();
     }
 
     //Write parameters to Properties object
     Enumeration paramNames = req.getParameterNames();
     String curName, curVal;
     while(paramNames.hasMoreElements()) {
                curName = (String)paramNames.nextElement();
                curVal = req.getParameter(curName);
                context.setProperty(curName, curVal);
     }
 
     //Save the values to the session
     ses.putValue("user.context", context);
 
     //Parse the page and stream to the client
     String templateName = req.getParameter("template"); // Get the file name of the template to use
     res.setContentType("text/html");
     SsiPage page = SsiParser.parse(this.templateFilesDirectory + templateName); //Parsing occurs here
     page.write(res.getWriter(), context); //Stream to the client
  
     page = null; //clean up
   }
}

Теперь просто создайте файл шаблона, передайте сервлету имя файла шаблона и получите его!

43) Для HTML FORM с несколькими кнопками SUBMIT, как сервлет может

по-разному для каждой кнопки?

Ответ:

Сервлет будет реагировать по-разному для каждой кнопки в зависимости от HTML, который вы поместили на HTML-странице. Давай объясним

Для кнопки отправки HTML выглядит как <input type = submit name = ”Left” value = ”left”>. Сервлет может извлечь значение этой отправки, используя getParameter («Left») из объекта HttpRequest. Из этого следует, что если у вас есть HTML в ФОРМЕ, которая выглядит как:

1
2
3
4
5
6
7
<input type=submit name="Direction" value="left">
 
             <input type=submit name="Direction" value="right">
 
             <input type=submit name="Direction" value="up">
 
             <input type=submit name="Direction" value="down">

Затем getParameter («Направление») из HttpRequest извлекает значение, нажатое пользователем: «влево», «вправо», «вверх» или «вниз». Может произойти простое сравнение в сервлете с этими значениями, и будет выполнена обработка на основе кнопки отправки.

Аналогично, для кнопок отправки с разными именами на странице каждое из этих значений может быть извлечено с помощью вызова getParameter () и выполнено действие. Однако в ситуации, когда имеется несколько кнопок, обычной практикой будет использование одного имени и нескольких значений для идентификации нажатой кнопки.

44) Что подразумевается под термином «бизнес-логика»?

Ответ:

«Бизнес-логика» — это просто модный способ сказать «код».

Точнее говоря, в трехуровневой архитектуре бизнес-логикой является любой код, который не связан конкретно с хранением и извлечением данных (это «код хранения данных») или с форматированием данных для отображения пользователю (это «логика представления»). , По многим причинам имеет смысл хранить эту бизнес-логику в отдельных объектах; средний уровень состоит из этих объектов. Однако различия между этими тремя уровнями часто размыты, и в большинстве программ бизнес-логика является скорее идеалом, чем реальностью. Основной смысл этого термина заключается в том, что вы хотите где-то хранить логику и «бизнес-правила» (еще одно модное слово) вашего приложения, сохраняя при этом четкое и чистое разделение между уровнями.

45) Как я могу явно выгрузить сервлет или вызвать метод destroy?

Ответ:

В общем, вы не можете. Servlet API не указывает, когда сервлет выгружается или как вызывается метод destroy. Ваш механизм сервлетов (т. Е. Реализация интерфейсов в JSDK) может предоставить способ сделать это, возможно, через его интерфейс / инструмент администрирования (например, Webshpere или JWS). Большинство механизмов сервлетов также уничтожат и перезагрузят ваш сервлет, если увидят, что файлы классов были изменены.

46) Что такое боб сервлета?

Ответ:

Бин сервлета — это сериализуемый сервлет, который следует архитектуре компонентов JavaBeans, в основном предлагая методы получения / установки.

Пока вы создаете подкласс GenericServlet / HttpServlet, вы автоматически сериализуемы.

Если ваш веб-сервер поддерживает их, при установке сервлета на веб-сервере вы можете настроить его через интерфейс, похожий на лист свойств.

47) Почему нам нужно вызывать super.init (config) в методе init сервлета?

Ответ:

Просто делай, как тебе говорят, и ты не пострадаешь!

Потому что если вы этого не сделаете, то объект конфигурации будет потерян. Просто расширьте HttpServlet, используйте init () (без параметров), и все будет работать нормально.

Из Javadoc: init () — удобный метод, который может быть переопределен, так что нет необходимости вызывать super.init (config).

48) Что такое сервлетный движок?

Ответ:

«Механизм сервлетов» — это программа, которая подключается к веб-серверу и запускает сервлеты. Термин устарел; Теперь предпочтительным термином является «контейнер сервлета», поскольку он применяется как к модулям подключаемых модулей, так и к автономным веб-серверам, которые поддерживают API сервлетов.

49) Какой самый эффективный (т. Е. Скорость обработки) способ создания серверного приложения, обращающегося к базе данных: сервлет, использующий JDBC; страница JSP, использующая JavaBean для доступа к базе данных; или JSP в сочетании с сервлетом? Это мой единственный выбор?

Ответ:

Ваш вопрос действительно должен быть разбит на две части.

1-Какой самый эффективный способ обслуживания страниц из объекта Java? Там у вас есть явный победитель в сервлете. Хотя, если вы собираетесь менять статическое содержимое страницы, это будет довольно сложно, потому что вам придется менять код Java. Второе место по скорости занимает страницы JSP. Но, в зависимости от вашего приложения, разница в скорости между страницами JSP и необработанными сервлетами может быть настолько мала, что не стоит дополнительной работы по программированию сервлета.

2. Какой самый эффективный способ доступа к базе данных из Java? Если JDBC — это то, что вам нужно, я бы предложил выбрать как можно больше драйверов (II, III, IV или других) и сравнить их. Тип I использует мост JDBC / ODBC и обычно имеет паршивую производительность. Опять же, перейдите на самое простое (обычно драйвер типа IV) решение, если оно соответствует вашим требованиям к производительности.

Для приложений баз данных узким местом производительности обычно является база данных, а не веб-сервер / механизм. В этом случае обычным выбором является использование пакета, обращающегося к JDBC с пулами соединений на уровне приложения, используемого со страниц JSP (с компонентами промежуточного уровня или без них). Конечно, ваши требования к приложениям могут отличаться.

50) Как я могу изменить порт моего веб-сервера Java с 8080 на другой?

Ответ:

Это очень просто. JAVA WEB SERVER поставляется с инструментом удаленного веб-администрирования. Вы можете получить доступ к этому с помощью веб-браузера.

Инструмент администрирования расположен на порту 9090 на вашем веб-сервере. Чтобы изменить адрес порта для веб-сервера:

  1. Инструмент доступа (http: // hostname: 9090)
  2. Введите идентификатор пользователя / пароль (по умолчанию это admin / admin)
  3. Выберите сервис (веб-сервис)
  4. Нажмите на кнопку «Управление». Вы получите всплывающее окно со всеми настройками.
  5. Нажмите на узел дерева сети, справа вы увидите текстовое поле для ввода номера порта.
  6. Измените номер порта по своему желанию.
  7. нажмите на кнопку перезагрузки.

51) Могу ли я отправить несколько ответов на один запрос?

Ответ:

Нет, это даже не имеет смысла

Однако вы можете отправить «перенаправление», которое сообщает браузеру пользователя отправить другой запрос, возможно, тому же сервлету с другими параметрами. Ищите этот FAQ на «redirect», чтобы узнать больше.

52) Что такое логин на основе FORM и как его использовать? Кроме того, какие контейнеры сервлетов поддерживают это?

Ответ:

Форма входа в систему — это один из четырех известных механизмов входа в сеть. Для полноты перечислим их всех с описанием их характера:

  1. Базовая аутентификация HTTP
    • Протокол аутентификации, определенный в протоколе HTTP (и основанный на заголовках). Он указывает область HTTP, доступ к которой согласовывается, и отправляет пароли с кодировкой base64, поэтому он не очень безопасен. (См. RFC2068 для получения дополнительной информации.)
  2. Дайджест-аутентификация HTTP
    • Как и HTTP Basic Authentication, но с паролем, передаваемым в зашифрованном виде. Он более безопасен, чем Basic, но менее аутентифицирован HTTPS, который использует закрытые ключи. Тем не менее, в настоящее время он не широко используется.
  3. Аутентификация HTTPS (взаимная аутентификация SSL)
    • Этот механизм безопасности обеспечивает аутентификацию конечного пользователя с использованием HTTPS (HTTP через SSL). Он выполняет взаимную (клиент и сервер) аутентификацию на основе сертификатов с набором различных наборов шифров.
  4. Форма входа
    • Стандартная форма HTML (статическая, генерируемая сервлетом / JSP или сценарием) для входа в систему. Она может быть связана с доменами защиты или доменами пользователей и используется для аутентификации ранее не прошедших проверку пользователей.
    • Основным преимуществом является то, что внешний вид экрана входа в систему можно контролировать (по сравнению со встроенными механизмами браузеров HTTP).

Поддержка 1., 3. и 4. этих механизмов аутентификации является требованием спецификации J2EE (начиная с версии 1.2, 3.4.1.3 «Обязательные механизмы входа в систему»). (HTTP Digest Authentication не является обязательным требованием, но контейнеры поощряются для ее поддержки.)

Вы также можете увидеть раздел 3.3.11.1 Спецификаций J2EE. (Аутентификация пользователя, веб-клиент) для более подробного описания механизмов.

Таким образом, любой контейнер сервлетов, который соответствует спецификации платформы J2EE, должен поддерживать регистрацию на основе форм.

Чтобы быть более конкретным, спецификация Servlet 2.2 описывает / определяет те же механизмы в 11.5, включая вход в систему на основе формы в 11.5.3.

В этом разделе (11.5.3) подробно описывается природа, требования и соглашения об именах входа в систему на основе форм, и я предлагаю взглянуть на него.

Вот пример соответствующей формы входа в HTML:

1
2
3
4
<form method="POST" action="j_security_check">
                 <input type="text" name="j_username">
                 <input type="password" name="j_password">
              </form>

Известные контейнеры сервлетов, которые поддерживают вход в систему на основе FORM:

  • Сервер приложений iPlanet
  • Tomcat (эталонная реализация API сервлетов Java)

53) Как мне перехватить запрос и отправить точный запрос (со всеми полученными параметрами) на другой URL?

Ответ:

Насколько я знаю, это зависит от местоположения следующего целевого URL.

  • Если следующий URL сервлета находится на том же хосте, вы можете использовать метод forward.

Вот пример кода об использовании forward:

1
2
3
4
5
RequestDispatcher rd = null;
               String targetURL = "target_servlet_name";
               ServletContext ctx = this.getServletContext();
               rd = ctx.getRequestDispatcher(targetURL);
               rd.forward(request, response);

54) Как данные в HTML-форме могут обновляться автоматически при изменении базы данных?

Ответ:

JSP предназначен для динамического создания страниц. Сгенерированные страницы могут включать в себя WML, HTML, HTML или все, что вы хотите …

Когда у вас есть сгенерированная страница, JSP уже сделал свою работу. С этого момента у вас есть страница.

Если вы хотите автоматическое обновление, то это должно выполняться с помощью технологии, включенной в сгенерированную страницу (JSP сообщит только то, что включить в страницу).

Браузер не может быть загружен внешними факторами. Браузер — тот, кто выбирает URL, поскольку протокол http основан на запросе-ответе. Если сервер может перезагрузить браузер без его разрешения, это означает, что мы могли бы получать страницы, которые мы не запрашивали с серверов.

Возможно, вы могли бы использовать апплеты и ServerSocket для получения входящих сигналов от сервера для измененных данных в БД. Таким образом, вы можете загрузить новую информацию внутри апплета или попытаться перезагрузить страницу.

Это хорошая идея — она ​​может использовать вызов showDocument () для перезагрузки текущей страницы. Он также может использовать HTTP-опрос вместо поддержания дорогостоящего сокетного соединения. для -Alex-]

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

55) Что такое веб-приложение (или «веб-приложение»)?

Ответ:

Веб-приложение — это набор сервлетов, HTML-страниц, классов и других ресурсов, которые можно объединять и запускать в нескольких контейнерах от разных поставщиков. Веб-приложение внедряется по определенному пути внутри веб-сервера. Например, приложение каталога может быть расположено по адресу http://www.mycorp.com/catalog. Все запросы, которые начинаются с этого префикса, будут направлены в ServletContext, который представляет приложение каталога.

56) Как я могу вызвать сервлет со страницы JSP? Как я могу передать переменные из JSP, к которым сервлет может получить доступ?

Ответ:

Вы можете использовать <jsp: forward page = »/lativepath / YourServlet» /> или response.sendRedirect («http: // path / YourServlet»).

Переменные могут быть отправлены как:

1
2
3
4
<jsp:forward page=/relativepath/YourServlet>
               <jsp:param name="name1" value="value1" />
               <jsp:param name="name2" value="value2" />
               </jsp:forward>

Вы также можете передать параметры сервлету, указав response.sendRedirect («http: // path / YourServlet? Param1 = val1»).

57) Может ли быть более одного экземпляра сервлета одновременно?

Ответ:

Важно отметить, что в контейнере сервлета может быть несколько экземпляров данного класса сервлета. Например, это может произойти, когда было более одного определения сервлета, в котором использовался определенный класс сервлета с различными параметрами инициализации. Это также может произойти, когда сервлет реализует интерфейс SingleThreadModel, а контейнер создает пул экземпляров сервлета для использования.

58) Как измерить время загрузки файла с помощью сервлетов?

Ответ:

01
02
03
04
05
06
07
08
09
10
11
12
ServletOutputStream out = response.getOutputStream();
               String filename = getServletContext().getRealPath(request.getQueryString());
               FileInputStream fin = new FileInputStream(filename);
               long start = System.currentTimeMillis();
               byte data[] = new byte[1024];
               int len = 0;
               while ((len = fin.read(data)) > 0) {
                  out.write(data, 0, len);
               }
               out.flush();
               long stop = System.currentTimeMills();
               log("took " + (stop - start) + "ms to download " + filename);

59) Что такое меж сервлетная связь?

Ответ:

Как следует из названия, это связь между сервлетами. Сервлеты разговаривают друг с другом. [Существует множество способов связи между сервлетами, в том числе

  • Отправка запроса
  • HTTP Redirect
  • Сервлет Цепи
  • HTTP-запрос (с использованием сокетов или класса URLConnection)
  • Общий сеанс, запрос или объекты приложения (бины)
  • Прямой вызов метода (не рекомендуется)
  • Общие статические или переменные экземпляра (не рекомендуется)

Ищите в часто задаваемых вопросах, особенно в разделе « Передача сообщений» (включая отправку запросов) информацию о каждом из этих методов. для -Alex-]

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

например, ServletContext.getRequestDispatcher (HttpRequest, HttpResponse) .forward («NextServlet»); Вы можете передать текущий объект запроса и ответа из последней отправки формы следующему сервлету / JSP. Вы можете изменить эти объекты и передать их так, чтобы следующий сервлет / JSP мог использовать результаты этого сервлета.

Существует несколько конфигураций, специфичных для движка сервлета, для цепочки сервлетов.

Сервлеты также могут вызывать публичные функции других сервлетов, работающих на том же сервере. Это можно сделать, получив дескриптор нужного сервлета через объект ServletContext, передав ему имя сервлета (этот объект может возвращать любые сервлеты, запущенные на сервере). И затем вызов функции для возвращенного объекта сервлета.

например, TestServlet test = (TestServlet) getServletConfig (). getServletContext (). getServlet («OtherServlet»); otherServletDetails = Test.getServletDetails ();

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

Сервлеты также могут вызывать другие сервлеты программным путем, отправляя HTTP-запрос. Это можно сделать, открыв URL-соединение с нужным сервлетом.

60) Как заставить псевдоним сервлета работать с Apache + Tomcat?

Ответ:

Когда вы используете Tomcat как отдельный веб-сервер, вы можете изменить файл web.xml в $ TOMCAT_HOME / webapps / myApp / WEB-INF, чтобы добавить шаблон URL:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<web-app>
                  <servlet>
                    <servlet-name>
                              myServlet
                    </servlet-name>
                    <servlet-class>
                              myServlet
                    </servlet-class>
                  </servlet>
                  <servlet-mapping>
                    <servlet-name>
                              myServlet
                    </servlet-name>
                    <url-pattern>
                              /jsp-bin/*
                    </url-pattern>
                 </servlet-mapping>
               </web-app>

Это позволит вам использовать: http: // webserver: 8080 / myApp / jsp-bin / stuff.html вместо: http: // webserver: 8080 / myApp / servlet / myServlet / stuff.html Но он не будет работать на порт 80, если вы интегрировали Tomcat с Apache. Грэм Уоллес предоставил этот трюк, чтобы исправить ситуацию. Добавьте следующее в ваш tomcat-apache.conf (или в его статическую версию, так как tomcat заново генерирует файл conf при каждом запуске):

1
2
3
<LocationMatch /myApp/jsp-bin/* >
                 SetHandler jserv-servlet
              </LocationMatch>

Это позволяет Apache перевести обработку URL-адреса в ваш сервлет.

61) Есть ли способ определить количество одновременных соединений, которые может обработать мой движок сервлета?

Ответ:

Зависит от того, использует ли ваш контейнер сервлета пул потоков. Если вы не используете пул потоков, количество одновременных соединений, принятых Tomcat 3.1, например, равно 10. Это вы можете убедиться сами, протестировав сервлет с помощью инструмента Apache JMeter.

Однако, если ваш контейнер сервлета использует пул потоков, вы можете указать количество одновременных соединений, которые будут приняты контейнером. Для Tomcat 3.1 информация о том, как это сделать, предоставляется вместе с документацией в каталоге TOMCAT_HOME / doc / uguide.

62) Что такое диспетчер запросов и как он работает?

Ответ:

Объект RequestDispatcher может переслать запрос клиента к ресурсу или включить сам ресурс в ответ клиенту. Ресурс может быть другим сервлетом, файлом HTML, файлом JSP и т. Д.

Вы также можете рассматривать объект RequestDispatcher как оболочку для ресурса, расположенного по заданному пути, который предоставляется в качестве аргумента метода getRequestDispatcher.

Для создания объекта RequestDispatcher вы можете использовать либо метод ServletRequest.getRequestDispatcher (), либо метод ServletContext.getRequestDispatcher (). Они оба делают одно и то же, но накладывают немного разные ограничения на путь аргумента. В первом случае он ищет ресурс в том же веб-приложении, к которому принадлежит вызывающий сервлет, и указанное имя пути может относиться к вызывающему сервлету. В последнем случае путь должен начинаться с ‘/’ и интерпретироваться относительно корня веб-приложения.

Для иллюстрации предположим, что вы хотите, чтобы Servlet_A вызывал Servlet_B. Если они оба находятся в одном и том же каталоге, вы можете сделать это, включив следующий фрагмент кода в метод службы или метод doGet Servlet_A:

1
2
RequestDispatcher dispatcher = getRequestDispatcher("Servlet_B");
              dispatcher.forward( request, response );

где запрос типа HttpServletRequest является первым параметром метода включающей службы (или метода doGet) и ответом типа HttpServletResponse, вторым. Вы можете сделать то же самое,

1
2
RequestDispatcher dispatcher=getServletContext().getRequestDispatcher( "/servlet/Servlet_B" );
               dispatcher.forward( request, response );

63) Что такое контекст сервлета?

Ответ:

Контекст сервлета — это группа, в которой работают связанные сервлеты (и JSP, и другие веб-ресурсы). Они могут обмениваться данными, пространством имен URL и другими ресурсами. В одном контейнере сервлета может быть несколько контекстов.

Объект ServletContext используется отдельным сервлетом для «обратного вызова» и получения услуг из контейнера (например, диспетчера запросов). Прочитайте JavaDoc для javax.servlet.ServletContext для получения дополнительной информации.

Вы можете поддерживать «глобальные» переменные приложения, используя атрибуты контекста сервлета .

64) Ожидает ли RequestDispatcher относительный URL относительно первоначально вызванного сервлета или текущего сервлета (если отличается)?

Ответ:

Поскольку RequestDispatcher будет передавать элемент управления (объект запроса и объект ответа) из текущего сервлета, относительный URL-адрес должен быть относительно текущего сервлета.

Первоначально вызванный сервлет передал управление текущему сервлету, а теперь текущий сервлет действует как контроллер для других ресурсов.

65) В чем разница между контейнерами сервлетов в процессе и вне процесса?

Ответ:

Контейнеры Servlet в процессе работы — это контейнеры, которые работают внутри JVM веб-сервера, они обеспечивают хорошую производительность, но плохую масштабируемость.

Контейнеры вне процесса — это контейнеры, которые работают в JVM вне веб-сервера. низкая производительность, но лучшая масштабируемость

В случае контейнеров вне процесса веб-сервер и контейнер взаимодействуют друг с другом, используя некоторый стандартный механизм, такой как IPC.

В дополнение к этим типам контейнеров, есть 3-й тип, который является автономными сервлет-контейнерами. Это неотъемлемая часть веб-сервера.

66) Как SingleThreadModel реализован в Tomcat? В других контейнерах? [Я хотел бы предположить, что Tomcat использует свой пул потоков соединений и создает новый экземпляр сервлета для каждого потока соединений вместо того, чтобы делить один экземпляр между всеми потоками. Это правда?]

Ответ:

Этот вопрос объединяет два довольно независимых аспекта контейнера сервлета: «управление параллелизмом» и «пул потоков».

Управление параллелизмом, например, достигаемое за счет реализации сервлетом интерфейса SingleThreadModel, решает проблему безопасности потоков. Сервлет будет поточно-ориентированным или небезопасным независимо от того, использовал ли контейнер сервлета пул потоков. Пул потоков просто устраняет издержки, связанные с созданием и уничтожением потоков, поскольку контейнер сервлета пытается ответить на несколько запросов, полученных одновременно. Именно по этой причине в документе спецификации API Servlet 2.2 ничего не говорится о пуле потоков, поскольку это всего лишь деталь реализации. Тем не менее, документ действительно затрагивает проблему безопасности потоков и то, как и когда использовать сервлеты SingleThreadModel.

В разделе 3.3.3.1 документа Спецификации API Servlet 2.2 сказано, что если сервлет реализует SingleThreadModel, то гарантируется, что «в методе службы будет разрешен только один поток запросов за раз». Далее говорится, что «контейнер сервлета может удовлетворить эту гарантию, сериализовав запросы к сервлету или поддерживая пул экземпляров сервлета».

Очевидно, что для превосходной производительности вы хотите, чтобы контейнер сервлета создавал несколько экземпляров сервлета типа SingleThreadModel, если было получено много запросов в быстрой последовательности. Будет ли контейнер сервлета делать это, полностью зависит от реализации. Мои эксперименты показывают, что Tomcat 3.1 действительно создает несколько экземпляров сервлета SingleThreadModel, но только для первого пакета запросов, полученных одновременно. Для последующих пакетов параллельных запросов, кажется, используется только один из этих экземпляров.

67) Какие контейнеры сервлетов имеют постоянную поддержку сеанса? В частности, Tomcat 3.1?

Ответ:

Все контейнеры сервлетов, которые реализуют API Servlet 2.2, должны обеспечивать отслеживание сеансов либо с помощью файлов cookie, либо путем перезаписи URL. Все контейнеры сервлетов Tomcat поддерживают отслеживание сеансов.

68) Могу ли я использовать JAAS в качестве технологии аутентификации для сервлетов?

Ответ:

Да, JAAS может использоваться как технология аутентификации для сервлетов. Одна важная особенность JAAS — это чистая реализация Java. Инфраструктура JAAS разделена на два основных компонента: компонент аутентификации и компонент авторизации. Компонент аутентификации JAAS обеспечивает возможность надежного и безопасного определения того, кто в настоящее время выполняет код Java, независимо от того, выполняется ли код как приложение, апплет, bean-компонент или сервлет.

69) Как настроить сервлет для загрузки при запуске контейнера, а не при первом запросе?

Ответ:

Спецификация Servlet 2.2 определяет элемент загрузки при запуске именно для этой цели. Поместите его в раздел <servlet> вашего дескриптора развертывания web.xml.Он либо пуст (<load-on-startup />), либо содержит «положительное целое число, указывающее порядок загрузки сервлета. Нижние целые числа загружаются перед старшими целыми. Если значение не указано или указанное значение не является положительным целым числом, контейнер может загрузить его в любой момент в последовательности запуска ».

Например,

1
2
3
4
5
<servlet>
                 <servlet-name>foo</servlet-name>
                 <servlet-class>com.foo.servlets.Foo</servlet-class>
                 <load-on-startup>5</load-on-startup>
              </servlet>

Некоторые контейнеры сервлетов также имеют свои собственные методы для настройки этого; Пожалуйста, отправьте отзыв с информацией об этом.

70) Можно ли написать сервлет, который действует как FTP-сервер?

Ответ:

Да. Это породило бы поток, который открывает ServerSocket, затем прослушивает входящие соединения и говорит по протоколу FTP.

71) Есть ли способ отключить возможность пользователя дважды щелкнуть изображение / кнопку отправки (и, следовательно, отправить дубликаты данных — несколько отправок)? Есть ли способ сделать это с помощью Javascript?

Ответ:

Дайте отправляемое изображение (или кнопку) обработчику onClick (). Пусть обработчик проверит, установлен ли флаг, а если не установлен, и отправьте форму, а затем очистите форму.

72) Каковы основные различия между сервлетами и ISAPI?

Ответ:

Первое отличие состоит в том, что Servlets — это технология Sun Microsystems, а ISAPI — от Microsoft.

Другие отличия:

  1. Сервлет — это простой файл .class, а ISAPI — это DLL
  2. Сервлеты запускаются в контейнерах сервлетов и могут быть в процессе или вне процесса. ISA работают в том же адресном пространстве, что и HTTP-сервер
  3. Контейнер сервлетов предварительно обрабатывает и обрабатывает обмен данными между клиентом и сервером. Фильтры ISAPI обеспечивают возможность предварительной обработки и последующей обработки всех данных, передаваемых между клиентом и сервером.
  4. Java является единственным выбором для написания сервлетов, VC ++ / MFC используется для написания кода ISAPI.
  5. Сервлеты работают на большинстве веб-серверов, а сторонние контейнеры могут быть интегрированы с другими веб-серверами для предоставления на них сервлетов. ISAPI работает только на ISAPI-совместимом веб-сервере (например, Microsoft Internet Information Server)
  6. Сервлеты могут подключаться к базам данных через JDBC, а также через мосты jdbc-odbc. ISAPI может подключаться к базам данных только через ODBC
  7. Сервлеты имеют доступ ко многим серверным технологиям, таким как EJB и т. Д. ISAPI имеет ограниченную область применения.
  8. Несколько команд могут быть реализованы в сервлете с использованием pathinfo . ISAPI допускает несколько команд в одной DLL, реализованных как функции- члены объекта CHttpServer в DLL.
  9. Создание контента и представление контента могут быть выполнены отдельно в сервлетах с помощью JSP. Код ISAPI должен генерировать сам код HTML.

73) Могу ли я связать сервлет с определенным MIME-типом, поэтому, если клиент запрашивает файл этого типа, мой сервлет будет выполнен?

Ответ:

В web.xml вы можете использовать mime-mapping для сопоставления типа с определенным расширением, а затем сопоставить сервлет с этим расширением.

например

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<mime-mapping>
                 <extension>
                   zzz
                 </extension>
                 <mime-type>
                   text/plain
                 </mime-type>
              </mime-mapping>
 
              <servlet-mapping>
                 <url>
                   *.zzz
                 </url>
                 <servlet-name>
                   MyServlet
                 </servlet-name>
              </servlet-mapping>

Итак, когда запрашивается файл для типа zzz, сервлет вызывается.

74) Каковы различные случаи использования sendRedirect () и getRequestDispatcher ()?

Ответ:

Если вы хотите сохранить текущие объекты запроса / ответа и перенести их в другой ресурс в контексте, вы должны использовать getRequestDispatcher или getNamedDispatcher.

Если вы хотите отправить ресурсы вне контекста, вы должны использовать sendRedirect. В этом случае вы не будете отправлять исходные объекты запроса / ответа, но будете отправлять заголовок с просьбой к браузеру отправить запрос на новый URL-адрес.

Если вам не нужно сохранять объекты запроса / ответа, вы можете использовать любой из них.

75) Как мне получить доступ к значению куки, используя JavaScript?

Ответ:

Вы можете управлять файлами cookie в JavaScript с помощью свойства document.cookie. Вы можете установить cookie, назначив это свойство, и получить его, прочитав его текущее значение.

Например, следующий оператор устанавливает новый файл cookie с минимальным количеством атрибутов:

1
document.cookie = "cookieName=cookieValue";

И следующий оператор отображает значение свойства:

1
alert(document.cookie);

Значением document.cookie является строка, содержащая список всех файлов cookie, связанных с веб-страницей. Он состоит из пар имя = значение для каждого файла cookie, соответствующего текущему домену, пути и дате. Например, значением свойства document.cookie может быть следующая строка:

1
cookieName1=cookieValue1; cookieName2=cookieValue2;

76) Как мне записать в файл журнала, используя JSP под Tomcat? Могу ли я использовать метод log () для этого?

Ответ:

Да, вы можете использовать метод журнала Servlet API в Tomcat из JSP или сервлетов. Эти сообщения хранятся в каталоге журнала сервера в файле с именем servlet.log.

77) Как я могу использовать сервлет для печати файла на принтере, подключенном к клиенту?

Ответ:

Безопасность в браузере разработана, чтобы ограничить вас от автоматизации подобных вещей. Однако вы можете использовать JavaScript в HTML, который возвращает ваш сервлет, чтобы напечатать фрейм. Браузер все равно подтвердит задание на печать у пользователя, поэтому вы не можете полностью автоматизировать это. Кроме того, вы будете печатать все, что отображает браузер (он не будет надежно печатать плагины или апплеты), поэтому обычно вы ограничены HTML и изображениями.

[Исходный код JavaScript для этого:

1
<input type="button" onClick="window.print(0)" value="Print This Page">

78) Как вы делаете псевдоним сервлета с Apache и Tomcat?

Ответ:

Псевдоним сервлета состоит из двух частей с использованием Apache и Tomcat. Во-первых, вы должны отобразить запрос в Apache на Tomcat с помощью директивы ApJServMount, например:

ApJServMount / myservlet / ROOT

Во-вторых, вы должны сопоставить этот шаблон URL с именем сервлета, а затем с классом сервлета в вашем файле конфигурации web.xml. Вот примерная выдержка:

1
2
3
4
5
6
7
8
<servlet>
                  <servlet-name>myservlet</servlet-name>
                  <servlet-class>com.mypackage.MyServlet</servlet-class>
               </servlet>
               <servlet-mapping>
                  <servlet-name>myservlet</servlet-name>
                  <url-pattern>/myservlet</url-pattern>
               </servlet-mapping>

79) Я хочу, чтобы моя страница сервлета перенаправлялась на страницу входа, если время сеанса истекло. Как я могу узнать, истекло ли время моей сессии?

Ответ:

Если механизм сервлета делает тайм-аут, вам поможет следующий код:

1
2
3
4
5
6
//assume you have a HttpServletRequest request
               if(request.getSession(false)==null) {
                  //no valid session (timeouted=invalid)
 
                  //code to redirect to login page
               }

80) Можно ли настроить Tomcat для интерпретации всех или выбранных файлов .html в данном контексте как JSP? Или файлы JSP должны заканчиваться расширением .jsp?

Ответ:

да, вы можете сделать это, изменив файл web.xml. Вам нужно будет вызвать org.apache.jasper.runtime.JspServlet для всех запросов, имеющих расширение .html. Вы можете сделать это, изменив код отображения сервлета:

1
2
3
4
5
6
<servlet-mapping>
                <servlet-name>
                  jsp
                </servlet-name>
                <url>*.html</url>
             </servlet-mapping>

И закомментируйте следующий блок

1
2
3
4
5
6
7
8
<mime-mapping>
                  <extension>
                    html
                  </extension>
                  <mime-type>
                    text/html
                  </mime-type>
               </mime-mapping>

81) В чем разница между атрибутами запроса, атрибутами сеанса и атрибутами ServletContext?

Ответ:

Атрибут ServletContext — это объект, связанный с контекстом через метод ServletContext.setAttribute () и доступный для ВСЕХ сервлетов (таким образом, JSP) в этом контексте или для других контекстов через метод getContext (). По определению атрибут контекста существует локально в ВМ, где они были определены. Таким образом, они недоступны в распределенных приложениях.

Атрибуты сеанса привязаны к сеансу как средство предоставления состояния для набора связанных HTTP-запросов. Атрибуты сеанса доступны ТОЛЬКО для тех сервлетов, которые присоединяются к сеансу. Они также недоступны для разных JVM в распределенных сценариях. Объекты могут быть уведомлены, когда они связаны / не связаны с сеансом, реализующим интерфейс HttpSessionBindingListener.

Атрибуты запроса привязаны к конкретному объекту запроса, и они действуют до тех пор, пока запрос не будет решен или пока он будет отправляться от сервлета к сервлету. Они чаще используются в качестве канала связи между сервлетами через интерфейс RequestDispatcher (поскольку вы не можете добавлять параметры …) и контейнером. Атрибуты запроса очень полезны в веб-приложениях, когда вы должны предоставить информацию о настройке между поставщиками информации и уровнем представления информации (JSP), который связан с конкретным запросом и больше не должен быть доступен, что обычно происходит с сеансами без строгого контроля стратегия.

Таким образом, мы можем сказать, что атрибуты контекста предназначены для инфраструктуры, такой как общие пулы соединений, атрибуты сеанса для контекстной информации, такой как идентификация пользователя, и атрибуты запроса предназначены для конкретной информации запроса, такой как результаты запроса.

82) Являются ли одноэлементные / статические объекты общими для контекста сервлета?

[Вопрос продолжается: например, если у меня есть два контекста на одном веб-сервере, и каждый контекст использует сервлет входа в систему, а сервлет входа подключается к БД. Соединение с БД управляется одноэлементным объектом. Имеют ли оба контекста свой собственный экземпляр синглтона БД, или один экземпляр используется двумя?]

Ответ:

Это зависит от того, откуда загружен класс.

Классы, загруженные из каталога WEB-INF контекста, не являются общими для других контекстов, тогда как классы, загруженные из CLASSPATH, являются общими. Таким образом, если у вас есть точно один и тот же класс DBConnection в каталоге WEB-INF / classes двух разных контекстов, каждый контекст получает свою собственную копию одиночного (статического) объекта.

83) В каких областях возникают проблемы с синхронизацией при создании веб-приложений?

Ответ:

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

Типичные примеры включают в себя:

  • Соединения с внешними серверами, особенно если у вас есть какой-либо пул.
  • Все, что вы включаете в HttpSession. (Ваш пользователь может открыть много окон браузера и сделать много одновременных запросов в течение одного сеанса.)
  • Регистрируйте назначения, если вы ведете свою собственную регистрацию из своих сервлетов.

84) В чем разница между веб-сервером apache, веб-сервером java и сервером tomcat?

Ответ:

Apache — это HTTP-сервер, написанный на C, который можно скомпилировать и запустить на многих платформах.

Java WebServer — это HTTP-сервер от Sun, написанный на Java, который также поддерживает сервлеты и JSP.

Tomcat — это HTTP-сервер с открытым исходным кодом от Apache Foundation, написанный на Java, который поддерживает сервлеты и JSP. Его также можно использовать как «плагин» для HTTP-серверов с собственным кодом, таких как Apache Web Server и IIS, для обеспечения поддержки сервлетов (при этом все еще обслуживая обычные HTTP-запросы от основного веб-сервера с собственным кодом).

85) Как вы можете встроить JavaScript в страницы сервлетов / JSP?

Ответ:

Вам не нужно делать ничего особенного, чтобы включить JavaScript в сервлеты или страницы JSP. Просто попросите страницу сервлета / JSP сгенерировать необходимый код JavaScript, как если бы вы включили его в необработанную HTML-страницу.

Главное, что нужно помнить, это то, что он не будет работать на сервере. Он запустится на клиенте, когда браузер загрузит сгенерированный HTML с включенным JavaScript.

86) Как сделать запрос POST с помощью методов response.sendRedirect () или response.setStatus () и response.setHeader ()?

Ответ:

Ты не можешьЭто фундаментальное ограничение протокола HTTP. Вам придется найти другой способ передачи данных, например,

  • Используйте вместо этого GET
  • Сделайте ПОСТ из вашего сервлета, а не из клиента
  • Храните данные в куки, а не передавайте их через GET / POST

87) Как передать объект запроса одного сервлета в качестве объекта запроса другому сервлету?

Ответ:

Используйте диспетчер запросов.

88) Я называю сервлет как действие в форме, из JSP. Как я могу перенаправить ответ от сервлета обратно в JSP? (RequestDispatcher.forward в этом случае не поможет, так как я не знаю, какой ресурс сделал запрос.

Ответ:

Вам нужно будет передать URI JSP сервлету и заставить сервлет вызвать sendRedirect, чтобы вернуться к JSP. Например:

1
2
3
4
5
<FORM ACTION="/foo/myservlet">
                  <INPUT TYPE="HIDDEN" NAME="redirect" VALUE="/foo/thisjsp.jsp">
                     Shoe size: <INPUT NAME="shoesize">
                  <INPUT TYPE="SUBMIT">
               </FORM>

Тогда в сервлете …

1
response.sendRedirect(request.getParameter("redirect"));

89) Что такое объект ServletConfig и почему он полезен?

Ответ:

Объект ServletConfig является интерфейсом. Содержит методы

  • getInitParameter
  • getInitParameterNames
  • getServletContext
  • getServletName

Вы можете использовать методы для определения параметров инициализации сервлета, имени экземпляра сервлета и ссылки на контекст сервлета, в котором выполняется сервлет.

getServletContext является наиболее ценным методом, поскольку он позволяет вам обмениваться информацией через приложение (контекст).

90) У меня есть глобальная переменная в классе сервлетов. Что произойдет с этой глобальной переменной, если два запроса будут выполняться одновременно?

Ответ:

То, что произойдет, является непредвиденным событием.

Лучший способ установить вхождение по умолчанию (сервлет обрабатывает запрос за раз) — это синхронизировать доступ к глобальной переменной или, альтернативно, создать сервлет, который реализует интерфейс SingleThreadModel .

91) Предположим, у меня есть 2 сервера, server1 и server2. Как я могу взять данные в куки с server1 и отправить их на server2?

Ответ:

Вам придется создать (новый) аналогичный файл cookie на сервере 2.

Иметь ReadCookieServlet на сервере server1, который

  • Читает куки, используя request.getCookies ()
  • Перенаправляет на WriteCookieServlet, работающий на сервере server2, передавая имя cookie, значение и дату истечения срока действия в качестве параметров запроса, используя response.sendRedirect () .

Иметь WriteCookieServlet на сервере server2, который

  • Считывает параметры запроса имени файла cookie, его значения и срока годности, используя request.getParameter () .
  • Создает аналогичный файл cookie, используя response.addCookie () .

92) Как передать данные из сервлета, работающего в одном контексте (веб-приложение), в сервлет, работающий в другом контексте?

Ответ:

Есть три способа, которыми я могу думать о макушке головы:

  1. Сохраняйте информацию, которой вы хотите поделиться, в постоянном формате, например, в файловой системе или базе данных. Таким образом, любой сервлет, работающий в JVM, который может «видеть» эти ресурсы, может получить эту информацию.
  2. Если сохранение этой информации не является опцией, вы можете связать эту информацию с контекстом, который доступен для всех контекстов сервлета, например с контекстом сервера приложений. Таким образом, вы можете хранить данные, которыми хотите поделиться, в памяти.
  3. Используйте старый способ передачи информации сервлету — HTTP. Один сервлет может направить запрос другому сервлету и включить данные, которые должны быть переданы в качестве параметров в запросе.

93) Как я могу написать «страницу ошибок» — то есть сервлет или JSP, чтобы сообщать об ошибках других сервлетов?

Ответ:

Спецификация Servlet 2.2 позволяет вам указать страницу ошибок (сервлет или JSP) для различных типов ошибок HTTP или ServletExceptions. Вы можете указать это в дескрипторе развертывания веб-приложения как:

1
2
3
4
<error-page>
                  <exception-type>FooException</exception-type>
                  <location>/error.jsp</location>
                </error-page>

где FooException является подклассом ServletException.

Веб-контейнер вызывает этот сервлет в случае ошибок, и вы можете получить доступ к следующей информации из объекта запроса сервлета ошибок / JSP: код ошибки, тип исключения и сообщение.

94) В чем разница между ServletContext и ServletConfig?

Ответ:

ServletContext представляет контекст в контейнере сервлета экземпляра сервлета. Контейнер сервлета может иметь несколько контекстов (или веб-приложений) одновременно. Каждый экземпляр сервлета работает в одном из этих контекстов. Все экземпляры сервлетов, работающие в одном контексте, являются частью одного и того же веб-приложения и, следовательно, совместно используют общие ресурсы. Сервлет обращается к этим общим ресурсам (таким как RequestDispatcher и свойства приложения) через объект ServletContext.

Это понятие веб-приложения стало очень важным для Servlet 2.1 API, где вы можете развернуть все веб-приложение в файле WAR. Обратите внимание, что я всегда говорил «экземпляр сервлета», а не сервлет. Это потому, что один и тот же сервлет может использоваться в нескольких веб-приложениях одновременно. Фактически, это может быть распространено, если есть универсальный сервлет контроллера, который можно настроить во время выполнения для конкретного приложения. Тогда у вас будет запущено несколько экземпляров одного и того же сервлета, каждый из которых может иметь разные конфигурации.

Вот где приходит ServletConfig. Этот объект определяет, как сервлет должен быть настроен, передается сервлету в его методе init. Большинство контейнеров сервлетов предоставляют способ настройки сервлета во время выполнения (обычно через обычный файл) и установки его начальных параметров. Контейнер, в свою очередь, передает эти параметры сервлету через ServetConfig.

95) При каких обстоятельствах сервлет будет перезагружен?

Ответ:

Это зависит от контейнера сервлетов.

Большинство контейнеров сервлетов перезагружают сервлет, только он обнаруживает изменение кода в сервлете, а не в ссылочных классах.

В дескрипторе развертывания Tomcat server.xml, если вы упомянули

1
2
3
4
5
6
7
<Context path="/myApp"
                             docBase="D:/myApp/webDev"
                               crossContext="true"
                               debug="0"
                               reloadable="true"
                               trusted="false" >
              </Context>

Пополняемые = Истинные делает волшебство. Каждый раз, когда контейнер сервлета обнаруживает, что код сервлета изменен, он вызывает уничтожение в загруженном в настоящий момент сервлете и перезагружает новый код.

Но если класс, на который ссылается сервлет, изменится, сервлет не будет загружен. Вам нужно изменить метку времени сервлета или остановить запуск сервера, чтобы новый класс был в памяти контейнера.

96) Что такое сервлет-фильтр?

Ответ:

Фильтр — это в основном компонент, который вызывается всякий раз, когда вызывается ресурс, для которого этот фильтр сопоставлен. Ресурс может быть чем-то вроде сервлета или шаблона URL. Фильтр обычно работает с атрибутами запроса, ответа или заголовка и сам не отправляет ответ клиенту.

97) Я использую метод forward () RequestDispatcher для перенаправления в JSP. Проблема в том, что теперь URL-адрес jsp относительно URL-адреса сервлета, и все мои URL-адреса в jsp, такие как <img src = ”pic.gif”>, будут повреждены. Как мне решить эту проблему?

Ответ:

Вы можете использовать абсолютные URL, такие как:

1
2
3
4
<BODY>
                 <% String base = request.getContextPath(); %>
                 <IMG src="<%=base%>/img/pic.gif">
              </BODY>

или напишите БАЗОВЫЙ тег как:

1
2
3
4
5
6
7
<% String base = request.getContextPath(); %>
               <HEAD>
                  <BASE HREF="<%=base%>">
               </HEAD>
               <BODY>
                  <IMG src="img/pic.gif">
               </BODY>

Это должно решить проблему.

98) Как я могу вернуть легкодоступную (статическую) HTML-страницу пользователю вместо генерации ее в сервлете?

Ответ:

Чтобы решить вашу проблему, вы можете либо отправить «Redirect» обратно клиенту, либо использовать RequestDispatcher и перенаправить ваш запрос на другую страницу:

  1. Перенаправление:

    Перенаправление выполняется с использованием объекта HttpServletResponse:

    1
    2
    3
    4
    5
    if(condition) {
          response.sendRedirect("page1.html");
       } else {
               response.sendRedirect("page2.html");
       }
  2. RequestDispatcher:

    Диспетчер запросов может быть получен через ServletContext. Его можно использовать для добавления другой страницы или для пересылки на нее.

    1
    2
    3
    4
    5
    6
    7
    if(condition) {
         this.getServletContext()
                      .getRequestDispatcher("page1.html").forward();
      } else {
        this.getServletContext()
                      .getRequestDispatcher("page2.html").forward();
      }

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

Если ваш сервер приложений настроен в сочетании с обычным веб-сервером, таким как Apache, вы должны использовать решение (1), потому что веб-сервер обычно обслуживает статические файлы намного быстрее, чем сервер приложений.

99) В чем разница между статическими переменными и переменными экземпляра в сервлете?

Ответ:

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

Согласно спецификации Servlet, сервлет, который не объявляет SingleThreadModel, обычно имеет один и только один экземпляр, общий для всех одновременных запросов, попадающих в этот сервлет.

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

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

Помните, что вы можете хранить данные в разных местах сервлета. Для остроумия:

  • Локальные переменные — для итераторов цикла, наборов результатов и т. Д.
  • Атрибуты запроса — для данных, которые должны быть переданы другим сервлетам, вызываемым с помощью RequestDispatcher
  • Атрибуты сеанса — сохраняются для всех будущих запросов только от текущего пользователя
  • Переменные экземпляра — для данных, которые сохраняются в течение всего срока службы сервлета, передаются всем одновременным пользователям
  • Статические переменные — для данных, которые сохраняются на протяжении всего жизненного цикла приложения, доступны для всех одновременно работающих пользователей — включая любые другие экземпляры сервлета, экземпляры которых были созданы с различными параметрами init
  • Атрибуты контекста — для данных, которые должны сохраняться на протяжении всего жизненного цикла приложения и использоваться совместно со всеми остальными сервлетами.

100) Как я могу обмениваться данными между двумя различными веб-приложениями?

Ответ:

Различные сервлеты могут совместно использовать данные в одном приложении через ServletContext. Если у вас есть возможность поместить сервлеты в разные приложения, вы можете рассмотреть возможность использования EJB.

Ссылка: 100 лучших вопросов по сервлету Java от нашего партнера JCG Сунила Гулабани в блоге