L'intégration de Spring mvc avec Apache Tiles 3 à l'aide de la configuration Java présente des problèmes


Le problème est que la configuration des tuiles n'est pas appliquée à chaque fois. J'ai intégré Apache tiles 3 avec spring MVC. J'ai utilisé la configuration basée sur les annotations de spring. Le problème dans l'application est que les définitions de tuiles sont appliquées sur une base aléatoire. Lorsque j'essaie d'exécuter l'application, la configuration des tuiles que nous avons configurée peut ou non être appliquée.

J'utilise Apache tomcat 7. Ce problème est-il lié au serveur? Est-ce problème lié à la configuration? Ou Si Tout.

Voici mon code

Configuration MVC

        Annotation base Java Configuration using Spring
        @EnableWebMvc

        @Configuration

        @ComponentScan(basePackages = { "com.om.*" })

        public class MVCConfig extends WebMvcConfigurerAdapter {


            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
            }


            @Override
            public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
                configurer.enable();
            }
            @Bean
            public InternalResourceViewResolver viewResolver() {
                InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
                viewResolver.setViewClass(JstlView.class);
                viewResolver.setPrefix("/WEB-INF/views/layout/");
                viewResolver.setSuffix(".jsp");
                return viewResolver;
            }


            @Bean
            public TilesViewResolver getTilesViewResolver() {
                TilesViewResolver tilesViewResolver = new TilesViewResolver();
                tilesViewResolver.setViewClass(TilesView.class);
                return tilesViewResolver;
            }
            @Bean
            public TilesConfigurer getTilesConfigurer() {
                TilesConfigurer tilesConfigurer = new TilesConfigurer();
                tilesConfigurer.setCheckRefresh(true);
                tilesConfigurer.setDefinitionsFactoryClass(TilesDefinitionsConfig.class);

                // Add apache tiles definitions
                TilesDefinitionsConfig.addDefinitions();

                return tilesConfigurer;
            }
        }

MVCInitializer

        public class MVCInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

            @Override
            protected Class<?>[] getRootConfigClasses() {
                return new Class[] { MVCConfig.class };
            }

            @Override
            protected Class<?>[] getServletConfigClasses() {
                return null;
            }

            @Override
            protected String[] getServletMappings() {
                return new String[] { "/" };
            }


        }

TilesDefinitionsConfig

        public final class TilesDefinitionsConfig implements DefinitionsFactory {

            private static final Map<String, Definition> tilesDefinitions = new HashMap<String,Definition>();
            private static final Attribute BASE_TEMPLATE = new Attribute("/WEB-INF/views/layout/defaultLayout.jsp");

            public Definition getDefinition(String name, Request tilesContext) {
                System.out.println("3");
                return tilesDefinitions.get(name);
            }

            /**
             * @param name <code>Name of the view</code>
             * @param title <code>Page title</code>
             * @param body <code>Body JSP file path</code>
             *
             * <code>Adds default layout definitions</code>
             */
            private static void addDefaultLayoutDef(String name, String title, String body) {
                Map<String, Attribute> attributes = new HashMap<String,Attribute>();

                attributes.put("title", new Attribute(title));
                attributes.put("header", new Attribute("/WEB-INF/views/layout/header.jsp"));
                attributes.put("menu", new Attribute("/WEB-INF/views/layout/menu.jsp"));
                attributes.put("body", new Attribute(body));
                attributes.put("footer", new Attribute("/WEB-INF/views/layout/footer.jsp"));

                tilesDefinitions.put(name, new Definition(name, BASE_TEMPLATE, attributes));
            }

            /**
             * <code>Add Apache tiles definitions</code>
             */
            public static void addDefinitions(){

                addDefaultLayoutDef("welcome", "welcome", "/WEB-INF/views/layout/welcome.jsp");
                addDefaultLayoutDef("personList", "viewPerson", "/WEB-INF/views/layout/personList.jsp");

            }
        }

Contrôleur de

        @Controller

        public class SpringTilesController {


            @RequestMapping(value="welcome")
            public ModelAndView index() {

                ModelAndView model=new ModelAndView();
                System.out.println("In Controller");
                model.setViewName("welcome");       
                return model;
            }

            @RequestMapping(value="viewPerson")
            public ModelAndView viewPersons(Model model) {
                Map<String, List<Person>> persons = 
                        new HashMap<String, List<Person>>();
                persons.put("persons", Person.createPersons());
                return new ModelAndView("personList", persons);
            }
        }

Entité

        public class Person {

            private String name, email;
            private int age;

            public Person(String name, String email, int age) {
                this.name = name;
                this.email = email;
                this.age = age;
            }

            public String getName() {return name;}
            public void setName(String name) {this.name = name;}

            public String getEmail() {return email;}
            public void setEmail(String email) {this.email = email;}

            public int getAge() {return age;}
            public void setAge(int age) {this.age = age;}

            @Override
            public String toString()
            { 
                return String.format(
                    "Person [name = %s, email = %s, age = %d]", 
                        name, email, age);
            }

            public static List<Person> createPersons() {
                List<Person> persons = new ArrayList<Person>();
                persons.add(new Person("Tousif", "[email protected]", 32));
                persons.add(new Person("Asif", "[email protected]", 28));
                persons.add(new Person("Ramiz", "[email protected]", 26));
                persons.add(new Person("Rizwan", "[email protected]", 32));
                persons.add(new Person("Amol", "[email protected]", 33));
                persons.add(new Person("Ramdas", "[email protected]", 31));
                return persons;
            }
        }

