当前位置: 首页 > 知识库问答 >
问题:

带有Apache瓷砖的Spring靴

邢曦
2023-03-14

我试图将我的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>

共有3个答案

柯立果
2023-03-14

你将不得不把你的应用打包成一场战争。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>
左丘善
2023-03-14

我的主要版面位于/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>
万俟修诚
2023-03-14

我也遇到了一个类似的问题,在上面各种答案的帮助下,我能够解决它。为了帮助将来可能遇到这个问题的其他人,我在https://github.com/barryku/spring-boot-tiles包括在Spring Boot中使用平铺所需的最低设置。以下是需要注意的几点,,

  1. 呈现JSP页面需要tomcat嵌入jasper
  2. 记住使用org。springframework。网状物servlet。看法瓷砖3不是瓷砖2包装
  3. Spring的tiles3集成使用jstl,因此必须包含它

我一步一步地添加了所需的文件,因此您可以查看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的瓷砖网格。每个磁贴可以是“满”(玩家不能在上面行走)或“空”(玩家可以在上面行走)。我想遍历并随机填充瓷砖(以创建更有趣的地图),但是我需要所有“空”瓷砖才能访问。下面是一个快速图形: 我们从以下方面着手: 然后仔细检查并填充一些瓷砖: 并删除所有额外的行(仅用于显示): 如您所见,我们现在剩下的地图更有趣,并且可以随机生成(基于我们