模板引擎中心思想:解决拼接字符串的方式来进行构建HTML

1)当我们的客户端访问服务器的界面的时候,queryString里面要带有name=?这样的键值对

2)当我们的请求中传递过一个queryString,这里面有一个参数叫做name,返回的页面里面就包含name的值,用户请求的name不同,最终返回的页面就不同;

3)比如说当我们在浏览器上面输入不同的查询词,页面最终返回的结果也是各不相同的,就说明这个页面是动态的

@WebServlet("/html")
public class HelloServlet3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name=req.getParameter("name");resp.setContentType("text/html;charset=utf-8");String str=req.getParameter("name");resp.setContentType("text/html;charset=utf-8");StringBuilder stringBuilder=new StringBuilder();stringBuilder.append("<html>");stringBuilder.append("<head><title>标题字符串拼接</head></title>");stringBuilder.append("<body>");stringBuilder.append("<h3>name ="+str+"</h3>");stringBuilder.append("</body>");stringBuilder.append("</html>");resp.getWriter().write(stringBuilder.toString());}
}

2)下面我们来写一个web版本的猜数字页面;

2.1首先我们要约定好前后端进行交互的接口:

1)请求:GET/guessNum

通过这个请求,来获取到一个页面(页面里面就包含基本猜数字的页面),同时在服务器这里面进行初始化,让服务器生成一个1-100之间要去猜的数字;

2)响应:客户端给服务器返回的响应就是一个HTML页面;

2)请求:POST/guessNum(点击第一个页面提交按钮之后的请求)

content-Type:application/x-www-from-urlencoded;

body:result=9

1)这是处理一次猜的过程,页面上有一个输入框,还有一个提交按钮,点击提交按钮),就会把输入的内容交给服务器(从这里开始真正的发送了一个POST请求);

2)服务器收到这个数据之后,判断一下当前这个数据是不是猜对了

响应:返回一个界面包含猜大了猜小了,还是猜对了(html)

1)咱们只进行一次GET请求,因为我们在第一次进行加载的时候就已经生成了这个页面,我们每猜一次数字,就执行一次POST请求;

2)因为我们每一次进行POST提交的时候,都要用到这个GuessNum,所以设置成全局变量

3)我们进行POST请求的时候会把刚才的GET请求生成的页面生成,form表单里面的内容;

再去生成两个div标签,一个显示猜数字的结果,显示猜数字时猜大了还是猜小了

另一个会进行显示猜数字的次数,并且会进行更新count值

4)每遇到一个单引号,就要使用转义字符进行转移

2.2)我们要写一个GuessNumServlet,就要关联上/guessNum这个路径;

1)先实现一个doGET方法,来处理第一个交互接口(获取到页面的初始情况,并且初始化,生成一个待猜的数字)

2)在实现一个doPOST方法,实现第二个交互接口(处理一次猜的过程)

@WebServlet("/guessNum")
public class HelloServlet3 extends HttpServlet{//先获取到页面的初始情况,并且初始化,生成一个随机的数字private int num=0;//count表示要猜的数字private int count=0;protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {1.先生成一个随机的数字//这里面必须要设置一个返回的body的类型,要不然默认就会返回一个HTML标签resp.setContentType("text/html;charset=utf-8");Random random=new Random();num= random.nextInt(100)+1;
我们上面写的代码是生成了一个[0,99)范围性的数字,接下来我们再进行+1操作就生成了一个[1,100]范围性的数字count=0;StringBuilder stringBuilder=new StringBuilder();//在返回页面中的form表单中加上method=POST是为了后续可以触发POST请求,stringBuilder.append("<form action=\"guessNum\"method=\"POST\">");stringBuilder.append("<input type=\"text\" name=\"num\">");stringBuilder.append("<input type=\"submit\"value=\"提交\">");stringBuilder.append("</form>");resp.getWriter().write(stringBuilder.toString());}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1先从我们的请求中,读去用户提交的输入框的内容String integer=req.getParameter("num");resp.setContentType("text/html;charset=utf-8");int guessnum=Integer.parseInt(integer);String result="";//2进行比较if(num==guessnum){result="你猜对了";}else if(num>guessnum){result="你猜小了";}else{result="你猜大了";}//3猜的次数增加count++;StringBuilder stringBuilder=new StringBuilder();//在返回页面中的form表单中加上method=POST是为了后续可以触发POST请求,stringBuilder.append("<form action=\"guessNum\"method=\"POST\">");stringBuilder.append("<input type=\"text\" name=\"num\">");stringBuilder.append("<input type=\"submit\"value=\"提交\">");stringBuilder.append("</form>");stringBuilder.append("<div>"+result+"</div>");stringBuilder.append("<div>当前猜了:"+count+"次"+"</div>");resp.getWriter().write(stringBuilder.toString());}
}

