我试图将我的java应用程序迁移到Spring Boot。目前,我正在运行带有Apache Tiles的Spring MVC 3.2。当我迁移到Spring Boot时,我的控制器仍然被称为好的,它们将视图传递给视图解析程序,但是当Tiles去拉JSP文件时,事情就分崩离析了。我得到的错误消息是:
13:48:46,387 TRACE org.springframework.web.servlet.handler.SimpleUrlHandlerMapping:127 - No handler mapping found for [/jsp/layout/layout.jsp]
有没有人成功地使用了带有Spring Boot的Apache Tiles?知道怎么做吗?
提前感谢您的任何想法!
更多详情:
@Bean
public UrlBasedViewResolver viewResolver(){
LOGGER.trace("Entering tiles configurer");
UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
viewResolver.setViewClass(TilesView.class);
return viewResolver;
}
@Bean
public TilesConfigurer tilesConfigurer(){
LOGGER.trace("Entering tiles configurer");
System.out.println("Entering tiles configurer");
TilesConfigurer tilesConfigurer = new TilesConfigurer();
String[] defs = {"/WEB-INF/tiles-defs.xml"};
tilesConfigurer.setDefinitions(defs);
return tilesConfigurer;
}
控制器:
@RequestMapping(value="/")
public ModelAndView index(ModelAndView mav, HttpServletRequest request, HttpServletResponse resp,RedirectAttributes ra){
LOGGER.trace("Arrived in Home Controller");
mav.addObject("profile",appContext.getEnvironment().getActiveProfiles()[0]);
mav.setViewName("home");
return mav;
}
瓷砖定义:
<definition name="layout" template = "/jsp/layout/layout.jsp">
</definition>
<definition name="home" extends="layout">
<put-attribute name="body" value = "/jsp/home.jsp" />
</definition>
你将不得不把你的应用打包成一场战争。Spring Boot,jsp和jar包装相处得不太好。还要确保你的pom.xml有以下内容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
我的主要版面位于/src/main/webapp/WEB-INF/layouts/layouts中。xml
,其中包含以下示例条目:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
"http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<definition name="default" template="/WEB-INF/layouts/default.jspx">
<put-attribute name="menu" value="/WEB-INF/views/menu.jspx"/>
<put-attribute name="sidebar" value="/WEB-INF/views/sidebar.jspx"/>
<put-attribute name="header" value="/WEB-INF/views/header.jspx" />
<put-attribute name="footer" value="/WEB-INF/views/footer.jspx" />
</definition>
<definition name="public" template="/WEB-INF/layouts/default.jspx">
<put-attribute name="menu" value="/WEB-INF/views/menu.jspx"/>
<put-attribute name="sidebar" value="/WEB-INF/views/sidebar.jspx"/>
<put-attribute name="header" value="/WEB-INF/views/header.jspx" />
<put-attribute name="footer" value="/WEB-INF/views/footer.jspx" />
</definition>
</tiles-definitions>
然后是/src/main/webapp/WEB-INF/views/views中更具体的tile定义。xml
,其中包含以下示例条目:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<definition extends="default" name="index">
<put-attribute name="body" value="/WEB-INF/views/index.jspx"/>
</definition>
<definition extends="public" name="login">
<put-attribute name="sidebar" value=""></put-attribute>
<put-attribute name="body" value="/WEB-INF/views/login.jspx"/>
</definition>
</tiles-definitions>
然后你需要你的配置类:
@EnableWebMvc
@Configuration
public class RootMvcConfiguration extends WebMvcConfigurerAdapter {
...
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/login").setViewName("login");
}
...
}
如果您想使用JSP或Thymeleaf,则该类中与tile相关的bean将依赖于。
对于JSP,您应该有:
@Bean
public UrlBasedViewResolver tilesViewResolver(){
UrlBasedViewResolver tilesViewResolver = new UrlBasedViewResolver();
tilesViewResolver.setViewClass(TilesView.class);
return tilesViewResolver;
}
@Bean
public TilesConfigurer tilesConfigurer(){
String[] definitions = new String[] {
"/WEB-INF/layouts/layouts.xml",
"/WEB-INF/views/**/views.xml" /*Scans directories for Tiles configurations */
};
TilesConfigurer tilesConfigurer = new TilesConfigurer();
tilesConfigurer.setDefinitions(definitions);
return tilesConfigurer;
}
如果您使用Thymeleaf,您应该有如下内容:
@Bean
public MessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath:META-INF/i18n/messages");
messageSource.setFallbackToSystemLocale(false);
return messageSource;
}
@Bean
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
resolver.setOrder(2);
resolver.setCacheable(false);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine() throws Exception {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver());
engine.setTemplateEngineMessageSource(messageSource());
engine.addDialect(new TilesDialect());
engine.addDialect(new SpringSecurityDialect());
engine.afterPropertiesSet();
return engine;
}
@Bean
public TilesConfigurer tilesConfigurer(){
String[] definitions = new String[] {
"/WEB-INF/layouts/layouts.xml",
"/WEB-INF/views/**/views.xml" /*Scans directories for Tiles configurations */
};
ThymeleafTilesConfigurer tilesConfigurer = new ThymeleafTilesConfigurer();
tilesConfigurer.setDefinitions(definitions);
return tilesConfigurer;
}
然后可以扩展视图。jsp或html文件和示例控制器的xml和点视图名称可以如下所示:
@RequestMapping("/roles")
@Controller
public class RoleController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String show(@PathVariable("id") Integer id, Model uiModel) {
uiModel.addAttribute("role", Role.findRole(id));
uiModel.addAttribute("itemId", id);
return "roles/show";
}
}
如果您使用Maven,这里有一些示例库版本:
<properties>
<thymeleaf.version>2.0.19</thymeleaf.version>
<thymeleaf.extras.version>2.0.0</thymeleaf.extras.version>
<thymeleaf.extras.security.version>2.0.0</thymeleaf.extras.security.version>
<tiles.version>2.2.2</tiles.version>
</properties>
...
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>${tiles.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>${tiles.version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>${thymeleaf.version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring3</artifactId>
<version>${thymeleaf.version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity3</artifactId>
<version>${thymeleaf.extras.security.version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-tiles2</artifactId>
<version>${thymeleaf.extras.version}</version>
</dependency>
我也遇到了一个类似的问题,在上面各种答案的帮助下,我能够解决它。为了帮助将来可能遇到这个问题的其他人,我在https://github.com/barryku/spring-boot-tiles包括在Spring Boot中使用平铺所需的最低设置。以下是需要注意的几点,,
我一步一步地添加了所需的文件,因此您可以查看https://github.com/barryku/spring-boot-tiles/commits/master的提交历史记录,以便更好地理解在每个步骤中添加了什么。
我试图使用Struts 2 我在 glassfish 服务器上上传时遇到以下错误: 部署过程中发生错误:加载应用程序时出现异常:java.lang.IllegalState异常:ContainerBase.add子级:开始:org.apache.catalina.生命周期异常:java.lang.NoClassDefFoundError: org/spingframewor /core/io/su
我正在尝试使用Thymeleaf与Apache Tiles 2. x的集成。他们有一个如何使其工作的指南,所以我遵循了它,但现在我被卡住了。 基本上,这种集成允许使用JSP和Thymeleaf模板,根据指南,您应该能够通过在标题定义文件中设置属性来判断使用哪个。默认选项是Thymeleaf。 因为我正在慢慢从JSP迁移,绝大多数模板都是JSP,所以我需要使用这个属性,但是我得到一个错误,我的标题定
我找不到struts-tiles2-1.4.0-SNAPSHOT的源代码。jar版本的平铺。jar文件位于http://people.apache.org/~pbenedict/struts-osgi/org/apache/struts/struts-tiles2/1.4.0-SNAPSHOT/location。
在 Stuts2 中,我正在使用 Tiles 插件为网站(菜单、页脚、页眉等)创建在每个页面上一致的布局。 现在每个磁贴只是一个静态的超文本标记语言内容。 是否可以通过每次呈现页脚时调用<code>Footer</code>动作类来使平铺更动态?例如:从数据库获取页脚内容。 如果我在应用程序中的每个页面的action类中都这样做,这将导致非常不可用的代码... 所以也许从瓷砖的角度来看是可能的?
我计划使用Spring Boot将MVC应用程序从Spring 3移植到Spring 4。 这个web应用程序使用Apache Tiles。 考虑到百里香叶似乎是Spring的新标准,我有点困惑,并且集成得很好。 在这个应用程序中配置Tiles是一件痛苦的事情。 我们在这个应用程序中有大约20个JSP页面。 问题: 胸腔和瓷砖是相似的概念吗?(模板引擎?) 我已经看到胸腔叶可以和瓷砖一起使用…我不
有人能告诉我一种解决以下问题的算法吗: 假设我有一个10*10的瓷砖网格。每个磁贴可以是“满”(玩家不能在上面行走)或“空”(玩家可以在上面行走)。我想遍历并随机填充瓷砖(以创建更有趣的地图),但是我需要所有“空”瓷砖才能访问。下面是一个快速图形: 我们从以下方面着手: 然后仔细检查并填充一些瓷砖: 并删除所有额外的行(仅用于显示): 如您所见,我们现在剩下的地图更有趣,并且可以随机生成(基于我们