Springboot视图渲染技术

本文主要介绍了Springboot中使用Freemarker进行视图渲染的技术,包括Freemarker的基本语法和综合案例。从创建项目、配置依赖到实践操作,如实体类、控制器的设置,以及AOP和PageHelper插件的整合,展示了如何将jsp页面转换为Freemarker模板,并实现了分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、freemaker基本语法

 二、freemarer综合案例


一、freemaker基本语法

 创建项目

 导入下载依赖

 

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
    <groupId>com.zking</groupId>
    <artifactId>spboot04</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spboot04</name>
    <description>Demo project for Spring Boot</description>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.zking.spboot04.Spboot04Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

 添加fressmarker

 

 

 

 

 

 application.yml

 

mybatis:
    mapper-locations: classpath:mappers/*xml
    type-aliases-package: com.zking.spboot04.mybatis.entity
server:
    port: 8080
spring:
    application:
        name: spboot04
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        name: defaultDataSource
        password: 123456
        url: jdbc:mysql://localhost:3306/db_0701?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/
    mvc:
        static-path-pattern: /static/**

 index.ftl

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

 helloController

package com.zking.spboot04.Controller;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.Arrays;

/**
 * @author 锦鲤
 * @site www.lucy.com
 * @company xxx公司
 * @create  2022-11-02 11:17
 */
@Controller
public class helloController {

    @RequestMapping("/")
    public String index(Model model){
        //ModelAndView mv=new ModelAndView();
        model.addAttribute("uname","小白");
        model.addAttribute("sex","女");
        model.addAttribute("users", Arrays.asList(new User1(1,"ff"),new User1(2,"rr")));
       model.addAttribute("arr",new Integer[]{3,4,5,6,7,8});
        System.out.println("come in");
        return "index";
    }
}



 index.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
sfsdfs5555
<h3>取值--设置默认值</h3>
<#-- 值不为空打印小白-->
<#--${uname}-->
<#--${uname !}-->

<#--为空设置默认值‘小王’-->
<#--${uname !'小王'}-->
<hr/>
<h3>对null值先进行判断</h3>

1)exist用于逻辑判断
<#if uname ?exists >
    ${uname}
</#if>
<br>
2)判断对象是否为空
<#if uname ?? >
    ${uname}
</#if>
<br>
3)打印东西if_exists
    ${uname ?if_exists}
<br>
4)条件
<#if sex='女'>
    女
    <#elseif sex='男'>
    男
    <#else>
    未知
</#if>
<br>
5)循环
1.取出数组中的元素
<#list arr as a>
    ${a}/
</#list>
<br>
2.取出集合中对象
        <#list users as a >
        ${a.id}:${a.name}
        </#list>
<br>
6)include指令

<#include '/head.ftl'>
<h3>局部变量、全员变量</h3>
${cct}:${cct2}
</body>
</html>

 

 

 

创建一个实体类

package com.zking.spboot04.Controller;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
 public class  User1{
     private  int id;
     private  String name;


}

application.yml 

mybatis:
    mapper-locations: classpath:mappers/*xml
    type-aliases-package: com.zking.spboot04.mybatis.entity
server:
    port: 8080
    servlet:
        context-path: /spboot04

spring:
    application:
        name: spboot04
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        name: defaultDataSource
        password: 123456
        url: jdbc:mysql://localhost:3306/db_0701?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/
    mvc:
        static-path-pattern: /static/**

 include运用

 head.ftl

 

<#assign cct>
    ${springMacroRequestContext.contextPath}
</#assign>
<#global cct2>
    ${springMacroRequestContext.contextPath}
</#global>

 index.ftl

 

 

6)include指令

<#include '/head.ftl'>
<h3>局部变量、全员变量</h3>
${cct}:${cct2}

 

 

 


 二、freemarer综合案例

1.entity、mapper.java、mapper.xml、biz、controller

package com.zking.spboot04.model;


/**
 * NotNull:针对的是基本数据类型
 *  @NotEmpty 作用于集合
 *  @NotBlank    作用于字符串
 */
public class Clazz {
    protected Integer cid;

