ayziba-&& 2024-06-01 19:50 采纳率: 30%
浏览 2

springboot

2024-06-01 19:46:35.677 ERROR 21628 --- [nio-8080-exec-7] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-7] Exception processing template "schoolmatesList": An error happened during template parsing (template: "class path resource [templates/schoolmatesList.html]")
springboot报以上错误怎么解决,实在时找不到错误


package soft3.mngsys.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import soft3.mngsys.model.SchoolMate;
import soft3.mngsys.service.SchoolMateService;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.net.URLEncoder;
import java.util.Calendar;
import java.util.List;

@Controller
public class FileController {
    private Model getCopyRight(Model model){
        model.addAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR));
        model.addAttribute("author","则巴");
        return model;
    }
    //向文件上传页面跳转
    @GetMapping("/toUpload")
    public String fileUpload(Model model){
        getCopyRight(model);
        return "upload";
    }
    //文件上传管理
    @PostMapping("/uploadFile")
    public String uploadFile(MultipartFile[] fileUpload, Model model){
        //默认文件上传成功,并返回状态信息
        model.addAttribute("uploadStatus","上传成功!");
        for (MultipartFile file : fileUpload){
            //获取文件名以及后缀名
            String fileName = file.getOriginalFilename();
            //指定上传文件本地存储目录,不存在则需要提前创建
            String dirPath = "E:/file/";
            File filePath = new File(dirPath);
            if (!filePath.exists()){
                filePath.mkdir();
            }
            try {
                file.transferTo(new File(dirPath+fileName));
            } catch (Exception e){
                e.printStackTrace();
                //上传失败,返回失败信息
                model.addAttribute("uploadStatus","上传失败:" + e.getMessage());
            }
        }
        //携带上传状态信息回调到文件上传页面
        getCopyRight(model);
        return "upload";
    }

    @GetMapping("file_download")
    public String fileDownload(Model model){
        getCopyRight(model);
        return "download";
    }
    @GetMapping("/downloadFile")
    public ResponseEntity<byte[]> downloadFile(String filename, HttpServletRequest request) throws Exception{
        //指定被下载文件的路径
        String dirPath = "E:/file/";
        //创建文件对象
        File file = new File(dirPath + File.separator + filename);
        //设置响应头
        HttpHeaders headers = new HttpHeaders();
        //通知浏览器以下载方式打开(下载前对文件名进行转码,防止中文文件乱码)
        filename = getFilename(request,filename);
        headers.setContentDispositionFormData("attachment",filename);
        //以流的形式下载文件
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        try {
            //添加commons-io依赖
            //使用springmvc框架的ResponseEntity随心封装返回数据
            return new ResponseEntity<>(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
            return new ResponseEntity<byte[]>(e.getMessage().getBytes(), HttpStatus.EXPECTATION_FAILED);
        }
    }

    //根据浏览器的不同设置,返回编码后的文件名
    private String getFilename(HttpServletRequest request,String filename) throws Exception{
        //IE不同版本User-Agent中出现的关键字
        String[] IEBrowserKeyWords = {"MSIE","Trident","Edge"};
        //获取请求的代理信息
        String userAgent = request.getHeader("User-Agent");
        for (String keyWord : IEBrowserKeyWords){
            if (userAgent.contains(keyWord)){
                //IE内核浏览器,统一为UTF-8编码显示
                return URLEncoder.encode(filename,"UTF-8").replace("+","");
            }
        }
        //火狐等其他浏览器统一为ISO-8859-1编码
        return new String(filename.getBytes("UTF-8"),"ISO-8859-1");
    }

    @Autowired
    private SchoolMateService schoolMateServiceImpl;

    @GetMapping("/all_page")
    public String all_page(Model model){
        getCopyRight(model);
        List<SchoolMate> UserList = schoolMateServiceImpl.contTable_Service();
        model.addAttribute("Result",UserList);
        return "schoolmatesList";
    }
//    public String all_page(Model model){
//        List schoolMateList = schoolMateServiceImpl.findSchoolMatesList();
//        getCopyRight(model);
//        model.addAttribute("Result",schoolMateList);
//        return "schoolmatesList";
//    }

//    @GetMapping("/countNativePlace")
//    @ResponseBody
//    public List<SchoolMate> countNativePlace(Model model){
//        getCopyRight(model);
//        List<SchoolMate> schoolMateList = schoolMateService.nativePlaceChartService();
//        model.addAttribute("Result",schoolMateList);
//        System.out.println(schoolMateList);
//        return schoolMateList;
//    }
}


package soft3.mngsys.mapper;

import org.apache.ibatis.annotations.Mapper;
import soft3.mngsys.model.SchoolMate;

import java.util.List;

@Mapper
public interface SchoolMatesMapper {
    List<SchoolMate> contTable();
}

package soft3.mngsys.service;

import soft3.mngsys.model.SchoolMate;


import java.util.List;

public interface SchoolMateService {
    List<SchoolMate> contTable_Service();   //数据分页
//    public List findSchoolMatesList();
}


package soft3.mngsys.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import soft3.mngsys.mapper.SchoolMatesMapper;
import soft3.mngsys.model.SchoolMate;


import javax.transaction.Transactional;
import java.util.List;

