Spring MVC с Jetty - что должно быть в файле app-servlet.xml? - PullRequest
2 голосов
/ 19 ноября 2010

Я работаю над веб-приложением Spring MVC, использующим HTTP-сервер Jetty, который содержит WebAppContext

<bean id="Server" class="org.mortbay.jetty.Server" init-method="start"
    destroy-method="stop">
    <property name="connectors">
        <list>
            <bean id="Connector" class="org.mortbay.jetty.nio.SelectChannelConnector">
                <property name="port" value="9531" />
            </bean>
        </list>
    </property>

    <property name="handler">
        <bean id="handlers" class="org.mortbay.jetty.handler.HandlerCollection">
            <property name="handlers">
                <list>
                    <bean id="contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection">
                        <property name="handlers">
                            <list>
                                <bean class="org.mortbay.jetty.webapp.WebAppContext">
                                    <property name="contextPath" value="/" />
                                    <property name="war" value="/etc/WebContent" />
                                    <!-- <property name="copyWebDir" value="true" />  -->
                                </bean>
                            </list>
                        </property>
                    </bean>
                </list>
            </property>
        </bean>
    </property>
</bean>

Я пытаюсь выяснить, где бобы должны быть определены. В основном есть два варианта: мой конфигурационный файл Spring для моего приложения (назовите его «myApp-context.xml») или конфигурационный файл Spring сервлета (назовите его «myApp-servlet.xml»). Соответствующий раздел из файла web.xml:

<servlet-mapping>
    <servlet-name>myApp</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:jeff/myApp-context.xml</param-value>
</context-param>

Пока все хорошо. Основываясь на других связанных вопросах / ответах, я помещаю в myApp-servlet.xml такие вещи, как средства разрешения моего представления Spring MVC (которые непосредственно связаны с веб-приложением), а другие компоненты, специфичные для приложений, такие как DAO, утилиты предоставления прав и т. Д., В myApp-. context.xml (который задан как «contextConfigLocation» в web.xml). Это работает нормально, приложение запускается, и все вводится правильно, контроллеры Spring MVC работают нормально и т. Д.

Однако я заметил, что любые bean-компоненты, определенные в myApp-servlet.xml (которые, согласно соглашению, должны существовать в корневом каталоге Интернета, учитывая, что мое имя сервлета "myApp") загружаются Spring дважды. В частности, есть сообщение журнала, подобное «Инициализация Spring FrameworkServlet« myApp »», после чего все компоненты bean, которые были в myApp-servlet.xml, загружаются снова.

Если я переместлю все эти bean-компоненты из myApp-servlet.xml в myApp-context.xml, оставив myApp-servlet.xml пустым (просто открывая и закрывая теги), приложение запускается успешно (на этот раз быстрее) и не создайте каждый боб дважды.

Тем не менее, похоже, что WebAppContext в Jetty настаивает на наличии файла myApp-servlet.xml (если он не существует, приложение не запускается). Это также требует, чтобы contextConfigLocation был определен и указывал на действительный конфигурационный файл Spring.

Может кто-нибудь помочь мне разобраться в моей конфигурации? Оставлять myApp-servlet.xml без какого-либо определения bean-компонента кажется правильным, потому что приложение запускается быстрее и без избыточной инициализации bean-компонента, но неправильно, потому что контекст веб-приложения требует его существования. Помещение некоторых bean-компонентов в myApp-servlet.xml кажется правильным, потому что в противном случае оно было бы пустым, но неправильным, потому что теперь эти bean-компоненты инициализируются дважды, запуск занимает больше времени, и выбор того, какие bean-компоненты поместить туда, кажется произвольным. Спасибо за любую помощь, и дополнительные детали / фрагменты могут быть предоставлены по мере необходимости.

Редактировать : теперь мне ясно, почему эти двое различны. myApp-servlet.xml - это конфигурационный файл Spring для конкретного сервлета. Поэтому, если этот сервлет является сервлетом Spring MVC, в этот файл следует поместить контроллеры и т. Д. Можно также иметь myApp2-servlet.xml и myApp3-servlet.xml, определяя два других сервлета в одном контейнере. Все они, естественно, будут иметь компоненты, независимые друг от друга (поскольку они являются полностью отдельными веб-приложениями).

С другой стороны, файл myApp-context.xml содержит определения bean-компонентов, которые будут предоставляться каждому сервлету. Вот почему утилиты БД, права и т. Д., Как указала Неэме Пракс, должны быть в этом файле. Вполне вероятно, что каждое веб-приложение, будучи совершенно отдельным по своей презентации и функциям, должно будет использовать некоторые общие утилиты. Это место для определения тех «обычных» бобов.

1 Ответ

1 голос
/ 20 ноября 2010

В целом, у вас есть правильная настройка:

  • myApp-servlet.xml должен содержать непосредственно связанные с веб-приложением компоненты
  • myApp-context.xml должен содержать компоненты бизнес-логики (например, DAOs,соответствующие утилиты)

Что касается причины, почему ваши bean-компоненты, связанные с веб-приложением, загружаются дважды - не знаю. Они не должны загружаться дважды .Может быть, вы неправильно читаете журнал ?Может быть, есть какая-то ошибка конфигурации , которая не очевидна из предоставленных вами фрагментов конфигурации (полные web.xml, myApp-servlet.xml и myApp-context.xml были бы полезны)?

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...