web-dev-qa-db-ja.com

Java、Spring、Apache Tilesエラー:「dispatcher」という名前のサーブレットで「index」という名前のビューを解決できませんでした

TilesとSpringMVCは初めてです(いくつかの同様の問題を調べましたが、「私の問題」の解決策は見つかりませんでした)

コントローラ:

@Controller
public class IndexController {

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

タイル定義を含む私の「general.xml」:

<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>
5
flopec

問題は非常に単純です。 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へのリクエストは、適切な応答を正しくレンダリングします

4
geoand

問題はプロジェクトの場所にあります。

その場所にスペースがある場合、桟橋、Apacheタイル、およびSpring's ViewResolverの組み合わせは機能しません。

例:プロジェクトの場所-D:\ folder whitespace\your_projectは上記のエラーをスローします-名前 'dispatcher'のサーブレットで名前 'index'のビューを解決できませんでした

解決策-プロジェクトの場所を、スペースのないパスに変更してください。

6
abagri

今日も同じ問題が発生しました。私も春が初めてなので、どこから始めればいいのかわかりませんでした。長い一日の後、私はなんとか答えを見つけることができました:

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>

ご覧のとおり、最後の定義の「extends」値に間違った値がありました。このtiles3.TilesViewResolverからtiles2.TilesViewResolverへのダウングレードを発見し、より役立つエラーメッセージを提供しました。

3
Alex San

IndexController.index()の戻り値を"/WEB-INF/jsp/index.jsp"から"index"に変更してみてください。これは私のために働きます:

@RequestMapping("/index")
public String index() {
    return "index";
}
2
speksy

私は同じ問題を抱えています。タイル構成ファイルで正しいバージョンのDTDを使用してみてください。

https://stackoverflow.com/a/28854479

また、タイル定義ファイルでgeneral.xml使用tile:addAttributeの代わりにtile:insertAttribute

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

プロジェクトのパスにはおそらく空白があります。

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

0
Gene