Spring Web MVC 404 ошибка - развернут в качестве пользователя root на сервере Tomcat веб-хостинга - PullRequest
2 голосов
/ 09 ноября 2011

Это сводит меня с ума. Пожалуйста, помогите.

Я новичок в Spring и разработал свое первое весеннее веб-приложение mvc, используя sts / eclipse. Он отлично работает на tomcat-сервере eclipse.

Контекст приложения - /realtyguide, и я запускаю его в затмении в http://localhost:8080/realtyguide/

Вот мой web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
           http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

  <display-name>Realty Guide</display-name>

      <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
      </context-param>

      <!-- Creates the Spring Container shared by all Servlets and Filters -->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>

      <!-- Handles Spring requests -->
      <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>

</web-app>

Вот мой root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans     
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <!-- Root Context: defines shared resources visible to all other web components -->

</beans>

Вот моя конфигурация сервлета приложения Spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <context:annotation-config />

    <!-- Scans within the base package of the application for @Components to configure as beans -->
    <context:component-scan base-package="com.springproject.realtyguide" />

    <!-- Enables the Spring MVC @Controller programming model -->    
    <mvc:annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources -->
    <mvc:resources mapping="/resources/**" location="/resources/"/>   

    <!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet -->
    <mvc:default-servlet-handler/>      


    <!-- Bean to provide Internationalization  -->
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="WEB-INF/i18n/messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="classpath:META-INF/spring/database.properties" />

    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:META-INF/hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <!-- Enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven />

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- __________ BEAN ENTRIES FOR TILES 2 -->

    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/layouts/tiles.xml</value>
            </list>
        </property>
    </bean>

    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" >
        <property name="order" value="0"/> 
        <property name="viewClass"> 
            <value>org.springframework.web.servlet.view.tiles2.TilesView </value>
        </property>
        <property name="requestContextAttribute" value="requestContext"/>
        <property name="viewNames" value="*.tiledef"/>
    </bean>

    <bean id="jstlViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
        <property name="order" value="1"/> 
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.JstlView</value>
        </property>
        <property name="prefix" value="/WEB-INF/views/"/> 
        <property name="suffix" value=".jsp"/> 
    </bean> 

    <!-- __________ END OF BEAN ENTRIES FOR TILES 2 -->

    <!-- Resolves localized <theme_name>.properties files in the classpath to allow for theme support -->
    <bean id="themeSource" class="org.springframework.ui.context.support.ResourceBundleThemeSource">
        <property name="basenamePrefix" value="theme-" />
    </bean>

    <bean id="themeResolver" class="org.springframework.web.servlet.theme.CookieThemeResolver">  
        <property name="defaultThemeName" value="standard" />
    </bean>

</beans>

Вот метод обработчика моего контроллера для корня

@RequestMapping(value = "/", method=RequestMethod.GET)
public String setupForm(
        @ModelAttribute("searchFormBean") SearchFormBean searchFormBean, 
        Model model) {
    model.addAttribute("searchFormBean", searchFormBean);
    // 'index' is a Tile definition in tiles.xml
    return "index.tiledef";
}

Это мой webhosts tomcat / conf / server.xml

Я удалил большую часть «закомментированных» материалов, чтобы сделать их короче.

                <?xml version="1.0" encoding="UTF-8"?>

                <Server port="9200" shutdown="SHUTDOWN">

                  <!-- Comment these entries out to disable JMX MBeans support used for the 
                       administration web application -->
                  <Listener className="org.apache.catalina.core.AprLifecycleListener" />
                  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
                  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
                  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>

                  <!-- Global JNDI resources -->
                  <GlobalNamingResources>

                    <!-- Test entry for demonstration purposes -->
                    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

                    <!-- Editable user database that can also be used by
                         UserDatabaseRealm to authenticate users -->
                    <Resource name="UserDatabase" auth="Container"
                              type="org.apache.catalina.UserDatabase"
                       description="User database that can be updated and saved"
                           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                          pathname="conf/tomcat-users.xml" readonly="true" />

                  </GlobalNamingResources>


                  <!-- Define the Tomcat Stand-Alone Service -->
                  <Service name="Catalina">


                    <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
                    <Connector port="9201" maxHttpHeaderSize="8192"
                               maxThreads="10" minSpareThreads="5" maxSpareThreads="75"
                               enableLookups="false" redirectPort="8443" acceptCount="100"
                               connectionTimeout="20000" disableUploadTimeout="true" />

                    <!-- Define an AJP 1.3 Connector on port 8009 -->
                    <Connector port="9203" 
                               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />


                    <!-- Define the top level container in our container hierarchy -->
                    <Engine name="Catalina" defaultHost="localhost">


                      <!-- This Realm uses the UserDatabase configured in the global JNDI
                           resources under the key "UserDatabase".  Any edits
                           that are performed against this UserDatabase are immediately
                           available for use by the Realm.  -->
                      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                             resourceName="UserDatabase"/>


                      <!-- Define the default virtual host
                           Note: XML Schema validation will not work with Xerces 2.2.
                       -->
                      <Host name="localhost" appBase="webapps"
                       unpackWARs="true" autoDeploy="true"
                       xmlValidation="false" xmlNamespaceAware="false">

                       </Host>

                    </Engine>

                  </Service>

                </Server>

Моя цель

Вывести страницу индекса сайта на example.com, без лишних /.../ после имени домена.

Что я сделал

Развернуто в качестве корневого виртуального хоста на общем веб-хосте:

Я прочитал в стеке поток, который мне нужно развернуть как root, так что ...

Я упаковал его в STS / Eclipse следующим образом: щелкнув правой кнопкой мыши по проекту «realtyguide»> «Запуск от имени»> пакет Maven

Сервер Webhost является частным Tomcat 5.5. Я развернул файл war (разархивировал его) на своем веб-хосте в качестве приложения виртуального хоста по умолчанию (с Context path = "" в server.xml), чтобы я мог получить доступ к сайту как example.com, а не example.com/realtyguide.

Успех. Или я так думал. Я могу вызвать страницу индекса на http://example.com/

Задача

Доступ к другим веб-страницам, на которые ссылается страница индекса, возвращает ошибку 404:

Запрошенный URL / realtyguide / page-name не был найден на этом сервере

Несмотря на то, что в адресной строке браузера отображается контекстный путь с полным URL-адресом http://www.example.com/realtyguide/page-name

Я думаю, что приложение обходит сервлет весеннего диспетчера, следовательно, не распознает путь контекста, "realtyguide", в URL-адресе запроса, что приводит к ошибке 404.

Я так растерялся, как с этим справиться.

Вопросы:

  1. Что я могу сделать, чтобы поднять индексную страницу веб-сайта на example.com вместо example.com/realtyguide/, не ломая приложение? Я пробовал файл index.jsp (в WEB-INF) перенаправить на индекс пути контекста, но это не решает проблему. Возможно я делал это неправильно.

  2. Есть ли какой-нибудь механизм пересылки, который я могу использовать, чтобы посетитель сайта вводил example.com и немедленно переадресовывался на индексную страницу в example.com/realtyguide/, чтобы приложение обрабатывало все URL-адреса?

Правильно ли я думаю о проблеме? Какие решения вы уже использовали?

Буду очень признателен за вашу помощь. Спасибо за ваше время.

1 Ответ

2 голосов
/ 09 ноября 2011

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

http://wiki.apache.org/tomcat/HowTo#How_do_I_make_my_web_application_be_the_Tomcat_default_application.3F

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

Файл index.jsp в корне WAR, содержащий следующее, должен сделать это:

<jsp:forward page="/realtyguide/" />
...