Java、Spring、Apache Tiles 错误:无法解析名称为“dispatcher”的 servlet 中名称为“index”的视图

Posted

技术标签:

【中文标题】Java、Spring、Apache Tiles 错误:无法解析名称为“dispatcher”的 servlet 中名称为“index”的视图【英文标题】:Java, Spring, Apache Tiles error : Could not resolve view with name 'index' in servlet with name 'dispatcher' 【发布时间】:2014-05-03 16:36:06 【问题描述】:

我是 Tiles 和 Spring MVC 的新手(我查看了几个类似的问题,但没有找到“我的问题”的解决方案)

控制器:

@Controller
public class IndexController 

    @RequestMapping("/index")
    public String index()
        return "index";
    

我的 'general.xml' 包含 Tiles 定义:

<tiles-definitions>
<definition name="common" template="/WEB-INF/layout/classic.jsp">
    <put-attribute name="footer" value="/WEB-INF/layout/footer.jsp" />
</definition>

<definition name="index" extends="common">
    <put-attribute name="title" value="My First Application" />
    <put-attribute name="body" value="/WEB-INF/jsp/index.jsp" />
</definition>

例外:

javax.servlet.ServletException: Could not resolve view with name 'index' in servlet with name 'dispatcher'
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:738)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:551)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:586)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:478)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:261)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:101)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:552)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:738)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:551)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:568)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:478)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:462)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:279)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:232)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:534)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
at java.lang.Thread.run(Thread.java:744)

调度程序-servlet.xml:

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/defs/general.xml</value>
        </list>
    </property>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>  
</bean>

web.xml

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

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.html</url-pattern>
    <url-pattern>*.htm</url-pattern>
    <url-pattern>*.json</url-pattern>
    <url-pattern>*.xml</url-pattern>
</servlet-mapping>

【问题讨论】:

你看过这个教程richardbarabe.wordpress.com/2014/02/02/…吗? 不,我已经关注了另一个教程,但不明白错误出现在哪里 你有 GitHub 上的代码或其他东西,我可以试试看吗? github.com/yuramitsyuk/my-first-app 非常感谢,这一定是一些愚蠢的错误,但我不知道它是在哪里犯的 【参考方案1】:

问题出在项目位置。

当位置中有空间时,码头、apache 瓦片和 spring 的视图解析器的组合不起作用。

例如:项目位置 - D:\folder whitespace\your_project 将抛出上述错误 - 无法解析名称为 'dispatcher' 的 servlet 中名称为 'index' 的视图

解决方案 - 请将您的项目位置更改为没有空格的路径。

【讨论】:

【参考方案2】:

问题非常简单。 将您的 web.xml 替换为

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_0.xsd" version="3.0">
  <display-name>my-first-app</display-name>


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

        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

我还在 pom 中添加了一个 jstl 依赖项

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

在这些更改之后,对localhost:8080/index 的请求会正确呈现适当的响应

【讨论】:

尝试在 Maven 中进行干净编译。它适用于 Tomcat 和嵌入式 Jetty ok with jstl 它在 VMware vFabric tc Server Developer Edition v2.9-config 服务器上工作,但仍然无法在码头上工作......而且我也没有更改我的 servlet 映射,所以问题一定是在其他地方 如果您按照我更新的答案,代码应该也适用于 Jetty。我验证了很多次 这很奇怪...你更新了你的 GitHub 存储库,让我可以再看一遍吗? GirHub 存储库已更新。正如我所说,我的(和你的)代码在 tomcat 上运行良好,但在码头上尝试时仍然出错【参考方案3】:

我今天也遇到了同样的问题。我也是Spring的新手,所以我不知道从哪里开始。经过漫长的一天,我终于找到了答案:

我的 default.xml 文件有误。我做了一些手动重构,这导致了所有的麻烦。这是一个错误的例子:

<definition name="tos.base" template="/WEB-INF/templates/default.jsp">
<put-attribute name="includes" value="" ></put-attribute>
<put-attribute name="title" value="Title" ></put-attribute>
<put-attribute name="header" value="/WEB-INF/tiles/header.jsp"></put-attribute>
<put-attribute name="content" value="/WEB-INF/tiles/content.jsp"></put-attribute>
<put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp"></put-attribute>
</definition>

<definition name="home" extends="tos.base">
<put-attribute name="title" value="Homepage" ></put-attribute>
<put-attribute name="content" value="/WEB-INF/tiles/home.jsp"></put-attribute>
</definition>

<definition name="current" extends="to.base">
<put-attribute name="title" value="Current" ></put-attribute>
<put-attribute name="content" value="/WEB-INF/tiles/current.jsp"></put-attribute>
</definition>

如您所见,我在最后一个定义“扩展”值中的值有误。 我发现从 tiles3.TilesViewResolver 降级到 tiles2.TilesViewResolver 并提供了更有用的错误消息。

【讨论】:

【参考方案4】:

尝试将IndexController.index()的返回值从"/WEB-INF/jsp/index.jsp"改为"index"。这对我有用:

@RequestMapping("/index")
public String index() 
    return "index";

【讨论】:

【参考方案5】:

我也遇到过同样的问题。 尝试在图块配置文件中使用正确版本的 DTD。

https://***.com/a/28854479

也在您的图块定义文件 general.xml 中 使用 tile:insertAttribute 而不是 tile:addAttribute

<tile:insertAttribute name="body"/>
     <br />
<tile:insertAttribute name="footer" />

【讨论】:

【参考方案6】:

您的项目路径中可能有一个空格:

https://www.youtube.com/watch?v=JAYjZnykalg

【讨论】:

以上是关于Java、Spring、Apache Tiles 错误:无法解析名称为“dispatcher”的 servlet 中名称为“index”的视图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Controller 解析 Apache Tiles 定义

带有 Spring WebFlow 的 Apache Tiles 通配符

Spring-Boot + Spring-MVC + Thymeleaf + Apache Tiles

Apache Tiles 3:org.apache.tiles.template.NoSuchAttributeException:找不到属性'title'

第6章—渲染web视图—使用Apache Tiles视图定义布局

JspTaglib ["http://tiles.apache.org/tags-tiles"] 未定义:不能分配给瓷砖