3)模板引擎的具体用法:Thymeleaf

我们需要从中央仓库来进行引入,搜索Thymeleaf(3.0.12);

http://mvnrepository.com/

我们去中央仓库里面去进行搜索Thymeleaf,选择3.0.12版本的模板引擎

1)通过刚才的案例,我们知道拼接字符串的方式是很不靠谱的,模板引擎就是可以让我们自己来写一个html文件界面,固定的位置都不变,把一些不固定的地方使用一些特殊符号占位,在程序运行当中,再把占位符给换掉;

2)创建文件的位置:在WEB-INF中创建template文件,再从这个文件里面创建创建一个新的HTML文件,这就是HTML模板所在的路径

3)我们先编写一个模板文件,其实上就是一个HTML文件,只不过是把一些可变的数据单独摘出来了;
4)编写一个类,调用里面的doGET方法,就可以把当前这个模板给返回回来

<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.12.RELEASE</version>
</dependency>
<h3 th:text="${message}"></h3>

我们在这里面是期望h3里面的内容是可以变化的,是Servlet代码中计算传递过来的

1)我们在前端代码里面写了一个标签叫做h3标签,里面的th就是thymeleaf的缩写意思是这个属性是thymeleaf所进行提供的;

2)text表示这里面的类型是一个字符串

3)${message},这是表示一个具体的变量,我们就可以在Java代码中,把这个变量的具体的值给填写进来

后端代码:我们进行编写Servlet的代码,重写doGet方法,把刚才这个模板给进行返回回来;

一)初始化操作:这个初始化的目标就是为了告诉我们的模板引擎,要从那些目录中来进行加载模板文件

在进行模板渲染之前,把刚才写的html代码中的message变量进行替换,要先进行初始化,况且这个初始化操作只执行一次即可,所以我们把它放到init()方法中进行;

1)创建模板引擎中最核心的类:private TemplateEngin templateEngin=new TemplateEngin(),它主要干的事情就是将前端代码中的$message等变量进行替换;

2)创建模板解析器对象,需要搭配ServletContext来进行使用

ServletContextTemplateResolver resolver=new ServletContextTemplateResolver(this.getServletContext()),与当前所在的webapp绑定

2.1)Context被翻译成上下文,ContextPath之前我们设定的,是用来区分WebApp的,一个Tomact有多个webapp,每一个webapp都有一个Context,也就是说一个webapp中里面可以有多个Servlet,这些Servlet共用同一个Context对象每一个war包都有一个Context对象

2.2)Context对象是Tomact在进行加载webapp的时候所创建出来的一个对象,Tomact在webapps目录中有多个webapp,每一个webapp都会创建出来一个对应的Context对象,所以说每一个Context对象就是和webapp绑定的一个概念

2.3在一个webapp里面的任意个Servlet类中,都是可以通过getServletContext来进行获取到这个上下文对象(Context)

一个webapps目录下的文件如上述所示,这个webapps目录下面的每一个目录都是一个webapp

3)我们要让模板解析器进行加载模板文件

