首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring - Thymeleaf - 404错误

Spring - Thymeleaf - 404错误
EN

Stack Overflow用户
提问于 2014-05-09 19:22:51
回答 2查看 6.2K关注 0票数 1

我过去曾与Spring合作过一个大型项目,但我从未从零开始使用Spring应用程序。

这就是我现在正在做的练习,因为我有一个项目,即将需要它。

我成功地制作了一个简单的Spring,它使用了.JSP页面(使用注释,而不是XML)。不过,我想使用Thymeleaf,并开始了我的转换过程。

现在,我得到了一个404错误,我的HomeController类甚至没有被击中,看起来是这样的。

在控制台输出中没有错误。

我有谷歌搜索,阅读教程,和代码示例。第二双眼睛就好了。谢谢!:)

注意:从.JSP到Thymeleaf,惟一的更改是添加ThymeleafConfig类。我不明白从工作到不工作是怎么回事。

这是我的密码:

WebInit.java

代码语言:javascript
运行
复制
public class WebInit implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // Creates the root application context
        AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
        appContext.register(ServletConfig.class);
        appContext.setDisplayName("REPLACE ME");
        appContext.setConfigLocation("com.demo.config");

        // Creates the Spring Container shared by all Servlets and Filters
        servletContext.addListener(new ContextLoaderListener(appContext));

        // Further configures the servlet context
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
                "dispatcher", new DispatcherServlet(appContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.setAsyncSupported(true);
        dispatcher.addMapping("/");
    }
}

ServetConfig.java

代码语言:javascript
运行
复制
@Configuration
@Import(WebConfig.class)
@ImportResource({/*"classpath:META-INF/spring/persistence-context.xml"*/})
public class ServletConfig {

}

WebConfig.java

代码语言:javascript
运行
复制
@Configuration
@ComponentScan("com.illinois.dnr")
@EnableAspectJAutoProxy
@EnableWebMvc
@Import({ThymeleafConfig.class})
public class WebConfig extends WebMvcConfigurerAdapter {
    // Maps resources path to webapp/resources
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations(
                "/resources/");
    }

    // Provides internationalization of messages
    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource source = new ResourceBundleMessageSource();
        source.setBasename("messages");
        return source;
    }
}

Thymeleaf.java

代码语言:javascript
运行
复制
@Configuration
public class ThymeleafConfig {
    @Bean 
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/WEB-INF/views/");
        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;
    }
}

HomeController.java

代码语言:javascript
运行
复制
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/dnr", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
                DateFormat.LONG, locale);
        String formattedDate = dateFormat.format(date);
        model.addAttribute("serverTime", formattedDate);
        return "home";
    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String loginPage(Locale locale, Model model) {
        logger.info("Login");
        return "login";
    }

    @RequestMapping(value = "/home", method = RequestMethod.POST)
    public String login(@Validated User user, Model model) {
        model.addAttribute("userName", user.getUserName());
        logger.info("User");
        return "user";
    }

    @RequestMapping(value = { "/", "/welcome**" }, method = RequestMethod.GET)
    public ModelAndView welcomePage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is welcome page!");
        model.setViewName("hello");
        logger.info("Hello");
        return model;
    }

    @RequestMapping(value = "/admin**", method = RequestMethod.GET)
    public ModelAndView adminPage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is protected page - Admin Page!");
        model.setViewName("admin");
        logger.info("admin");
        return model;
    }

    @RequestMapping(value = "/dba**", method = RequestMethod.GET)
    public ModelAndView dbaPage() {

        ModelAndView model = new ModelAndView();
        model.addObject("title", "Spring Security Hello World");
        model.addObject("message", "This is protected page - Database Page!");
        model.setViewName("admin");
        logger.info("dba");
        return model;
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2014-05-14 20:43:50

我不确定它是否有用,但是您可以通过扩展WebInit而不是实现WebApplicationInitializer来简化WebApplicationInitializer。否则,Thymeleaf配置在我看来是可以的(假设它被称为)。我给出了配置的工作框架,这样你就可以用它进行实验了。

WebApplicationInitializer

代码语言:javascript
运行
复制
public class WebInitializer extends
    AbstractAnnotationConfigDispatcherServletInitializer {

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

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

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

}

WebConfig

代码语言:javascript
运行
复制
@Configuration
@EnableWebMvc
@ComponentScan("com.kreuzman")
public class WebConfig {

    @Bean
    public ITemplateResolver templateResolver() {
        TemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/templates/");
    resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setCacheTTLMs(0l);

        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());

        return engine;
    }

    @Bean
    public ViewResolver thymeleafViewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");

        return viewResolver;
    }

}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23572401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档