Я новичок в Spring и разработал свое первое весеннее веб-приложение mvc, используя sts / eclipse.
Мне нужна ваша помощь по этой ошибке, которая появилась после развертывания на моем веб-хосте.
Обратите внимание, что это небольшое приложение прекрасно работает на сервере tomcat в eclipse.
Путь к контексту приложения Spring (контекст приложения): 100 realtyguide ’.
Сервер Webhost является частным Tomcat 5.5. Приложение было упаковано как военный пакет maven. Я развернул файл war (разархивировал его) на своем веб-хосте в качестве виртуального хоста (с Context path = "/ realtyguide" в server.xml).
Индекс сайта доступен через http://mysite.com/realtyguide/
Страница индекса работает нормально, но при доступе к другим веб-страницам, на которые ссылается страница индекса, браузер возвращает сообщение об ошибке:
«Запрошенный URL / realtyguide / page-name не был найден на этом сервере."
Я проверил, что страница индекса обнаружила контекст моего приложения, потому что я использовал c: url и spring: url для своих ссылок, а источник страницы страницы индекса показывает путь контекста в моих ссылках, такой как href="/realtyguide/resources/styles/standard.css”
и
<a href="/realtyguide/testpage" >Test - next page</a>
Похоже, контроллер не обнаруживает сопоставленные URL-адреса. Может ли это быть причиной этой ошибки?
Вот веб.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 (servlet-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"
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);
return "index.tiledef"; // 'index' is a Tile definition in tiles.xml,
}
@RequestMapping(value = "/", method=RequestMethod.POST)
public String submitForm(@ModelAttribute("searchFormBean") SearchFormBean searchFormBean,
BindingResult result, SessionStatus status, Model model) {
searchFormValidator.validate(searchFormBean, result);
if (result.hasErrors()) {
model.addAttribute("searchFormBean", searchFormBean);
return "index.tiledef";
} else {
String searchTerm = searchFormBean.getSearchTerm();
searchTerm = searchTerm.replaceAll(" ","_");
return "redirect:/propertylistings/" + searchTerm + "/1"; // If no errors - display the listings page
}
}
@RequestMapping("/testpage")
public String gotoNextPage() {
return "nextpage.tiledef";
}
Это веб-хосты 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>
<Host name="mysite.com" appBase="/home/tsoriano/public_html">
<Alias>www.mysite.com</Alias>
<Alias>mysite.com</Alias>
<Context path="/realtyguide" reloadable="true" docBase="realtyguide" debug="0"/>
<Context path="/manager" debug="0" privileged="true"
docBase="/usr/local/jakarta/tomcat/server/webapps/manager">
</Context>
</Host>
</Engine>
</Service>
</Server>
Это небольшое приложение прекрасно работает в наборе инструментов eclipse / springsource.
Какое решение для этого URL не найдена ошибка? Пожалуйста, помогите мне.
Проблема решена
Я подозревал, что сервер моего веб-хоста может быть неправильно настроен, но я не могу проверить, потому что у меня есть план общего хостинга. Чтобы убедиться, что проблема не в моем приложении, я развернул его в локальном Tomcat за пределами затмения на своем ноутбуке. Работает отлично.
Поэтому я снова сообщил в техподдержку, что « сервлет Tomcat не загружается ». Я настоял в техподдержке, что проблема в их конце. Что может быть что-то не так с их конфигурацией apache. Apache не правильно говорит с Tomcat.
Они наконец-то все исправили, и вот подтверждение, которое я получил от них: «Мы изменили некоторые настройки в файле конфигурации сервера, чтобы все запросы к вашему домену обрабатывались tomcat вместо Apache.»
Надеюсь, это поможет кому-то, кто находится в плане общего хостинга, и сталкивается с той же ошибкой. Если вы чувствуете, что ваш сервер Tomcat настроен правильно, но по-прежнему получаете ошибки «Не найден URL», обратитесь в службу технической поддержки, чтобы узнать их конфигурацию сервера. Или получите выделенный сервер, если вы можете себе это позволить, чтобы иметь полный контроль над сервером Apache и tomcat.