2009-11-11 3 views
0

Попытка реализовать чистые URL-адреса (без .form, .do и т. Д.) С помощью Spring MVC 3.0 (на самом деле это базовый пример из справки Spring). Проблема в том, что он просто не работает: http://localhost:8080/ct/helloWorld дает страницу 404.Реализация контроллера Spring MVC 3.0

Ниже приведены источники, помогите найти ошибку.

HelloWorldController.java

package controllers; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 

@Controller() 
public class HelloWorldController { 
    @RequestMapping("/helloWorld") 
    public ModelAndView helloWorld() { 
     ModelAndView mav = new ModelAndView(); 
     mav.setViewName("helloWorld"); 
     mav.addObject("message", "Hello World!"); 
     return mav; 
    } 
} 

кар-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:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="controllers" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 
</beans> 

web.xml

<web-app id="WebApp_ID" version="2.4" 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"> 
    <display-name> 
    ct</display-name> 


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


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


</web-app> 

консоль вывода

12.11.2009 0:49:25 org.apache.tomcat.util.digester.SetPropertiesRule begin 
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:ct' did not find a matching property. 
12.11.2009 0:49:25 org.apache.catalina.core.AprLifecycleListener init 
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:\Program Files\PC Connectivity Solution\;C:\PROGRA~1\RATIONAL\RATION~1\NUTCROOT\bin;C:\PROGRA~1\RATIONAL\RATION~1\NUTCROOT\bin\x11;C:\PROGRA~1\RATIONAL\RATION~1\NUTCROOT\mksnt;C:\Program Files\Borland\Delphi7\Bin;C:\Program Files\Borland\Delphi7\Projects\Bpl\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Microsoft SQL Server\80\Tools\Binn\;C:\Program Files\Microsoft SQL Server\90\DTS\Binn\;C:\Program Files\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies\;C:\Program Files\TortoiseSVN\bin;C:\Program Files\QuickTime\QTSystem\;e:\my downloads\develop tools\nant-0.86-beta1\bin\;C:\Program Files\Rational\common;C:\Program Files\Rational\ClearQuest;C:\Program Files\Rational\Rose\TopLink\;C:\Program Files\Rational\Rational Test;C:\Program Files\CodeGear\Delphi Prism\bin 
12.11.2009 0:49:25 org.apache.coyote.http11.Http11Protocol init 
INFO: Initializing Coyote HTTP/1.1 on http-8080 
12.11.2009 0:49:25 org.apache.catalina.startup.Catalina load 
INFO: Initialization processed in 769 ms 
12.11.2009 0:49:25 org.apache.catalina.core.StandardService start 
INFO: Starting service Catalina 
12.11.2009 0:49:25 org.apache.catalina.core.StandardEngine start 
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20 
12.11.2009 0:49:26 org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring FrameworkServlet 'ct' 
12.11.2009 0:49:26 org.springframework.web.servlet.FrameworkServlet initServletBean 
INFO: FrameworkServlet 'ct': initialization started 
12.11.2009 0:49:26 org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing WebApplicationContext for namespace 'ct-servlet': startup date [Thu Nov 12 00:49:26 MSK 2009]; root of context hierarchy 
12.11.2009 0:49:26 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/ct-servlet.xml] 
12.11.2009 0:49:27 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]197507c: defining beans [helloWorldController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,viewResolver,org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#0]; root of factory hierarchy 
12.11.2009 0:49:27 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 
INFO: Mapped URL path [/helloWorld] onto handler [[email protected]] 
12.11.2009 0:49:27 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 
INFO: Mapped URL path [/helloWorld.*] onto handler [[email protected]] 
12.11.2009 0:49:27 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 
INFO: Mapped URL path [/helloWorld/] onto handler [[email protected]] 
12.11.2009 0:49:28 org.springframework.web.servlet.FrameworkServlet initServletBean 
INFO: FrameworkServlet 'ct': initialization completed in 2641 ms 
12.11.2009 0:49:28 org.apache.coyote.http11.Http11Protocol start 
INFO: Starting Coyote HTTP/1.1 on http-8080 
12.11.2009 0:49:28 org.apache.jk.common.ChannelSocket init 
INFO: JK: ajp13 listening on /0.0.0.0:8009 
12.11.2009 0:49:28 org.apache.jk.server.JkMain start 
INFO: Jk running ID=0 time=0/79 config=null 
12.11.2009 0:49:28 org.apache.catalina.startup.Catalina start 
INFO: Server startup in 3451 ms 

java project structure http://www.freeimagehosting.net/uploads/566ee12a13.png

ответ

2

ОК, сейчас решение:

web.xml

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

HelloWorldController.java

@Controller 
public class HelloWorldController { 

    @RequestMapping("/helloWorld") 
    public String list() { 
     return "helloWorld"; 
    } 
    } 

кар-servlet.xml

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

    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 
3

Ваш web.xml является отображение Spring DispatcherServlet шаблону URL/кт/* в верхней части расположения вашего веб-приложение развертывается в.

Так что, если ваш веб-приложение развертывается в/кт попробовать собирается http://localhost:8080/ct/ct/helloWorld

Скорее всего, что вы хотите Spring DispatcherServlet для отображения на всех URL-адресов для вашего веб-приложения. Измените отображение сервлетов на:

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

и ваш оригинальный URL должен работать должным образом.

+0

ОК, теперь запросы доходят до контроллера, спасибо. Но когда диспетчер хочет визуализировать представление, запрос JSP-представления обслуживается DispathcerServlet, у меня есть следующее сообщение в консоли: ВНИМАНИЕ: сопоставления не найдено для HTTP-запроса с URI [/ ct/WebContent/WEB-INF /helloWorld.jsp] в DispatcherServlet с именем 'ct' , и результат снова 404 страницы. Есть ли способ подавать запрос jsp в обход DispatcherServlet? – kilonet

+0

ОК, попробуйте изменить класс вашего вида resolver на org.springframework.web.servlet.view.InternalResourceViewResolver. UrlBasedViewResolver ожидает, что сможет преобразовать ваше символическое представление в URI, который он может использовать для визуализации представления. Это, вероятно, не то, что вы хотите сделать. Как правило, вы не хотите, чтобы ваши JSP-представления были доступны напрямую, и, помещая их под WEB-INF, это не так. InternalResourceViewResolver сможет получить к ним доступ. – gavinjames

+0

Изменение разрешения распознавателя на InternalResourceViewResolver не помогло. В http://stackoverflow.com/questions/1234298/can-springmvc-be-configured-to-process-all-requests-but-exclude-static-content-d/1235311#1235311 рекомендуется использовать SimpleUrlHandlerMapping для исключения адреса, содержащие «.jsp» из службы Spring DispatcherServlet. Интересно, как я могу это сделать? – kilonet

0

Вы создали страницу helloWorld.jsp?

Я попробовал ваш код (NB: с помощью 2.5.6), и увидел 404 в браузере, и следующее сообщение об ошибке в журнале сервера:

File "/path/to/my/WEB-INF/helloWorld.jsp" not found 

Где /path/to/my будет отличаться для вашего окр.

Без helloWorld.jsp разрешение распознавателя не будет выполнено. Добавление этого jsp, и все хорошо.

0

Путь в вашем RequestMapping должен быть полным путем, а не только pathInfo (материал после согласованной строки в web.xml). Таким образом, ваша RequestMapping должна указывать @RequestMapping ("/ ct/HelloWorld")

В качестве альтернативы может возникнуть проблема, заключающаяся в том, что вы не запускаете приложение в качестве корневого приложения и на самом деле работаете на пути/ct. В этом случае ваш web.xml не соответствует чему-либо, потому что/ct, который обозначает контекст приложения, не используется при сравнении url-шаблонов, чтобы определить контекст сервлета. В этом случае вам нужно получить доступ к url ​​/ ct/ct/HelloWorld, чтобы отправить запрос на ваш сервлет. Но вам все равно нужно @RequestMapping ("/ ct/HelloWorld"), чтобы контроллер был сопоставлен с этим запросом (но он не заботится о начальном/ct, который обозначает приложение).

Лично я на самом деле думаю, что ясно, что карта основана на суффиксе, но для использования общего суффикса. Я сопоставляю * .html с моим сервлетом и контроллерами, которые отвечают на эти запросы, отправляют обратно html. Аналогично, я использую * .json и * .xml для запросов json и xml. Я обрабатываю статический html и другой статический контент на балансировщике нагрузки, поэтому tomcat никогда их не видит.

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