告诉模板引擎要加载那些文件到内存里面,这里的前缀就表示模板文件所在的目录,这里面的后缀就表示要进行的加载文件的类型;

resolver.setPrefix("/WEB-INF/template"),指定加载的模板文件的路径

resolver.setSuffix(".html),指定要加载那些模板文件,这个情况下是说在这个目录文件中所有后缀名带有html的,都给它进行加载过来

resolver.setCharacterEncoding("utf-8"),在进行加载的时候,指定解析模板文件的字符集

4)我们把解析器对象,给设置到engine对象里面

engine.setTemplateResolver(resolver);

//成功的告诉了模板引擎要到哪些目录中加载那些文件作为HTML模板

5)当前我们可以看到,我们的模板引擎是一个对象,我们的模板解析器有是一个对象,这样分开的目的是,模板引擎可以同时安排上多种不同类型的解析器,我们的模板引擎是可以支持多种解析器对象的;

6)两者的关联主要是为了告诉模板引擎,当前要加载那些文件,以什么样的形式加载;
 模板引擎是一辆汽车,模板解析器是一辆发动机,最终要把发动机关联到汽车上

二:处理Get请求

1)处理请求,渲染模板;创建一个类WebContext,调用里面的setVariable方法来将我们要往这个动态标签里面放的值和前端页面的动态参数$message进行关联替换,把这个要存放的值放到标签里面

2)进行最终渲染调用engine的process方法来进行最终渲染,里面有两个参数。文件名,webContext,最终进行替换;

上面是抓包的一个过程

当前的模板引擎是一个对象,解析器是一个对象,这样分开的目的是模板引擎可以同时安排上多个不同类型的解析器;

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("helloworldhh")
public class HelloServlet3 extends HttpServlet {private TemplateEngine engine=new TemplateEngine();public void init() throws ServletException{
1)完成Thymeleaf的初始化操作,还要创建一个模板解析器对象,this.getServletContext
2)Context的意思是上下文,每一个webapp里面都有一个Context,一个webapp里面可以有多个Servlet对象,这些Servlet对象共用一个Context对象
3)Context对象是Tomact加载webapp的时候所创建出的一个对象,Tomact在webapps中有多个webapp,每一个webapp都会创建出对应的Context对象;
4)每一个目录都可以看成是一个webapp,所以说同一个webapp里面的若干个Servlet共用一个Context对象
5)所以这里面的getServletContext就是获取到这里面的Context对象ServletContextTemplateResolver resolver=new ServletContextTemplateResolver(this.getServletContext());
6)让模板解析器来加载文件,先设置前缀,再设置后缀,也就是说当前的目录中凡是带.html的文件都会被加载出来,就是告诉模板引擎,要进行加载一些文件到内存里面,以备后用resolver.setPrefix("/WEB-INF/template/");resolver.setSuffix(".html");resolver.setCharacterEncoding("utf-8");
//把解析器对象设置到engine对象中,给汽车配置发动机engine.setTemplateResolver(resolver);}
上面的操作在执行模板渲染之前,把刚才写的模板html代码里面的message变量进行替换之前,要先进行初始化,初始化操作只是执行一次即可
______________________________________________________________________________________protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.处理请求,先从参数中读取传过来的message的值(queryString中读取)String str1=req.getParameter("query");
//2把当前从请求中的读取出来的message的值和html模板中的${message}给关联起来WebContext webContext=new WebContext(req,resp,getServletContext());webContext.setVariable("message",str1);//这个操作这就会把str1中的值放到h3标签中
//3最终进行渲染,第一个参数就是HTML文件的前缀,也就是说把html文件替换成webContextString html=engine.process("hello",webContext);resp.getWriter().write(html);}
}

