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"] 未定义:不能分配给瓷砖