目录
因为使用模板引擎技术,需要在Maven中的pom.xml中引入thymeleaf依赖。我这里jdk使用的是1.8;
模板引擎的依赖版本为3.1.0。如果开发环境相同,可以参考下面的依赖。
注意:这里的依赖和自己的环境要对应,否则之后可能会出现异常
引入依赖相当于是从远程仓库Maven自动下载依赖包,方便使用。这些依赖代码需要添加到Maven项目中的pom.xml文件中,之后在dependencs中添加下面依赖即可。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 开发编译时需要这个依赖包,运行时不需要 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!-- 开发编译时需要这个依赖包,运行时不需要 -->
<scope>provided</scope>
</dependency>
在使用模板技术时,将需要使用模板技术进行渲染的页面需要放到指定文件夹中才能起到效果,这里就了解一下整体的Maven项目结构。
方法 | 功能 |
th:text | 在标签体中展示表达式求值结果的文本内容 |
th:[HTML标签属性] | 标签属性的值 |
th:if | 当表达式的结果为真时则显示内容,否则不显示 |
th:each | 循环访问元素 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>使用模板技术渲染页面</h3>
<!--动态添加文本-->
<p th:text="${message}"></p>
<!--动态添加路径-->
<a th:href="${a1}">搜狗</a>
<!--为true就显示该标签 (这里使用条件判断)-->
<p th:if="${isLogin}">已经登录</p>
<ul>
<!-- 这里是循环遍历 name知识自己定义的一个变量 ;${变量}这里的变量需要前后端保持一致 -->
<li th:each="name : ${names}">
<span th:text="${name}"></span>
</li>
</ul>
<ol>
<!-- 动态渲染对象中的值,里面的值通过.进行获取 -->
<li th:each="user : ${users}">
姓名:<span th:text="${user.name}"></span>
年龄:<span th:text="${user.age}"></span>
</li>
</ol>
</body>
</html>
首先需要初始化模板引擎,初始化前需要使用引擎解析器,设置编码格式和设置网页模板路径的前后缀,最后将解析器放到模板引擎中。然后就可以在请求方法中使用WebContext类中的setVariable方法来设置变量和值,这里在使用WebContext时还需要借助getServletContext(),最终将将webContext中的内容渲染到模板引擎中即可。最后将渲染后的页面发送给请求端即可。
Servlet代码如下:
package practice;
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;
import java.lang.reflect.Array;
import java.util.Arrays;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
//初始化模板引擎
TemplateEngine engine = new TemplateEngine();
@Override
public void init() throws ServletException {
//该方法在实例对象的时候只执行依次,在这里面使用模板技术,提高效率
//创建渲染网页的模板引擎解析器
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(getServletContext());
//设置渲染时的编码格式
resolver.setCharacterEncoding("utf-8");
//设置网页模板路径的前后缀
resolver.setPrefix("WEB-INF/templates/");
resolver.setSuffix(".html");
//将解析器放到模板引擎中
engine.setTemplateResolver(resolver);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//创建一个web上下文,用于存放键值对
WebContext webContext = new WebContext(req, resp, getServletContext());
webContext.setVariable("message", req.getParameter("msg"));
webContext.setVariable("a1", "http://www.sogou.com");
webContext.setVariable("isLogin",true);
webContext.setVariable("names", Arrays.asList("张三","李四","王五"));
webContext.setVariable("users", Arrays.asList(
new User("张三",18),
new User("李四",20),
new User("王五",22)
));
//模板名称+上下文(保存的数据)
//返回值就是渲染后的网页字符串
String html = engine.process("hello", webContext);
resp.getWriter().write(html);
}
//必须要有getter和setter
private static class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
由于模板引擎只需要一次实例化,而且为了方便多个servlet对模板引擎的调用,我们这里使用监听器来监听ServletContext,并将创建好的模板引擎放到ServletContext中,由于ServletContext可以在一个webapp中全局使用,所以之后只需要使用getServletContext()方法就可以直接调用出该模板引擎实例。
package practice;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener//不加就不会进行监听
//使用监听器来创建模板引擎
public class TemplateEnginListener implements ServletContextListener {
/**
* 这个方法在创建servletcontext的时候会自动进行调用
* @param servletContextEvent
*/
public void contextInitialized(ServletContextEvent servletContextEvent) {
//获取servletcontext对象
ServletContext servletContext = servletContextEvent.getServletContext();
//创建模板引擎实例
TemplateEngine engine = new TemplateEngine();
//创建模板引擎加载器
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(servletContext);
//给加载器设置属性,将渲染的HTML文件的前缀和后缀进行设置,最后会自动进行拼接
//设置编码格式
resolver.setCharacterEncoding("utf-8");
//设置前后缀
resolver.setPrefix("/WEB-INF/templates/");
resolver.setSuffix(".html");
//关联加载器和模板引擎
engine.setTemplateResolver(resolver);
//将模板引擎放到servletcontext中(为了方便之后的调用)
servletContext.setAttribute("engine", engine);
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
package practice;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import javax.servlet.ServletContext;
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;
import java.util.Arrays;
@WebServlet("/listener")
public class ServletListenerDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
ServletContext servletContext = getServletContext();
TemplateEngine engine = (TemplateEngine) servletContext.getAttribute("engine");
//创建一个web上下文,用于存放键值对
WebContext webContext = new WebContext(req, resp, getServletContext());
webContext.setVariable("message", req.getParameter("msg"));
webContext.setVariable("a1", "http://www.sogou.com");
webContext.setVariable("isLogin",true);
webContext.setVariable("names", Arrays.asList("张三","李四","王五"));
webContext.setVariable("users", Arrays.asList(
new ServletListenerDemo.User("张三",18),
new ServletListenerDemo.User("李四",20),
new ServletListenerDemo.User("王五",22)
));
//模板名称+上下文(保存的数据)
//返回值就是渲染后的网页字符串
String html = engine.process("hello", webContext);
resp.getWriter().write(html);
}
//必须要有getter和setter
private static class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
}
文章浏览阅读879次。1.如何设置共享盘只能上传指定文件格式呢?2.如何设置共享盘不能上传电影、可以执行的程序.exe等?_windows 文件共享禁止上传文件类型
文章浏览阅读1.2w次,点赞4次,收藏12次。原来的登录处理流程:通过按钮点击触发,在处理函数内调用wx.login()发现每次登录,第一次都会解密失败,第二次就成功了。<button open-type="getPhoneNumber" bindgetphonenumber="getPhonenumber">登录</button>async getPhonenumber(e){ wx.login()}此时,是先点击的获取用户信息,再进行登录。逻辑是不对的,因为获取手机号之后才进行的登录第一次获取手_wx.getphonenumber
文章浏览阅读562次。什么是原生APP:原生APP别名又叫Native App,该APP开发模式主要是针对IOS、Android、Windows等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是由“云服务器数据+APP应用客户端”两部份构成的。原生APP最大的优势就是性能,是三种APP开发模式里面最好的一个。主要就是:运行够快、支持大量图片内容以及一些动图等、可实现的功能也是最齐全的、并且还能够快捷地使用设备端提供的接口原生APP开发模式的缺点就是价格昂贵、开发时间比较长Android和iOS都需要单独开发_webapp和app区别
文章浏览阅读1.5k次。靶机渗透测试(covfefe):Vulnhub靶机 covfefe靶机:修改靶机的网络配置为桥接模式。攻击机:Kali虚拟机,同样使用桥接模式,即可访问靶机。靶机难度:(Intermediate)目标:Covfefe is my Debian 9 based B2R VM, originally created as a CTF for SecTalks_BNE. It has three flags…flag进度:3/3渗透流程:1. 探测靶机ip地址(netdiscover -i e_covfefe
文章浏览阅读1k次。本文将介绍如何使用Python编写爬虫程序抓取某网站top前100的电影名称,将会使用Python的requests和BeautifulSoup库,获取某网站网站上电影名等信息_all_li item.find
文章浏览阅读5.6k次,点赞6次,收藏9次。样本概况样本信息测试环境以及工具分析目标具体行为分析0利用查壳工具查看1.利用PChunter2.手工清理3.利用火绒剑进行主要行为分析恶意行为的一个简要小结4.脱壳病毒恶意行为分析(OD结合IDA双剑合璧)知识点扩展1:知识点扩展1小结:知识点扩展2知识点扩展3知识点扩展4(编辑函数标签:)知识点扩展5(有关seh链的:)知识点扩展6(Del..._火绒剑定位函数
文章浏览阅读1.5w次,点赞24次,收藏154次。Mysql连接不上本地服务器的解决办法_mysql不能连接localhost
文章浏览阅读2.7k次。简易测试方法 由于光电耦合器的组成方式不尽相同,所以在检测时应针对不同的结构特点,采取不同的检测方法。例如,在检测普通光电耦合器的输入端时,一般均参照红外发光二极管的检测方法进行。对于光敏三极管输出型的光电耦合器,检测输出端时应参照光敏三极管的检测方法进行。 1.万用表检测法。 这里以MF50型指针式万用表和4脚PC817型光电耦合器为例,说明具体检测方法:首先,按照图1_tlp421光电耦合器使用方法
文章浏览阅读722次。限定通配符对类型进行了限制。有两种限定通配符:<? extends T>它通过确保类型必须是T及T的子类来设定类型的上界; <? super T>它通过确保类型必须是T及T的父类设定类型的下界;非限定通配符:类型为<T>,可以用任意类型来替代..._什么是泛型中的限定通配符和非限定通配符
文章浏览阅读7.5k次,点赞3次,收藏11次。图形推理的两大灵魂是数量关系和图形的转动。牢牢把握住这两大灵魂就基本把握了图形推理题目。在这两大灵魂统帅下的十大基本规律,是做图形推理题的必胜工具。图形推理的两大灵魂:数量关系和图形的转动。1. 答案:B分析:方法一,从图形旋转的角度来分析这个题目。顺时针方向看,会发现黑色小方框在作顺时针旋转。具体的说,第一行三个图形中,黑色小方框在作顺时_本题目考察的是图形的种类。 每一行都有 3 种不同的图形。
文章浏览阅读6.6k次,点赞8次,收藏17次。下载maven点击下载解压放入随意的一个目录即可,这里我放在D盘下配置环境变量MAVEN_HOME:D:\apache-maven-3.5.2现在就开始setting.xml的配置。首先配置的第一步是本地仓库的配置,打开setting.xml,我一般配置在maven安装目录下。D:\apache-maven-3.5.2\repo配置好本地仓库后,下一步配置中央仓库阿里云AliMavenaliyun mavenhttp://maven.aliyun.com/nexus/co
文章浏览阅读1.9w次,点赞6次,收藏28次。一、软件下载地址二、支持的型号SinCos SKS36、SKM36、SKS36 外置型和SKM36 外置型:HIPERFACE 接口系列伺服反馈编码器等 比如SICK SRS50-HFA0-K21,SRM50-HZZ0-S21等。三、支持的系统windows 2003 / XP / win7 / win8 /win10及以上四、需要的硬件:USB转RS485线比如像...