1)private TemplateEngine templateEngine=new TemplateEngine(),是模板引擎的主体,功能就是调用process方法来进行渲染模板,完成最终的模板里面的内容进行替换的过程,将一个键值对结构和一个模板文件进行关联起来了,这里面没有参数;
2)ServletContextTemplateResolver resovler=new ServletContextTemplateResovler()
里面要传的参数是this.getServletContext();主要作用就是加载模板文件,相当于是发动机,告诉TemplateEngin模板文件都有哪些;
3)WebContext webContext=new WebContext();他就是一个键值对结构,只不过是在Thymeleaf用一个专门的类来进行表示的,很多的模板引擎就是直接拿一个哈希表来进行标识的,我们直接把WebContext想象成是一个哈希表就行了,主要功能就是将动态标签里面的值替换成我们我们想要的值;

就是将${message}和咱们Java中的一个变量结果进行关联起来
里面要传递的参数是req,resp,getServletContext;

1)private TemplateEngine templateEngine=new TemplateEngine();他是模板引擎的主体,功能就是调用process方法来进行渲染模板,完成最终的模板里面的内容进行替换的过程,将一个键值对结构和一个模板文件进行关联起来了;这里面没有参数;
2)ServletContextTemplateResolver resovler=new ServletContextTemplateResovler()
里面要传的参数是this.getServletContext();
3)WebContext webContext=new WebContext();他就是一个键值对结构,只不过是在Thymeleaf用一个专门的类来进行表示的,很多的模板引擎就是直接拿一个哈希表来进行标识的,我们直接把WebContext想象成是一个哈希表就行了;
里面要传req,resp,getServletContext;

使用ThymeLeaf的流程:

1)先编写HTML模板文件,放到固定的目录中;

2)创建出一个TemplateEngin实例,这是模板引擎中最核心的类,最重要进行替换,相当于汽车;

3)再创建一个ServletContextTemplateResolver实例,并把要指定加载的模板文件路径和字符集,文件类型通过setPrefix(指定路径)和setSuffix(指定文件类型,html文件),并通过setCharacterEncodding来指定字符编码方式,相当于是汽车的导航仪,告诉气车到哪里执行工作

4)再通过engin.setTemplateResovler(resolver),这个方法把上面的两个实例进行关联起来;把导航和汽车关联起来;

5)上面的过程都是在init()中做的初始化操作,下面正是调用doGET方法;

6)我们通过创建WebContext(运送的货)这个类将前端页面的$+变量名和我们在后端中的要被替换的变量给关联到一起;

7)再调用engine的process方法来完成模板中内容的替换,参数是HTML文件名(源文件),WebContext(替换之后的文件)对象

8)本质上来说把变量的值替换到HTML中,主要就是HTML中的变量字符串和java代码中的字符串进行替换

ServletContextTemplateResolver确定唯一的webapp;

webContext要确定唯一的Servlet;

  <!-- 我们期望h3里面的内容是可变的,是通过Servlet代码计算传过来的 -->
<h3 th:text="${message}"></h3>
<!--这里面的th就是thymeleaf的缩写,意思是这个属性是由thymeleaf所提供,
text表示这里面的内容是一个字符串,“${message}” 是一个普通的变量,这样我们就可以在java代码,就可以把这个变量的值填写进来-->

重新写一个猜数字界面

1)当我们在浏览器上面输入一个URL路径的时候,就相当于给服务器发送了一个GET请求,我们第一次访问是不会出现猜数字的结果和次数的,况且我们在后续进行访问的时候form表单和提交按钮都是不变的,发生变化的内容只是猜的次数和猜的结果,因为这些是可变的,所以我们还是需要使用模板引擎来进行渲染;

此时是第一次访问只需将newGame设成true即可,不需要显示出访问次数和猜的情况;

2)当我们在浏览器上面提交一个我们所要猜的数字之后,就会触发POST请求,就会把我们刚才才的数字发送过去

前端代码:

