【问题标题】:Implementing Spring MVC 3.0 controller实现 Spring MVC 3.0 控制器
【发布时间】:2010-12-15 15:49:06
【问题描述】:

尝试使用 Spring MVC 3.0 实现干净的 URL(没有 .form、.do 等)(实际上它是 Spring 参考中的一个基本示例)。 它只是不起作用的问题:http://localhost:8080/ct/helloWorld 给出了 404 页面。

以下是我的来源,请帮助查找错误。

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;
    }
}

ct-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.springframework.beans.factory.support.DefaultListableBeanFactory@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 [controllers.HelloWorldController@1c2fff0]
12.11.2009 0:49:27 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/helloWorld.*] onto handler [controllers.HelloWorldController@1c2fff0]
12.11.2009 0:49:27 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/helloWorld/] onto handler [controllers.HelloWorldController@1c2fff0]
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

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    您的 web.xml 正在将 Spring DispatcherServlet 映射到您的 Web 应用程序部署到的位置之上的 url 模式 /ct/*。

    因此,如果您的 Web 应用程序正在部署到 /ct,请尝试转到 http://localhost:8080/ct/ct/helloWorld

    您可能希望 Spring DispatcherServlet 映射到您的 Web 应用程序的所有 url。将 servlet-mapping 更改为:

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

    您的原始网址应该可以按预期工作。

    【讨论】:

    • 好的,现在请求到达控制器,谢谢。但是当控制器想要渲染视图时,DispathcerServlet 正在为 JSP-view 的请求提供服务,我在控制台中收到以下消息:警告:没有找到带有 URI [/ct/WebContent/WEB-INF/helloWorld 的 HTTP 请求的映射.jsp] 在 DispatcherServlet 中,名称为“ct”,结果再次为 404 页面。有什么方法可以绕过 DispatcherServlet 来处理 jsp 请求?
    • 好的,尝试将视图解析器的类更改为 org.springframework.web.servlet.view.InternalResourceViewResolver。 UrlBasedViewResolver 希望能够将您的符号视图名称转换为可用于呈现视图的 URI。这可能不是你想要做的。通常,您不希望您的 JSP 视图可以直接访问,并且通过将它们放在 WEB-INF 下它们不是。不过,InternalResourceViewResolver 将能够访问它们。
    • 将视图解析器更改为 InternalResourceViewResolver 没有帮助。在stackoverflow.com/questions/1234298/… 中,建议使用 SimpleUrlHandlerMapping 从 Spring DispatcherServlet 服务中排除包含“.jsp”的地址。我想知道,我该怎么做?
    【解决方案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";
        } 
      }
    

    ct-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】:

      RequestMapping 中的路径应该是完整路径,而不仅仅是 pathInfo(web.xml 中匹配字符串之后的内容)。所以你的 RequestMapping 应该指定 @RequestMapping("/ct/HelloWorld")

      或者,您的问题可能是您没有将应用程序作为根应用程序运行,而是实际上在路径 /ct 处运行。在这种情况下,您的 web.xml 不匹配任何内容,因为在比较 url 模式以确定 servlet 上下文时未使用指定应用程序上下文的 /ct。在这种情况下,您需要访问 url /ct/ct/HelloWorld 以便将请求发送到您的 servlet。但是您仍然需要 @RequestMapping("/ct/HelloWorld") 才能将控制器映射到该请求(但它不关心指定应用程序的初始 /ct )。

      我个人其实认为基于后缀映射是明确的,但是使用通用后缀。我将 *.html 映射到我的 servlet 和响应这些请求的控制器发回 html。同样,我将 *.json 和 *.xml 用于 json 和 xml 请求。我在负载均衡器上处理静态 html 和其他静态内容,所以 tomcat 永远不会看到它们。

      【讨论】:

        【解决方案4】:

        您是否创建了 helloWorld.jsp 页面?

        我试用了您的代码(注意:使用 2.5.6),在浏览器上看到 404,并且在服务器日志中看到以下错误消息:

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

        /path/to/my 的位置会因您的环境而异。

        没有 helloWorld.jsp,视图解析器将失败。添加这个jsp,一切都好。

        【讨论】:

          猜你喜欢
          • 2014-02-28
          • 2012-05-30
          • 2011-05-03
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 2012-06-05
          • 1970-01-01
          • 2017-09-21
          相关资源
          最近更新 更多