记录一个springboot+freemark的错误

SpringBoot+FreeMarker遍历集合报错解析
本文记录了一次在SpringBoot项目中使用FreeMarker模板引擎时遇到的错误,具体表现为在遍历集合时出现异常。错误源于从Mybatis-Plus查询的Page对象直接返回,正确做法是取出Page内的数据后再传递给FreeMarker模板,以避免此类错误。
javax.servlet.ServletException: Cannot expose bind macro helper 'springMacroRequestContext' because of an existing model object of the same name

还有

freemarker.core.NonSequenceOrCollectionException: The value you try to list is an extended_hash+string (com.baomidou.mybatisplus.plugins.Page wrapped into f.e.b.StringModel), thus you must specify two loop variables after the "as"; one for the key, and another for the value, like <#... as k, v>).

项目是springboot+freemark

今天报了这个错 ,先来解释下为什么报错
根据错误提示在[#list indexPage as _data]
遍历集合时候出错了, 再看后台怎么封装的

Page<IrStaticDiss> indexPage = iIrStaticDissService.searchIndexByVo(irStaticDissVo);
  model.addAttribute("indexPage", indexPage);

这里是直接将查出Page返回了 (Page是mybatis-plus自带的) , 所以应该再取值时改成下面这样就不会报错了

[#list indexPage.records as _data]

粗心的错…

实现一个使用 Java + Spring Boot + MyBatis + FreeMarker + MySQL 的用户登录并跳转到首页的功能,主要包括以下几个部分: - 数据库设计 - 后端 Controller、Service、Mapper 层的逻辑处理 - 使用 FreeMarker 模板引擎渲染页面 - 登录成功后跳转首页 --- ## ✅ 一、数据库设计(MySQL) ```sql CREATE DATABASE login_demo; USE login_demo; CREATE TABLE `user` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL UNIQUE, `password` VARCHAR(100) NOT NULL ); ``` 插入测试数据: ```sql INSERT INTO user(username, password) VALUES('admin', '123456'); ``` --- ## ✅ 二、Spring Boot 配置 ### `pom.xml` 添加依赖 ```xml <dependencies> <!-- Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- FreeMarker --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> </dependencies> ``` --- ## ✅ 三、实体类 `User.java` ```java public class User { private Long id; private String username; private String password; // Getters and Setters } ``` --- ## ✅ 四、Mapper 接口 `UserMapper.java` ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE username = #{username}") User findByUsername(String username); @Insert("INSERT INTO user(username, password) VALUES(#{username}, #{password})") void insert(User user); } ``` --- ## ✅ 五、Service 层 `UserService.java` ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User login(String username, String password) { User user = userMapper.findByUsername(username); if (user != null && user.getPassword().equals(password)) { return user; } return null; } } ``` --- ## ✅ 六、Controller 控制器 `AuthController.java` ```java @Controller public class AuthController { @Autowired private UserService userService; // 显示登录页面 @GetMapping("/login") public String showLoginForm() { return "login"; // 对应 templates/login.ftl } // 处理登录请求 @PostMapping("/login") public String handleLogin(@RequestParam String username, @RequestParam String password, Model model, HttpSession session) { User user = userService.login(username, password); if (user != null) { session.setAttribute("user", user); // 存入 session return "redirect:/home"; // 跳转首页 } else { model.addAttribute("error", "用户名或密码错误"); return "login"; } } // 首页 @GetMapping("/home") public String home(Model model, HttpSession session) { User user = (User) session.getAttribute("user"); if (user == null) { return "redirect:/login"; } model.addAttribute("username", user.getUsername()); return "home"; // 对应 templates/home.ftl } // 注销 @GetMapping("/logout") public String logout(HttpSession session) { session.invalidate(); return "redirect:/login"; } } ``` --- ## ✅ 七、FreeMarker 页面模板 模板路径:`src/main/resources/templates/` ### `login.ftl` 登录页 ```html <!DOCTYPE html> <html> <head> <title>登录</title> </head> <body> <h2>用户登录</h2> <#if error??> <p style="color:red">${error}</p> </#if> <form action="/login" method="post"> 用户名:<input type="text" name="username"><br><br> 密码:<input type="password" name="password"><br><br> <button type="submit">登录</button> </form> </body> </html> ``` ### `home.ftl` 首页 ```html <!DOCTYPE html> <html> <head> <title>首页</title> </head> <body> <h2>欢迎你,${username}!</h2> <a href="/logout">注销</a> </body> </html> ``` --- ## ✅ 八、application.properties 配置 ```properties spring.datasource.url=jdbc:mysql://localhost:3306/login_demo?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.freemarker.template-loader-path=classpath:/templates/ spring.freemarker.suffix=.ftl spring.freemarker.content-type=text/html spring.freemarker.charset=UTF-8 ``` --- ## ✅ 九、运行说明 1. 确保 MySQL 正常启动,并创建好数据库和用户表; 2. 修改 `application.properties` 中的数据库连接信息; 3. 运行 Spring Boot 应用,默认访问地址: - 登录页:http://localhost:8080/login - 登录成功后跳转至:http://localhost:8080/home --- ## ✅ 十、扩展建议(生产环境) - 使用 Spring Security 增强安全机制 - 使用 BCrypt 加密密码 - 添加验证码功能 - 使用 Redis 缓存 Session ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值