2015-04-26 19 views
8

Używam aplikacji Tomcat7 przy użyciu Spring MVC na OpenShift w domenie: financial-datasite.rhcloud.com. Uruchamiam i testuję aplikację lokalnie przy użyciu serwera Tomcat, a następnie przesyłaję go do zdalnego repozytorium. Obecnie jest tylko strona główna i przycisk pod przekierowaniem na inną stronę. Podczas testowania lokalnie obie strony wyświetlają zawartość zgodnie z oczekiwaniami. Jednak po wdrożeniu na serwerze zdalnym wyświetlana jest tylko strona główna, a po kliknięciu przycisku pojawia się błąd HTTP 404. Napotkałem tutaj różne podobne pytania, ale żadna z nich nie pomogła do tej pory. Grałem przy konfigurowaniu plików web.xml, pom.xml, servlet-context.xml i kontrolera. Jednak żadna z nich nie pomogła. Mam również sprawdzenie tail files and logs monitorować co się dzieje, co sugeruje, że serwer zdalnego dostępu jakiś „printWelcome” metody (które nawet nie istnieje w moim projekcie) w klasie kontrolera dla drugiej strony:Openshift Spring Wdrożona ścieżka MVC Tomcat zwraca 404

INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/Sectors],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.spring.mvc.SectorController.printWelcome(org.springframework.ui.ModelMap) 

Oto moja project structure. W moim localhost, domyślna strona jest uruchamiana jako localhost:8181/mvc/, a druga strona jest uruchamiana jako http://localhost:8181/mvc/Sectors. Podobnie, po wdrożeniu, strona główna jest uruchamiana jako http://financial-datasite.rhcloud.com, a druga strona wykonana jako http://financial-datasite.rhcloud.com/Sectors, która zgłasza błąd 404 dla /WEB-INF/views/hello.jsp, który znowu nie istnieje nawet w moim katalogu projektu . Inną rzeczą, którą zaobserwowałem w plikach dziennika, jest to, że kod prawdopodobnie nie trafia w klasę SectorController, ponieważ mam kodowane polecenia drukowania, które nie są logowane do konsoli, gdy strona jest żądana z wdrożonej witryny. Nie jestem pewien, które pliki są uruchamiane na serwerze zdalnym i czy są jakieś problemy z konfiguracją, których nie jestem świadomy. Oto mój plik web.xml, pom.xml, servlet-context.xml, Sectors.jsp, Google-Maps.js, z którego nazwałem nową stronę do załadowania) i SectorController.java (który jest plikiem kontrolnym dla druga strona). Przepraszamy za długotrwałe pytanie, proszę dać mi znać, jeśli potrzebujesz więcej informacji. Każda pomoc będzie doceniona, dzięki.

web.xml

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

    <display-name>Financial Data Site</display-name> 

    <servlet> 
    <servlet-name>financial</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>financial</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/root-context.xml</param-value> 
    </context-param> 

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <welcome-file-list> 
    <welcome-file>index</welcome-file> 
    </welcome-file-list> 

