2015-09-10 2 views
1

Я использую код, загруженный из Интернета, образец данных Spring MVC + Hibernate + Maven + Spring и в этом коде страницы jsp. Теперь я хотел бы представить Thymeleaf вместо Jsp си я создал страницу HTML приветствия, но когда я иду на этой странице я получаю эту ошибкуThymeleaf с ошибкой Spring MVC Не найдено сопоставления для HTTP-запроса с URI

09:16:23.622 [http-nio-8080-exec-7] WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/dpr-data/WEB-INF/pages/greeting.html] in DispatcherServlet with name 'dispatcher'

Это мои файлы код:

Контроллера

package com.spr.controller; 

import java.util.List; 

import javax.validation.Valid; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.support.RedirectAttributes; 

import com.spr.exception.ShopNotFound; 
import com.spr.model.Shop; 
import com.spr.service.ShopService; 
import com.spr.validation.ShopValidator; 

@Controller 
@RequestMapping(value="/shop") 
public class ShopController { 

    @Autowired 
    private ShopService shopService; 

    @Autowired 
    private ShopValidator shopValidator; 

    //Used to validate data 
    @InitBinder 
    private void initBinder(WebDataBinder binder) { 
     binder.setValidator(shopValidator); 
    } 

    @RequestMapping(value="/create", method=RequestMethod.GET) 
    public ModelAndView newShopPage() { 
     ModelAndView mav = new ModelAndView("shop-new", "shop", new Shop()); 
     return mav; 
    } 

    //@Valid means that shop has to be validate 
    @RequestMapping(value="/create", method=RequestMethod.POST) 
    public ModelAndView createNewShop(@ModelAttribute @Valid Shop shop, 
      BindingResult result, 
      final RedirectAttributes redirectAttributes) { 

     if (result.hasErrors()) 
      return new ModelAndView("shop-new"); 

     ModelAndView mav = new ModelAndView(); 
     String message = "New shop "+shop.getName()+" was successfully created."; 

     shopService.create(shop); 
     mav.setViewName("redirect:/index.jsp"); 

     redirectAttributes.addFlashAttribute("message", message); 
     return mav;  
    } 

    @RequestMapping(value="/list", method=RequestMethod.GET) 
    public ModelAndView shopListPage() { 
     ModelAndView mav = new ModelAndView("shop-list.jsp"); 
     List<Shop> shopList = shopService.findAll(); 
     mav.addObject("shopList", shopList); 
     return mav; 
    } 

    @RequestMapping(value="/edit/{id}", method=RequestMethod.GET) 
    public ModelAndView editShopPage(@PathVariable Integer id) { 
     ModelAndView mav = new ModelAndView("shop-edit"); 
     Shop shop = shopService.findById(id); 
     mav.addObject("shop", shop); 
     return mav; 
    } 

    @RequestMapping(value="/edit/{id}", method=RequestMethod.POST) 
    public ModelAndView editShop(@ModelAttribute @Valid Shop shop, 
      BindingResult result, 
      @PathVariable Integer id, 
      final RedirectAttributes redirectAttributes) throws ShopNotFound { 

     if (result.hasErrors()) 
      return new ModelAndView("shop-edit"); 

     ModelAndView mav = new ModelAndView("redirect:/index.html"); 
     String message = "Shop was successfully updated."; 

     shopService.update(shop); 

     redirectAttributes.addFlashAttribute("message", message); 
     return mav; 
    } 

    @RequestMapping(value="/delete/{id}", method=RequestMethod.GET) 
    public ModelAndView deleteShop(@PathVariable Integer id, 
      final RedirectAttributes redirectAttributes) throws ShopNotFound { 

     ModelAndView mav = new ModelAndView("redirect:/index.jsp");  

     Shop shop = shopService.delete(id); 
     String message = "The shop "+shop.getName()+" was successfully deleted."; 

     redirectAttributes.addFlashAttribute("message", message); 
     return mav; 
    } 

    @RequestMapping(value="/greeting", method=RequestMethod.GET) 
public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) { 
    model.addAttribute("name", name); 
    return "greeting"; 
} 

} 

WebAppConfig:

package com.spr.init; 

import java.util.*; 
import java.util.Properties; 

import javax.annotation.Resource; 
import javax.sql.DataSource; 

import org.thymeleaf.dialect.*; 
import org.hibernate.jpa.HibernatePersistenceProvider; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.support.ResourceBundleMessageSource; 
import org.springframework.core.env.Environment; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.view.JstlView; 
import org.springframework.web.servlet.view.UrlBasedViewResolver; 
import org.thymeleaf.spring4.SpringTemplateEngine; 
import org.thymeleaf.spring4.view.ThymeleafViewResolver; 
import org.thymeleaf.templateresolver.ServletContextTemplateResolver; 

import nz.net.ultraq.thymeleaf.LayoutDialect; 

@Configuration 
@EnableWebMvc 
@EnableTransactionManagement 
@ComponentScan("com.spr") 
@PropertySource("classpath:application.properties") 
@EnableJpaRepositories("com.spr.repository") 
public class WebAppConfig { 

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan"; 

    @Resource 
    private Environment env; 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

     dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
     dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
     dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
     dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 

     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
     entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 

     entityManagerFactoryBean.setJpaProperties(hibProperties()); 

     return entityManagerFactoryBean; 
    } 

    private Properties hibProperties() { 
     Properties properties = new Properties(); 
     properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
     properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 
     return properties; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return transactionManager; 
    } 