@Service
@Transactional
public class SchoolMateServiceImpl implements SchoolMateService{
    @Autowired
    private SchoolMatesMapper schoolMatesMapper;

    @Override
    public List<SchoolMate> contTable_Service() {
        return schoolMatesMapper.contTable();
    }
//    @Override    //重写方法
//    public List<UserInfo> findUserInfoList_Service(){
//        return userInfoMapper.findUserInfoList();
//    }
}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="soft3.mngsys.mapper.SchoolMatesMapper">
    <select id="contTable" resultType="SchoolMate">
        select * from schoolmates
    </select>

<!--    <select id="nativePlaceChart" resultType="map">-->
<!--        select nativeplace,count(nativeplace) as value from schoolmates group by nativeplace-->
<!--    </select>-->



</mapper>


package soft3.mngsys.model;

import java.util.Date;

public class SchoolMate {
    //Generate get and set and toString
    private Integer id;
    private String username;
    private String sex;
    private Date birthday;
    private String nativeplace;
    private String classNo;
    private String job;
    private String company;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getNativeplace() {
        return nativeplace;
    }

    public void setNativeplace(String nativeplace) {
        this.nativeplace = nativeplace;
    }

    public String getClassNo() {
        return classNo;
    }

    public void setClassNo(String classNo) {
        this.classNo = classNo;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    @Override
    public String toString() {
        return "SchoolMate{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", nativeplace='" + nativeplace + '\'' +
                ", classNo='" + classNo + '\'' +
                ", job='" + job + '\'' +
                ", company='" + company + '\'' +
                '}';
    }
}


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" th:replace="publicPage(title='数据分页')">
<head>
    <meta charset="UTF-8">
    <title>校友录列表</title>
</head>
<body>
<div th:fragment="public_right">
    <table id="table" class="table table-hover" style="width: 80%">
        <thead>
        <th>编号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>出生日期</th>
        <th>籍贯</th>
        <th>班级</th>
        <th>职务</th>
        <th>公司</th>
        </thead>
        <tbody>
        <tr class="alert-info active table-" th:each="User:${Result}">
            <td th:text="${User.id}"> </td>
            <td th:text="${User.username}"> </td>
            <td th:text="${User.sex}"> </td>
            <td th:text="${#datas.format(User.birthday,'YYYY-MM-dd')}"> </td>
            <td th:text="${User.nativeplace}"> </td>
            <td th:text="${User.classNo}"> </td>
            <td th:text="${User.job}"> </td>
            <td th:text="${User.company}"> </td>
        </tr>
        </tbody>
    </table>
        <script type="text/javascript">
            $(document).ready(function () {
                $("#table").dataTable({
                    "bProcessing": true,               "aLengthMenu": [5, 10, 15],              "sPaginationType": "full_numbers",
                    "bAutoWidth": true,             // "bJQueryUI":true,
                    "oLanguage": {
                        "sProcessing": "正在获取数据,请稍后...",
                        "sLengthMenu": "显示 _MENU_ 条",
                        "sZeroRecords": "没有您要搜索的内容",
                        "sInfo": "从 _START_ 到 _END_ 条记录 总记录数为 _TOTAL_ 条",
                        "sInfoEmpty": "记录数为0",
                        "sInfoFiltered": "(全部记录数 _MAX_ 条)",
                        "sInfoPostFix": "",
                        "sSearch": "搜索",
                        "sUrl": "",
                        "oPaginate": {
                            "sFirst": "第一页",
                            "sPrevious": "上一页",
                            "sNext": "下一页",
                            "sLast": "最后一页"
                        }
                    },
                });
            });
        </script>


</div>

</body>
</html>

  • 写回答

3条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    **问题:**Spring Boot项目中,访问templates/schoolmatesList.html模板时抛出An error happened during template parsing错误。

    **原因:**这种错误通常是因为Thymeleaf解析模板时遇到问题,可能是模板语法错误、文件路径问题或者是资源加载配置不正确。

    解决方案:

    1. 检查模板语法

      • 检查templates/schoolmatesList.html文件中的HTML和Thymeleaf语法是否正确。
      • 确保模板引用的变量或属性在模型(Model)中存在。
    2. 确保资源路径正确

      • 检查classpath前缀是否正确,templates目录是否在项目的类路径(classpath resources)下。
      • 如果是相对路径,确保路径是从@Controller类所在的包开始的。
    3. 检查Spring Boot配置

      • application.propertiesapplication.yml中,确认spring.thymeleaf.prefixspring.thymeleaf.suffix配置是否正确。这两个属性分别定义了模板文件的前缀和后缀。
      spring:
        thymeleaf:
          prefix: classpath:/templates/
          suffix: .html
      
    4. 处理静态资源映射

      • 如果模板引用了静态资源(如图片、CSS等),确保在web.xmlSpring MVC配置中已经正确配置了静态资源的访问。
    5. 清理缓存

      • 有时候,由于缓存问题可能导致模板解析失败,尝试清除IDE或者服务器的缓存。
    6. 日志排查

      • 查看控制台输出的详细错误信息,这可能包含关于具体错误位置和原因的线索。

    如果以上步骤都无法解决问题,可能需要查看具体的错误堆栈信息,或者将错误报告分享出来以便进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月1日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请