.vm文件发邮件时js未生效,无法控制显示隐藏

需求起因

最近在做一个发邮件的功能,是后端发邮件,不过邮件内容是由前端来写。

邮件内容包括姓名、手机号、邮箱,这三个参数都是不一定有的,如果没有某个参数时,那一行内容就不显示。

写法没错,但就是js里面的代码没有执行,不知道怎么控制这几行字的显示和隐藏,可苦恼坏了。

寻求解决方案

后来发现这是因为安全策略,js被禁止了,我们需要弄清楚后端用的什么模版引擎。

咱们后端用的是Velocity,它是基于java的一套模板引擎,它让我们可以用简单的模板语言和后台的java代码关联起来。通过MVC架构,Velocity可以让web端开发和java后台可发同时进行,这样web端(前端页面)开发人员就可以专心于开发漂亮的页面,而后端java开发人员就可以专注于后台一流代码的编写。它让前后端的开发分离开来。

使用Velocity模板的页面文件是以.vm结尾的和.jsp很像。

1、判读语句

#if(条件)

      内容

#elseif

      内容

#end

例子1:

可以用在div、input、a…等标签外

#if($!{userResult.userStatus} == 11 || $!{userResult.userStatus} == 10)
    <div class="ui-tips refund-nt"><i class="iconfont"></i>代码。。。</div>
#end

还可以用在div、input、a…等标签内

<input type="text" #if($!{userResult.name}) value="$!{userResult.name}" #elseif  value="Hellopocher" #end>

2、循环语句