    protected String cname;

    protected String cteacher;

    protected String pic;

    public Clazz(Integer cid, String cname, String cteacher, String pic) {
        this.cid = cid;
        this.cname = cname;
        this.cteacher = cteacher;
        this.pic = pic;
    }

    public Clazz() {
        super();
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public String getCteacher() {
        return cteacher;
    }

    public void setCteacher(String cteacher) {
        this.cteacher = cteacher;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }
}

  ClazzMapper

package com.zking.spboot04.mapper;

import com.zking.spboot04.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);
}

 

<?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.zking.spboot04.mapper.ClazzMapper" >
  <resultMap id="BaseResultMap" type="com.zking.spboot04.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.zking.spboot04.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="Clazz" parameterType="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="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="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="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="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>

2.整合aop pageHelper插件

mybatis:
    mapper-locations: classpath:mappers/*xml
    type-aliases-package: com.zking.spboot04.model
server:
    port: 8080
    servlet:
        context-path: /spboot04

spring:
    application:
        name: spboot04
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        name: defaultDataSource
        password: 123456
        url: jdbc:mysql://localhost:3306/db_0701?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/
    mvc:
        static-path-pattern: /static/**
        
        pagehelper:
            reasonable: true
            supportMethodsArguments: true
            page-size-zero: true
            helper-dialect: mysql

 classbiz

package com.zking.spboot04.biz;

import com.zking.spboot04.model.Clazz;
import com.zking.spboot04.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);
}

3.jsp-->freemarker

工具PagerAspect 

package com.zking.spboot04.aspect;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zking.spboot04.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方法
     * 只要同时匹配上诉四个条件,就会被列为目标对象
     * 上述配置要生效,代理注解<aop:aspectj-autoproxy/>不能少
     * @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;
    }


}

 PageFreemarker

package com.zking.spboot04.util;

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


public class PageFreemarker{
	public static String toHTML(PageBean pageBean) {
		StringBuffer sb = new StringBuffer();
//		隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
//		上一次请求的URL
		sb.append("<form action='"+pageBean.getUrl()+"' id='pageBeanForm' method='post'>");
		sb.append("	<input type='hidden' name='page'>");
//		上一次请求的参数
		Map<String, String[]> paramMap = pageBean.getParamMap();
		if(paramMap != null && paramMap.size() > 0) {
			Set<Entry<String, String[]>> entrySet = paramMap.entrySet();
			for (Entry<String, String[]> entry : entrySet) {
//				参数名
				String key = entry.getKey();
//				参数值
				for (String value : entry.getValue()) {
//					上一次请求的参数,再一次组装成了新的Form表单
//					注意:page参数每次都会提交,我们需要避免
					if(!"page".equals(key)) {
						sb.append("	<input type='hidden' name='"+key+"' value='"+value+"' >");
					}
				}
			}
		}
		sb.append("</form>");
		
//		分页条
		sb.append("<ul class='pagination justify-content-center'>");
		sb.append("	<li class='page-item "+(pageBean.getPage() == 1 ? "disabled" : "")+"'><a class='page-link'");
		sb.append("	href='javascript:gotoPage(1)'>首页</a></li>");
		sb.append("	<li class='page-item "+(pageBean.getPage() == 1 ? "disabled" : "")+"'><a class='page-link'");
		sb.append("	href='javascript:gotoPage("+pageBean.previousPage()+")'>&lt;</a></li>");// less than 小于号
//		sb.append("	<li class='page-item'><a class='page-link' href='#'>1</a></li>");
//		sb.append("	<li class='page-item'><a class='page-link' href='#'>2</a></li>");
		sb.append("	<li class='page-item active'><a class='page-link' href='#'>"+pageBean.getPage()+"</a></li>");
		sb.append("	<li class='page-item "+(pageBean.getPage() == pageBean.maxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.nextPage()+")'>&gt;</a></li>");
		sb.append("	<li class='page-item "+(pageBean.getPage() == pageBean.maxPage() ? "disabled" : "")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.maxPage()+")'>尾页</a></li>");
		sb.append("	<li class='page-item go-input'><b>到第</b><input class='page-link'");
		sb.append("	type='text' id='skipPage' name='' /><b>页</b></li>");
		sb.append("	<li class='page-item go'><a class='page-link'");
		sb.append("	href='javascript:skipPage()'>确定</a></li>");
		sb.append("	<li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");
		sb.append("</ul>");
		
//		分页执行的JS代码
		sb.append("<script type='text/javascript'>");
		sb.append("	function gotoPage(page) {");
		sb.append("		document.getElementById('pageBeanForm').page.value = page;");
		sb.append("		document.getElementById('pageBeanForm').submit();");
		sb.append("	}");
		sb.append("	function skipPage() {");
		sb.append("		var page = document.getElementById('skipPage').value;");
		sb.append("		if (!page || isNaN(page) || parseInt(page) < 1 || parseInt(page) > "+pageBean.maxPage()+") {");
		sb.append("			alert('请输入1~"+pageBean.maxPage()+"的数字');");
		sb.append("			return;");
		sb.append("		}");
		sb.append("		gotoPage(page);");
		sb.append("	}");
		sb.append("</script>");
		
		return sb.toString();
	}
}

 数据列表

<!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="${cct }/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="${cct }/clz/toEdit">新增</a>
</form>

<table class="table table-striped bg-success">
    <thead>
    <tr>
        <th scope="col">ID</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="${cct }/clz/toEdit?cid=${b.cid}">修改</a>
                <a href="${cct }/clz/del?cid=${b.cid}">删除</a>
            </td>
        </tr>
    </#list>
    </tbody>
</table>
<#--jsp是借助助手类,而这里是Freemarker,没有jsp相关依赖-->
${pagestr !}
</body>
</html>

 编辑界面

<!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="${cct }/clz/edit" method="post">
        cid:<input type="text" name="cid" value="${b.cid !}"><br>
        cname:<input type="text" name="cname" value="${b.cname !}"><br>
        cteacher:<input type="text" name="cteacher" value="${b.cteacher !}"><br>
        <input type="submit">
    </form>
<#else>
    <form action="${cct }/clz/add" method="post">
        cid:<input type="text" name="cid" value=""><br>
        cname:<input type="text" name="cname" value=""><br>
        cteacher:<input type="text" name="cteacher" value=""><br>
        <input type="submit">
    </form>
</#if>
</body>
</html>

 

mybatis:
    mapper-locations: mappers/*.xml
    type-aliases-package: com.zking.spboot04.model
server:
    port: 8080
    servlet:
        context-path: /spboot04

spring:
    application:
        name: spboot04
    datasource:
        driver-class-name: com.mysql.jdbc.Driver
        name: defaultDataSource
        password: 123456
        url:
        jdbc:mysql://localhost:3306/db_0701?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/
    mvc:
        static-path-pattern: /static/**

        pagehelper:
            reasonable: true
            supportMethodsArguments: true
            page-size-zero: true
            helper-dialect: mysql
            logging:
                level:
                    com.zking.spboot04:debug

 head.ftl

<#assign cct>
    ${springMacroRequestContext.contextPath}
</#assign>
<#global cct2>
    ${springMacroRequestContext.contextPath}
</#global>

4.分页标签以及分页功能

ClazzController 

package com.zking.spboot04.Controller;

import com.zking.spboot04.biz.ClazzBiz;
import com.zking.spboot04.model.Clazz;
import com.zking.spboot04.util.PageBean;
import com.zking.spboot04.util.PageFreemarker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

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

/**
 * @author小李飞刀
 * @site www.javaxl.com
 */
@Controller
@RequestMapping("/clz")
public class ClazzController {
    @Autowired
    private ClazzBiz clazzBiz;
    @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);

        String pagestr = PageFreemarker.toHTML(pageBean);
        request.setAttribute("lst",lst);
        request.setAttribute("pageBean",pageBean);
        request.setAttribute("pagestr",pagestr);

        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";
    }


    @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";
    }

}

主界面

<#--jsp是借助助手类,而这里是Freemarker,没有jsp相关依赖-->
${pagestr !}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值