2016-07-07 14 views
1

私はフレームワークを構築するためにthymeleafとspringbootを使用します。そして、thymeleafのレイアウトテンプレートを使用しようとします。問題は、ThymeleafLayoutInterceptorを使用してレイアウトテンプレートを使用する場合です。 cssとjsのURLをもう見つけられませんでした。Springブートthymeleafのレイアウト[URI * .css/*。jsのHTTP要求でマッピングが見つかりません]

コードと構成は以下の通りである:

あなたはproject view

public class ThymeleafLayoutInterceptor extends HandlerInterceptorAdapter { 

private static final String DEFAULT_LAYOUT = "layouts/default"; 

private static final String DEFAULT_VIEW_ATTRIBUTE_NAME = "view"; 

@Override 
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
    if (modelAndView == null || !modelAndView.hasView()) { 
     return; 
    } 
    String originalViewName = modelAndView.getViewName(); 
    if (isRedirectOrForward(originalViewName)) { 
     return; 
    } 
    modelAndView.setViewName(DEFAULT_LAYOUT); 
    modelAndView.addObject(DEFAULT_VIEW_ATTRIBUTE_NAME,originalViewName); 
} 

private boolean isRedirectOrForward(String viewName) { 
    return viewName.startsWith("redirect:") || viewName.startsWith("forward:"); 
} 

}

@Configuration

パブリッククラスWebMvcConfigはWebMvcConfigurationSupportを{延びリンクを介してプロジェクトのレイアウトを見ることができます

@Override 
protected void addInterceptors(InterceptorRegistry registry) { 
    super.addInterceptors(registry); 
    registry.addInterceptor(new ThymeleafLayoutInterceptor()); 
} 

@Bean 
public ServletContextTemplateResolver templateResolver(){ 
    ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(); 
    resolver.setPrefix("/templates/views/"); 
    resolver.setSuffix(".html"); 
    resolver.setTemplateMode("HTML5"); 
    resolver.setOrder(1); 
    return resolver; 
} 

@Bean 
public SpringTemplateEngine templateEngine(){ 
    Set<IDialect> dialects = new HashSet<>(); 
    dialects.add(new LayoutDialect()); 
    SpringTemplateEngine engine = new SpringTemplateEngine(); 
    engine.setTemplateResolver(templateResolver()); 
    engine.setAdditionalDialects(dialects); 
    return engine; 
} 

@Bean 
public ThymeleafViewResolver thymeleafViewResolver(){ 
    ThymeleafViewResolver resolver = new ThymeleafViewResolver(); 
    resolver.setTemplateEngine(templateEngine()); 
    resolver.setViewNames(new String[]{"*","springBootMvc/js/*","springBootMvc/css/*"}); 
    return resolver; 
} 

}

にdefault.html

<!DOCTYPE html> 
 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> 
 

 
<head> 
 
    <link th:href="@{/dataTable/media/css/jquery.dataTables.css}" rel="stylesheet" type="text/css"/> 
 
    <link href="css/boot.css" rel="stylesheet" type="text/css"/> 
 
    <link th:href="@{/bootstrap/css/bootstrap.min.css}" rel="stylesheet" type="text/css"/> 
 

 
    <script th:src="@{/dataTable/media/js/jquery.js}" type="text/javascript" charset="utf8"/> 
 
    <script th:src="@{/dataTable/media/js/jquery.dataTables.js}" type="text/javascript" charset="utf8"></script> 
 
    <script th:src="@{/bootstrap/js/bootstrap.min.js}" type="text/javascript" charset="utf8"/> 
 
    <script th:src="@{/js/boot.js}" type="text/javascript" charset="utf8"/> 
 
</head> 
 
<body> 
 
<div th:raplace="fragments/header :: header"> 
 
    Header1 
 
</div> 
 
<div th:replace="${view} :: content"> 
 
    Content 
 
</div> 
 
<div th:replace="fragments/footer :: footer"> 
 
    Footer 
 
</div> 
 
</body> 
 
</html>

.htmlのapplication.yaml

server: 
 
    context-path: /springBootMvc 
 
    port: 8082 
 

 
spring: 
 
    profiles: 
 
    active: test 
 
    messages: 
 
    basename: i18n 
 
    devtools: 
 
    restart: 
 
     exclude: static/** 
 
     additional-paths: src/main/ 
 
    thymeleaf: 
 
    prefix: /templates/views/ 
 
    suffix: .html

はその後、問題が起こった、私は* .jsファイルおよび*の.cssのURLを取得できませんでした。 エラー・スタックは以下の通りです:

2016-07-07 09:22:08.427 WARN 9572 --- [nio-8082-exec-2] o.s.web.servlet.PageNotFound    : No mapping found for HTTP request with URI [/springBootMvc/css/boot.css] in DispatcherServlet with name 'dispatcherServlet' 
 
2016-07-07 09:22:08.452 WARN 9572 --- [nio-8082-exec-4] o.s.web.servlet.PageNotFound    : No mapping found for HTTP request with URI [/springBootMvc/dataTable/media/js/jquery.js] in DispatcherServlet with name 'dispatcherServlet' 
 
2016-07-07 09:22:08.454 WARN 9572 --- [nio-8082-exec-5] o.s.web.servlet.PageNotFound    : No mapping found for HTTP request with URI [/springBootMvc/dataTable/media/css/jquery.dataTables.css] in DispatcherServlet with name 'dispatcherServlet' 
 
2016-07-07 09:22:08.457 WARN 9572 --- [nio-8082-exec-6] o.s.web.servlet.PageNotFound    : No mapping found for HTTP request with URI [/springBootMvc/bootstrap/css/bootstrap.min.css] in DispatcherServlet with name 'dispatcherServlet' 
 
2016-07-07 09:22:08.461 WARN 9572 --- [nio-8082-exec-7] o.s.web.servlet.PageNotFound    : No mapping found for HTTP request with URI [/springBootMvc/dataTable/media/js/jquery.dataTables.js] in DispatcherServlet with name 'dispatcherServlet' 
 
2016-07-07 09:22:08.475 WARN 9572 --- [nio-8082-exec-3] o.s.web.servlet.PageNotFound    : No mapping found for HTTP request with URI [/springBootMvc/bootstrap/js/bootstrap.min.js] in DispatcherServlet with name 'dispatcherServlet' 
 
2016-07-07 09:22:08.740 WARN 9572 --- [nio-8082-exec-8] o.s.web.servlet.PageNotFound    : No mapping found for HTTP request with URI [/springBootMvc/js/boot.js] in DispatcherServlet with name 'dispatcherServlet' 
 
2016-07-07 09:22:08.745 ERROR 9572 --- [nio-8082-exec-2] o.a.c.c.C.[Tomcat].[localhost]   : Exception Processing ErrorPage[errorCode=0, location=/error]

私はクラスWebMvcConfigを削除する場合は、それらの*の.cssと* .jsファイルが見つかりませんでした。しかし、レイアウトテンプレートはもう機能しません。 screen with js, css but no header and footer

答えて

0

最後に、私は多くのソースコードを読んで解決しました。私の設定でSimpleUrlHandlerMappingが見つからないことがわかりました。そして私はコードでそれを設定します。それは少し複雑かもしれません。誰かがもっと簡単な方法を持っているなら、私と連絡することを歓迎します!

デフォルトスプリングのブートリソースによって

@Bean 
 
    public SimpleUrlHandlerMapping simpleUrlHandlerMapping() { 
 
     SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping(); 
 
     Map<String, Object> map = new LinkedHashMap<>(); 
 
     ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler(); 
 
     List<Resource> locations = new ArrayList<>(); 
 
     locations.add(new ServletContextResource(getServletContext(), "/")); 
 
     locations.add(new ClassPathResource("META-INF/resources")); 
 
     locations.add(new ClassPathResource("resources/")); 
 
     locations.add(new ClassPathResource("static/")); 
 
     locations.add(new ClassPathResource("public/")); 
 
     resourceHttpRequestHandler.setLocations(locations); 
 
     resourceHttpRequestHandler.setApplicationContext(getApplicationContext()); 
 

 
     List<ResourceResolver> resourceResolvers = new ArrayList<>(); 
 
     PathResourceResolver resourceResolver = new PathResourceResolver(); 
 
     resourceResolver.setAllowedLocations(new ServletContextResource(getServletContext(), "/"), new ClassPathResource("META-INF/resources"), new ClassPathResource("resources/"), new ClassPathResource("static/"), new ClassPathResource("public/")); 
 
     resourceResolvers.add(resourceResolver); 
 

 
     resourceHttpRequestHandler.setResourceResolvers(resourceResolvers); 
 
     map.put("/**", resourceHttpRequestHandler); 
 
     simpleUrlHandlerMapping.setUrlMap(map); 
 
     ResourceUrlProvider resourceUrlProvider = new ResourceUrlProvider(); 
 
     Map<String, ResourceHttpRequestHandler> handlerMap = new LinkedHashMap<>(); 
 
     handlerMap.put("/**", resourceHttpRequestHandler); 
 
     resourceUrlProvider.setHandlerMap(handlerMap); 
 
     ResourceUrlProviderExposingInterceptor interceptor = new ResourceUrlProviderExposingInterceptor(resourceUrlProvider); 
 
     simpleUrlHandlerMapping.setInterceptors(new Object[]{interceptor}); 
 
     return simpleUrlHandlerMapping; 
 
    }

0

"のsrc /メイン/リソース" に配置する必要があり、例えば、JSとCSSファイルは/静的フォルダ内 「のsrc /メイン/リソースを配置する必要があります/ static/css "テンプレートフォルダにも同じことが適用されますが、何か特別なことを必要としない場合はほとんど設定が必要ありません。 アプリケーションを実行してログを確認しようとすると、springはそこにすべてのマッピングを記録し、デフォルトのマッピングを確認できます。

私は家に帰るとき、プロジェクトの階層を付けます。

5

WebMvcConfigurerAdapterを継承するクラスでは、同じレイアウトの例に関して、@EnableWebMvcアノテーションを使用していました。

この注釈を削除しても、レイアウトは同じになり、CSSがロードされます。

こちらがお役に立てば幸いです。

関連する問題