#foreach(one in ones)

     内容 ($velocityCount 放在#foreach循环中是一个角标)

#end

例子1:

#foreach($!{one} in $!{ones})

    <a href="$!{one.url}" ></a>
 #end

3、 与 {}与 !{}区别

例子:

${str}:如果str没有值,则页面显示str本身;

$!{str}:如果str没有值,则页面显示“”(“”在页面上的显示效果就是啥也看不到);

4、#set用法

#set是用来定义变量的

例子:

#set( $name = "pocher!" )
Welcome $name to oschina.net

执行后结果:

Welcome pocher! to oschina.net

总结

Velocity就是Servlet + Velocity的模式,早期我们使用的Jsp开发模式Jsp+JavaBean。

我们更改为Servlet+JavaBean+Velocity,想想是不是已经替代了Jsp+JavaBean,并更彻底的把Java代码去除在Jsp(vm)外,如果光使用Struts(Servlet+Jsp),那么带来的代价是Java代码总或多或少出现在Jsp上。

即使可以做到不出现Java代码,但做过复杂架构系统的开发者都知道,代价也是很昂贵的,并且在可维护性、和网页设计师的集成开发上存在一定的困难,所以我们在这里能感觉到,Servlet+JavaBean+Velocity的模式较好的实现了OOD的概念。

而在效率上,大家也不用担心,此种结合方式比Servlet+Jsp的方式要高效一些。

邮件的写法可以看以下代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1,maximum-scale=1,user-scalable=no">
  <title>邮件通知</title>
</head>
<body>
  <div class="container"
    style="padding:30px;margin: 80px auto;width: 640px !important;min-width: 640px;box-shadow: 0px 0px 20px -4px rgba(90, 94, 109, 0.14);border-radius: 8px;">
    <div class="header" style="padding: 20px 0 10px;border-bottom: 1px solid #EBEBEB;">
      <img style="margin-bottom:10px;padding-left: 20px;" src="https://oss-emcsprod-public.modb.pro/image/indexlogo.png"
        height="33px" width="113px">
      <div style="display: flex;align-items: center;justify-content: space-between;padding-left: 20px;">
        <span style="font-size: 14px;color: #5A5E6D;">开放、便捷、专业的数据库社区</span>
        <span style="font-size: 14px;color: #5A5E6D;"><a style="color: #5A5E6D;text-decoration:none"
            href="www.modb.pro">www.modb.pro</a></span>
      </div>
    </div>
    <div style="padding: 50px 40px 30px;">
      <div style="font-size: 20px;color: #2B2B2B;margin-bottom:20px;">收到新的【BethuneX】购买咨询</div>
      #if($phoneNum)
      <div style="font-size: 16px;color: #2B2B2B;margin-bottom:20px;" class="phoneNumdiv">手机:<span
          style="color: #3D5F98;">${phoneNum}</span></div>
      #end
      #if($userName)
      <div style="font-size: 16px;color: #2B2B2B;margin-bottom:20px;" class="namediv">姓名:<span
          style="color: #3D5F98;">${userName}</span></div>
      #end
      #if($email)
      <div style="font-size: 16px;color: #2B2B2B;margin-bottom:20px;" class="emaildiv">邮箱:<span
          style="color: #3D5F98;">${email}</span></div>
      #end
      <div style="color: #4285F4;font-size: 16px;margin-bottom:50px;"></div>
      <div style="font-size: 16px;color: #2B2B2B;margin-bottom:10px;">再次感谢您的支持!</div>
    </div>
    <div>
      <div style="border-top: 1px solid #EBEBEB;"></div>
    </div>
  </div>
</body>
</html>

image.png

最终实现的是,如果没有邮箱,就不展示邮箱,大功告成~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/33585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java——抽象类和接口

抽象类 抽象类 使用abstract关键字定义的类称为抽象类 public abstract class Employee {private String name;private int number; }在 Java中抽象类不可以实例化为对象。例如&#xff1a; 抽象方法 使用abstract关键字定义的方法称为抽象方法。抽象方法没有方法体 抽象…

使用影刀RPA拆分excel数据

首先&#xff0c;要使程序有一定的兼容性&#xff0c;即增加互动性&#xff0c;认为选择要拆分的文件和拆分的依据列&#xff0c;可以利用影刀中的‘打开选择对话框’和‘打开输入对话框’来实现&#xff0c;这样一来便不用考虑待拆分excel的路径问题获取1中选择的依据拆分列&a…

CSS实现多头像叠加ui效果

第一种实现方式 简单粗暴直接使用margin-right实现&#xff0c;缺点是第一行右侧最右边头像溢出容器&#xff0c;代码中的三行注释的代码放开后可解决这个问题。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

【ISO26262】汽车功能安全第一部分:术语

【tommi_wei@163.com】 故障响应时间 fault reaction time 从故障(2.42) 探测到进入安全状态(2.102) 的时间间隔。 故障容错时间间隔 fault tolerant time interval 在危害事件(2.59) 发生前, 系统(2.129) 中一个或多个故障(2.42) 可存在的时间间隔。 功能安全 functio…

如何调用百度地图API

前言 要调用百度地图API&#xff0c;步骤操作如下 注册并创建一个API密钥。您可以在百度地图API控制台上创建您的密钥。选择要使用的API服务。百度地图API提供了多种服务&#xff0c;包括地图展示、路线规划、地点搜索、实时交通等。您可以在百度地图API控制台上查看所有可用…

Uniapp uni-app学习与快速上手

个人开源uni-app开源项目地址&#xff1a;准备中 在线展示项目地址&#xff1a;准备中 什么是uni-app uni&#xff0c;读 you ni&#xff0c;是统一的意思。 Dcloud即数字天堂(北京)网络技术有限公司是W3C成员及HTML5中国产业联盟发起单位&#xff0c;致力于推进HTML5发展构…

亚马逊云科技“专库专用”模式,可有效提高数据库的性能和效率

近日&#xff0c;全球数据库市场发生了一件令人瞩目的事件&#xff0c;根据Gartner的数据&#xff0c;我们发现亚马逊云科技作为一个纯云厂商&#xff0c;夺得了2022年全球数据库领导者的桂冠&#xff0c;占据全球市场的25.3%份额。 云原生数据库的发展方向&#xff1a;与数据分…

Python技术自学的方式

Python是一种高级编程语言&#xff0c;被广泛用于软件开发、数据分析、人工智能和科学计算等领域。它于1991年由Guido van Rossum创建&#xff0c;并且其简洁、易读的语法以及丰富的标准库使得它成为了初学者和专业开发人员的首选语言之一。 一、Python技术介绍 学习Python技术…

JumpServer开源堡垒机页面配置

JumpServer开源堡垒机页面配置 一、登录二、功能模块2.1、控制台2.1.1、用户管理2.1.1.1、用户列表2.1.1.2、用户组 2.1.2、资产管理2.1.2.1、资产列表2.1.2.1.1、创建服务器链接2.1.2.1.2、创建数据库MySQL链接 2.1.2.2、网域列表2.1.2.3、平台列表2.1.2.4、标签列表 2.1.3、账…

项目中遇到的问题总结(四)

GateWay和Nginx的相同点和不同点在哪里&#xff1f; Gateway 和 Nginx 都是常见的反向代理服务器&#xff0c;它们的相同点和不同点如下&#xff1a; 相同点&#xff1a; 都可以作为反向代理服务器&#xff0c;接收来自客户端的请求并转发到后端服务器进行处理。 都支持负载均…

【Linux】基本指令——带你快速上手Linux

目录 一、重新认识操作系统1.1 操作系统是什么&#xff1f;1.2 为什么要有操作系统&#xff1f;1.3 我们在计算机上的所有操作1.4 Linux操作的特点 二、Linux基本指令2.1 mkdir指令&#xff08;重要&#xff09;2.2 rmdir指令2.3 rm指令&#xff08;重要&#xff09;2.4 touch指…

JavaScript数据存储方式

内置对象 js内部提供的对象&#xff0c;包含各种属性和方法给开发者调用 document.write() console.log() Math Math对象是js提供的一个 “数学”对象&#xff0c;提供了一系列做数学运算的方法 max找最大值Math.max(3,8,5,4) 返回8min找最小值Math.min(3,8,5,4) 返回4ab…

【软考网络管理员】2023年软考网管初级常见知识考点(15)-网络管理与存储

涉及知识点 网络管理功能&#xff0c;网络管理模型&#xff0c;SNMP协议原理与版本&#xff0c;数据备份&#xff0c;DAS/NAS/SAN技术 软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 文章目录 涉及知识点一、网络管理功能二、…

EasyFlash在GD32F303CC上面的移植

记录学习的过程&#xff0c;如果在GD32F303CC上面移植EasyFlash。关于EasyFlash的相关介绍和源码&#xff0c;请参考&#xff1a;https://gitee.com/Armink/EasyFlash 或者 https://github.com/armink/EasyFlash 主要记录移植过程中需要注意的点&#xff0c;移植还是比较简单的…

Spring 事务和事务传播机制

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 Spring 中事务的实现Spring 编程式事务Spring 声明式事务Transactional 作⽤范围Transactional 参数说明Spring 事务隔离级别…

[State of GPT] OpenAI讲座随笔记

原版&#xff1a;State of GPT B站翻译版&#xff1a;【精校版】Andrej Karpathy微软Build大会精彩演讲&#xff1a; GPT状态和原理 - 解密OpenAI模型训练 1 GPT Training Pipeline图解 记录一下对这个图的理解&#xff1a; 大模型训练的四个阶段&#xff1a; Pretraining 阶…

【深入了解Spring Cloud Alibaba Nacos:服务注册和配置中心】—— 每天一点小知识

&#x1f4a7; 深入了解 S p r i n g C l o u d A l i b a b a N a c o s &#xff1a;服务注册和配置中心 \color{#FF1493}{深入了解Spring Cloud Alibaba Nacos&#xff1a;服务注册和配置中心} 深入了解SpringCloudAlibabaNacos&#xff1a;服务注册和配置中心&#x1f4a7;…

带你用Python制作一个经典必收藏的游戏:地铁跑酷(含完整代码)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 一、游戏简介 二、游戏设计 引入必要的库 初始化游戏 定义游戏元素 定义游戏循环 更新游戏…

Qt QGraphicsScene、QGraphicsView类实现仪表盘

Qt QGraphicsScene、QGraphicsView类实现仪表盘 【1】UI界面设计【2】效果【3】QGraphicsScene简介【4】QGraphicsEllipseItem简介【5】QGraphicsPolygonItem简介【6】QGraphicsLineItem简介【7】QGraphicsView简介【8】仪表源码头文件源码 【1】UI界面设计 【2】效果 【3】QGr…

caffeine和google-guava cache缓存使用详解和源码介绍

google-guava cache 1.pom引入其依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency> 2.具体使用 com.google.common.cache.LoadingCache<Strin…