购物商城---freemarker在项目中的应用

2023-11-07


1.通过模板+数据–》生成静态化页面
2.缺点:数据不实时
3.适用于于数据长时间不更新的情况

二、在项目中搭建freemarker
freemarker.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">


    <!--配置freemarker的实现类 -->
    <bean id="staticPageService" class="cn.zhou.core.service.staticpage.StaticPageServiceImpl">
        <!-- set注入 -->
        <property name="freeMarkerConfigurer">
            <bean
                class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
                <!--配置模板加载路径 -->
                <property name="templateLoaderPath" value="/WEB-INF/ftl/"></property>
                <!--配置读取模板的语言格式 -->
                <property name="defaultEncoding" value="UTF-8"></property>
            </bean>
        </property>
    </bean>
</beans>

jar包

        <dependency>
            <groupId>freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.9</version>
        </dependency>

适用于单独某个网页的静态化 这里对productDetail.html做静态化
调用:生产静态化界面了,下次访问设置不去controller层,直接跳转静态化页面



/**
 * 
 * 生成静态页面
 * 
 * @author Administrator
 *
 */
// 实现接口ServletContextAware,是为了获取servletContext,进而获取项目路径
public class StaticPageServiceImpl implements StaticPageService, ServletContextAware {
    // @Autowired
    // private Configuration conf;//注入配置对象
    private Configuration conf;
    // 不用注解注入,set注入
//   private FreeMarkerConfigurer freeMarkerConfigurer;//注入配置对象

    // freeMarkerConfig 注解得到,得到后通过getConfiguration(),将值注入conf,所以conf也不要注解

    public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
        this.conf = freeMarkerConfigurer.getConfiguration();
    }

    // 静态方法,rootMap填充数据
    public void productIndex(Map<String, Object> rootMap,Integer id) {
        // conf.setDirectoryForTemplateLoading(new File(""));//设置模板加载路径,已经在freemark.xml中配置
        // 获取模板
        // 输出流 从内存写到磁盘中UTF-8格式
        Writer out = null;
        String path = getPath("/html/product/"+id+".html");
        File file=new File(path);
        //  /html/product/这个文件不存在
        if(!file.getParentFile().exists()){
            //创建/html/product/文件夹,mkdirs多级创建
            file.getParentFile().mkdirs();
        }

        try {
            // 从从磁盘读到内存中UTF-8格式,已经在freemark.xml中配置
            //模板:productDetail.html 实际是/WEB-INF/ftl/productDetail.html 
            Template template = conf.getTemplate("productDetail.html");
            out = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
            //填充数据
            template.process(rootMap, out);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }

    // 获取名称对应的路径
    public  String getPath(String name) {
        return servletContext.getRealPath(name);

    }

    private ServletContext servletContext;

    public void setServletContext(ServletContext servletContext) {
        // set注入
        this.servletContext = servletContext;

    }
}

