Используйте представления JSP и Thymeleaf в приложении Spring Boot - PullRequest
0 голосов
/ 08 октября 2018

Есть несколько похожих вопросов на сайте и в Интернете в целом, но я не смог заставить их работать в моем примере столько, сколько я пытался.

Я работаю сSpring Boot впервые, и я застрял, пытаясь включить JSP-представления через InternalResourceViewResolver.Я уже заставил работать представления Thymeleaf.

Application.java

@SpringBootApplication
@ComponentScan("controller")
@EnableWebSecurity
@Configuration
public class Application extends WebSecurityConfigurerAdapter {
    public static void main(String args[]) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("classpath:/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCharacterEncoding("UTF-8");
        resolver.setCacheable(false);
        resolver.setOrder(1);
        return resolver;
    }

    //intended for the .jsp view
    @Bean
    public InternalResourceViewResolver jspResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("classpath:/templates/jsp/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        resolver.setOrder(2);
        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addTemplateResolver(new UrlTemplateResolver());
        templateEngine.addTemplateResolver(templateResolver());

        //IKD if/how I should somehow add jspResolver() here

        templateEngine.addDialect(new SpringSecurityDialect());
        templateEngine.addDialect(new LayoutDialect(new GroupingStrategy()));
        templateEngine.addDialect(new Java8TimeDialect());
        return templateEngine;
    }

    @Bean
    @Description("Thymeleaf View Resolver")
    public ThymeleafViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setOrder(0);
        return viewResolver;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/users/**").hasRole("USER")//USER role can access /users/**
                .antMatchers("/admin/**").hasRole("ADMIN")//ADMIN role can access /admin/**
                .antMatchers("/quests/**").permitAll()// anyone can access /quests/**
                .anyRequest().authenticated()//any other request just need authentication
                .and()
                .formLogin();//enable form login
    }

    @Override
    protected void configure(AuthenticationManagerBuilder builder) throws Exception {
        builder.inMemoryAuthentication()
                .passwordEncoder(passwordEncoder())
                .withUser("tim").password(passwordEncoder().encode("123")).roles("ADMIN")
                .and()
                .withUser("joe").password(passwordEncoder().encode("234")).roles("USER");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

MainController.java

@Controller
public class MainController {
@GetMapping("/")
ModelAndView index(Principal principal) {
    ModelAndView mv = new ModelAndView("home");
    if (principal != null) {
        mv.addObject("message", principal.getName());
    } else {
        mv.addObject("message", "anon.");
    }

    return mv;
}

@GetMapping("/**")
String request(HttpServletRequest request, Model model) {
    Authentication auth = SecurityContextHolder.getContext()
            .getAuthentication();
    ModelAndView mv = new ModelAndView("home");
    model.addAttribute("uri", request.getRequestURI())
            .addAttribute("user", auth.getName())
            .addAttribute("roles", auth.getAuthorities());

    return "html"; //<-- whenever I change this to return "jsp/jsp"; it breaks
}

html.html (Thymeleaf)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
    <body>
        <p>
            URI: <h3 th:text="${uri}"></h3>
        User: <h3 th:text="${user}"></h3>
        Roles: <h3 th:text="${roles}"></h3>
        <a href="/admin/">/admin/</a><br/>
        <a href="/users/">/users/</a><br/>
        <a href="/others/">/others/</a><br/>
        <a href="/quests/">/quests/</a><br/><br/>
    </p>
    <form th:action="@{/logout}" method="post">
        <input type="hidden"
               name="${_csrf.parameterName}"
               value="${_csrf.token}"/>
        <input type="submit" value="Logout">
    </form>
</body>
</html>

Когда я пытаюсь сделать эту работу с файлом JSP хорошо, браузер выводит только

HTTP Status 500?Внутренняя ошибка сервера

и в окне NetBeans Вывод , где запускается задача gradle, ну, в общем, журнал показывает это в самом верху (весь журнал довольно обширный):

2018-10-07 18: 09: 40.070 ОШИБКА 6024 --- [nio-8080-exec-4] org.thymeleaf.TemplateEngine: [THYMELEAF] [http-nio-8080-exec-4] Шаблон обработки исключений "jsp / jsp": во время синтаксического анализа произошла ошибка (template: "ресурс пути к классу [templates / jsp / jsp.html]")

JSPview Я пытаюсь включить

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html lang="en">
    <body>
        <p>URI: ${uri} <br/>
            User :  ${user} <br/>
            roles:  ${roles} <br/><br/>
            <a href="/admin/">/admin/</a><br/>
            <a href="/users/">/users/</a><br/>
            <a href="/others/">/others/</a><br/>
            <a href="/quests/">/quests/</a><br/><br/>
        </p>
        <form action="/logout" method="post">
            <input type="hidden"
                   name="${_csrf.parameterName}"
                   value="${_csrf.token}"/>
            <input type="submit" value="Logout">
        </form>
    </body>
</html>

Наконец, дерево моего проекта:

enter image description here

Я предполагаю, чтоприложение не знает о файле jsp.jsp внутри папки templates / jsp , поэтому я задаю вопрос для просмотра распознавателей, но, как я уже сказал, я мог легкобыть неправым в этом.

Это всего лишь пример, который я пытаюсь воплотить в жизнь и развить, поэтому не стесняйтесь обсуждать его с предложениями, спасибо.

1 Ответ

0 голосов
/ 08 октября 2018

На самом деле я еще не пробовал, так как использовал jsp и thymeleaf в совершенно другом проекте.А также конвертировал jsp в thymeleaf, но не использовал его вместе.Я просто хочу помочь, поскольку я сталкиваюсь с этим вопросом, и я нахожу его интересным.


Я полагаю, вы уже проверили эту тему? Используя как Thymeleaf, так и JSP


В соответствии с этого блога , вы можете оставить настройку по умолчанию на тимилиф.Вам просто нужно добавить InternalResourceViewResolver для конфигурации jsp.

Полный пример здесь:

Добавить следующие зависимости в ваш файл pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</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>
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
 </dependency>

В ваших application.properties задайте имена представлений тимьяна и конфигурацию JSP для разрешения внутреннего представления

spring.view.prefix:/WEB-INF/
spring.view.suffix:.jsp
spring.view.view-names:jsp/*
spring.thymeleaf.view-names:thymeleaf/*

создайте класс конфигурации для разрешения представления для страниц JSP

package com.example.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
public class JspConfig {
    @Value("${spring.view.prefix}")
    private String prefix;

    @Value("${spring.view.suffix}")
    private String suffix;

    @Value("${spring.view.view-names}")
    private String viewNames;

    @Bean
    InternalResourceViewResolver jspViewResolver() {
        final InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix(prefix);
        viewResolver.setSuffix(suffix);
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setViewNames(viewNames);
        return viewResolver;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...