2

これは、恥知らずにインターネットから例をコピーするときに出くわす一種の奇妙な質問です。Spring MVC 4、Apache Tiles 3、Java 8、および Tomcat 8 を使用しています。

私は絶対に views.properties ファイルを持っている必要があります。 しかし、実際のマッピングが含まれている必要はありません。ですから問題は、なぜそれが必要なのかではなく、なぜ必要でないのかということです。

views.properties ファイルからわかるように、userList とはまったく関係のないエントリが 1 つあります。ファイルが完全に欠落している場合、DispatcherServlet は例外をスローします。しかし、この哀れなエントリでは、すべてがうまく機能します。確かに、TilesView クラスがリストされており、JSP を探す場所の一般的なアイデアを提供しています。しかし、私が読んだすべてのことによると、各 JSP は、views.properties ファイルに細心の注意を払ってリストする必要があります。それは単に真実ではありません。

一方では、維持する必要がはるかに少ないため、これは良いことです。しかし、その一方で、私は何か重要なものを本当に失っているように感じます. 免責事項: 私はまだ静的リソース リゾルバーをクラックしていません。これは、Spring がリソースを見つける際の一般的な問題であることを除けば、これとはまったく関係がないようです。

悪名高い views.properties (ファイル全体)

messages.(class)=org.springframework.web.servlet.view.tiles3.TilesView
messages.url=/WEB-INF/xxxx/messages.jsp (for example)

必須のコード例:

@構成クラス

...
@Bean
TilesConfigurer tilesConfigurer() {
    TilesConfigurer tilesConfigurer = new TilesConfigurer();
    tilesConfigurer.setDefinitions("WEB-INF/tiles/tiles.xml"); 
    return tilesConfigurer;
}

@Bean
ResourceBundleViewResolver viewResolver() {
    ResourceBundleViewResolver resourceBundleViewResolver = new ResourceBundleViewResolver();
    resourceBundleViewResolver.setBasename("views");
    return resourceBundleViewResolver;
}

@Bean
TilesViewResolver tilesVewResolver() {
    return new TilesViewResolver();
}
...

tiles.xml

<tiles-definitions>
<definition name="baseLayout" template="/WEB-INF/tiles/maintemplate.jspx">
    <put-attribute name="header" value="/WEB-INF/tiles/header.jspx" />
    <put-attribute name="menu" value="/WEB-INF/tiles/menu.jspx" />
    <put-attribute name="body" value="" />
    <put-attribute name="footer" value="/WEB-INF/tiles/footer.jspx" />
</definition>

<!-- USERS -->
<definition name="userEdit" extends="baseLayout">
    <put-attribute name="title" value="Edit User" />
    <put-attribute name="body" value="/WEB-INF/views/users/edit.jspx" />
</definition>
<definition name="userList" extends="baseLayout">
    <put-attribute name="title" value="List Users" />
    <put-attribute name="body" value="/WEB-INF/views/users/list.jspx" />
</definition>
...

ユーザーコントローラー.java

...
@PreAuthorize("isAuthenticated()")
@RequestMapping(method = RequestMethod.GET)
public String list(Locale locale, HttpServletRequest request, HttpServletResponse response, Model uiModel) {

    themeResolver.setThemeName(request, response, "defaultTheme");

    List<User> users = userRepository.findAll();
    uiModel.addAttribute("users", users);
    return "userList";
}
...
4

1 に答える 1

1

ResourceBundleViewResolverには、処理できるすべてのビューの構成を含む追加の構成ファイルが必要です。デフォルトでは、のベース名viewsが使用されます。このファイルが存在しない場合、ResourceBundleViewResolverロード/起動に失敗します。

あなたが説明した動作とタイルを使用しているという事実から判断すると、TilesViewResolver. タイルの場合、返されるビューの名前 (ここuserListでは ) は、タイル ビューの定義に対応している必要があります。

Spring MVC を使用する場合、構成されたすべてViewResolverの s が参照され、ビューの名前が実際のView実装に解決されます。あなたの場合、はという名前のビューしか処理できないため、ビューの解像度ResourceBundleViewResolverが返されます。次に、のタイル ビュー定義があるため、ビューを返す が参照されます。nullmessagesTilesViewResolveruserList

于 2015-05-02T16:57:46.813 に答える