静态化页面在项目中的生成,这里以商品上架的时候,同时生产静态化页面

    //商品上架
    @RequestMapping(value="/product/isShow.do")
    public String isShow(Integer[] ids,Integer pageNo,String name,Integer brandId,Integer isShow,ModelMap modelMap){
        //Integer[] ids 为商品id数组
        Product product=new Product();
        //设置上架
        product.setIsShow(1);
        if(ids!=null && ids.length>0){
            for (Integer id : ids) {
                product.setId(id);
                productService.updateProductByKey(product);

                //freemarker静态化
                Map<String, Object> rootMap=new HashMap<String, Object>();
                // sku集合
                List<Sku> skuList = skuService.getStock(id);
                rootMap.put("skuList", skuList);
                // 商品集合
                  product = productService.getProductByKey(id);
                  rootMap.put("product", product);
                // 颜色集合
                List<Color> colors = new ArrayList<Color>();
                //去重复
                for (Sku sku : skuList) {
                    //判断集合中是否已经有此颜色对象了
                    if (!colors.contains(sku.getColor())) {
                        colors.add(sku.getColor());
                    }
                }
                rootMap.put("colors", colors);
                //生成静态化页面
                staticPageService.productIndex(rootMap, id);
            }
        }

页面模板

<script type="text/javascript">

//刷新页面第一个a标签触发click事件
$(function(){
    $("#colors a:first").trigger("click");
    //商品购买+-
    //商品+,jquery点击触发事件
    $("#add").click(function(){
        //获取件数
        var num=$("#num").val();
        num++;
        if(num>buyLimit){
            alert("此商品只能买"+buyLimit+"件");
            return;
        }
        //赋值
        $("#num").val(num);

    });
    //商品-,jquery点击触发事件
    $("#sub").click(function(){
        //获取件数
        var num=$("#num").val();
        num--;
        if(num==0){
            return;
        }
        //赋值
        $("#num").val(num);
    });
})
//全局变量
var colorId;//颜色Id
var skuId;//skuId
var buyLimit;//限购

//点击选择颜色id为颜色的ID
function colorToRed(target,id){
    //给全局变量赋值
    colorId=id;
    //清理其他颜色
    $("#colors a").each(function(){
        $(this).attr("class","changToWhite");
    });
    //先清理尺码  都变成不可点
    $("#sizes a").each(function(){
        $(this).attr("class","not-allow");
    });
    //点击变红
    $(target).attr("class","changToRed");
    //第一次尺寸默认变红
    var flag=0;
    //判断尺寸
        <!--静态化填充数据  -->
    <#list  skuList as sku>
    //判断sku中与当前选择颜色Id一样的,将获取所有的尺码
    if(id=='${sku.colorId}'){
        if(flag==0){//第一个尺寸,并获取第一个尺寸的价格
            //第一次尺寸默认变红,例如海蓝色id=2的有尺寸 s,m,x,那么s位红,m,x为白
        $("#"+'${sku.size}').attr("class","changToRed");
        flag=1;
        //填充数据
        //巴巴价
        $("#price").html('${sku.skuPrice}');
        //市场价
        $("#mprice").html('${sku.marketPrice}');
        //运费
        $("#fee").html('${sku.deliveFee}');
        //库存
        $("#stock").html('${sku.stockInventory}');
        //skuid
        skuId='${sku.id}';
        //限购
        buyLimit='${sku.skuUpperLimit}';
        //默认给购买件数赋值为1
        $("#num").val(1);
        }else{
            //非第一次尺寸默认变白,例如海蓝色id=2的有尺寸 s,m,x,那么s位红,m,x为白
            $("#"+'${sku.size}').attr("class","changToWhite");
        }  
    }
    </#list>
}

//点击选择颜色id为尺码s,m,l...
function sizeToRed(target,id){
    //先清理尺码  都变成不可点
    //如果当前是不可点的不能点
    var cc=$(target).attr("class");
    if(cc=="not-allow"){
        return;
    }

    $("#sizes a").each(function(){
        var c=$(this).attr("class");
        //排除了不开点的后,其余的都变白
        if(c!="not-allow"){
            $(this).attr("class","changToWhite");
        }
    });
    //当前的变红
    $(target).attr("class","changToRed");
    <!--静态化填充数据  -->
    <#list skuList as sku >
    //判断sku中与当前选择颜色Id一样的,将获取所有的尺码
    if(colorId=='${sku.colorId}'&&id=='${sku.size}'){
        //填充数据
        //巴巴价
        $("#price").html('${sku.skuPrice}');
        //市场价
        $("#mprice").html('${sku.marketPrice}');
        //运费
        $("#fee").html('${sku.deliveFee}');
        //库存
        $("#stock").html('${sku.stockInventory}');
        //skuid
        skuId='${sku.id}';
        //限购
        buyLimit='${sku.skuUpperLimit}';
        //默认给购买件数赋值为1
        $("#num").val(1);
    }
    </#list>
}
//加入购物车
function addCart(){
    alert("添加购物车成功!");
}
//立即购买
function buy(){
    window.location.href='cart.jsp';
    //skuId  productId  件数   限购
}
</script>
</head>
<body>

    <div class="w ofc mt">
        <div class="l">
            <div class="showPro">
                <div class="big">
                    <a id="showImg" class="cloud-zoom" href="${product.img.allUrl }"
                        rel="adjustX:10,adjustY:-1"><img alt=""
                        src="${product.img.allUrl }"></a>
                </div>
            </div>
        </div>
        <div class="r" style="width: 640px">
            <ul class="uls form">
                <!--静态化填充数据  -->
                <li><h2>${product.name }</h2></li>
                <li><label>巴 巴 价:</label>
                    <span class="word"><b class="f14 red mr" id="price">¥128.00</b>(市场价:<del id="mprice">¥150.00</del>)</span></li>
                <li><label>商品评价:</label>
                    <span class="word"> <span class="val_no val3d4" title="4分">4分 </span> <var class="blue">(已有888人评价)</var>
                    </span> </li>
                <li><label>运 费:</label><span class="word" id="fee">10元</span></li>
                <li><label>库 存:</label><span class="word" id="stock">100</span><span class="word"></span></li>
                <li><label>选择颜色:</label>

                    <div id="colors" class="pre spec">
                    <!--静态化填充数据  -->
                        <#list colors as color> 
                        <a onclick="colorToRed(this,${color.id })" href="javascript:void(0)" title="${color.name }" class="changToWhite">
                            <img width="25" height="25" data-img="1" src="/res/img/pic/ppp00.jpg" alt="${color.name }">
                            <i>${color.name}</i>
                        </a> 
                        </#list>

                    </div></li>
                <li id="sizes"><label>尺 码:</label> <a href="javascript:void(0)"
                    class="not-allow" onclick="sizeToRed(this,'S')" id="S">S</a> <a
                    href="javascript:void(0)" class="not-allow"
                    onclick="sizeToRed(this,'M')" id="M">M</a> <a
                    href="javascript:void(0)" class="not-allow"
                    onclick="sizeToRed(this,'L')" id="L">L</a> <a
                    href="javascript:void(0)" class="not-allow"
                    onclick="sizeToRed(this,'XL')" id="XL">XL</a> <a
                    href="javascript:void(0)" class="not-allow"
                    onclick="sizeToRed(this,'XXL')" id="XXL">XXL</a></li>
                <li><label>我 要 买:</label>
                 <a id="sub" class="inb arr" style="border: 1px solid #919191; width: 10px; height: 10px; line-height: 10px; text-align: center;"
                    title="减" href="javascript:void(0);">-</a> 
                    <input id="num" type="text" value="1" name="" size="1" readonly="readonly">
                    <a id="add" class="inb arr" style="border: 1px solid #919191; width: 10px; height: 10px; line-height: 10px; text-align: center;"
                    title="加" href="javascript:void(0);">+</a>
                </li>
                <li class="submit"><input type="button" value="" class="hand btn138x40" onclick="buy();" />
                <input type="button" value="" class="hand btn138x40b" onclick="addCart()" /></li>
            </ul>
        </div>
    </div>

</body>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

购物商城---freemarker在项目中的应用 的相关文章

  • 设置一个FreemarkerExceptionHandler捕获freemarker页面上的异常

    在Freemarker页面中如果使用 userName 并且userName为空 那么Freemarker页面就会崩掉 需要设置默认值 userName 来避免对象为空的错误 同理 user userName 也应该写成这样 user us
  • Java开发的模板引擎--freemarker

    模板引擎 freemarker 一 基础知识 1 1 模版引擎 1 2 关于freemarker 1 3 常用的java模版引擎 1 4 快速入门 1 4 1 指定了SpringBoot的版本 1 4 2 指定了pom xml文件依赖 1
  • java mail 通过 freemarker 发送邮件

    java mail 通过 freemarker 发送邮件 理解 java mail 核心类 1 MimeMessage 对象就是一封邮件 2 Session 定义系统属性信息 具体代码如下 1 controller 层代码如下 packag
  • Freemarker 转义 freemarker

    我正在使用 freemarker 生成 freemarker 模板 但我需要一些方法来逃避 freemarker 标签 我该如何逃脱 lt list gt 标签或 expression 您还可以使用 expression 如果您发现 嵌套令
  • 如何在freemarker中自定义数字格式?

    我正在使用 freemarker 并尝试以这种格式显示数字 3 343 434 00例如 这很容易通过使用来解决 total string currency 假设 总数 是某个数字 但是 当我有负数时 它会像这样显示 343 34 而不是这
  • Freemarker 迭代 hashmap 键

    Freemarker 有两种集合数据类型 列表和哈希图 有没有一种方法可以像我们处理列表一样迭代哈希图键 因此 如果我有一个带有数据的变量 可以这样说 user name user email email protected homepag
  • 获取存储在变量中的字符串的值,该变量的名称作为字符串存储在另一个变量中

    lt assign blah foo gt lt assign foo awesome gt 我们可以在不引用 foo 的情况下渲染 awesome 吗 我尝试过类似的东西 blah 但它不起作用 有什么想法吗 有一个eval内置函数 它将
  • 禁用 freemarker 日志

    我正在使用 Struts 2 0 11 2 但我不知道我的应用程序最近发生了什么变化 我收到了大量的 freemarker 日志 DEBUG 13201 freemark template simple hidden ftl en UTF
  • 从日历中删除选定的事件

    我正在使用 JQuery Full Calendar 和 Spring MVC 你好 我做了一个演示 比如that 目标 我需要当用户单击她 他已经插入的事件时 出现一个对话框 并让他 她能够删除该事件或取消 问题 现在 每当用户单击任何一
  • 如何使用 FreeMarker 模板化嵌套 Pojo?

    我正在研究使用 FreeMarker 编写 EDI 文件 这些基本上是严格格式化 并经过验证 的电子发票 我决定从编写一个简单的示例开始 但一直坚持将其模板化为 嵌套 pojo 我的意思是一个 POJO 其中包含 POJO 其中这两个 PO
  • Freemarker 在模板中打印日期

    我试图在激活模板时打印当前日期 我读过 我必须将一个新的 Date Java 对象传递给模板 但我不知道如何执行此操作或将其放在代码中的位置 在这种情况下 有人知道如何将 Java 对象传递给模板吗 谢谢 实际上你不必通过new Date
  • Keycloak主题变量

    在 Keycloak 的基本模板中 有多个变量示例 可在 Freemarker 模板中访问 例如 在文件中 https github com keycloak keycloak blob master themes src main res
  • 需要更好的模板语言[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对我知道那个this https stackoverflow com questions 3793880 lightweight temp
  • Feemarker 将图像写入 html

    有没有办法在 freemarker 中写入图像而不是给出链接 img src
  • spring security 3.2.0 csrf 令牌在 freemarker 模板中不起作用

    升级到 Spring Security 3 2 0 并配置 xml 后 csrf 令牌不起作用 基本原理 春季4 0 1 春季安全3 2 0 Freemarker 模板语言 步骤1 spring security xml配置
  • 有没有办法做 gsp 部分而不是标签库?

    我喜欢 freemarker 的一件事是 你可以快速创建封装复杂 html 的新宏 使页面更小 更简洁 我是否必须创建标签库才能在 grails 中执行相同的操作 或者是否有一个真正的轻量级语法来实现相同的操作 有一个
  • 如何在 Struts 2 中向我的所有视图公开一个对象?

    我有一个使用 Struts 2 和 Freemarker 模板以及 Spring 4 的 Web 应用程序 我有一些配置字符串存储在 properties我需要在每个页面上呈现的文件 例如 我们的 CDN 路径 其中包含版本字符串 现在这些
  • 对象集合表单的 Freemarker 语法 (Spring 3 MVC)

    我有一个命令 bean FooList 它有一个属性 它是一个集合 aList of Foo beans 我正在尝试创建一个可以编辑所有内容的表单Foo立刻 我发现了许多如何使用 JSP 执行此操作的示例 但我在将这些示例转换为 Freem
  • Freemarker没有分配staticUtil

    我在liferay 6 2上工作了应用程序显示模板 我使用freemarker帮助对liferay的动态数据列表进行分页 当我升级到liferay 7时 这是一个问题 Liferay 7使用代码 lt assign records ddlD
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT

随机推荐

  • Epoll图解

    图解 Epoll怎么实现的 51CTO COM epoll详解 Ineffable 的博客 CSDN博客 epoll详解
  • Nginx健康检查

    0 背景 服务治理的一个重要任务是感知服务节点变更 完成服务自动注册及异常节点的自动摘除 这就需要服务治理平台能够 及时 准确的感知service节点的健康状况 1 方案概述 Nginx 提供了三种HTTP服务健康检查方案供用户选择 1 T
  • 三面阿里被挂,竟获内推名额,历经 5 面拿下口碑 offer...

    每一个互联网人心中都有一个大厂梦 百度 阿里巴巴 腾讯是很多互联网人梦寐以求的地方 而我也不例外 但是 BAT 等一线互联网大厂并不是想进就能够进的 它对人才的技术能力和学历都是有一定要求的 所以除了学历以外 我们的技术和能力都要过硬才行
  • win10微信打电话对方听不到你的声音,你能听到对方声音

    1 隐私权限 开始 设置 隐私 麦克风 更改 开启权限 2 禁用占用问题 右键电脑右下角小喇叭 声音 声音控制面板 录制 分别右键下面的几个选项 启用麦克风 立体声混音等 然后分别双击下面的麦克风 立体声等选项 高级 独占前面的v取消 确定
  • 拯救小tim【最短路】

    题目链接 这里有一个坑点 譬如说 我们从S出发的时间 不是刚好卡着第一个的 起始点 没准出发的第一步 没有卡起始点 而是在后面的到达其他点的时候卡了起始点这样的情况 所以我们应该从0 max BegTim的来枚举起点时间 然后跑Dijkst
  • javamail发送接收的简单demo

    目录结构 首先引入文件
  • 23考研重大软院数一英一391分经验帖

    今年这情况之后 所有前人的经验帖作废 前言 本校本专业生一战上岸 属于考研界难度最低的一档 今年有个初试439的怪物 属于是蚌了 第二名也有419 第三名就断档了 我初试第五 政治78 英一75 数一115 专业课123 总分391分 可以
  • [个人笔记] vCenter设置时区和NTP同步

    VMware虚拟化 运维篇 第三章 vCenter设置时区和NTP同步 VMware虚拟化 运维篇 系列文章回顾 vCenter设置时区和NTP同步 附加 ESXi设置alias 参考链接 系列文章回顾 第一章 vCenter给虚机添加RD
  • 鼓励参与计算机考试宣传标语,考试宣传标语

    考试标语 1 遵守考场纪律 维护知识尊严 2 提倡诚信做人 纯洁校园风气 3 考前不慌不乱 考时沉着应对 考后杜绝议论 4 用心看卷 专心答题 细心复查 5 我自信 我成功 6 与诚信携手同行与舞弊挥手作别 7 怀轻松心情进考场 带胜利喜悦
  • 安全https,dns笔记整理

    一 https HTTP 是用于从万维网 WWW World Wide Web 服务器传输超文本到本地浏览器的传送协议 他是一种应用层协议 是基于 TCP IP 通信协议来传递数据的 但他不安全 以明文传递的方式 容易被他人盗取篡改信息 H
  • java 提取存在逗号和小数点的字符串中的数字

    可以使用正则表达式来处理 以下是一个示例代码 可以提取字符串中可能包含逗号和小数点的数字 import java util regex Matcher import java util regex Pattern public class
  • Arduino和Python实时监督控制和数据采集系统(SCADA)

    本文 将向您展示如何设置环境温度信号 该信号将通过计算机上的实时仪表板记录和可视化数据 硬件设计 首先 我们将使用Arduino Uno开发板从红外温度计读取温度值 如上所示连接红外测温仪后 继续将以下程序上传到Arduino 要验证Ard
  • 如何在windows下切换node版本

    解决办法 1 用到某个版本对node重新卸载 安装对应的版本 2 使用nvm 很明显 第一种方法虽然也能解决node版本问题 但是太多麻烦 接下来介绍下nvm的安装使用 第一步 下载nvm并安装 推荐使用nvm setup zip nvm
  • ROS配置LTE第二链路实现故障自动切换

    本文几乎没有操作部分 主要是讲原理 设备是RB962 通过PPPoE方式上网 华为5577移动路由器配合电信日租卡作为第二链路备用 计划实现宽带正常时通过PPPoE线路上网 异常时通过LTE线路上网 PPPoE线路恢复正常时 流量回到PPP
  • 第37.2节 框选-框选场景中的物体

    目录 本节内容 实现要点 点选 性能 绘制球 本节内容 结合上一节 我们把框选这个功能给完善了 如下 白色的是我点击左CTRL 用鼠标左键在场景中拉的框 拉框的教程在第37 1节 框选 绘制框选框 拉完框后能够将场景中选择的物体置红 本节代
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(十二)光照贴图

    Vries的原教程地址如下 https learnopengl cn github io 02 20Lighting 04 20Lighting 20maps 关于OpenGL函数的详细解析及OpenGL关于满反射贴图与镜面反射贴图的知识点
  • 反射的使用

    反射 一 反射基本概念 1 反射是什么 2 Class类实例对象是什么 Field类实例对象和Method类实例对象是什么 3 jVM类加载机制 很难又很重要 待补充 二 反射的作用 三 Class详解 Class的使用场景 1 通过对象获
  • C语言之函数必备练习题

    笔者来自于一个普通二本 非科班出身 对于未来的打算博多 无法完事皆满意 所以 尽自己可能去实现 所以 打算转码中 C语言XX必备练习题 凝聚了笔者精华所有 请看到的读者认真思考 在进行 话不多说 直接上题 笔者的一贯要求 速度 1 作业标题
  • Python爬虫从入门到精通:(9)数据解析_xpath解析2_爬取4K高清动漫图片_Python涛哥

    使用xpath爬取4K高清动漫图片名称和图片数据 爬取当前页 创建文件夹 存储图片 dirName GirlsLib if not os path exists dirName os mkdir dirName headers User A
  • 购物商城---freemarker在项目中的应用

    一 1 通过模板 数据 生成静态化页面 2 缺点 数据不实时 3 适用于于数据长时间不更新的情况 二 在项目中搭建freemarker freemarker xml