</web-app> 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.spring</groupId> 
    <artifactId>mvc</artifactId> 
    <name>SpringMVC</name> 
    <packaging>war</packaging> 
    <version>1.0.0-BUILD-SNAPSHOT</version> 

    <properties> 
     <java-version>1.6</java-version> 
     <org.springframework-version>3.1.1.RELEASE</org.springframework-version> 
     <org.aspectj-version>1.6.10</org.aspectj-version> 
     <org.slf4j-version>1.6.6</org.slf4j-version> 

     <!-- Newly Added from here --> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.6</maven.compiler.source> 
     <maven.compiler.target>1.6</maven.compiler.target> 
    </properties> 

    <repositories> 
     <repository> 
      <id>eap</id> 
      <url>http://maven.repository.redhat.com/techpreview/all</url> 
      <releases> 
       <enabled>true</enabled> 
      </releases> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </repository> 
    </repositories> 

    <pluginRepositories> 
     <pluginRepository> 
      <id>eap</id> 
      <url>http://maven.repository.redhat.com/techpreview/all</url> 
      <releases> 
       <enabled>true</enabled> 
      </releases> 
      <snapshots> 
       <enabled>true</enabled> 
      </snapshots> 
     </pluginRepository> 
    </pluginRepositories> 
    <!-- Till here --> 

    <dependencies> 

     <!-- Spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${org.springframework-version}</version> 
      <exclusions> 
       <!-- Exclude Commons Logging in favor of SLF4j --> 
       <exclusion> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <!-- MySQL database driver --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.34</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <!-- Hibernate --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>3.6.10.Final</version> 
     </dependency> 

     <!-- AspectJ --> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>${org.aspectj-version}</version> 
     </dependency> 

     <!-- Logging --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>${org.slf4j-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>jcl-over-slf4j</artifactId> 
      <version>${org.slf4j-version}</version> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>${org.slf4j-version}</version> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.15</version> 
      <exclusions> 
       <exclusion> 
        <groupId>javax.mail</groupId> 
        <artifactId>mail</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>javax.jms</groupId> 
        <artifactId>jms</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>com.sun.jdmk</groupId> 
        <artifactId>jmxtools</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>com.sun.jmx</groupId> 
        <artifactId>jmxri</artifactId> 
       </exclusion> 
      </exclusions> 
      <scope>runtime</scope> 
     </dependency> 

     <!-- @Inject --> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 

     <!-- JSTL --> 
     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
      <scope>compile</scope> 
     </dependency> 

     <!-- Tag Library --> 
     <dependency> 
      <groupId>taglibs</groupId> 
      <artifactId>standard</artifactId> 
      <version>1.1.2</version> 
      <scope>compile</scope> 
     </dependency> 

     <!-- Servlet --> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.1</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 

     <!-- Test --> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.7</version> 
      <scope>test</scope> 
     </dependency>   
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <artifactId>maven-eclipse-plugin</artifactId> 
       <version>2.9</version> 
       <configuration> 
        <additionalProjectnatures> 
         <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> 
        </additionalProjectnatures> 
        <additionalBuildcommands> 
         <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> 
        </additionalBuildcommands> 
        <downloadSources>true</downloadSources> 
        <downloadJavadocs>true</downloadJavadocs> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.5.1</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
        <compilerArgument>-Xlint:all</compilerArgument> 
        <showWarnings>true</showWarnings> 
        <showDeprecation>true</showDeprecation> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <version>1.2.1</version> 
       <configuration> 
        <mainClass>org.test.int1.Main</mainClass> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <!-- When built in OpenShift the 'openshift' profile will be 
       used when invoking mvn. --> 
      <!-- Use this profile for any OpenShift specific customization 
       your app will need. --> 
      <!-- By default that is to put the resulting archive into the 
       'deployments' folder. --> 
      <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html --> 
      <id>openshift</id> 
      <build> 
      <finalName>financial</finalName> 
       <plugins> 
        <plugin> 
         <artifactId>maven-war-plugin</artifactId> 
         <version>2.4</version> 
         <configuration> 
          <outputDirectory>webapp</outputDirectory> 
          <warName>ROOT</warName> 
         </configuration> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 

</project> 

serwlet-context.xml

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

    <annotation-driven /> 

    <context:component-scan base-package="com.spring.mvc" /> 

    <resources mapping="/resources/**" location="/resources/" /> 

    <beans:bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

</beans:beans> 

Sectors.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> 
<%@ page session="false"%> 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Sectors</title> 
</head> 

<body> 
    <h1>Message</h1> 
    <c:if test="${not empty Sectors}"> 

     <ul> 
      <c:forEach var="_SectorNames" items="${Sectors}"> 
       <li>${_SectorNames}</li> 
      </c:forEach> 
     </ul> 

    </c:if> 
</body> 

</html> 

Google Maps.js: Poniższy urywek zawiera tylko funkcję użyty do utworzenia sekcji div na mapie i nazwać nową stronę w nowym oknie

function HomeControl(controlDiv, map) 
{ 
     // Set CSS for the control border. 
     var _ControlUI = document.createElement('div'); 
     _ControlUI.style.backgroundColor = '#fff'; 
     _ControlUI.style.border = '2px solid #fff'; 
     _ControlUI.style.borderRadius = '3px'; 
     _ControlUI.style.boxShadow = '0 2px 6px rgba(0,0,0,.3)'; 
     _ControlUI.style.cursor = 'pointer'; 
     _ControlUI.style.marginBottom = '22px'; 
     _ControlUI.style.textAlign = 'center'; 
     _ControlUI.title = 'Click to filter by Sectors'; 
     controlDiv.appendChild(_ControlUI); 

     // Set CSS for the control interior. 
     var _ControlText = document.createElement('div'); 
     _ControlText.style.color = 'rgb(25,25,25)'; 
     _ControlText.style.fontFamily = 'Roboto,Arial,sans-serif'; 
     _ControlText.style.fontSize = '12px'; 
     _ControlText.style.lineHeight = '38px'; 
     _ControlText.style.paddingLeft = '5px'; 
     _ControlText.style.paddingRight = '5px'; 
     _ControlText.innerHTML = '<strong>View by Sectors</strong>'; 
     _ControlUI.appendChild(_ControlText); 

     // Setup the click event listeners, also calls Sectors page on a new window 
     google.maps.event.addDomListener(_ControlUI, 'click', function() { 
      //add code here to redirect to Sectors page 
      var _Window = window.open('/mvc/Sectors', '__blank'); 
      _Window.focus(); 
     }); 
} 

SectorController.java

package com.spring.mvc; 

    import java.text.DateFormat; 
    import java.util.ArrayList; 
    import java.util.Date; 
    import java.util.List; 
    import java.util.Locale; 

    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory; 
    import org.springframework.stereotype.Controller; 
    import org.springframework.ui.Model; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    import org.springframework.web.bind.annotation.RequestMethod; 
    import org.springframework.web.servlet.ModelAndView; 

    import com.spring.dao.impl.SectorDAOImpl; 
    import com.spring.model.Sector; 

    @Controller 
    public class SectorController { 

     private static final Logger logger = LoggerFactory.getLogger(SectorController.class); 

     @RequestMapping(value = "/Sectors", method = {RequestMethod.HEAD, RequestMethod.GET}) 
     public ModelAndView DisplaySectors(Locale locale, Model model) { 

      logger.info("Welcome home! You are in: {}.", locale); 

      Date date = new Date(); 
      DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

      String formattedDate = dateFormat.format(date); 

      model.addAttribute("serverTime", formattedDate); 

      SectorDAOImpl _SectorDAOImpl = new SectorDAOImpl(); 
      List<Sector> _Sectors = _SectorDAOImpl.GetByID();  
      List<String> _SectorNames = new ArrayList<String>(); 

      for(Sector sector : _Sectors) { 
       _SectorNames.add(sector.getSectorName()); 
      } 

      ModelAndView _ModelAndView = new ModelAndView("Sectors"); 
      _ModelAndView.addObject("Sectors", _SectorNames); 

      return _ModelAndView; 
     } 
} 
+0

Czy możesz umieścić kod, w którym przycisk uruchamia żądanie strony? Możesz również opublikować zdjęcie ze strukturą projektu, proszę – Jessai

+0

Wysłano kod JavaScript żądający nowej strony. Zamieszczam również link do obrazu struktury projektu na powyższym pytaniu, tutaj znajduje się link do odsyłacza: http://imgur.com/WhOuzJB. Dzięki. –

+0

W tym wierszu: var _Window = window.open ('/ mvc/Sectors', '__blank'); Dlaczego używasz prefiksu "/ mvc /"? Czy to jest twoja nazwa projektu? – Jessai

Odpowiedz

4
  1. Jak zauważył Jessai w komentarzu,

    var _Window = window.open('/mvc/Sectors', '__blank'); 
    

    Nie używaj nazwy projektu wyraźnie! Istnieją sposoby na uzyskanie nazwy kontekstu, na przykład request.getContextPath() metody HttpServletRequest.

    W tym przypadku z zakodowanym na sztywno ciągiem URL myślę, że możesz użyć względnego adresu URL, po prostu "Sektory" lub "./Sektory".

    Referencje:

  2. '__blank': masz na myśli '_blank'?

  3. Przy okazji:

    są wdrażane na Tomcat 7, więc można zadeklarować przestrzegania specyfikacji Servlet 3.0 zamiast 2.5 w pliku web.xml.

    Zobacz następujące czynności, aby wyłączyć komponenty skanowanie przy starcie:
    https://wiki.apache.org/tomcat/HowTo/FasterStartUp#Configure_your_web_application

  4. Na

    INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/Sectors],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.spring.mvc.SectorController.printWelcome(org.springframework.ui.ModelMap) 
    

    Jeśli plik klasy nie pasuje do kodu źródłowego, oznacza to, że kod nie został skompilowany . Usuń skompilowane klasy (np. Użyj mvn clean) i spróbuj ponownie.

    Jeśli jesteś ciekawy, możesz rozpakować plik wojenny za pomocą dowolnej aplikacji archiwizującej ZIP i sprawdzić, co naprawdę tam jest.

  5. Czy Ty lub nasza firma posiadasz domenę o nazwie internetowej http://spring.com? Jeśli nie, NIE używaj nazwy pakietu com.spring i nie używaj <groupId>com.spring</groupId>. Te imiona nie należą do ciebie. Są własnością kogoś innego.

  6. Na

    <org.springframework-version>3.1.1.RELEASE</org.springframework-version> 
    

    Jeśli używasz 3.x, dlaczego nie obecny 3.2.12.RELEASE w serii 3.x, albo lepiej ostatni 4.1.6.RELEASE? Spring Framework 3.1.x osiągnął koniec życia i nie jest już obsługiwany.

+0

Dziękuję za odpowiedź! Wypróbowałem wszystkie powyższe kroki, które zaleciłeś, z wyjątkiem ostatniego z czwartego punktu (rozpakuj WAR i sprawdź, co naprawdę tam jest). Jeśli mówisz o rozpakowywaniu pliku WAR, który sam przesłałem, ma on cały oczekiwany kod, który mam na moim komputerze klienta. Jednak po wdrożeniu ścieżka zwraca błąd 404. –

+0

Włącz AccessLogValve w konfiguracji serwera, aby utworzyć plik dziennika dostępu dla żądań, aby zobaczyć, jakie adresy URL faktycznie żąda klient (przeglądarka). W Tomcat można włączyć globalny rejestr dostępu dla hosta w pliku conf/server.xml. (Nie wiem, czy to prawda w przypadku "jbossews", z którego korzystasz, to inne oprogramowanie). –