• SpringBoot视图渲染技术


    目录

    一、Freemarker入门

    二、Freemarker的基本语法

    三、Freemarker综合案例

    实现步骤:

    1、entity、Mapper.java、Mapper.xml、biz、Controller

    2、jsp——>freemarker

    3、jsp中是有分页标签 ——> freemarker中的分页条展示问题,以及分页功能

    4、整合aop PageHelper插件

    后端处理:

    前端页面处理:


    一、Freemarker入门

    SpringBoot默认是不推荐使用jsp的,本身就是向前端推送数据。

    学习网址:
    
    http://freemarker.foofun.cn/
    

    项目创建如下:

    六个组件 —

     生成后相关配置稍作调整

    yml文件:

    1. mybatis:
    2. mapper-locations: classpath:mappers/*xml
    3. type-aliases-package: com.ycx.spboot04.mybatis.model
    4. server:
    5. port: 8080
    6. spring:
    7. application:
    8. name: spboot04
    9. datasource:
    10. driver-class-name: com.mysql.jdbc.Driver
    11. name: defaultDataSource
    12. password: 123456
    13. url: jdbc:mysql://localhost:3306/yjy?useUnicode=true&characterEncoding=UTF-8
    14. username: root
    15. freemarker:
    16. cache: false
    17. charset: utf-8
    18. expose-request-attributes: true
    19. expose-session-attributes: true
    20. suffix: .ftl
    21. template-loader-path: classpath:/templates/
    22. # resources:
    23. # static-locations: classpath:/static/# 应用服务 WEB 访问端口
    24. mvc:
    25. static-path-pattern: classpath:/static/

     接着:

     

     

     

     index.ftl

    1. DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>title>
    6. head>
    7. <body>
    8. 欢迎来到 Freemarker首页!
    9. body>
    10. html>

    controllerIndexController :

    1. package com.ycx.spboot04.contrller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author 杨总
    6. * @create 2022-11-02 1:12
    7. */
    8. @Controller
    9. @RequestMapping
    10. public class IndexController {
    11. @RequestMapping("/")
    12. public String index(){
    13. System.out.println("come in...");
    14. return "index";
    15. }
    16. }

    测试:

    二、Freemarker的基本语法

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>title>
    6. head>
    7. <body>
    8. <h2>1.取值h2>
    9. <h3>1.1. 提供默认值h3>
    10. <#--报错-->
    11. <#--${uname} -->
    12. <#--不报错,但是页面无内容-->
    13. <#--${uname !}-->
    14. <#--给值设置一个默认值-->
    15. ${uname! '无名'}
    16. <h3>1.2. 对null值先进行判断h3>
    17. <p>1)exists用在逻辑判断;p>
    18. <#if uname?exists>
    19. ${uname}
    20. <br>
    21. <p>2)??是判断对象是否为空p>
    22. <#if uname??>
    23. ${uname}
    24. <br>
    25. <p>3)if_exists用来打印东西p>
    26. ${uname?if_exists}
    27. <br>
    28. <h3>2.条件h3>
    29. <#if sex=='nv'>
    30. <#elseif sex='nan'>
    31. <#else>
    32. 未知
    33. <br>
    34. <h3>3.循环h3>
    35. <p>1)取出数组中的元素p>
    36. <#list arr as a>
    37. ${a}==
    38. <br>
    39. <p>2)取出集合中的对象(注:访问的类要被public所修饰)p>
    40. <#list lst as item>
    41. ${item.id} : ${item.name} <br>
    42. <h3>4 includeh3>
    43. <#include "/common.ftl" >
    44. <h3>5 局部变量(assign)/全局变量(global)h3>
    45. ${ctx}:${ctx2}
    46. body>
    47. html>

     common.ftl

    1. <#assign ctx>
    2. ${springMacroRequestContext.contextPath}
    3. <#global ctx2>
    4. ${springMacroRequestContext.contextPath}

    IndexController :

    1. package com.ycx.spboot04.controller;
    2. import com.ycx.spboot04.entity.User;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.ui.Model;
    5. import org.springframework.web.bind.annotation.GetMapping;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. /**
    9. * @author杨总
    10. *
    11. */
    12. @Controller
    13. public class IndexController {
    14. @GetMapping("/")
    15. public String index(Model model) {
    16. System.out.println("come in............");
    17. model.addAttribute("uname", "小刘");
    18. model.addAttribute("sex", "girl");
    19. List<User> lst = new ArrayList<>();
    20. lst.add(new User(1, "zs"));
    21. lst.add(new User(2, "ls"));
    22. lst.add(new User(3, "ww"));
    23. model.addAttribute("lst",lst);
    24. model.addAttribute("arr", new Integer[]{5, 6, 7, 8, 9});
    25. return "index";
    26. }
    27. }

    三、Freemarker综合案例

    利用Freemarker完成基本的增删改查,参照之前ssm项目进行改造

    实现步骤:

    1、entity、Mapper.java、Mapper.xml、biz、Controller

    2、jsp——>freemarker

    3、jsp中是有分页标签 ——> freemarker中的分页条展示问题,以及分页功能

    4、整合aop PageHelper插件

    后端处理:

    SpringBoot aop整合分页,添加配置如下:


          org.springframework
          spring-aspects
          5.0.2.RELEASE
       

        
       
           com.github.pagehelper
           pagehelper-spring-boot-starter
           1.2.3
         
     

    完整版依赖: 

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.ycxgroupId>
    6. <artifactId>spboot04artifactId>
    7. <version>0.0.1-SNAPSHOTversion>
    8. <name>spboot04name>
    9. <description>Demo project for Spring Bootdescription>
    10. <properties>
    11. <java.version>1.8java.version>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    14. <spring-boot.version>2.3.7.RELEASEspring-boot.version>
    15. properties>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.bootgroupId>
    19. <artifactId>spring-boot-starter-freemarkerartifactId>
    20. dependency>
    21. <dependency>
    22. <groupId>org.springframework.bootgroupId>
    23. <artifactId>spring-boot-starter-jdbcartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframework.bootgroupId>
    27. <artifactId>spring-boot-starter-webartifactId>
    28. dependency>
    29. <dependency>
    30. <groupId>org.mybatis.spring.bootgroupId>
    31. <artifactId>mybatis-spring-boot-starterartifactId>
    32. <version>2.1.4version>
    33. dependency>
    34. <dependency>
    35. <groupId>mysqlgroupId>
    36. <artifactId>mysql-connector-javaartifactId>
    37. <version>5.1.44version>
    38. dependency>
    39. <dependency>
    40. <groupId>org.springframeworkgroupId>
    41. <artifactId>spring-aspectsartifactId>
    42. <version>5.0.2.RELEASEversion>
    43. dependency>
    44. <dependency>
    45. <groupId>com.github.pagehelpergroupId>
    46. <artifactId>pagehelper-spring-boot-starterartifactId>
    47. <version>1.2.3version>
    48. dependency>
    49. <dependency>
    50. <groupId>org.projectlombokgroupId>
    51. <artifactId>lombokartifactId>
    52. <optional>trueoptional>
    53. dependency>
    54. <dependency>
    55. <groupId>org.springframework.bootgroupId>
    56. <artifactId>spring-boot-starter-testartifactId>
    57. <scope>testscope>
    58. <exclusions>
    59. <exclusion>
    60. <groupId>org.junit.vintagegroupId>
    61. <artifactId>junit-vintage-engineartifactId>
    62. exclusion>
    63. exclusions>
    64. dependency>
    65. dependencies>
    66. <dependencyManagement>
    67. <dependencies>
    68. <dependency>
    69. <groupId>org.springframework.bootgroupId>
    70. <artifactId>spring-boot-dependenciesartifactId>
    71. <version>${spring-boot.version}version>
    72. <type>pomtype>
    73. <scope>importscope>
    74. dependency>
    75. dependencies>
    76. dependencyManagement>
    77. <build>
    78. <plugins>
    79. <plugin>
    80. <groupId>org.apache.maven.pluginsgroupId>
    81. <artifactId>maven-compiler-pluginartifactId>
    82. <version>3.8.1version>
    83. <configuration>
    84. <source>1.8source>
    85. <target>1.8target>
    86. <encoding>UTF-8encoding>
    87. configuration>
    88. plugin>
    89. <plugin>
    90. <groupId>org.springframework.bootgroupId>
    91. <artifactId>spring-boot-maven-pluginartifactId>
    92. <version>2.3.7.RELEASEversion>
    93. <configuration>
    94. <mainClass>com.ycx.spboot04.Spboot04ApplicationmainClass>
    95. configuration>
    96. <executions>
    97. <execution>
    98. <id>repackageid>
    99. <goals>
    100. <goal>repackagegoal>
    101. goals>
    102. execution>
    103. executions>
    104. plugin>
    105. plugins>
    106. build>
    107. project>

    把如下配置加到yml文件中 

    pagehelper:
      reasonable: true
      supportMethodsArguments: true
      page-size-zero: true
      helper-dialect: mysql

    1. mybatis:
    2. mapper-locations: classpath:mappers/*xml
    3. type-aliases-package: com.ycx.spboot04.model
    4. server:
    5. port: 8080
    6. servlet:
    7. context-path: /spboot04
    8. spring:
    9. application:
    10. name: spboot04
    11. datasource:
    12. driver-class-name: com.mysql.jdbc.Driver
    13. name: defaultDataSource
    14. password: 1234
    15. url: jdbc:mysql://localhost:3306/yjy?useUnicode=true&characterEncoding=UTF-8
    16. username: root
    17. freemarker:
    18. cache: false
    19. charset: utf-8
    20. expose-request-attributes: true
    21. expose-session-attributes: true
    22. suffix: .ftl
    23. template-loader-path: classpath:/templates/
    24. # resources:
    25. # static-locations: classpath:/static/# 应用服务 WEB 访问端口
    26. mvc:
    27. static-path-pattern: classpath:/static/
    28. pagehelper:
    29. reasonable: true
    30. supportMethodsArguments: true
    31. page-size-zero: true
    32. helper-dialect: mysql

    实体类Clazz.java:

    1. package com.ycx.spboot04.model;
    2. import java.io.Serializable;
    3. /**
    4. * NotNull:针对的是基本数据类型
    5. * @NotEmpty 作用于集合
    6. * @NotBlank 作用于字符串
    7. */
    8. public class Clazz implements Serializable {
    9. protected Integer cid;
    10. protected String cname;
    11. protected String cteacher;
    12. protected String pic;
    13. public Clazz(Integer cid, String cname, String cteacher, String pic) {
    14. this.cid = cid;
    15. this.cname = cname;
    16. this.cteacher = cteacher;
    17. this.pic = pic;
    18. }
    19. public Clazz() {
    20. super();
    21. }
    22. public Integer getCid() {
    23. return cid;
    24. }
    25. public void setCid(Integer cid) {
    26. this.cid = cid;
    27. }
    28. public String getCname() {
    29. return cname;
    30. }
    31. public void setCname(String cname) {
    32. this.cname = cname;
    33. }
    34. public String getCteacher() {
    35. return cteacher;
    36. }
    37. public void setCteacher(String cteacher) {
    38. this.cteacher = cteacher;
    39. }
    40. public String getPic() {
    41. return pic;
    42. }
    43. public void setPic(String pic) {
    44. this.pic = pic;
    45. }
    46. }

    ClazzBiz :

    1. package com.ycx.spboot04.biz;
    2. import com.ycx.spboot04.model.Clazz;
    3. import com.ycx.spboot04.util.PageBean;
    4. import org.springframework.cache.annotation.CacheEvict;
    5. import org.springframework.cache.annotation.CachePut;
    6. import java.util.List;
    7. import java.util.Map;
    8. public interface ClazzBiz {
    9. @CacheEvict(value = "xx",key = "'cid:'+#cid",allEntries = true)
    10. int deleteByPrimaryKey(Integer cid);
    11. int insert(Clazz record);
    12. int insertSelective(Clazz record);
    13. // xx=cache-cid:1
    14. // key的作用改变原有的key生成规则
    15. // @Cacheable(value = "xx",key = "'cid:'+#cid",condition = "#cid > 6")
    16. @CachePut(value = "xx",key = "'cid:'+#cid",condition = "#cid > 6")
    17. Clazz selectByPrimaryKey(Integer cid);
    18. int updateByPrimaryKeySelective(Clazz record);
    19. int updateByPrimaryKey(Clazz record);
    20. List<Clazz> listPager(Clazz clazz, PageBean pageBean);
    21. List<Map> listMapPager(Clazz clazz, PageBean pageBean);
    22. }

    ClazzMapper.java:

    1. package com.ycx.spboot04.mapper;
    2. import com.ycx.spboot04.model.Clazz;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. import java.util.Map;
    6. @Repository
    7. public interface ClazzMapper {
    8. int deleteByPrimaryKey(Integer cid);
    9. int insert(Clazz record);
    10. int insertSelective(Clazz record);
    11. Clazz selectByPrimaryKey(Integer cid);
    12. List<Clazz> listPager(Clazz clazz);
    13. List<Map> listMapPager(Clazz clazz);
    14. int updateByPrimaryKeySelective(Clazz record);
    15. int updateByPrimaryKey(Clazz record);
    16. }

    ClazzBizImpl.java:

    1. package com.ycx.spboot04.biz.impl;
    2. import com.ycx.spboot04.biz.ClazzBiz;
    3. import com.ycx.spboot04.mapper.ClazzMapper;
    4. import com.ycx.spboot04.model.Clazz;
    5. import com.ycx.spboot04.util.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import java.util.List;
    9. import java.util.Map;
    10. @Service
    11. public class ClazzBizImpl implements ClazzBiz {
    12. @Autowired
    13. private ClazzMapper clazzMapper;
    14. @Override
    15. public int deleteByPrimaryKey(Integer cid) {
    16. System.out.println("不做任何操作...");
    17. return clazzMapper.deleteByPrimaryKey(cid);
    18. // return 0;
    19. }
    20. @Override
    21. public int insert(Clazz record) {
    22. return clazzMapper.insert(record);
    23. }
    24. @Override
    25. public int insertSelective(Clazz record) {
    26. return clazzMapper.insertSelective(record);
    27. }
    28. @Override
    29. public Clazz selectByPrimaryKey(Integer cid) {
    30. return clazzMapper.selectByPrimaryKey(cid);
    31. }
    32. @Override
    33. public int updateByPrimaryKeySelective(Clazz record) {
    34. return clazzMapper.updateByPrimaryKeySelective(record);
    35. }
    36. @Override
    37. public int updateByPrimaryKey(Clazz record) {
    38. return clazzMapper.updateByPrimaryKey(record);
    39. }
    40. @Override
    41. public List<Clazz> listPager(Clazz clazz, PageBean pageBean) {
    42. return clazzMapper.listPager(clazz);
    43. }
    44. @Override
    45. public List<Map> listMapPager(Clazz clazz, PageBean pageBean) {
    46. if(true)
    47. throw new RuntimeException("查询班级信息异常,异常存在于ClazzBizImpl.list。。。。");
    48. return clazzMapper.listMapPager(clazz);
    49. }
    50. }

    ClazzMapper.xml:

    1. "1.0" encoding="UTF-8" ?>
    2. DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.ycx.spboot04.mapper.ClazzMapper" >
    4. <resultMap id="BaseResultMap" type="Clazz" >
    5. <constructor >
    6. <idArg column="cid" jdbcType="INTEGER" javaType="java.lang.Integer" />
    7. <arg column="cname" jdbcType="VARCHAR" javaType="java.lang.String" />
    8. <arg column="cteacher" jdbcType="VARCHAR" javaType="java.lang.String" />
    9. <arg column="pic" jdbcType="VARCHAR" javaType="java.lang.String" />
    10. constructor>
    11. resultMap>
    12. <sql id="Base_Column_List" >
    13. cid, cname, cteacher, pic
    14. sql>
    15. <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    16. select
    17. <include refid="Base_Column_List" />
    18. from t_struts_class
    19. where cid = #{cid,jdbcType=INTEGER}
    20. select>
    21. <select id="listMapPager" resultType="java.util.Map" parameterType="Clazz" >
    22. select
    23. <include refid="Base_Column_List" />
    24. from t_struts_class
    25. <where>
    26. <if test="cname != null and cname != ''">
    27. and cname like CONCAT('%',#{cname},'%')
    28. if>
    29. <if test="cid != null and cid != ''">
    30. and cid = #{cid}
    31. if>
    32. where>
    33. select>
    34. <select id="listPager" resultType="Clazz" parameterType="Clazz" >
    35. select
    36. <include refid="Base_Column_List" />
    37. from t_struts_class
    38. <where>
    39. <if test="cname != null and cname != ''">
    40. and cname like CONCAT('%',#{cname},'%')
    41. if>
    42. <if test="cid != null and cid != ''">
    43. and cid = #{cid}
    44. if>
    45. where>
    46. select>
    47. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    48. delete from t_struts_class
    49. where cid = #{cid,jdbcType=INTEGER}
    50. delete>
    51. <insert id="insert" parameterType="Clazz" >
    52. insert into t_struts_class (cid, cname, cteacher,
    53. pic)
    54. values (#{cid,jdbcType=INTEGER}, #{cname,jdbcType=VARCHAR}, #{cteacher,jdbcType=VARCHAR},
    55. #{pic,jdbcType=VARCHAR})
    56. insert>
    57. <insert id="insertSelective" parameterType="Clazz" >
    58. insert into t_struts_class
    59. <trim prefix="(" suffix=")" suffixOverrides="," >
    60. <if test="cid != null" >
    61. cid,
    62. if>
    63. <if test="cname != null" >
    64. cname,
    65. if>
    66. <if test="cteacher != null" >
    67. cteacher,
    68. if>
    69. <if test="pic != null" >
    70. pic,
    71. if>
    72. trim>
    73. <trim prefix="values (" suffix=")" suffixOverrides="," >
    74. <if test="cid != null" >
    75. #{cid,jdbcType=INTEGER},
    76. if>
    77. <if test="cname != null" >
    78. #{cname,jdbcType=VARCHAR},
    79. if>
    80. <if test="cteacher != null" >
    81. #{cteacher,jdbcType=VARCHAR},
    82. if>
    83. <if test="pic != null" >
    84. #{pic,jdbcType=VARCHAR},
    85. if>
    86. trim>
    87. insert>
    88. <update id="updateByPrimaryKeySelective" parameterType="Clazz" >
    89. update t_struts_class
    90. <set >
    91. <if test="cname != null" >
    92. cname = #{cname,jdbcType=VARCHAR},
    93. if>
    94. <if test="cteacher != null" >
    95. cteacher = #{cteacher,jdbcType=VARCHAR},
    96. if>
    97. <if test="pic != null" >
    98. pic = #{pic,jdbcType=VARCHAR},
    99. if>
    100. set>
    101. where cid = #{cid,jdbcType=INTEGER}
    102. update>
    103. <update id="updateByPrimaryKey" parameterType="Clazz" >
    104. update t_struts_class
    105. set cname = #{cname,jdbcType=VARCHAR},
    106. cteacher = #{cteacher,jdbcType=VARCHAR},
    107. pic = #{pic,jdbcType=VARCHAR}
    108. where cid = #{cid,jdbcType=INTEGER}
    109. update>
    110. mapper>

    ClazzController.java:

    1. package com.ycx.spboot04.controller;
    2. import com.ycx.spboot04.biz.ClazzBiz;
    3. import com.ycx.spboot04.model.Clazz;
    4. import com.ycx.spboot04.util.PageBean;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.http.HttpHeaders;
    7. import org.springframework.http.HttpStatus;
    8. import org.springframework.http.MediaType;
    9. import org.springframework.http.ResponseEntity;
    10. import org.springframework.stereotype.Controller;
    11. import org.springframework.validation.BindingResult;
    12. import org.springframework.validation.FieldError;
    13. import org.springframework.web.bind.annotation.RequestMapping;
    14. import org.springframework.web.multipart.MultipartFile;
    15. import javax.servlet.http.HttpServletRequest;
    16. import java.util.HashMap;
    17. import java.util.List;
    18. import java.util.Map;
    19. /**
    20. * @author杨总
    21. */
    22. @Controller
    23. @RequestMapping("/clz")
    24. public class ClazzController {
    25. @Autowired
    26. private ClazzBiz clazzBiz;
    27. // list->clzList
    28. // toList->重定向list->"redirect:/clz/list"
    29. // toEdit->跳转到编辑界面->clzEdit
    30. // Clazz : 以前是通过模型驱动接口封装,现在是直接在方法中接受参数即可
    31. @RequestMapping("/list")
    32. public String list(Clazz clazz, HttpServletRequest request){
    33. System.out.println("我添加了 新的代码,终于不重启了....");
    34. PageBean pageBean = new PageBean();
    35. pageBean.setRequest(request);
    36. List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);
    37. request.setAttribute("lst",lst);
    38. request.setAttribute("pageBean",pageBean);
    39. return "clz/clzList";
    40. }
    41. @RequestMapping("/toEdit")
    42. public String toEdit(Clazz clazz, HttpServletRequest request){
    43. Integer cid = clazz.getCid();
    44. // 传递的id代表了修改,没传代表新增
    45. if(cid != null){
    46. List<Clazz> lst = this.clazzBiz.listPager(clazz, null);
    47. request.setAttribute("b",lst.get(0));
    48. }
    49. return "clz/clzEdit";
    50. }
    51. @RequestMapping("/add")
    52. public String add(Clazz clazz){
    53. this.clazzBiz.insertSelective(clazz);
    54. return "redirect:/clz/list";
    55. }
    56. @RequestMapping("/edit")
    57. public String edit(Clazz clazz){
    58. this.clazzBiz.updateByPrimaryKeySelective(clazz);
    59. return "redirect:/clz/list";
    60. }
    61. @RequestMapping("/del")
    62. public String del(Clazz clazz){
    63. this.clazzBiz.deleteByPrimaryKey(clazz.getCid());
    64. return "redirect:/clz/list";
    65. }
    66. }

    PagerAspect :

    1. package com.ycx.spboot04.aspect;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.ycx.spboot04.util.PageBean;
    5. import org.aspectj.lang.ProceedingJoinPoint;
    6. import org.aspectj.lang.annotation.Around;
    7. import org.aspectj.lang.annotation.Aspect;
    8. import org.springframework.stereotype.Component;
    9. import java.util.List;
    10. @Component
    11. @Aspect
    12. public class PagerAspect {
    13. /**
    14. * *:返回值类型
    15. * *..:无限包
    16. * *Service:以Service结尾接口名
    17. * *Pager:以Pager方法
    18. * 只要同时匹配上诉四个条件,就会被列为目标对象
    19. * 上述配置要生效,代理注解不能少
    20. * @param args
    21. * @return
    22. * @throws Throwable
    23. */
    24. @Around("execution(* *..*Biz.*Pager(..))")
    25. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    26. Object[] params = args.getArgs();
    27. PageBean pageBean = null;
    28. for (Object param : params) {
    29. if(param instanceof PageBean){
    30. pageBean = (PageBean)param;
    31. break;
    32. }
    33. }
    34. if(pageBean != null && pageBean.isPagination())
    35. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    36. // 执行目标方法
    37. Object list = args.proceed(params);
    38. if(null != pageBean && pageBean.isPagination()){
    39. PageInfo pageInfo = new PageInfo((List) list);
    40. pageBean.setTotal(pageInfo.getTotal()+"");
    41. }
    42. return list;
    43. }
    44. }

    StringUtils :

    1. package com.ycx.spboot04.util;
    2. public class StringUtils {
    3. // 私有的构造方法,保护此类不能在外部实例化
    4. private StringUtils() {
    5. }
    6. /**
    7. * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
    8. *
    9. * @param s
    10. * @return
    11. */
    12. public static boolean isBlank(String s) {
    13. boolean b = false;
    14. if (null == s || s.trim().equals("")) {
    15. b = true;
    16. }
    17. return b;
    18. }
    19. /**
    20. * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
    21. *
    22. * @param s
    23. * @return
    24. */
    25. public static boolean isNotBlank(String s) {
    26. return !isBlank(s);
    27. }
    28. }

     Spboot04Application :

    1. package com.ycx.spboot04;
    2. import org.mybatis.spring.annotation.MapperScan;
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5. import org.springframework.transaction.annotation.EnableTransactionManagement;
    6. @MapperScan("com.ycx.spboot04.mapper")
    7. @EnableTransactionManagement
    8. @SpringBootApplication
    9. public class Spboot04Application {
    10. public static void main(String[] args) {
    11. SpringApplication.run(Spboot04Application.class, args);
    12. }
    13. }

     前端页面处理:

    clzList.ftl:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    5. <link
    6. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    7. rel="stylesheet">
    8. <script
    9. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js">script>
    10. <title>班级列表title>
    11. <style type="text/css">
    12. .page-item input {
    13. padding: 0;
    14. width: 40px;
    15. height: 100%;
    16. text-align: center;
    17. margin: 0 6px;
    18. }
    19. .page-item input, .page-item b {
    20. line-height: 38px;
    21. float: left;
    22. font-weight: 400;
    23. }
    24. .page-item.go-input {
    25. margin: 0 10px;
    26. }
    27. style>
    28. head>
    29. <body>
    30. <#include '/common.ftl'/>
    31. <#--查询的条件框-->
    32. <form class="form-inline"
    33. action="${ctx }/clz/list" method="post">
    34. <div class="form-group mb-2">
    35. <input type="text" class="form-control-plaintext" name="cname"
    36. placeholder="请输入班级名称">
    37. div>
    38. <button type="submit" class="btn btn-primary mb-2">查询button>
    39. <a class="btn btn-primary mb-2" href="${ctx }/clz/toEdit">新增a>
    40. form>
    41. <#--数据展示条-->
    42. <table class="table table-striped ">
    43. <thead>
    44. <tr>
    45. <th scope="col">IDth>
    46. <th scope="col">班级名称th>
    47. <th scope="col">指导老师th>
    48. <th scope="col">操作th>
    49. tr>
    50. thead>
    51. <tbody>
    52. <#list lst as b>
    53. <tr>
    54. <td>${b.cid !}td>
    55. <td>${b.cname !}td>
    56. <td>${b.cteacher !}td>
    57. <td>
    58. <a href="${ctx }/clz/toEdit?cid=${b.cid}">修改a>
    59. <a href="${ctx }/clz/del?cid=${b.cid}">删除a>
    60. td>
    61. tr>
    62. tbody>
    63. table>
    64. body>
    65. html>

    clzEdit.ftl:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    5. <title>编辑界面title>
    6. head>
    7. <body>
    8. <#include '/common.ftl' />
    9. <#if b??>
    10. <#--修改-->
    11. <form action="${ctx }/clz/edit" method="post">
    12. cid:<input type="text" name="cid" value="${b.cid !}"><br>
    13. cname:<input type="text" name="cname" value="${b.cname !}"><br>
    14. cteacher:<input type="text" name="cteacher" value="${b.cteacher !}">span><br>
    15. <input type="submit">
    16. form>
    17. <#else >
    18. <#--新增-->
    19. <form action="${ctx }/clz/add" method="post">
    20. cid:<input type="text" name="cid" value=""><br>
    21. cname:<input type="text" name="cname" value=""><br>
    22. cteacher:<input type="text" name="cteacher" value=""><br>
    23. <input type="submit">
    24. form>
    25. body>
    26. html>

    此时页面效果如下:

     删除了id为10 :

     

     新增成功:

     

     

    为了检查方便,可以在yml文件里添加如下:

    1. logging:
    2. level:
    3. com.ycx.spboot04:debug

    接下来设置分页功能:

    用于Freemarker引擎生成分页条的工具类

    FreemarkerPageHelper .java:

    1. package com.ycx.spboot04.util;
    2. import java.util.Map;
    3. import java.util.Set;
    4. /**
    5. * @author 杨总
    6. * @create 2022-11-02 13:25
    7. */
    8. public class FreemarkerPageHelper {
    9. public static String toHTML(PageBean pageBean) {
    10. StringBuffer sb = new StringBuffer();
    11. // 隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
    12. // 上一次请求的URL
    13. sb.append("
      ");
    14. sb.append(" ");
    15. // 上一次请求的参数
    16. Map<String, String[]> paramMap = pageBean.getParamMap();
    17. if(paramMap != null && paramMap.size() > 0) {
    18. Set<Map.Entry<String, String[]>> entrySet = paramMap.entrySet();
    19. for (Map.Entry<String, String[]> entry : entrySet) {
    20. // 参数名
    21. String key = entry.getKey();
    22. // 参数值
    23. for (String value : entry.getValue()) {
    24. // 上一次请求的参数,再一次组装成了新的Form表单
    25. // 注意:page参数每次都会提交,我们需要避免
    26. if(!"page".equals(key)) {
    27. sb.append(" ");
    28. }
    29. }
    30. }
    31. }
    32. sb.append("");
    33. // 分页条
    34. sb.append("
        ");
    35. sb.append("
    36. );
  • ");
  • sb.append("
  • );
  • ");// less than 小于号
  • // sb.append("
  • 1
  • ");
  • // sb.append("
  • 2
  • ");
  • sb.append("
  • "+pageBean.getPage()+"
  • ");
  • sb.append("
  • >
  • ");
  • sb.append("
  • 尾页
  • ");
  • sb.append("
  • 到第);
  • sb.append(" type='text' id='skipPage' name='' />
  • ");
  • sb.append("
  • );
  • ");
  • sb.append("
  • 共"+pageBean.getTotal()+"条
  • ");
  • sb.append("");
  • // 分页执行的JS代码
  • sb.append("");
  • return sb.toString();
  • }
  • }
  • 去controller添加: 

     还有clzList添加:

     运行效果 :

    今日就分享到这里咯,再会!

  • 相关阅读:
    Python爬取阿里巴巴商城数据
    Windows安装Redis详细步骤
    Java泛型
    【生成模型】解决生成模型面对长尾类型物体时的问题 RE-IMAGEN: RETRIEVAL-AUGMENTED TEXT-TO-IMAGE GENERATOR
    38. 【Android教程】Handler 消息传递机制
    Databend使用入门
    经典电源电路基础(变压-整流-滤波-稳压)
    Monkey命令
    mysql8 添加一个用户 并给与所有权限 报错解决
    first()案例和take(n)案例_大数据培训课程
  • 原文地址:https://blog.csdn.net/weixin_65808248/article/details/127638261