<form action="guessNum" method="POST">
<input type="text" name="num">
<input type="submit" name="猜数字"></form><!-- 这个th:if是一个条件判断的逻辑,if后面的表达式为真,就执行显示的标签,如果为假,就不进行显示 --><div th:if="${!newGame}"><!-- 这两个代码,猜了以后才会进行显示,我们在开始进行一局游戏的时候是不会显示这两个标签的,因为在这里面是动态变化的,所以我们要通过模板引擎的方式来进行渲染--><div th:text="${result}"></div><div th:text="${count}"></div></div>
@WebServlet("/guessNum")
public class HelloServlet3 extends HttpServlet{private TemplateEngine templateEngine=new TemplateEngine();@Overridepublic void init() throws ServletException {ServletContextTemplateResolver servletContextTemplateResolver=new ServletContextTemplateResolver(this.getServletContext());servletContextTemplateResolver.setPrefix("/WEB-INF/template/");servletContextTemplateResolver.setSuffix(".html");servletContextTemplateResolver.setCharacterEncoding("utf-8");templateEngine.setTemplateResolver(servletContextTemplateResolver);}//先获取到页面的初始情况,并且初始化,生成一个随机的数字private int num=0;//count表示要猜的数字private int count=0;protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {开始一局新的游戏,不显示猜的结果和次数//1 先生成一个随机的数字//这里面必须要设置一个返回的body的类型,要不然默认就会返回一个HTML标签resp.setContentType("text/html;charset=utf-8");Random random=new Random();num= random.nextInt(100)+1;count=0;//2返回一个HTML页面,这时开始一局新的游戏WebContext webContext=new WebContext(req,resp,getServletContext());webContext.setVariable("newGame",true);String html=  templateEngine.process("hello",webContext);//要把hello文件里面的值替换成webContext中的内容resp.getWriter().write(html);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1先从我们的请求中,读去用户提交的输入框的内容String integer=req.getParameter("num");resp.setContentType("text/html;charset=utf-8");int guessnum=Integer.parseInt(integer);String result="";//2进行比较if(num==guessnum){result="你猜对了";}else if(num>guessnum){result="你猜小了";}else{result="你猜大了";}//3猜的次数增加count++;WebContext webContext=new WebContext(req,resp,getServletContext());webContext.setVariable("newGame",false);webContext.setVariable("count",count);webContext.setVariable("result",result);String html=templateEngine.process("hello",webContext);System.out.println(html);resp.getWriter().write(html);}
}

咱们此时的模板文件是在text.html文件里面,当我们去访问webContext中的路径的时候,Servlet会自动进行渲染操作,后端会自动地给我们返回一个HTML页面,这个页面是服务器自动返回的

(不需要进行访问text.html,访问也无法进行访问)

127.0.0.1:8080/Java100/text.html

127.0.0.1:8080/Java100/GuessNum

我们可以在浏览器上面直接输入网址:127.0.0.1:8080/Java200/upload,模板引擎最大的意义就是让Java代码和界面的Html代码分离开了;

常见的Thymeleaf中的命令:

1)th:text:在标签体的表达式获取到的文本内容,把我们后端指定的值替换到标签的内容里面,主要是替换字符串;
2)th:if:表示条件,当表达式为真的时候显示内容,为假时不显示,一般的用法是放到一个大的div标签中,里面套上一些小的div标签,里面有各种属性;
3)th:[HTML标签属性]设置任意的HTML标签中属性的值

例如说现在有一个image标签,里面有src属性,我们想要动态变化src属性
这是就可以在模板中显示:< img th:src="${url}"></a>,这样就可以直接在java代码中进行关联

String path="d:/html文件",就可以写成webContext.setVariable("url",path),像a标签的href属性也是这样;
4)th:each循环渲染,循环访问元素,有时服务器提供的数据可能是一个数组,list方式来呈现,这时就可以通过这个list来把数组中的每一个元素都进行渲染,最终以循环的方式展现出来

1)显示:指的是页面上可以看到这个内容,同时Html标签是存在的;

2)不显示:页面上看不到这个内容,但是HTML标签可能仍然存在,只不过是通过display:none,给进行了隐藏/或其他方式

