繁体   English   中英

从控制器访问百里香叶片段

[英]Accessing thymeleaf fragments from controller

嗨,我是百里香的新手。 当我尝试从控制器访问百里香片段时,它说该片段或模板不存在。以下是用于访问片段的控制器代码。

控制者

@RequestMapping(value="/firstpage")
public String firstPage(){
  return "mainpage::firstpage";
}

我的百里香叶拦截器文件是

public class ThymeleafLayoutInterceptor extends HandlerInterceptorAdapter {
private static final String LayoutFile = "mainHTML/layoutFile";
private static final String ReturnedHtmlFile = "returnedHTML";

@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 (originalViewName.startsWith("redirect:") || originalViewName.startsWith("forward:")) {
        return;
    }
    modelAndView.setViewName(LayoutFile);
    modelAndView.addObject(ReturnedHtmlFile,originalViewName);
}
}

我的春季配置文件是

@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class BeanConfig {
@Bean 
public ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix("/");
    resolver.setSuffix(".html");
    resolver.setTemplateMode("HTML5");
    resolver.setOrder(1);
    return resolver;
}
@Bean 
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver());
    return engine;
}
@Bean 
public ThymeleafViewResolver thymeleafViewResolver() {
    ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    resolver.setTemplateEngine(templateEngine());
    return resolver;
}
}

我的布局文件是

<!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:th="http://www.thymeleaf.org">
 <body>
<div th:include="${returnedHTML}" class="contents"></div>
 </body>
</html>

最后是我的mainpage.html文件

<html>
<body>
  <div th:fragment="firstpage">
   Hi...This is my first page 
 </div>
 </body>
</html>

当我在控制器中以“ mainpage”的形式返回字符串时,将显示主页的所有内容。但是,如果我们尝试以片段形式访问,则会返回上述错误消息。有人可以在这里解决我的问题吗?

我相信你做对了所有事情。

我认为问题是org.thymeleaf.standard.processor.attr.StandardIncludeFragmentAttrProcessor(实际上是org.thymeleaf.standard.processor.attr.AbstractStandardFragmentHandlingAttrProcessor)试图在评估表达式$ {returnedHTML}之前解析该片段的方式。 并且由于字符串“ $ {returnedHTML}”尚不包含该片段,因此该模板将无法正确处理。

参见org.thymeleaf.standard.processor.attr.AbstractStandardFragmentHandlingAttrProcessor.computeFragment(Arguments,Element,String,String):列表

当您不在交换器中交换变量并从控制器返回一个片段时,它将像超级按钮一样工作。 我假设您实现了一种自定义布局技术,类似于此处所述: http : //blog.codeleak.pl/2013/11/thymeleaf-template-layouts-in-spring.html 我对么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM