springboot视图渲染技术

目录

  • 一、Freemarker简介及入门
  • 二、Freemarker语法
    • 2.1 取值
      • 2.1.1 提供默认值
      • 2.1.2 对Null值先进行判断
        • ①exist用于逻辑判断
        • ② ??是判断对象是否为空
        • ③if_exists用来打印东西
        • ④测试
    • 2.2 条件
    • 2.3 循环
      • ①取出数组中的元素
      • ②取出对象中的元素(对象必须被public修饰)
      • ③测试
    • 2.4 include指令and局部变量全局变量
  • 三、Freemarker综合案例
    • PagerAspect
    • ClazzMapper
    • ClazzMapper.xml
    • ClazzBiz
    • ClazzBizImpl
    • ClazzController
    • FreemarkerPageHelper
    • PageBean
    • StringUtils
    • SpringbootviemApplication
    • clzEdit.ftl
    • clzList.ftl
    • application.yml
    • pom.xml
    • 测试
      • 增加
      • 修改
      • 删除
      • 分页
  • 静态资源访问

一、Freemarker简介及入门

参考网址
http://freemarker.foofun.cn/

创建项目如下

springboot视图渲染技术_第1张图片
springboot视图渲染技术_第2张图片
springboot视图渲染技术_第3张图片
springboot视图渲染技术_第4张图片
springboot视图渲染技术_第5张图片
springboot视图渲染技术_第6张图片

springboot视图渲染技术_第7张图片

刚刚开始我们右键创建类是没有Freemarker选项的,所以我们进行配置

File>Settings>Editor>File and Code Templates

springboot视图渲染技术_第8张图片

首先复制HTML模板

springboot视图渲染技术_第9张图片

springboot视图渲染技术_第10张图片

配置application.properties

springboot视图渲染技术_第11张图片

mybatis:
    mapper-locations: classpath:mappers/**/*xml
    type-aliases-package: com.xlb.springbootviem.mybatis.entity
server:
    port: 8080
spring:
    application:
        name: springbootviem
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        name: defaultDataSource
        password: 123456
        url: jdbc:mysql://localhost:3306/y101?useUnicode=true&characterEncoding=UTF-8
        username: root
    freemarker:
        cache: false
        charset: utf-8
        expose-request-attributes: true
        expose-session-attributes: true
        suffix: .ftl
        template-loader-path: classpath:/templates/
#    resources:
#        static-locations: classpath:/static/# 应用服务 WEB 访问端口
    mvc:
        static-path-pattern: classpath:/static/

降低MySQL的版本

springboot视图渲染技术_第12张图片

测试

text.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    欢迎来到Freemarker首页
</body>
</html>

ViemController

package com.xlb.springbootviem.web;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 波哥
 * @QQ 2212371722
 * @company 波哥集团
 * @create  2022-11-01 16:39
 */
@Controller
public class ViemController {

    @RequestMapping("/")
    public String index(){
        return "index";
    }


}

启动项目测试

springboot视图渲染技术_第13张图片
springboot视图渲染技术_第14张图片

二、Freemarker语法

2.1 取值

2.1.1 提供默认值

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>取值h3>
<p>1.1 提供默认值p>
<#-- 如果改uname的值为空,而且没有提供默认值,那么就会报错 -->
${uname}

body>
html>

ViemController

package com.xlb.springbootviem.web;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 波哥
 * @QQ 2212371722
 * @company 波哥集团
 * @create  2022-11-01 16:39
 */
@Controller
public class ViemController {

    @RequestMapping("/")
    public String index(Model model){
        model.addAttribute("uname","小谢");
        return "index";
    }


}

springboot视图渲染技术_第15张图片
解决接收值为空报错
① 加入 ==!==号

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>取值h3>
<p>1.1 提供默认值p>
<#-- 如果改uname的值为空,而且没有提供默认值,那么就会报错 -->
<#--${uname}-->

<#-- 解决接收值为空报错 -->
${uname !}

body>
html>

ViemController

package com.xlb.springbootviem.web;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 波哥
 * @QQ 2212371722
 * @company 波哥集团
 * @create  2022-11-01 16:39
 */
@Controller
public class ViemController {

    @RequestMapping("/")
    public String index(Model model){
        /*model.addAttribute("uname","小谢");*/
        return "index";
    }


}

运行测试

springboot视图渲染技术_第16张图片

设置默认值(当后台没有值,取默认值,有则反之)

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>取值h3>
<p>1.1 提供默认值p>
<#-- 如果改uname的值为空,而且没有提供默认值,那么就会报错 -->
<#--${uname}-->

<#-- 解决接收值为空报错 -->
<#--${uname !}-->
${uname ! '小强'}

body>
html>

springboot视图渲染技术_第17张图片

2.1.2 对Null值先进行判断

①exist用于逻辑判断

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>取值h3>
<p>1.1 提供默认值p>
<#-- 如果改uname的值为空,而且没有提供默认值,那么就会报错 -->
<#--${uname}-->

<#-- 解决接收值为空报错 -->
<#--${uname !}-->
<#--${uname ! '小强'}-->


<p>1.2 对null值先进行判断p>
<br>
1) exist用在逻辑判断
<#if uname?exists>
    ${uname}
#if>
body>
html>

② ??是判断对象是否为空

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>取值h3>
<p>1.1 提供默认值p>
<#-- 如果改uname的值为空,而且没有提供默认值,那么就会报错 -->
<#--${uname}-->

<#-- 解决接收值为空报错 -->
<#--${uname !}-->
<#--${uname ! '小强'}-->


<p>1.2 对null值先进行判断p>
<br>
2) ?? 判断对象是否为空
<#if uname??>
    ${uname}
#if>

body>
html>

③if_exists用来打印东西

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>取值h3>
<p>1.1 提供默认值p>
<#-- 如果改uname的值为空,而且没有提供默认值,那么就会报错 -->
<#--${uname}-->

<#-- 解决接收值为空报错 -->
<#--${uname !}-->
<#--${uname ! '小强'}-->


<p>1.2 对null值先进行判断p>
<br>
3)if_exits打印对象
${uname?if_exists}
body>
html>

④测试

ViemController的uname有值
springboot视图渲染技术_第18张图片
ViemController的uname没有值

springboot视图渲染技术_第19张图片

2.2 条件

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>条件h3>
<#if sex='nv'><#elseif sex='nan'><#else>
    未知
#if>
body>
html>

ViemController

package com.xlb.springbootviem.web;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 波哥
 * @QQ 2212371722
 * @company 波哥集团
 * @create  2022-11-01 16:39
 */
@Controller
public class ViemController {

    @RequestMapping("/")
    public String index(Model model){
        /*model.addAttribute("uname","小谢");*/
        model.addAttribute("sex","nan");
        return "index";
    }


}

测试
springboot视图渲染技术_第20张图片
把后台值换成nv
springboot视图渲染技术_第21张图片
后台值缓存其他
springboot视图渲染技术_第22张图片

2.3 循环

①取出数组中的元素

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
<h3>循环h3>
1)取出数组中的元素
<#list arr as a>
    #{a}<br>
#list>
body>
html>

②取出对象中的元素(对象必须被public修饰)

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
2)取出对象中的元素(对象必须被public修饰)
<#list users as a>
    <br>${a.id}:${a.name}
#list>
body>
html>

③测试

User.java

package com.xlb.springbootviem.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author 波哥
 * @QQ 2212371722
 * @company 波哥集团
 * @create  2022-11-01 17:36
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
}

ViemController

package com.xlb.springbootviem.web;


import com.xlb.springbootviem.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Arrays;

/**
 * @author 波哥
 * @QQ 2212371722
 * @company 波哥集团
 * @create  2022-11-01 16:39
 */
@Controller
public class ViemController {

    @RequestMapping("/")
    public String index(Model model){
        /*model.addAttribute("uname","小谢");*/
        model.addAttribute("sex","nvs");
        model.addAttribute("users", Arrays.asList(new User(1,"zs"),new User(2,"ls"),new User(3,"ww")));
        model.addAttribute("arr",new Integer[]{1,2,3,4,56});
        return "index";
    }
}

springboot视图渲染技术_第23张图片

2.4 include指令and局部变量全局变量

为了方便演示结果,所以博主在application.yml修改访问路径

springboot视图渲染技术_第24张图片

templates下创建文件head.ftl

head.ftl

<#--局部变量-->
<#assign ctx>
    ${springMacroRequestContext.contextPath}
#assign>


<#--全局变量-->
<#global ctx2>
    ${springMacroRequestContext.contextPath}
#global>

index.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>



<h3>include指令h3>
<#include '/head.ftl'>
<h3>局部变量全局变量h3>
${ctx}:${ctx2}




body>
html>

springboot视图渲染技术_第25张图片

三、Freemarker综合案例

这边博主就没有自动生成代码,kopissm项目来完善(springboot支持ssm开发模式)
博主这边直接上代码了

目录结构

springboot视图渲染技术_第26张图片

PagerAspect

package com.xlb.springbootviem.aspect;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xlb.springbootviem.util.PageBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author小李飞刀
 * @site www.javaxl.com
 * @company xxx公司
 * @create  2022-08-12 16:32
 */
@Component
@Aspect
public class PagerAspect {

    /**
     * *:返回值类型
     * *..:无限包
     * *Service:以Service结尾接口名
     * *Pager:以Pager方法
     * 只要同时匹配上诉四个条件,就会被列为目标对象
     * 上述配置要生效,代理注解不能少
     * @param args
     * @return
     * @throws Throwable
     */
    @Around("execution(* *..*Biz.*Pager(..))")
    public Object invoke(ProceedingJoinPoint args) throws Throwable {
        Object[] params = args.getArgs();
        PageBean pageBean = null;
        for (Object param : params) {
            if(param instanceof PageBean){
                pageBean = (PageBean)param;
                break;
            }
        }

        if(pageBean != null && pageBean.isPagination())
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());

//        执行目标方法
        Object list = args.proceed(params);

        if(null != pageBean && pageBean.isPagination()){
            PageInfo pageInfo = new PageInfo((List) list);
            pageBean.setTotal(pageInfo.getTotal()+"");
        }
        return list;
    }


}

ClazzMapper

package com.xlb.springbootviem.mapper;

import com.xlb.springbootviem.model.Clazz;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public interface ClazzMapper {
    int deleteByPrimaryKey(Integer cid);

    int insert(Clazz record);

    int insertSelective(Clazz record);

    Clazz selectByPrimaryKey(Integer cid);

    List<Clazz> listPager(Clazz clazz);

    List<Map> listMapPager(Clazz clazz);

    int updateByPrimaryKeySelective(Clazz record);

    int updateByPrimaryKey(Clazz record);
}

ClazzMapper.xml

<?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="com.xlb.springbootviem.mapper.ClazzMapper" >
  <resultMap id="BaseResultMap" type="com.xlb.springbootviem.model.Clazz" >
    <constructor >
      <idArg column="cid" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="cname" jdbcType="VARCHAR" javaType="java.lang.String" />
      <arg column="cteacher" jdbcType="VARCHAR" javaType="java.lang.String" />
      <arg column="pic" jdbcType="VARCHAR" javaType="java.lang.String" />
    </constructor>
  </resultMap>
  <sql id="Base_Column_List" >
    cid, cname, cteacher, pic
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from t_struts_class
    where cid = #{cid,jdbcType=INTEGER}
  </select>

  <select id="listMapPager" resultType="java.util.Map" parameterType="com.xlb.springbootviem.model.Clazz" >
    select
    <include refid="Base_Column_List" />
    from t_struts_class
    <where>
      <if test="cname != null and cname != ''">
         and cname like CONCAT('%',#{cname},'%')
      </if>
      <if test="cid != null and cid != ''">
        and cid = #{cid}
      </if>
    </where>
  </select>

  <select id="listPager" resultType="com.xlb.springbootviem.model.Clazz" parameterType="com.xlb.springbootviem.model.Clazz" >
    select
    <include refid="Base_Column_List" />
    from t_struts_class
    <where>
      <if test="cname != null and cname != ''">
        and cname like CONCAT('%',#{cname},'%')
      </if>
      <if test="cid != null and cid != ''">
        and cid = #{cid}
      </if>
    </where>
  </select>

  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from t_struts_class
    where cid = #{cid,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.xlb.springbootviem.model.Clazz" >
    insert into t_struts_class (cid, cname, cteacher, 
      pic)
    values (#{cid,jdbcType=INTEGER}, #{cname,jdbcType=VARCHAR}, #{cteacher,jdbcType=VARCHAR}, 
      #{pic,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.xlb.springbootviem.model.Clazz" >
    insert into t_struts_class
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="cid != null" >
        cid,
      </if>
      <if test="cname != null" >
        cname,
      </if>
      <if test="cteacher != null" >
        cteacher,
      </if>
      <if test="pic != null" >
        pic,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="cid != null" >
        #{cid,jdbcType=INTEGER},
      </if>
      <if test="cname != null" >
        #{cname,jdbcType=VARCHAR},
      </if>
      <if test="cteacher != null" >
        #{cteacher,jdbcType=VARCHAR},
      </if>
      <if test="pic != null" >
        #{pic,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.xlb.springbootviem.model.Clazz" >
    update t_struts_class
    <set >
      <if test="cname != null" >
        cname = #{cname,jdbcType=VARCHAR},
      </if>
      <if test="cteacher != null" >
        cteacher = #{cteacher,jdbcType=VARCHAR},
      </if>
      <if test="pic != null" >
        pic = #{pic,jdbcType=VARCHAR},
      </if>
    </set>
    where cid = #{cid,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.xlb.springbootviem.model.Clazz" >
    update t_struts_class
    set cname = #{cname,jdbcType=VARCHAR},
      cteacher = #{cteacher,jdbcType=VARCHAR},
      pic = #{pic,jdbcType=VARCHAR}
    where cid = #{cid,jdbcType=INTEGER}
  </update>
</mapper>

ClazzBiz

package com.xlb.springbootviem.biz;

import com.xlb.springbootviem.model.Clazz;
import com.xlb.springbootviem.util.PageBean;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;

import java.util.List;
import java.util.Map;

public interface ClazzBiz {
    @CacheEvict(value = "xx",key = "'cid:'+#cid",allEntries = true)
    int deleteByPrimaryKey(Integer cid);

    int insert(Clazz record);

    int insertSelective(Clazz record);

//    xx=cache-cid:1
//    key的作用改变原有的key生成规则
//    @Cacheable(value = "xx",key = "'cid:'+#cid",condition = "#cid > 6")
    @CachePut(value = "xx",key = "'cid:'+#cid",condition = "#cid > 6")
    Clazz selectByPrimaryKey(Integer cid);

    int updateByPrimaryKeySelective(Clazz record);

    int updateByPrimaryKey(Clazz record);

    List<Clazz> listPager(Clazz clazz, PageBean pageBean);
    List<Map> listMapPager(Clazz clazz, PageBean pageBean);
}

ClazzBizImpl

package com.xlb.springbootviem.biz.impl;

import com.xlb.springbootviem.biz.ClazzBiz;
import com.xlb.springbootviem.mapper.ClazzMapper;
import com.xlb.springbootviem.model.Clazz;
import com.xlb.springbootviem.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @author小李飞刀
 * @site www.javaxl.com
 * @company xxx公司
 * @create  2022-08-17 15:13
 */
@Service
public class ClazzBizImpl implements ClazzBiz {
    @Autowired
    private ClazzMapper clazzMapper;
    @Override
    public int deleteByPrimaryKey(Integer cid) {
       // System.out.println("不做任何操作...");
        return clazzMapper.deleteByPrimaryKey(cid);
    }

    @Override
    public int insert(Clazz record) {
        return clazzMapper.insert(record);
    }

    @Override
    public int insertSelective(Clazz record) {
        return clazzMapper.insertSelective(record);
    }

    @Override
    public Clazz selectByPrimaryKey(Integer cid) {
        return clazzMapper.selectByPrimaryKey(cid);
    }

    @Override
    public int updateByPrimaryKeySelective(Clazz record) {
        return clazzMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Clazz record) {
        return clazzMapper.updateByPrimaryKey(record);
    }

    @Override
    public List<Clazz> listPager(Clazz clazz, PageBean pageBean) {
        return clazzMapper.listPager(clazz);
    }

    @Override
    public List<Map> listMapPager(Clazz clazz, PageBean pageBean) {
        if(true)
            throw new RuntimeException("查询班级信息异常,异常存在于ClazzBizImpl.list。。。。");
        return clazzMapper.listMapPager(clazz);
    }
}

ClazzController

package com.xlb.springbootviem.controller;

import com.xlb.springbootviem.biz.ClazzBiz;
import com.xlb.springbootviem.model.Clazz;
import com.xlb.springbootviem.util.FreemarkerPageHelper;
import com.xlb.springbootviem.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author小李飞刀
 * @site www.javaxl.com
 * @company xxx公司
 * @create  2022-08-17 15:23
 */
@Controller
@RequestMapping("/clz")
public class ClazzController {
    @Autowired
    private ClazzBiz clazzBiz;
//    list->clzList
//    toList->重定向list->"redirect:/clz/list"
//    toEdit->跳转到编辑界面->clzEdit
//    Clazz : 以前是通过模型驱动接口封装,现在是直接在方法中接受参数即可
    @RequestMapping("/list")
    public String list(Clazz clazz, HttpServletRequest request){
        System.out.println("我添加了 新的代码,终于不重启了....");
        PageBean pageBean = new PageBean();
        pageBean.setRequest(request);
        List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);
        request.setAttribute("lst",lst);
        request.setAttribute("pageBean",pageBean);
        //调用分页工具类
        request.setAttribute("pagehepr",FreemarkerPageHelper.toHTML(pageBean));
        return "clz/clzList";
    }

    @RequestMapping("/toEdit")
    public String toEdit(Clazz clazz, HttpServletRequest request){
        Integer cid = clazz.getCid();
//        传递的id代表了修改,没传代表新增
        if(cid != null){
            List<Clazz> lst = this.clazzBiz.listPager(clazz, null);
            request.setAttribute("b",lst.get(0));
        }
        return "clz/clzEdit";
    }

    @RequestMapping("/add")
    public String add(Clazz clazz){
        this.clazzBiz.insertSelective(clazz);
        return "redirect:/clz/list";
    }

    /**
     * @Valid 是与实体类中 的服务端校验 注解配合使用的
     * BindingResult 存放了所有违背 校验的错误信息
     * @param clazz
     * @param bindingResult
     * @return
     */
    @RequestMapping("/valiAdd")
    public String valiAdd(Clazz clazz, BindingResult bindingResult,HttpServletRequest request){
        if (bindingResult.hasErrors()){
            Map msg = new HashMap();
//            违背规则
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
//                cid : cid不能为空
                System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
//                msg.put(cid,cid不能为空);
                msg.put(fieldError.getField(),fieldError.getDefaultMessage());
            }
            request.setAttribute("msg",msg);
//            如果出现了错误,应该将提示语显示在 表单提交元素后方
            return "clzEdit";
        }else {
            this.clazzBiz.insertSelective(clazz);
        }
        
        return "redirect:/clz/list";
    }

    @RequestMapping("/edit")
    public String edit(Clazz clazz){
        this.clazzBiz.updateByPrimaryKeySelective(clazz);
        return "redirect:/clz/list";
    }

    @RequestMapping("/del")
    public String del(Clazz clazz){
        this.clazzBiz.deleteByPrimaryKey(clazz.getCid());
        return "redirect:/clz/list";
    }

}

FreemarkerPageHelper

package com.xlb.springbootviem.util;

import java.util.Map;
import java.util.Set;

/**
 * @author 波哥
 * @QQ 2212371722
 * @company 波哥集团
 * @create  2022-11-01 19:35
 */
public class FreemarkerPageHelper {

    public static String toHTML(PageBean pageBean) {
        StringBuffer sb = new StringBuffer();
//		隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
//		上一次请求的URL
        sb.append("
"); sb.append(" "); // 上一次请求的参数 Map<String, String[]> paramMap = pageBean.getParamMap(); if(paramMap != null && paramMap.size() > 0) { Set<Map.Entry<String, String[]>> entrySet = paramMap.entrySet(); for (Map.Entry<String, String[]> entry : entrySet) { // 参数名 String key = entry.getKey(); // 参数值 for (String value : entry.getValue()) { // 上一次请求的参数,再一次组装成了新的Form表单 // 注意:page参数每次都会提交,我们需要避免 if(!"page".equals(key)) { sb.append(" "); } } } } sb.append(""
); // 分页条 sb.append(""); // 分页执行的JS代码 sb.append(""); return sb.toString(); } }

PageBean

package com.xlb.springbootviem.util;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
 * 分页工具类
 *
 */
public class PageBean {

	private int page = 1;// 页码

	private int rows = 10;// 页大小

	private int total = 0;// 总记录数

	private boolean pagination = true;// 是否分页
	
	private String url; //保存上一次请求的URL
	
	private Map<String,String[]> paramMap = new HashMap<>();// 保存上一次请求的参数
	
	/**
	 * 初始化pagebean的,保存上一次请求的重要参数
	 * @param req
	 */
	public void setRequest(HttpServletRequest req) {
//		1.1	需要保存上一次请求的URL
		this.setUrl(req.getRequestURL().toString());
//		1.2	需要保存上一次请求的参数	bname、price
		this.setParamMap(req.getParameterMap());
//		1.3	需要保存上一次请求的分页设置	pagination
		this.setPagination(req.getParameter("pagination"));
//		1.4	需要保存上一次请求的展示条目数
		this.setRows(req.getParameter("rows"));
//		1.5  初始化请求的页码	page
		this.setPage(req.getParameter("page"));
	}
	
	public void setPage(String page) {
		if(StringUtils.isNotBlank(page))
			this.setPage(Integer.valueOf(page));
	}

	public void setRows(String rows) {
		if(StringUtils.isNotBlank(rows))
			this.setRows(Integer.valueOf(rows));
	}

	public void setPagination(String pagination) {
//		只有在前台jsp填写了pagination=false,才代表不分页
		if(StringUtils.isNotBlank(pagination))
			this.setPagination(!"false".equals(pagination));
	}


	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getParamMap() {
		return paramMap;
	}

	public void setParamMap(Map<String, String[]> paramMap) {
		this.paramMap = paramMap;
	}



	public PageBean() {
		super();
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return pagination;
	}

	public void setPagination(boolean pagination) {
		this.pagination = pagination;
	}

	/**
	 * 获得起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (this.page - 1) * this.rows;
	}
	
	/**
	 * 最大页
	 * @return
	 */
	public int maxPage() {
//		total % rows == 0 ? total / rows : total / rows +1
		return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows + 1;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int nextPage() {
//		如果当前页小于最大页,那就下一页为当前页+1;如果不小于,说明当前页就是最大页,那就无需+1
		return this.page < this.maxPage() ? this.page + 1 : this.page;
	}
	
	/**
	 * 上一页
	 * @return
	 */
	public int previousPage() {
		return this.page > 1 ? this.page - 1 : this.page;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
	}

}

StringUtils

package com.xlb.springbootviem.util;

public class StringUtils {
	// 私有的构造方法,保护此类不能在外部实例化
	private StringUtils() {
	}

	/**
	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isBlank(String s) {
		boolean b = false;
		if (null == s || s.trim().equals("")) {
			b = true;
		}
		return b;
	}
	
	/**
	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNotBlank(String s) {
		return !isBlank(s);
	}

}

SpringbootviemApplication

package com.xlb.springbootviem;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

//完成对mapper接口的扫描
@MapperScan("com.xlb.springbootviem.mapper")
//开启事务管理
@EnableTransactionManagement
@SpringBootApplication
public class SpringbootviemApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootviemApplication.class, args);
    }

}

clzEdit.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>博客的编辑界面title>
head>
<body>
<#include '/head.ftl' />
<#if b??>
   <#-- 修改-->
    <form action="${ctx }/clz/edit">
        cid:<input type="text" name="cid" value="${b.cid !}">
        cname:<input type="text" name="cname" value="${b.cname !}">
        cteacher:<input type="text" name="cteacher" value="${b.cteacher !}">
        <input type="submit">
    form>
    <#else>
        <#-- 新增 -->
        <form action="${ctx }/clz/add" method="post">
            cid:<input type="text" name="cid" value="">
            cname:<input type="text" name="cname" value="">
            cteacher:<input type="text" name="cteacher" value="">
            <input type="submit">
        form>
#if>

body>
html>

clzList.ftl

DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link
            href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
            rel="stylesheet">
    <script
            src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js">script>
    <title>博客列表title>
    <style type="text/css">
        .page-item input {
            padding: 0;
            width: 40px;
            height: 100%;
            text-align: center;
            margin: 0 6px;
        }

        .page-item input, .page-item b {
            line-height: 38px;
            float: left;
            font-weight: 400;
        }

        .page-item.go-input {
            margin: 0 10px;
        }
    style>
head>
<body>
<#include '/head.ftl' />
<#-- 查询条件框  -->
<form class="form-inline"
      action="${ctx}/clz/list" method="post">
    <div class="form-group mb-2">
        <input type="text" class="form-control-plaintext" name="cname"
               placeholder="请输入班级名称">
    div>
    <button type="submit" class="btn btn-primary mb-2">查询button>
    <a class="btn btn-primary mb-2" href="${ctx}/clz/toEdit">新增a>
form>
<table class="table table-striped bg-success">
    <thead>
    <tr>
        <th scope="col">IDth>
        <th scope="col">班级名称th>
        <th scope="col">指导老师th>
        <th scope="col">班级相册th>
        <th scope="col">操作th>
    tr>
    thead>
    <tbody>
    <#list lst as b>
        <tr>
            <td>${b.cid !}td>
            <td>${b.cname !}td>
            <td>${b.cteacher !}td>
            <td>
                <a href="${ctx }/clz/toEdit?cid=${b.cid}">修改a>
                <a href="${ctx }/clz/del?cid=${b.cid}">删除a>
            td>
        tr>
    #list>
    tbody>
table>
${pagehepr !}

body>
html>

application.yml

mybatis:
    mapper-locations: classpath:mappers/**/*xml
    type-aliases-package: com.xlb.springbootviem.mybatis.model
server:
    port: 8080
    servlet:
        context-path: /spboots
spring:
    application:
        name: springbootviem
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        name: defaultDataSource
        password: 123456
        url: jdbc:mysql://localhost:3306/y101?useUnicode=true&characterEncoding=UTF-8
        username: root
    freemarker:
        cache: false
        charset: utf-8
        expose-request-attributes: true
        expose-session-attributes: true
        suffix: .ftl
        template-loader-path: classpath:/templates/
#    resources:
#        static-locations: classpath:/static/# 应用服务 WEB 访问端口
    mvc:
        static-path-pattern: classpath:/static/
# 整合分页
pagehelper:
    reasonable: true
    supportMethodsArguments: true
    page-size-zero: true
    helper-dialect: mysql
#打印SQL语句
logging:
    level:
      com.xlb.springbootviem: debug


pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>com.xlbgroupId>
    <artifactId>springbootviemartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>springbootviemname>
    <description>Demo project for Spring Bootdescription>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASEspring-boot.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-freemarkerartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-jdbcartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.mybatis.spring.bootgroupId>
            <artifactId>mybatis-spring-boot-starterartifactId>
            <version>2.1.4version>
        dependency>

        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.44version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aspectsartifactId>
            <version>5.0.2.RELEASEversion>
        dependency>
        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelper-spring-boot-starterartifactId>
            <version>1.2.3version>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>${spring-boot.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <version>2.3.7.RELEASEversion>
                <configuration>
                    <mainClass>com.xlb.springbootviem.SpringbootviemApplicationmainClass>
                configuration>
                <executions>
                    <execution>
                        <id>repackageid>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>

project>

测试

启动项目

springboot视图渲染技术_第27张图片

增加

在这里插入图片描述
springboot视图渲染技术_第28张图片

修改

在这里插入图片描述
springboot视图渲染技术_第29张图片

删除

springboot视图渲染技术_第30张图片
springboot视图渲染技术_第31张图片

分页

springboot视图渲染技术_第32张图片

静态资源访问

配置application.yml

mybatis:
    mapper-locations: classpath:mappers/**/*xml
    type-aliases-package: com.xlb.springbootviem.mybatis.model
server:
    port: 8080
    servlet:
        context-path: /spboots
spring:
    application:
        name: springbootviem
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        name: defaultDataSource
        password: 123456
        url: jdbc:mysql://localhost:3306/y101?useUnicode=true&characterEncoding=UTF-8
        username: root
    freemarker:
        cache: false
        charset: utf-8
        expose-request-attributes: true
        expose-session-attributes: true
        suffix: .ftl
        template-loader-path: classpath:/templates/
#    resources:
#        static-locations: classpath:/static/# 应用服务 WEB 访问端口
    mvc:
        static-path-pattern: /static/**
# 整合分页
pagehelper:
    reasonable: true
    supportMethodsArguments: true
    page-size-zero: true
    helper-dialect: mysql
#打印SQL语句
logging:
    level:
      com.xlb.springbootviem: debug


你可能感兴趣的:(Spring,Boot,spring,boot,mybatis,java)