3.不渲染:html标签都没有生成

模板引擎:根据条件的不同,决定渲染的最终页面效果就不同;

5)实战项目:实现一个电话本显示电话号码的简单案例

1)先去写一个模板界面,主要里面有一个ul,ul中有<li>标签,<li>标签里面有<span>标签,li标签里面中li就包含了一个完整的记录,姓名+电话,每一个人的信息在ul里面都对应着一组li标签

2)我们在Servlet代码中就要把姓名和电话以数组的形式展现出来,借助th:each来进行渲染;

 <ul><!--这个each里面是一个person对象,persons是一个数组 --><li th:each="person:${persons}"><!-- 这里面的值分别对对象设置属性 --><span th:text="${person.name}"></span><span th:text="${person.phone}"></span></li></ul>

1)th:each="person:${persons}",Java代码中传过来一个persons数组,里面的每一个元素就是一个person对象,一个person对象里面有两个成员属性,name和phone;

2)th:each="person:"${persons}",person就相当于取到persons中的每一个元素了,在进行后面的代码,就可以通过${person.name}和${person.phone}来进行循环访问person对象中的属性了(和for each有一点像);

3)在正常情况下,在后端的Servlet代码中,我们可以用一个数组或者List来对前端代码中persons进行替换;最终在页面上显示,数组中有几个对象,就会在页面上显示几个li标签;

class Person{public String name;public String phone;public Person(String name, String phone) {this.name = name;this.phone = phone;}
}@WebServlet("/helloyou")
public class HelloServlet3 extends HttpServlet {private TemplateEngine templateEngine=new TemplateEngine();@Overridepublic void init() throws ServletException {ServletContextTemplateResolver servletContextTemplateResolver=new ServletContextTemplateResolver(this.getServletContext());servletContextTemplateResolver.setPrefix("/WEB-INF/template/");servletContextTemplateResolver.setSuffix(".html");servletContextTemplateResolver.setCharacterEncoding("utf-8");templateEngine.setTemplateResolver(servletContextTemplateResolver);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {WebContext webContext=new WebContext(req,resp,getServletContext());resp.setContentType("text/html;charset=utf-8");List<Person> list=new ArrayList<>();list.add(new Person("李佳伟","12503487e"));list.add(new Person("李佳鑫","12506788a"));webContext.setVariable("persons",list);templateEngine.process("hello",webContext, resp.getWriter());}
}

常见错误:

1)如果说发现页面上什么内容都不进行显示看看是不是setVariable方法中的两个参数有问题

2)但是说有的时候,如果模板渲染的代码写错了,正常来说是会抛出异常的,但是有的时候就不会抛出异常,甚至一点错误信息也没有,因为有的时候,engine.process方法就会将异常给消化了,并不会在外边体现出来;

3)我们希望engine方法返回一个字符串,再去调用resp中的方法进行写回,就可以出现异常信息,出现500前端代码可能有问题

替换链接:

 <a th:href="${message}" th:text="${str}"></a>

