模板引擎替换拼接字符串(1)
模板引擎中心思想:解决拼接字符串的方式来进行构建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)相关推荐
- knockoutJS学习笔记01:从拼接字符串到编写模板引擎
开篇 关于knockout的文章,园里已经有很多大神写过了,而且都写得很好.其实knockout学习起来还是很容易的,看看官网的demo和园里的文章,练习练习就可以上手了(仅限使用,不包含研究源码). ...
- js模板引擎渐进--后记
至此,算是完成了一个系列了. 本来是想写的更详细的,但是太详细每次说的东西就少的可怜. 在学习的过程中,每次的改进改动博主都是复制一个新的文件进行,整个有二十多篇,中间有很多小细节的东西,集中在 ea ...
- 前端模板引擎 —— 带你学习Jade / Pug 模板引擎
模板引擎是什么 模板引擎是将静态部分糅合的一种实现机制或者技术. 目前使用较广的模板引擎有以下几种:Jade / Pug.EJS.Handlebars. 本文详述Jade / Pug模板引擎在项目开发 ...
- node中使用模板引擎
模板引擎 1 .模板引擎基础 1.1模板引擎 主要功能就是拼接字符串(将HTML模板与数据拼接) 模板引擎不是node.js本身提供的,是第三方模块 让开发者以更友好的方式拼接字符串,是项目代码更加清 ...
- php开发自己的模板引擎,如何用PHP来编写自己的模板引擎 - PHP|模板引擎 - 软件工程|架构设计|网站设计|艺术营销 - 河洛炎黄 - 魏文侯...
本文的目的不是为了让大家学会如何编写一个完善的模板引擎,只是为了给PHP初学入门者解释模板引擎的原理和作用. PHP模板引擎的作用是为了让表现层逻辑和页面本身分开,让程序员和美工的工作可以相对独立,并 ...
- js模板引擎渐进--if/else(7)
有了 each 的经验后,要实现 if/else 这种指令就简单了-------在 case '}' 处对 varcode 进行指令的判断即可. 模板代码: {if data.value==1}&l ...
- node.js 学习笔记(二)模板引擎和C/S渲染
node.js 学习笔记(二)模板引擎和C/S渲染 文章目录 node.js 学习笔记(二)模板引擎和C/S渲染 一.初步实现Apache功能 1.1 使用模板引擎 1.2 在 node 中使用模板引 ...
- html页面增删改查模板,模板引擎+(实现数据增删改查小项目)
art-template模板引擎: 在命令行工具中使用 npm install art-template 命令进行下载 使用const template = require('art-template ...
- 使用arttemplate js模板引擎,直接用模板渲染,减少字符串拼接。
html: <div class="box"></div><script id="t1" type="text/html ...
最新文章
- 小米note3无线显示电脑连接服务器,小米note3如何连接电脑 小米note3连接电脑没反应怎么办...
- 从谷歌离职回到西湖大学,只为让AI听懂你的悲伤!
- WRF,WPS,WRF-Chem安装及编译步骤及bug总结(2)
- 怎么才能更好的掌握Python这门语言?该怎么学呢?
- [Lua学习]简单链表
- osg图元绑定方式总结
- MVC模式 与 Model2模型 介绍
- system health_Health Hack 2014:开源,开放数据和跨学科协作的力量
- 从“小众”到“首选”,推动云原生产业落地华为云作用几何?
- android 设置超时时间,为android requestSingleUpdate设置超时
- nyoj 122 Triangular Sums
- CNDS 签到在哪里
- ubuntu 20.04安装输入法,微信,QQ,亲测使用很方便。
- Java 年龄与疾病
- 增值税/所得税 概念与区别
- 图片聚类——k-means算法的python实现
- Unity3D 实现录音小案例
- Airtest+Poco+Pytest框架搭建1
- Android强制关闭某个指定应用 “关闭应用”
- 首家试水企业微信客户社群运营的春秋航空,给其他航司带来了怎样的启示?
热门文章
- 如何做SEO如何优化排名教程
- 张长水:图像识别与机器学习
- VisualFreeBasic+Miniblink做浏览器实现js内容替换
- node.js安装后输入“node -v”提示'node' 不是内部或外部命令,也不是可运行的程序的解决方法
- JSP Taglib指令具有什么功能呢?
- [转帖]房博士教你购房(五)
- 四种静态路由配置方法
- VR虚拟现实大屏展示如何通过H265播放器EasyPlayerPro实现8K视频流播放?
- 1.7.2 W3C代码标准及规范(完整版)
- 笨办法学python第五版_笨办法学python PDF下载|笨办法学python第五版 电子版附目录_最火软件站...