JSP 和 JSTL
文章目录
- 🍓摘要
- 🍓一、JSP
- 🍉1.1 JSP的基础语法
- 🍫1.1.1 简介
- 🍫1.1.2 依赖
- 🍫1.1.3 注释
- 🍫1.1.4 Scriptlet 脚本
- 🍉1.2 JSP的指令标签
- 🍫1.2.1 include 静态包含
- 🍫1.2.2 include 动态包含
- 🍉1.3 JSP的四大域对象
- 🍫1.3.1 四种属性范围
- 🍫1.3.2 验证属性范围的特点
- 🍉1.4 EL表达式的使用
- 🍫1.4.1 EL表达式的语法
- 🍫1.4.2 EL表达式的使用
- 🍌1.4.2.1 获取数据
- 🍌1.4.2.2 获取List
- 🍌1.4.2.3 获取Map
- 🍌1.4.2.4 获取JavaBean对象
- 🍌1.4.2.5 empty判空
- 🍌1.4.2.6 EL运算
- 🍓二、JSTL
- 🍉2.1 标签的使用
- 🍫2.1.1 依赖
- 🍫2.1.2 JSTL库
- 🍉2.2 条件动作标签
- 🍫2.2.1 set 存储数据
- 🍫2.2.2 if 标签
- 🍫2.2.3 choose、when、otherwise 标签
- 🍉2.3 迭代标签
- 🍫2.3.1 forEach 标签
- 🍉2.4 格式化动作标签
- 🍫2.4.1 formatNumber 标签
- 🍫2.4.2 formatDate 标签
- 🍫2.4.3 parseNumber 标签
- 🍫2.4.4 parseDate 标签
提示:以下是本篇文章正文内容,Java系列学习将会持续更新
🍓摘要
回到目录…
🍓一、JSP
🍉1.1 JSP的基础语法
🍫1.1.1 简介
JSP:Java Server Page SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。
它相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。
相比 servlet 而言,servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产生动态数据的同时, 也很容易对数据进行排版。
不管是 JSP 还是 Servlet,虽然都可以用于开发动态 web 资源。但由于这 2 门技术各自的特点,在长期的软件实践中,人们逐渐把 servlet 作为 web 应用中的控制器组件来使用, 而把 JSP 技术作为数据显示模板来使用。
其实 Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个 Jsp 翻译 成一个
Servlet,这个文件存放在tomcat(源码目录) 中的 work 目录中。
🍫1.1.2 依赖
<!-- Servlet 依赖 -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
<!-- jsp 依赖 -->
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version><scope>provided</scope>
</dependency>
回到目录…
🍫1.1.3 注释
在 JSP 中支持两种注释的语法操作:
① 显示注释语法:从 HTML 风格继承而来,这种注释是允许客户端看见的。
② 隐式注释语法:从 JAVA 风格继承;JSP 自己的注释,此种注释是客户端无法看见的。
JSP 的三种注释方式:
1) // 注释,单行注释 /* 多行注释*/2) <!-- HTML风格的注释 -->3) <%-- JSP注释 --%>
🍫1.1.4 Scriptlet 脚本
在 JSP 中最重要的部分就是 Scriptlet(脚本小程序),所有嵌入在 HTML 代码中的 Java 程序。
在 JSP 中一共有三种 Scriptlet 代码:都必须使用 Scriptlet 标记出来。
第一种:<% %>:java 脚本段,可以定义局部变量、编写语句第二种:<%! %>:声明,可以定义全局(成员)变量、方法、类第三种:<%= %>:表达式,数据一个变量或具体内容
通过观察解析为java文件的jsp代码理解三种小脚本:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>01_footbook</title></head><body><%-- 三种脚本 --%><%-- 声明的是 service方法的局部变量 --%><%int num = 20;System.out.println("num = " + num);%><%-- 声明的是成员变量 --%><%!String name = "张三";%><%-- 原样输出,相当于print的参数 --%><%= name %></body>
</html>
回到目录…
🍉1.2 JSP的指令标签
使用包含操作,可以将一些重复的代码包含进来继续使用,从正常的页面组成来看,有时可能分为几个区域。而其中的一些区域可能是一直不需要改变的,改变的就其中的一个具体内容区域。现在有两种方法可以实现上述功能。
方法一:在每个 JSP 页面(HTML)都包含工具栏、头部信息、尾部信息、具体内容。
方法二:将工具栏、头部信息、尾部信息都分成各个独立的文件,使用的时候直接导入。
很明显,第二种方法比第一种更好,第一种会存在很多重复的代码,并且修改很不方便,在 JSP 中如果要想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使用 include 指令即可,动态包含则需要使用 include 动作标签。
🍫1.2.1 include 静态包含
静态包含就是将内容进行了直接的替换,就好比程序中定义的变量一样,是在 servlet 引擎转译时,就把此文件内容包含了进去(两个文件的源代码整合到一起, 全部放到_jspService 方法中),所以只生成了一个 servlet,所以两个页面不能有同名的变量。 运行效率高一点点。耦合性较高,不够灵活。
<%@ include file="要包含的文件路径" %> <!-- 相对路径 --><%@include file="include.jsp" %>
或
<%@include file="include.html" %>
🍫1.2.2 include 动态包含
动态包含在代码的编译阶段,包含和被包含部分是两个独立的部分,只有当运行时,才会动态包含进来,好比方法的调用。
<jsp:include page="include.jsp"></jsp:include>
注意:动态包含,中间不要加任何内容,包括空格,除非确认要使用参数,否则报错!
<jsp:include page="include.html"></jsp:include>
<%String a = "hello.jsp";
%>
<jsp:include page="<%=a %>"></jsp:include>
使用动态包含还可以通过在页面之间传参。接收参数通过 request.getParameter(name);
<jsp:include page="hello.jsp" flush="true">
<jsp:param name="uname" value="zhangsan"/>
</jsp:include>
hello.jsp
<!-- 接收参数 -->
<%=request.getParameter("uname")%>
回到目录…
🍉1.3 JSP的四大域对象
🍫1.3.1 四种属性范围
在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以再多少个页面中保存并可以继续使用
- page 范围
pageContext : 只在一个页面中保存属性,跳转之后无效 - request 范围
request : 只在一次请求中保存,服务器跳转后依然有效 - session 范围
session : 在一次会话范围中,无论何种跳转都可以使用 - application 范围
application : 在整个服务器上保存
方法 | 类型 | 描述 |
---|---|---|
public void setAttribute(String name, Object o) | 普通 | 设置属性的名称及内容 |
public Object getAttribute(String name) | 普通 | 根据属性名称取属性 |
public void removeAttribute(String name) | 普通 | 删除指定的属性 |
🍫1.3.2 验证属性范围的特点
-
page
本页面取得,服务器端跳转()后无效。 -
request
服务器跳转有效,客户端跳转无效。
如果是客户端跳转,则相当于发出了两次请求,那么第一次的请求将不存在了;如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围。 -
session
无论客户端还是服务器端都可以取得,但是现在重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中,并在相关的页面取得。
对于服务器而言,每一个连接到它的客户端都是一个session。
如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application。 -
application
所有的application属性直接保存在服务器上,所有的用户(每一个session)都可以直接访问取得。
只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重启了,则无法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。
问:使用哪个范围呢?
答:在合理范围尽可能小。
回到目录…
🍉1.4 EL表达式的使用
🍫1.4.1 EL表达式的语法
EL(Expression Language) 是为了使 JSP 写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更加简化。
语法结构非常简单: ${expression}
EL 表达式一般操作的都是域对象中的数据,操作不了局部变量。
域对象的概念在 JSP 中一共有四个:pageContext
, request
, session
, application
;范围依次是 本页面,一次请求, 一次会话,整个应用程序。
当需要指定从某个特定的域对象中查找数据时可以使用四个域对象对应的空间对象,分别是: pageScope
, requestScope
, sessionScope
, applicationScope
。
而 EL 默认的查找方式为从小到大查找,找到即可。当域对象全找完了还未找到则返回空字符串""。
🍫1.4.2 EL表达式的使用
🍌1.4.2.1 获取数据
设置域对象中的数据
<%pageContext.setAttribute("uname","zhangsan"); // page作用域request.setAttribute("uname","lisi"); // request作用域session.setAttribute("uname","wangwu"); // session作用域application.setAttribute("uname","zaholiu"); // application
%>
获取域对象的值
<%-- 获取域对象中的数据:默认查找方式为从小到大,找到即止。若四个范围都未找到,则返回空字符串。--%>
${uname} <!-- 输出结果为:zhangsan -->
获取指定域对象的值
${pageScope.uname} <!-- page作用域 -->
${requestScope.uname} <!-- request作用域 -->
${sessionScope.uname} <!-- session作用域 -->
${applicationScope.uname} <!-- application作用域 -->
🍌1.4.2.2 获取List
<%List<String> strs = new ArrayList<>();strs.add("aaa");strs.add("bbb");strs.add("ccc");request.setAttribute("list", strs);
%>
list的长度: ${list.size()}
list的内容: ${list[0]}、${list[1]}、${list.get(2)}
🍌1.4.2.3 获取Map
<%Map<String, String> map = new HashMap<>();map.put("name", "zhangsan");map.put("age", "21");map.put("sex", "男");request.setAttribute("map", map);
%>
name: ${map.name}
age: ${map["age"]}
sex: ${map.get("sex")}
🍌1.4.2.4 获取JavaBean对象
<%User user = new User("admin", "123456", 20);request.setAttribute("user", user);
%>
user: ${user}
username: ${user.username}
password: ${user.password}
age: ${user.getAge()}
🍌1.4.2.5 empty判空
为空时返回true: ${empty admin}
存在时返回false: ${empty user}
存在时返回true: ${!empty user}
🍌1.4.2.6 EL运算
<%-- 等值判断 --%>
${a == b }
${c eq d }
${a == 5 }
${c == 'aa' }<%-- 算术运算 --%>
${a + b }
${a / b } 或 ${a div b }<%-- 大小比较 --%>
${a > b}
${a + 1 > 10 }
${a + b >= 10 }
${a > b && b > 5 }
${a + b > 10 || a - b > 5 }
回到目录…
🍓二、JSTL
🍉2.1 标签的使用
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。
🍫2.1.1 依赖
<!-- JSTL 依赖 -->
<dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-impl</artifactId><version>1.2.5</version>
</dependency>
<dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version>
</dependency>
🍫2.1.2 JSTL库
我们现在只讨论 JSTL 中最重要的标签,迭代集合以及格式化数字和日期几个标签。
核心标签库:
http://java.sun.com/jsp/jstl/core
包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
格式化标签库:
http://java.sun.com/jsp/jstl/fmt
用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
为了在 JSP 页面使用 JSTL 类库,必须以下列格式使用 taglib 指令:<%@taglib uri="" prefix="" %>
例如:
<%-- 引入核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
回到目录…
🍉2.2 条件动作标签
条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在 Java 中是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标签可以执行条件式动作指令:if、 choose、when 和 otherwise。
🍫2.2.1 set 存储数据
🍌 ①示例:
<%-- 相当于 request.setAttribute("aaa", 111); --%>
<%-- var:变量名, value:变量值, scope:作用域 --%>
<c:set var="aa" value="111" scope="request"></c:set>aa的值为: ${aa}
🍫2.2.2 if 标签
if 标签先对某个条件进行测试,如果该条件运算结果为 true, 则处理它的主体内容,测试结果保存在一个 Boolean 对象中,并创建一个限域变量来引用 Boolean 对象。可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。
🍌 ①语法格式:
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
🍌 ②属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | var属性的作用域 可取值:page\request\session\application | 否 | page |
🍌 ③示例:
<%-- test:EL表达式, scope:作用域, var:存储if结果 --%>
<c:if test="${aa > 100}" scope="request" var="result">aa > 100 的判断结果为: ${result}
</c:if>
注: JSTL中没有else标签。为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为相反的条件。
回到目录…
🍫2.2.3 choose、when、otherwise 标签
choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似,用于在众多选项中做出选择。也就是说:他们为相互排斥的条件式执行提供相关内容。
switch 语句中有 case,而 choose 标签中对应有 when,switch语句中有 default,而 choose 标签中有 otherwise。
🍌 ①语法格式:
<c:choose><c:when test="<boolean>">...</c:when><c:when test="<boolean>">...</c:when><c:otherwise>...</c:otherwise>
</c:choose>
🍌 ②属性:
- choose 标签没有属性。
- when 标签只有一个 test 属性。
- otherwise 标签没有属性。
🍌 ③示例:
<c:choose><c:when test="${num < 60}">学渣</c:when><c:when test="${num > 60 && num < 80}">中等生</c:when><c:when test="${num > 80 && num < 90}">优等生</c:when><c:otherwise>学霸</c:otherwise>
</c:choose>
🍌 ④注意点:
- choose 标签和 otherwise 标签没有属性,而 when 标签必须设置 test 属性。
- choose 标签中必须有至少一个 when 标签,可以没有 otherwise 标签。
- otherwise 标签必须放在最后一个从 when 标签之后。
- choose 标签中只能有 when 标签和 otherwise 标签,when 标签和 otherwise 标签可以嵌套其他标签。
- otherwise 标签在所有的 when 标签不执行的情况下才会执行。
回到目录…
🍉2.3 迭代标签
forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可以迭代java.util.Iterator 和 java.util.Enumeration,但不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者 Enumeration 都不能重置(reset)。 各属性含义如下:
🍫2.3.1 forEach 标签
🍌 ①语法格式:
<c:forEachitems="<object>"begin="<int>"end="<int>"step="<int>"var="<string>"varStatus="<string>">
</c:forEach>
🍌 ②属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的数据 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
varStatus 属性 | 属性值 |
---|---|
index | 索引 |
first | 判断是否为第一个元素 |
last | 判断是否为最后一个元素 |
count | 统计数量 |
🍌 ③遍历List:
<c:forEach items="${list}" var="item" varStatus="status">元素: ${item}, 索引: ${status.index}, 排第一? ${status.first}, 排最后? ${status.last}, 数量: ${status.count}
</c:forEach>
🍌 ④遍历Map:
<c:forEach items="${map}" var="people">用户名: ${people.key}, 密码: ${people.value}
</c:forEach>
🍌 ⑤小应用:
<%List<User> users = new ArrayList<>();users.add(new User("zhangsan", "123456", 21));users.add(new User("lisi", "258741", 20));users.add(new User("wangwu", "654789", 19));users.add(new User("zhaoliu", "852123", 24));request.setAttribute("users", users);
%><c:if test="${!empty users}"><table border="1px"><tr><th>编号</th><th>用户名</th><th>密码</th><th>年龄</th></tr><c:forEach items="${users}" var="user" varStatus="status"><tr><td>${status.count}</td><td>${user.username}</td><td>${user.password}</td><td>${user.age}</td></tr></c:forEach></table>
</c:if>
回到目录…
🍉2.4 格式化动作标签
JSTL 提供了格式化和解析数字和日期的标签,我们讨论里面有:formatNumber、formatDate、parseNumber 及 parseDate。
🍫2.4.1 formatNumber 标签
formatNumber 标签用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)
🍌 ①语法格式:
<fmt:formatNumbervalue="<string>"type="<string>"var="<string>"scope="<string>"/>
🍌 ②属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的数字 | 是 | 无 |
type | NUMBER,CURRENCY,或 PERCENT类型 | 否 | Number |
var | 存储格式化数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
注意:
- 如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名。
- 默认的类型(type)的取值为number。可取值:number数值型、percent百分比类型、currency货币型。
🍌 ③示例:
数值型: <fmt:formatNumber value="15" type="number" var="tt"/>${tt}
百分比型: <fmt:formatNumber value="0.25" type="percent"/>
货币型: <fmt:formatNumber value="2630" type="currency" />
<!-- 设置时区 -->
美元型: <fmt:setLocale value="en_US"/>
<fmt:formatNumber value="1250" type="currency" />
回到目录…
🍫2.4.2 formatDate 标签
formatDate标签用于使用不同的方式格式化日期。(将Date型数据转换成指定格式的字符串类型。)
🍌 ①语法格式:
<fmt:formatDatevalue="<string>"type="<string>"dateStyle="<string>"timeStyle="<string>"pattern="<string>"timeZone="<string>"var="<string>"scope="<string>"/>
🍌 ②属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
标签格式模式:
代码 | 描述 | 实例 |
---|---|---|
y | 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 | 2002 |
M | 月份数字。一位数的月份没有前导零。 | April & 04 |
d | 月中的某一天。一位数的日期没有前导零。 | 20 |
h | 12 小时制的小时。一位数的小时数没有前导零。 | 12 |
H | 24 小时制的小时。一位数的小时数没有前导零。 | 0 |
m | 分钟。一位数的分钟数没有前导零。 | 45 |
s | 秒。一位数的秒数没有前导零。 | 52 |
🍌 ③示例:
<% request.setAttribute("date", new Date()); %>
默认日期: ${date}
格式化日期: <fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss" /><fmt:formatDate value="${myDate }" type="date"/>
<fmt:formatDate value="${myDate }" type="time"/>
<fmt:formatDate value="${myDate }" type="both"/>
<fmt:formatDate value="${myDate }" type="both" dateStyle="full"/>
<fmt:formatDate value="${myDate }" type="both" dateStyle="long"/>
<fmt:formatDate value="${myDate }" type="both" dateStyle="short"/>
<fmt:formatDate value="${myDate }" type="both" timeStyle="full"/>
<fmt:formatDate value="${myDate }" type="both" timeStyle="long"/>
回到目录…
🍫2.4.3 parseNumber 标签
parseNumber标签用来解析数字,百分数,货币。(parseNumber 标签可以将数字、货币或百分比类型的字符串转换成数值型。)
🍌 ①语法格式:
<fmt:parseNumbervalue="<string>"type="<string>"var="<string>"scope="<string>"/>
🍌 ②属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要解析的数字 | 否 | Body |
type | NUMBER,CURRENCY,或 PERCENT | 否 | number |
var | 存储待解析数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
🍌 ③示例:
<h2>parseNumber 标签: 解析为数字</h2>
100 --> <fmt:parseNumber value="100" />
100 --> <fmt:parseNumber value="100" type="number" />
25% --> <fmt:parseNumber value="25%" type="percent" />
$10.00 --> <fmt:parseNumber value="$10.00" type="currency" />
回到目录…
🍫2.4.4 parseDate 标签
parseDate 标签用于解析日期。(将指定格式的字符串转换成Date类型。)
🍌 ①语法格式:
<fmt:parseDatevalue="<string>"type="<string>"dateStyle="<string>"timeStyle="<string>"pattern="<string>"var="<string>"scope="<string>"/>
🍌 ②属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
🍌 ③示例:
<fmt:parseDate value="2020-01-06" type="date" />
<fmt:parseDate value="2020/01/06" pattern="yyyy/MM/dd" />
回到目录…
总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是JSP和JSTL的学习,初步学习了JSP的三种脚本、指令标签、四大作用域、EL表达式,以及尝试使用了JSTL的常用标签库。之后的学习内容将持续更新!!!
相关文章:
JSP 和 JSTL
文章目录🍓摘要🍓一、JSP🍉1.1 JSP的基础语法🍫1.1.1 简介🍫1.1.2 依赖🍫1.1.3 注释🍫1.1.4 Scriptlet 脚本🍉1.2 JSP的指令标签🍫1.2.1 include 静态包含🍫1…...
数据分析| Pandas200道练习题,使用Pandas连接MySQL数据库
文章目录使用Pandas连接数据库编码环境依赖包read_sql_query()的使用read_sql_table()的使用read_sql() 函数的使用to_sql()写入数据库的操作删除操作更新操作总结:使用Pandas连接数据库 通过pandas实现数据库的读,写操作时,首先需要进行数据…...
【Node.js】全局可用变量、函数和对象
文章目录前言_dirname和_filename变量全局函数setTimeout(cb,ms)clearTimeout(t)setInterval(cb,ms)clearInterval(t)setImmediate(cb)clearImmediate()console对象console.info([data][,...])console.error([data][,...])console.warn([data][,...])console.dir(obj[,options]…...
package.json 开发依赖与运行时依赖
文章目录前言一、生产环境与开发环境二、dependencies二、devDependencies总结前言 我已经使用npm接近两年了, 但对于package.json内的dependencies 和devDependencies也只是知道什么依赖该放什么部分, 至于为什么放到这个部分, 我不是很了解… 呃, 还是去了解一下. 一、生产环…...
关于最短路径算法中边的权值的思考
关于最短路径算法中边的权值的思考 不管是单源最短路径算法:Dijkstra Bellman-ford 还是多源最短路径算法:floyed Johnson 我们都绕不开的一件事就是,边的权值wi,jw_{i,j}wi,j 下面我们从多个角度谈边的权值 1.权值恒定 它是指对于每条边…...
LVGL开发教程:二、ESP-IDF 使用CmakeList管理自己的文件以及文件夹
本文需要已经安装了Vscode+IDF插件没有安装的请提前安装一下,IDF插件为乐鑫的插件不需要翻墙。需要环境搭建请看下面链接。 环境搭建: VScode+platformIO和Vscode+ESP-IDF两种开发环境搭建 项目例程下载地址: IDF-CmakeTes,密码:8888 另外,由于你和我的路径不一致,下载的工…...
与感受野相关的几种网络结构
一、Inception 1. Inception v1 目的 通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。 结构 图1-1 Inception v1结构图 特点 共4个通道,其中3个卷积通道分别使用111111…...
day19_抽象类丶接口
由来 当我们声明一个几何图形类:圆、矩形、三角形类等,发现这些类都有共同特征:求面积、求周长、获取图形详细信息。那么这些共同特征应该抽取到一个公共父类中。但是这些方法在父类中又无法给出具体的实现,而是应该交给子类各自…...
【网安神器篇】——系统指纹探测工具finger
作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 我不想停下,因为这次出发的感觉太好了一…...
Prometheus离线tar包安装
Prometheus离线tar包安装实验环境一、部署前操作二、Master2.1下载2.2解压2.3更改服务目录名称2.4创建系统服务启动文件2.5配置修改2.6启动并设置开机自启2.7访问2.8添加node节点2.8.1 添加方法2.8.2修改Prometheus配置(Master)————————————…...
PostgreSQL查询引擎——SELECT STATEMENTS SelectStmt
SelectStmt: select_no_parens %prec UMINUS| select_with_parens %prec UMINUS select_with_parens:( select_no_parens ) { $$ $2; }| ( select_with_parens ) { $$ $2; } 该规则返回单个SelectStmt节点或它们的树,表示集合操作树(set-operation tree…...
零信任-易安联零信任介绍(11)
目录 易安联零信任公司介绍 易安联零信任发展路线 易安联零信任产品介绍 易安联零信任架构 易安联零信任解决方案 易安联零信任发展展望 易安联零信任公司介绍 易安联是一家专业从事网络信息安全产品研发与销售,是行业内领先的“零信任”解决方案提供商&…...
C++ STL——map和set的使用
文章目录1. 关联式容器1.1 键值对1.2 树形结构的关联式容器2. set2.1 set的介绍2.2 set的插入2.3 set的删除和查找2.4 lower_bound和upper_bound3. multiset3.1 count4. map4.1 map的介绍4.2 map的插入4.3 map的遍历4.4 map的[ ]5. multimap1. 关联式容器 我们之前学的vector、…...
【Python】thread使用
目录1、Condition条件变量使用2、event通信3、Semaphore信号量使用4、setDaemon设置守护线程5、threadPool_map使用6、threadPool使用7、threadingTimer1、Condition条件变量使用 # encoding:utf-8 Condition 提供了一种多线程通信机制, 假如线程 1 需要数据&#…...
计网传输层协议:UDP和TCP
文章目录一. 应用层和传输层的联系二. UDP协议三. TCP协议1. TCP报头介绍2. TCP实现可靠传输的核心机制2.1 确认应答2.2 超时重传3. 连接管理(三次握手, 四次挥手)3.1 建立连接(三次握手)3.2 断开连接(四次挥手)4. 滑动窗口5. 流量控制6.拥塞控制7. 延时应答8. 捎带应答9. 面向…...
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
文章目录1 Socket讲解2 基于Socket的TCP编程3 客户端Socket的工作过程包含以下四个基本的步骤3.1 客户端创建Socket对象4 服务器程序的工作过程包含以下四个基本的步骤:4.1 服务器建立ServerSocket对象5 案例实现 客户端和服务端通信5.1 代码实现5.2 实现结果6 更多…...
Java中print和println的区别
1 问题在最开始学习Java的时候学到soutenter键可以输出结果,显示的是System.out.println();而在Python中是直接使用print。那么在Java中print和println有什么区别?2 方法Print输出会自动将括号中的内容转换成字符串输出,如果括号中…...
RocketMq使用规范(纯技术和实战建议)
概述: 使用规范主要从,生产、可靠性、和消费为轴线定义使用规范;kafka使用核心:削峰、解耦、向下游并行广播通知(无可靠性保证)和分布式事务,本规范仅从削峰、解耦、向下游并行广播通知论述&am…...
matlab离散系统仿真分析——电机
目录 1.电机模型 2.数字PID控制 3.MATLAB数字仿真分析 3.1matlab程序 3.2 仿真结果 4. SIMULINK仿真分析 4.1simulink模型 4.2仿真结果 1.电机模型 即: 其中:J 0.0067;B 0.10 2.数字PID控制 首先我们来看一下连续PID࿱…...
一文学会进程控制
目录进程的诞生fork函数fork的本质fork的常规用法fork调用失败的原因进程的死亡进程退出的场景常见的进程退出方法正常终止(代码跑完)echo $?main函数返回调用exit调用_exitexit和_exit的区别进程等待进程等待的重要性进程等待的函数waitwaitpid进程退出…...
5.2 BGP水平分割
5.2.2实验2:BGP水平分割 1. 实验目的 熟悉BGP水平分割的应用场景掌握BGP水平分割的配置方法 2. 实验拓扑 实验拓扑如图5-2所示: 图5-2:BGP水平分割 3. 实验步骤 (1)配置IP地址 R1的配置 <Huawei>…...
华为OD机试 - TLV 编码 | 备考思路,刷题要点,答疑 【新解法】
最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…...
【C语言每日一题】——猜名次
【C语言每日一题】——猜名次😎前言🙌猜名次🙌解题思路分享:😍解题源码分享:😍总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神…...
Agilent E4982A、Keysight E4982A、LCR 表,1 MHz 至 3 GHz
Agilent E4982A、Keysight E4982A、HP E4982A LCR 表,1 MHz 至 3 GHz 产品概览 KEYSIGHT E4982A(安捷伦) Keysight E4982A LCR 表为需要高频(1 MHz 至 3 GHz)阻抗测试的无源元件制造行业提供一流的性能,…...
SAP 系统的配置传输
在SAP项目的实施过程中,经常会遇到关于配置传输的问题。即我们在某个client下面做系统配置,配好了之后再传到其他系统之中。 配置传输分为两种情况:同服务器配置传输,异服务器配置传输。同服务器配置传输: 在DEV配置cl…...
华为OD机试 - 喊七(Python)
喊七 题目 喊 7,是一个传统的聚会游戏, N 个人围成一圈,按顺时针从1 - 7编号, 编号为1的人从1开始喊数, 下一个人喊得数字是上一个人喊得数字+1, 但是当将要喊出数字7的倍数或者含有7的话, 不能喊出,而是要喊过。 假定N个人都没有失误。 当喊道数字k时, 可以统计每…...
Docker下快速搭建RabbitMQ单例及集群
引子生命在于折腾,为上数据实时化用到了消息传送的内容,当时也和总公司人员商量选型,kafka不能区分分公司就暂定用了RbtMQ刚好个人也在研究容器及分布式部署相关内容就在docker上实践单机 docker(要想快 先看问题 避免踩坑&#x…...
python代码写开心消消乐
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 一.python是什么 二.游戏代码效果呈现 三.主代...
【郭东白架构课 模块一:生存法则】09|法则四:为什么要顺应技术的生命周期?
你好,我是郭东白。今天我们来讲架构师的第四条生存法则,那就是尊重技术的生命周期。 人类的各种活动都要遵循事物的客观生命周期。不论是农业社会种田打渔,还是资本社会投资创业,行动太早或太晚,都会颗粒无收。技术也…...
Linux之进程控制
一.进程创建 1.1 fork函数 我们创建进程的方式有./xxx和fork()两种 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值:自进程…...
图书馆登录系统网站建设代码/接单平台app
1. Mantle Mantle 让我们能简化 Cocoa 和 Cocoa Touch 应用的 model 层。简单点说,程序中经常要进行网络请求,请求到得一般是 json 字符串,我们一般会建一个 Model 类来存放这些数据。这就要求我们编写一系列的序列化代码,来把 js…...
商标查询网站/短视频营销策划方案
一.冒泡排序 冒泡排序是运行最慢点排序算法,但是确实最简单的。 下图可以理解为队员排队。 遵循的规则: 1. 比较两个队员。 2. 如果左边的队员高,则两队员位置交换。 3. 向右移动一个位置,比较下…...
wordpress默认密码恢复/最全bt搜索引擎入口
软件问题1.病毒,升级杀毒软件,进安全模式下杀毒。2.系统文件损坏,覆盖安装或重装系统。3.启动项问题,开始--运行--msconfig 除了ctfmon外 其余的全部去掉。硬件问题1.机箱电源功率不足,引起自动重启,更换高…...
温岭网站建设公司/外链系统
Description Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流。不过,为此FJ必须在奶牛们居住的N(1 < N < 10,000)块草地中选一些建上无线电通讯塔,来保证任意两块草地间都存在手机信号。所有的N块草地按1..N 顺次编号。…...
网站前台做好之后再怎么做/福州seo网站排名
其实 业务上经常会出现 在浏览器弹出一个 提示框 让用户输入一些东西 但是把 如果后面的 元素还能滚动的话 就给人一种 很不爽的感觉 建议 弹窗出现的时候禁止 body 内容滚动 用户体验就更好了 body{overflow:hidden; }让弹窗出来 设置 body的样式 overflow:hidden 弹窗消失…...
网站建设费用初步预算/页面优化
目录一、准备 Linux 系统二、安装 Xshell 与 Xfpt三、配置服务器3.1 创建普通用户3.2 安装 SSH3.3 安装 Java 环境3.4 安装 Hadoop3.5 配置 Hadoop四、总结五、参考资料说明:本篇文字主要在 Linux 系统上搭建 Hadoop ,采用伪分布式的形式搭建,…...