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>
問題は非常に単純です。 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
へのリクエストは、適切な応答を正しくレンダリングします
問題はプロジェクトの場所にあります。
その場所にスペースがある場合、桟橋、Apacheタイル、およびSpring's ViewResolverの組み合わせは機能しません。
例:プロジェクトの場所-D:\ folder whitespace\your_projectは上記のエラーをスローします-名前 'dispatcher'のサーブレットで名前 'index'のビューを解決できませんでした
解決策-プロジェクトの場所を、スペースのないパスに変更してください。
今日も同じ問題が発生しました。私も春が初めてなので、どこから始めればいいのかわかりませんでした。長い一日の後、私はなんとか答えを見つけることができました:
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へのダウングレードを発見し、より役立つエラーメッセージを提供しました。
IndexController.index()
の戻り値を"/WEB-INF/jsp/index.jsp"
から"index"
に変更してみてください。これは私のために働きます:
@RequestMapping("/index")
public String index() {
return "index";
}
私は同じ問題を抱えています。タイル構成ファイルで正しいバージョンのDTDを使用してみてください。
https://stackoverflow.com/a/28854479
また、タイル定義ファイルでgeneral.xml使用tile:addAttributeの代わりにtile:insertAttribute
<tile:insertAttribute name="body"/>
<br />
<tile:insertAttribute name="footer" />
プロジェクトのパスにはおそらく空白があります。