2014-09-01 6 views
-3

Я попробовал приложение Spring MVC, как описано в книге «Весна в действии третьего издания». К сожалению, до сих пор я не могу запустить простейшее приложение после траты 6 часов. Я всегда получаю ошибку «HTTP Status 404».Приложение Spring MVC не работает

Я нашел много тем на этом форуме, так как «@RequestMapping не работает весной», и теперь я задаюсь вопросом, следую ли я правильной книге или есть что-то очень основное, что вызвало беспокойство у многих других учеников Spring.

Я попытался запустить приложение MVC в самой книге (Ch-7, spitter-web), но опять же это приложение также не сработало. Похоже, автор не уделял большого внимания при попытке использовать свои собственные приложения.

Для полноты картины, мой 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"> 

<context-param> 
    <description>locations of the Spring configuration files</description> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
    </param-value> 
</context-param> 

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

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

<servlet-mapping> 
    <servlet-name>application</servlet-name> 
    <url-pattern>*.jsp</url-pattern> 
</servlet-mapping> 

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


</web-app> 

Мое приложение-servlet.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:context="http://www.springframework.org/schema/context" 
xmlns:util="http://www.springframework.org/schema/util" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:p="http://www.springframework.org/schema/p" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!--<start id="spring_component_scan" />--> 
    <context:component-scan base-package="com.truality.demo.web.controller" /> 
    <!--<end id="spring_component_scan" />--> 

    <!--<start id="mvc_annotatedcontrollers" />--> 
    <mvc:annotation-driven/> 
    <!--<end id="mvc_annotatedcontrollers" />--> 

    <context:annotation-config /> 

    <!--<start id="mvc_resources"/>--> 
    <mvc:resources mapping="/resources/**" location="/resources/" /> 
    <!--<end id="mvc_resources"/>--> 

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


</beans> 

И мой класс Контроллер: пакет com.truality. demo.web.controller;

import java.util.Map; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
public class HomeController { 

    @RequestMapping(value={"/home.htm"}, method=RequestMethod.GET) 
     public String showHomePage(Map<String, String> model) { 
     model.put("name","Google"); 
     return "home"; 
    } 

Я получаю ошибку 404 всегда, когда я пытаюсь доступа

- http://localhost:8080/demo-prop-1-1/home.htm OR 
- http://localhost:8080/demo-prop-1-1/home.jsp 
- http://localhost:8080/demo-prop-1-1/home 
- http://localhost:8080/demo-prop-1-1 

Я до того момента, когда я начну оценивать некоторые другие технологии, такие как PHP или ... если бы я не мог решить этот тривиальный вопрос.

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

Большое спасибо.

+1

Это не проблема с весной. Вы не используете веб-приложение должным образом. Похоже, вам нужно веб-приложение Java 101. Не ошибка Спрингса. И идите и исследуйте PHP или другие технологии. Никакой весенний разработчик не заботится о том, что вы выбираете. Взгляните на это: http://www.srccodes.com/p/article/24/spring-3-mvc-framework-based-hello-world-web-application-example-using-maven-eclipse-ide- and-tomcat-server – duffymo

+0

https://spring.io/guides/gs/spring-boot/ https://www.youtube.com/watch?v=p8AdyMlpmPk – Vaelyr

+0

Задаёт вопрос здесь плохо? Как вы думаете, я недостаточно пробовал? Вещи не прямолинейны и легки, поэтому новые люди, подобные мне, сталкиваются с проблемами. И когда авторы предоставляют непроверенный код, что вы можете сделать? Я ожидаю больше помощи от этого форума, а не отрицательных голосов по моим вопросам. Вы можете видеть, что некоторые другие сталкиваются с проблемами здесь, и это не так прямо. – AAgg

ответ

1

У вас есть эта

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

<servlet-mapping> 
    <servlet-name>application</servlet-name> 
    <url-pattern>*.jsp</url-pattern> 
</servlet-mapping> 

Это не имеет никакого смысла для вашего DispatcherServlet, названный application, обрабатывать *.jsp запросы. Весна, по умолчанию, и вы, через конфигурацию, не предоставили обработчик ресурсов JSP. Избавьтесь от этого servlet-mapping.

Вы затем налево с

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

где /* является отображение пути, который соответствует всем. Это означает, что, хотя вы удалили другой <servlet-mapping>, это сопоставление будет по-прежнему использоваться для обработки запросов на любые пути, заканчивающиеся на .jsp (среди прочих). Это означает, что ресурс, разрешенный вашим зарегистрированным InternalResourceViewResolver, то есть /WEB-INF/views/home.jsp, также будет обрабатываться весной DispatcherServlet. Но снова, у него нет обработчика для такого пути.

Вместо этого вам необходимо передать JSP Servlet контейнера сервлета. Вы можете сделать это путем отображения вашего DispatcherServlet в /

<servlet-mapping> 
    <servlet-name>application</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

, который помечает его как сервлет по умолчанию. Сервлет по умолчанию будет обрабатывать любые запросы, которые не были сопоставлены никаким другим <servlet-mapping>.Большинство контейнеров Servlet имеют JSP Servlet, сопоставленный с *.jsp, поэтому любые запросы на ресурс с расширением *.jsp будут обработаны тем, что до того, как ваша весна DispatcherServlet получит даже выстрел.

Подробнее здесь: Spring: servlet-mapping -> url-pattern : /* working but can't display

0

@Sotirios Delimanolis Спасибо за разъяснение.

Если я сервлет как

<servlet-mapping> 
    <servlet-name>application</servlet-name> 
    <url-pattern>*.jsp</url-pattern> 
</servlet-mapping> 

и сделать RequestMapping в

@RequestMapping(value={"/home.jsp"}, method=RequestMethod.GET) 

тогда было бы быть обработано яровой DispatcherServlet и призыв к HTTP: /// демо-проп/дома. jsp преуспеет

1

Наконец, я обнаружил, что мой файл войны не содержит класс моего контроллера, из-за которого запрос не был правильно отображен. Причина этого заключалась в том, что я не следовал структуре каталогов в соответствии с ожиданиями плагина Gradle.

Я исправил файлы XML в соответствии с предложениями; все изменения, которые я им сделал, не дали никаких результатов, поскольку проблема лежала где-то в другом месте.

Несмотря на то, что это была проблема с моей стороны, было бы неплохо поразвлечься на Gradle, чтобы дать хотя бы предупреждение или замечание о том, что мои java-файлы не собираются. Есть ли способ включить это в Gradle?

Благодарим за помощь.

Смежные вопросы