11

我正在尝试运行第一个 Spring 3 MVC 设置。

我的应用程序在 tomcat 上运行,在“grapevine”的服务器上下文中

出于测试的目的,我正在尝试从中获取请求http://localhost:8080/grapevine/test以呈现WEB-INF/jsp/noSuchInvitation.jsp

当我尝试这个时,我得到一个404,并且日志表明我的 jsp 不存在:

WARN  org.springframework.web.servlet.PageNotFound  - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine'

我一定是在某个地方错误地配置了这个,但我看不出我做错了什么。

这是所有相关的片段。

Web.xml:

<servlet>
    <servlet-name>grapevine</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>grapevine</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

从我的情况来看:

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

控制器:

@Controller
public class ParticipantInvitationController {

@RequestMapping("/test")
public ModelAndView test()
{
    return new ModelAndView("noSuchInvitation");
}

日志:

DEBUG org.springframework.web.servlet.DispatcherServlet  - Rendering view [org.springframework.web.servlet.view.JstlView: name 'noSuchInvitation'; URL [/WEB-INF/jsp/noSuchInvitation.jsp]] in DispatcherServlet with name 'grapevine'
DEBUG org.springframework.web.servlet.view.JstlView  - Forwarding to resource [/WEB-INF/jsp/noSuchInvitation.jsp] in InternalResourceView 'noSuchInvitation'
DEBUG org.springframework.web.servlet.DispatcherServlet  - DispatcherServlet with name 'grapevine' processing GET request for [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp]
WARN  org.springframework.web.servlet.PageNotFound  - No mapping found for HTTP request with URI [/grapevine/WEB-INF/jsp/noSuchInvitation.jsp] in DispatcherServlet with name 'grapevine'
DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository  - SecurityContext contents are anonymous - context will not be stored in HttpSession. 
DEBUG org.springframework.web.servlet.DispatcherServlet  - Successfully completed request
4

5 回答 5

27

这是因为<url-pattern>in yourweb.xml太“宽”了。值/*表示 servlet 被配置为接收所有请求,包括从 servlet 到 JSP 的请求。您看到的错误消息来自DispatcherServlet,它正在接收自己的转发请求。

你应该选择一个更具体的<url-pattern>,例如<url-pattern>/xyz/*</url-pattern>,这样你的 URL 就会变成http://localhost:8080/grapevine/xyz/test,然后它应该可以正常工作。

于 2010-10-07T07:30:55.157 回答
2

只需替换/*/您的url-pattern. 它会工作...

于 2013-03-19T07:57:45.380 回答
1

解决方案 1:您可以在 *.html 和 *.json(或 xml、gif、png...)中注册您的 servlet:

<servlet>
    <servlet-name>RestServlet</servlet-name>
    <servlet-class>
       org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>RestServlet</servlet-name>
  <url-pattern>/</url-pattern>
  <url-pattern>*.html</url-pattern>
  <url-pattern>*.json</url-pattern>
 </servlet-mapping>

解决方案 2:如果您想将您的 servlet 映射到/*,请将以下内容添加到您的 spring.xml 文件中:

<mvc:default-servlet-handler/> 

这对您的 web.xml 文件:

<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>/WEB-INF/jsp/*</url-pattern>
 </servlet-mapping>

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

这里解释了基本原理:springweb.xml。这将为 JSP 页面注册一个显式处理程序,其优先级高于/*.

于 2013-02-12T10:35:49.900 回答
0

注意:这可能是一个误导性的错误信息。它只是发生在我身上。

即使错误消息意外包含路径开头的 /ContextName/... ,它仍然可能是 InternalResourceViewResolver 前缀中的拼写错误:

<property name="prefix" value="/WEB-INF-typo-Here/jsp/"/>

或文件路径本身。

现在我修正了我的拼写错误,它工作正常。我不知道为什么错误消息中会显示上下文,这确实使我忽略了我愚蠢的错字并尝试尝试对这个问题做出其他精彩的贡献。不要让它发生在你身上!

顺便说一句,我使用的是 Spring 4.0.0 版本。

于 2013-12-28T04:27:14.480 回答
0

对我来说,我通过使用 .jsp 模板而不仅仅是 .html 解决了这个问题。

于 2014-07-31T14:12:05.143 回答