// @Bean 
// public UrlBasedViewResolver setupViewResolver() { 
//  UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
//  resolver.setPrefix("/WEB-INF/pages/"); 
////  resolver.setSuffix(".jsp"); 
//  resolver.setViewClass(JstlView.class); 
//  return resolver; 
// } 

    @Bean 
    public ResourceBundleMessageSource messageSource() { 
     ResourceBundleMessageSource source = new ResourceBundleMessageSource(); 
     source.setBasename(env.getRequiredProperty("message.source.basename")); 
     source.setUseCodeAsDefaultMessage(true); 
     return source; 
    } 

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

    @Bean 
    public SpringTemplateEngine templateEngine() { 
     Set<IDialect> dialects = new HashSet<IDialect>(); 
     dialects.add(new LayoutDialect()); 

     SpringTemplateEngine engine = new SpringTemplateEngine(); 
     engine.setTemplateResolver(templateResolver()); 
     engine.setAdditionalDialects(dialects); 
     return engine; 
    } 

    @Bean 
    public ThymeleafViewResolver viewResolver() { 
     ThymeleafViewResolver resolver = new ThymeleafViewResolver(); 
     resolver.setTemplateEngine(templateEngine()); 
     resolver.setOrder(1); 
     resolver.setViewNames(new String[]{"*", "js/*", "template/*"}); 
     return resolver; 
    } 

} 

Initializer

package com.spr.init; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration.Dynamic; 

import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.ContextLoaderListener; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 

public class Initializer implements WebApplicationInitializer { 

    private static final String DISPATCHER_SERVLET_NAME = "dispatcher"; 

    public void onStartup(ServletContext servletContext) 
      throws ServletException { 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(WebAppConfig.class); 
     servletContext.addListener(new ContextLoaderListener(ctx)); 

     ctx.setServletContext(servletContext); 

     Dynamic servlet = servletContext.addServlet(DISPATCHER_SERVLET_NAME, 
       new DispatcherServlet(ctx)); 
     servlet.addMapping("/"); 
     servlet.setLoadOnStartup(1); 
    } 

} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 

    <display-name>spr-data</display-name> 

</web-app> 

файл ПОМ

<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>spr-data</groupId> 
    <artifactId>spr-data</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>spr-data</name> 

    <build> 
     <finalName>dpr-data</finalName> 
     <plugins> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.3</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <!-- Spring dependencies --> 



     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.2.1.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>4.2.1.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>1.9.0.RELEASE</version> 
     </dependency> 

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

     <!-- Thymeleaf dependecies --> 
     <dependency> 
      <groupId>org.thymeleaf</groupId> 
      <artifactId>thymeleaf-spring4</artifactId> 
      <version>2.1.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>nz.net.ultraq.thymeleaf</groupId> 
      <artifactId>thymeleaf-layout-dialect</artifactId> 
      <version>1.3.0</version> 
     </dependency> 



     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjweaver</artifactId> 
      <version>1.8.6</version> 
     </dependency> 

     <!-- dependency to fix JSPServletException --> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-jsp-api</artifactId> 
      <version>8.0.26</version> 
     </dependency> 


     <!-- Hibernate dependencies --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>5.0.1.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>5.2.1.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>5.0.1.Final</version> 
     </dependency> 

     <!-- MySQL dependncies --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.36</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.1.0.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <!-- slf4j --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.7</version> 
     </dependency> 
     <!-- logback --> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>1.1.2</version> 
     </dependency> 
     <!-- log4jdbc --> 
     <dependency> 
      <groupId>com.googlecode.log4jdbc</groupId> 
      <artifactId>log4jdbc</artifactId> 
      <version>1.2</version> 
      <scope>runtime</scope> 
     </dependency> 
    </dependencies> 

</project> 

структура проекта

http://i60.tinypic.com/mcccw9.png

чем проблема? Спасибо

ответ

0

Я не вижу в вашем коде никакой конфигурации тимелеафа. попробуйте добавить следующую строку в ваш класс конфигурации

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

    @Bean 
    public SpringTemplateEngine templateEngine() { 
     Set<IDialect> dialects = new HashSet<IDialect>(); 
     dialects.add(new LayoutDialect()); 

     SpringTemplateEngine engine = new SpringTemplateEngine(); 
     engine.setTemplateResolver(templateResolver()); 
     engine.setAdditionalDialects(dialects); 
     return engine; 
    } 

    @Bean 
    public ThymeleafViewResolver viewResolver() { 
     ThymeleafViewResolver resolver = new ThymeleafViewResolver(); 
     resolver.setTemplateEngine(templateEngine()); 
     resolver.setOrder(1); 
     resolver.setViewNames(new String[]{"*", "js/*", "template/*"}); 
     return resolver; 
    } 

for more details

+0

Спасибо, я hadded этого кода к WebAppConfig.java, но я получаю исключение при запуске (возможно, выше англичанин не так?) вызвано следующими причинами: java.lang.NoClassDefFoundError: org/thymeleaf/dom/Атрибут \t на nz.net.ultraq.thymeleaf.LayoutDialect. (LayoutDialect.groovy: 49) – luca

+0

используют эту зависимость вместо org.thymeleaf thymeleaf-spring4 2.1.4.RELEASE LynAs

+0

Вы также должны удалить UrlBasedViewResolver боб из конфигурационного класса – LynAs