模板引擎替换拼接字符串(1)相关推荐

  1. knockoutJS学习笔记01:从拼接字符串到编写模板引擎

    开篇 关于knockout的文章,园里已经有很多大神写过了,而且都写得很好.其实knockout学习起来还是很容易的,看看官网的demo和园里的文章,练习练习就可以上手了(仅限使用,不包含研究源码). ...

  2. js模板引擎渐进--后记

    至此,算是完成了一个系列了. 本来是想写的更详细的,但是太详细每次说的东西就少的可怜. 在学习的过程中,每次的改进改动博主都是复制一个新的文件进行,整个有二十多篇,中间有很多小细节的东西,集中在 ea ...

  3. 前端模板引擎 —— 带你学习Jade / Pug 模板引擎

    模板引擎是什么 模板引擎是将静态部分糅合的一种实现机制或者技术. 目前使用较广的模板引擎有以下几种:Jade / Pug.EJS.Handlebars. 本文详述Jade / Pug模板引擎在项目开发 ...

  4. node中使用模板引擎

    模板引擎 1 .模板引擎基础 1.1模板引擎 主要功能就是拼接字符串(将HTML模板与数据拼接) 模板引擎不是node.js本身提供的,是第三方模块 让开发者以更友好的方式拼接字符串,是项目代码更加清 ...

  5. php开发自己的模板引擎,如何用PHP来编写自己的模板引擎 - PHP|模板引擎 - 软件工程|架构设计|网站设计|艺术营销 - 河洛炎黄 - 魏文侯...

    本文的目的不是为了让大家学会如何编写一个完善的模板引擎,只是为了给PHP初学入门者解释模板引擎的原理和作用. PHP模板引擎的作用是为了让表现层逻辑和页面本身分开,让程序员和美工的工作可以相对独立,并 ...

  6. js模板引擎渐进--if/else(7)

    有了 each 的经验后,要实现 if/else 这种指令就简单了-------在  case '}' 处对 varcode 进行指令的判断即可. 模板代码: {if data.value==1}&l ...

  7. node.js 学习笔记(二)模板引擎和C/S渲染

    node.js 学习笔记(二)模板引擎和C/S渲染 文章目录 node.js 学习笔记(二)模板引擎和C/S渲染 一.初步实现Apache功能 1.1 使用模板引擎 1.2 在 node 中使用模板引 ...

  8. html页面增删改查模板,模板引擎+(实现数据增删改查小项目)

    art-template模板引擎: 在命令行工具中使用 npm install art-template 命令进行下载 使用const template = require('art-template ...

  9. 使用arttemplate js模板引擎,直接用模板渲染,减少字符串拼接。

    html: <div class="box"></div><script id="t1" type="text/html ...

最新文章

  1. 小米note3无线显示电脑连接服务器,小米note3如何连接电脑 小米note3连接电脑没反应怎么办...
  2. 从谷歌离职回到西湖大学,只为让AI听懂你的悲伤!
  3. WRF,WPS,WRF-Chem安装及编译步骤及bug总结(2)
  4. 怎么才能更好的掌握Python这门语言?该怎么学呢?
  5. [Lua学习]简单链表
  6. osg图元绑定方式总结
  7. MVC模式 与 Model2模型 介绍
  8. system health_Health Hack 2014:开源,开放数据和跨学科协作的力量
  9. 从“小众”到“首选”,推动云原生产业落地华为云作用几何?
  10. android 设置超时时间,为android requestSingleUpdate设置超时
  11. nyoj 122 Triangular Sums
  12. CNDS 签到在哪里
  13. ubuntu 20.04安装输入法,微信,QQ,亲测使用很方便。
  14. Java 年龄与疾病
  15. 增值税/所得税 概念与区别
  16. 图片聚类——k-means算法的python实现
  17. Unity3D 实现录音小案例
  18. Airtest+Poco+Pytest框架搭建1
  19. Android强制关闭某个指定应用 “关闭应用”
  20. 首家试水企业微信客户社群运营的春秋航空,给其他航司带来了怎样的启示?

热门文章

  1. 如何做SEO如何优化排名教程
  2. 张长水:图像识别与机器学习
  3. VisualFreeBasic+Miniblink做浏览器实现js内容替换
  4. node.js安装后输入“node -v”提示'node' 不是内部或外部命令,也不是可运行的程序的解决方法
  5. JSP Taglib指令具有什么功能呢?
  6. [转帖]房博士教你购房(五)
  7. 四种静态路由配置方法
  8. VR虚拟现实大屏展示如何通过H265播放器EasyPlayerPro实现8K视频流播放?
  9. 1.7.2 W3C代码标准及规范(完整版)
  10. 笨办法学python第五版_笨办法学python PDF下载|笨办法学python第五版 电子版附目录_最火软件站...