Может кто-нибудь объяснить файл Spring web.xml? - PullRequest
8 голосов
/ 30 апреля 2011

Я новичок в Java Enterprise и Spring, но я хорошо разбираюсь в стандартной Java.Я просматриваю существующий проект веб-приложения.В проекте используется Tomcat / Spring / Hibernate, который, как я понимаю, довольно распространен.Он также использует DWR для удаленных вызовов методов.Мне несколько трудно разделить обязанности: за что отвечает Tomcat, за что отвечает Spring, как запросы передаются от одного к другому и как основные части Spring сочетаются друг с другом.Я прочитал много документации по Spring, особенно о бобах и фабрике бобов, и все еще продолжаю читать дальше.Любой совет, который вы, ребята, получили бы, был бы желательным, но я дам некоторые конкретные вопросы.

Вопрос 1: Где файл web.xml вписывается в вещи (когда он используется / вызывается и откуда он вызывается)?

Пример кода 1:

    <servlet>
    <servlet-name>qrst</servlet-name>
        <display-name>qrst Servlet</display-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

Что делает приведенный выше фрагмент (или что он вызывает)?В какой-то момент в моем веб-приложении используется qrst.jsp;это DispatcherServlet, который вызывает qrst.jsp, используя имя сервлета?Иначе каково значение имени сервлета?Что такое нагрузка при запуске?

Пример кода 2:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /someLocation/some-servlet.xml
    </param-value>
</context-param>

Ссылки или объяснение того, что делает вышеперечисленное?Из файла XML видно, что он содержит определения bean-компонентов, и я понимаю, что такое bean-компоненты и как они используются, но я не знаю каких-либо других подробностей по этому поводу и хотел бы.

Кодпример 3:

<servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <display-name>DWR</display-name>
  <servlet-class>
        org.directwebremoting.servlet.DwrServlet
</servlet-class>
    <init-param>
        <param-name>classes</param-name>
        <param-value>
            somepackage.someclass
        </param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

Из того, что я читал о bean-компонентах, я считаю, что эти элементы init-param являются просто параметрами, которые задаются в java-классе сервлета.Какое значение имеет имя сервлета и какова нагрузка при запуске?Веб-приложение каким-то образом «знает», когда происходит вызов AJAX (dwr), по сравнению с первой загрузкой веб-приложения (при первой загрузке оно должно использовать qrst.jsp).Откуда он это знает?Как он решает направить запрос в DWR, а не в qrst.jsp?Где он это делает?

Спасибо.

1 Ответ

13 голосов
/ 30 апреля 2011

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

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

web.xml является частью любого приложения JavaEE, а не Spring.В вашем примере кода 1 объявляется, что ваше приложение будет использовать экземпляр класса org.springframework.web.servlet.DispatcherServlet для обработки входящих запросов.

Хотя сервлеты являются базовой основой для разработки JavaEE, не рекомендуется создавать свой собственный;вместо этого с помощью Spring вы создаете MVC контроллеры .Затем DispatcherServlet будет вызывать эти контроллеры для обработки запросов.Это просто еще одно косвенное (но очень мощное!)

- это DispatcherServlet, который вызывает qrst.jsp с использованием имени сервлета?

Не напрямую.Это просто совпадение, что ваш сервлет и файл JSP имеют одно и то же имя.

Что загружается при запуске?

Ваш пример кода 2 инструктирует DispatcherServlet для загрузкибобы из файла /someLocation/some-servlet.xml.Если в этом файле контроллеров EJB и в соответствии с тем, как вы настроили отображение URL , бины из этого файла будут отвечать на входящие запросы.См. ссылку .

Я считаю, что эти элементы init-param являются просто параметрами, которые устанавливаются в java-классе сервлета

init-paramэлементы в web.xml предназначены для класса сервлетов.

Веб-приложение каким-то образом «знает», когда происходит вызов AJAX (dwr), по сравнению с первой загрузкой веб-приложения (когдаего загрузка в первый раз должна использовать qrst.jsp).Откуда он это знает?

В вопросе отсутствуют либо элемент <servlet-mapping> (находится в web.xml), либо сопоставления URL-адресов (в файлах пружин).Они отвечают за принятие решения о том, должен ли URL обрабатываться сервлетом-диспетчером или сервлетом dwr.

Например, с отображением сервлета, как показано ниже:

<servlet-mapping>
    <servlet-name>qsrt</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>dwr</servlet-name>
    <url-pattern>*.dwr</url-pattern>
</servlet-mapping>

Тогда все URL-адреса заканчиваются на.do ответит сервлет диспетчера, а те, которые заканчиваются на .dwr, будут обработаны сервлетом dwr.Здесь важны имена сервлетов.

Файлы JSP - это отдельная история.Контейнер просто использует их для обработки URL-адреса, заканчивающегося * .jsp.Не создавайте сопоставление сервлетов onw для URL-адресов, заканчивающихся на *.jsp.Это вызовет только головные боли.Это, вероятно, неопределенное поведение.

Редактировать:

Однако URL-адрес в адресной строке браузера всегда выглядит одинаково: он всегда будет вызывать сервлет qrst

Тогда возможно, что ваше сервлет-отображение будет настолько широким (что-то вроде: <url-pattern>/*</url-pattern>), что оно будет обрабатывать все, что вы бросаете на сервер, и никогда не даст возможности другим сервлетам обрабатыватьit.

И последнее, но не менее важное: при работе с DWR или любой технологией Ajax установите расширение HttpFox для Firefox , чтобы вы могли отслеживать вызовы Ajax своего приложения.

...