Pom.xml

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>com.om</groupId>
            <artifactId>TilesDemo</artifactId>
            <packaging>war</packaging>
            <version>0.0.1-SNAPSHOT</version>
            <name>TilesDemo Maven Webapp</name>
            <url>http://maven.apache.org</url>

            <properties>
                <jdk.version>1.7</jdk.version>
                <spring.version>4.1.6.RELEASE</spring.version>
                <spring.security.version>4.0.1.RELEASE</spring.security.version>
                <jstl.version>1.2</jstl.version>
                <javax.servlet.version>3.1.0</javax.servlet.version>
                <mysql.connector.version>5.1.31</mysql.connector.version>
            </properties>


            <dependencies>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>3.8.1</version>
                    <scope>test</scope>
                </dependency>
                <!-- jstl for jsp page -->


                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>3.1.0</version>
                </dependency>

                <dependency>
                    <groupId>jstl</groupId>
                    <artifactId>jstl</artifactId>
                    <version>${jstl.version}</version>
                </dependency>

                <!-- Apache Tiles -->
                <dependency>
                    <groupId>org.apache.tiles</groupId>
                    <artifactId>tiles-api</artifactId>
                    <version>3.0.5</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.tiles</groupId>
                    <artifactId>tiles-core</artifactId>
                    <version>3.0.5</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.tiles</groupId>
                    <artifactId>tiles-jsp</artifactId>
                    <version>3.0.5</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.tiles</groupId>
                    <artifactId>tiles-servlet</artifactId>
                    <version>3.0.5</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.tiles</groupId>
                    <artifactId>tiles-template</artifactId>
                    <version>3.0.5</version>
                    <scope>compile</scope>
                </dependency>
                <dependency>
                    <groupId>org.apache.tiles</groupId>
                    <artifactId>tiles-el</artifactId>
                    <version>3.0.5</version>
                    <scope>compile</scope>
                </dependency>

                <!-- Spring 4 dependencies -->
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                    <version>${spring.version}</version>
                </dependency>

                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-jdbc</artifactId>
                    <version>${spring.version}</version>
                </dependency>


                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring.version}</version>
                </dependency>

                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                    <version>${spring.version}</version>
                </dependency>
            </dependencies>
            <build>
                <finalName>TilesDemo</finalName>
            </build>

        </project>

Conservez l'en-tête,le pied de page,le menu selon les exigences.

C'est defaultLayout.jsp page

        <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
        <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
            pageEncoding="ISO-8859-1"%>
        <html>
        <head>
        <title><tiles:insertAttribute name="title" ignore="true"></tiles:insertAttribute></title>
        </head>
        <body style="background-color: #FFF">
            <div class="page">
                <tiles:insertAttribute name="header" />
                <div class="content">
                    <div id="body">
                        <tiles:insertAttribute name="body" />
                    </div>
                </div>
                <tiles:insertAttribute name="footer" />
            </div>
        </body>
        </html>

Pied de page.jsp

    <hr />
    <div class="span-1 prepend-3">&nbsp;</div>
    <div class="span-16 last">
        <p>
            <b> Technology</b> 
            ( All rights Reserved)
        </p>
    </div>

En-tête.jsp

    <div class="span-24">
        <img src="resources/images/images.png" 
            width="950" style="padding-top:10px;" />
    </div>

Menu.jsp Options de la barre de menu côté gauche

    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
    <ul style="list-style:none;line-height:28px;">

        <li><spring:url value="/index" var="homeUrl" htmlEscape="true" />
            <a href="/TilesDemo/welcome">Home</a>
        </li>

        <li><spring:url value="/viewPerson" var="personListUrl" htmlEscape="true" />
            <a href="/TilesDemo/viewPerson">Person List</a>
        </li>

    </ul>

Bienvenue.jsp
Il s'agit de la page du corps sur laquelle l'en-tête, le pied de page et le menu seront appliqués.

    <div style="margin:10px;">
        <h3>SpringMVC - Tiles3 Integration tutorial</h3>
        <p>By:- XYZ</p>
    </div>

Le problème est que la configuration des tuiles n'est pas appliquée à chaque fois.

Author: Guido, 2015-08-08

2 answers

Comme vous pouvez le voir dans ce projet Configuration des tuiles sans xml le développeur a eu un problème similaire, la configuration des tuiles ne fonctionne pas.

Il a trouvé que si vous appelez la vue avec le même nom du fichier.jsp, somethings va mal.

public static void addDefinitions(){

            addDefaultLayoutDef("welcome", "welcome", "/WEB-INF/views/layout/welcome.jsp");
            addDefaultLayoutDef("personList", "viewPerson", "/WEB-INF/views/layout/personList.jsp");
}

Essayez d'utiliser un nom différent pour la vue et le fichier.JSP. Essayez avec

addDefaultLayoutDef("welcome", "Welcome", "/WEB-INF/views/layout/welcome.jsp");

Devrait fonctionner si le reste du code est correct.

 3
Author: ad3luc, 2016-05-10 12:52:24

Peut-être que vous devez définir la priorité de l'ordre du résolveur de vue, quelque chose comme ceci:

@Bean
public InternalResourceViewResolver internalResourceViewResolver(){
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setViewClass(JstlView.class);
    resolver.setPrefix("/WEB-INF/pages/");
    resolver.setSuffix(".jsp");

    //resolver.setOrder(2);

    return resolver;
}

//configuracion de apache tiles
@Bean
public TilesViewResolver getTilesViewResolver() {
    TilesViewResolver tilesViewResolver = new TilesViewResolver();
    tilesViewResolver.setViewClass(TilesView.class);

    // tiles view resolver va ha ser el primero en mostrarse
    tilesViewResolver.setOrder(1);

    return tilesViewResolver;
}
 1
Author: Richard Moises Leon, 2016-12-29 13:11:11