【问题标题】:Java, Spring, Apache Tiles error : Could not resolve view with name 'index' in servlet with name 'dispatcher'Java、Spring、Apache Tiles 错误:无法解析名称为“dispatcher”的 servlet 中名称为“index”的视图
【发布时间】: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>

【问题讨论】:

标签: java spring-mvc apache-tiles


【解决方案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://stackoverflow.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

          【讨论】:

            猜你喜欢
            • 2018-06-02
            • 2018-12-20
            • 2015-07-11
            • 1970-01-01
            • 1970-01-01
            • 2016-12-27
            • 1970-01-01
            • 1970-01-01
            • 2015-08-06
            相关资源
            最近更新 更多