文章目录

  • JSP简介
  • JSP工作原理
  • JSP生命周期
  • JSP注释
  • JSP中嵌套Java代码
  • JSP语法
    • 中文编码问题
    • 脚本程序
    • 声明变量
    • 表达式
    • 指令
      • Page指令
      • Include指令
      • Taglib指令
  • JSP内置对象
    • request对象
    • response对象
    • session对象
    • application对象
    • out 对象
    • pageContext 对象
    • config 对象
    • page 对象
    • exception 对象
  • 状态码
  • EL表达式
  • JSTL
    • 核心标签

JSP简介

JSP全称Java Server Pages(Java服务器页面),是一种动态网页开发技术

  • Java servlet的简化设计,主要用于实现Java web应用程序的用户界面部分

  • 使用JSP标签在HTML网页中插入Java代码(动态部分用Java编写),标签通常以<%开头、以%>结束

  • JSP就是在HTML页面中嵌入java代码,通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页

  • 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行

  • JSP将网页逻辑与网页设计的显示分离

html与jsp主要区别:

.html 是静态页面,包含固定的页面内容

.jsp 是动态页面,页面数据可以动态更新,支持嵌套java代码和html代码


JSP工作原理

当浏览器访问页面、服务器发现后缀为.jsp的文件时会根据路径找到index.jsp文件,并将index.jsp翻译成index_jsp.java文件并进行编译,产生index_jsp.class文件,将class文件加载运行

将JSP翻译成java文件,是将JSP中的所有的HTML代码通过流进行输出、最终翻译成class后被虚拟机加载,本质是servlet,往回响应(响应回去就是把JSP中的HTML代码以流的方式写回浏览器)


JSP生命周期

JSP生命周期,即从创建到销毁的整个过程,

类似于servlet生命周期(Servlet工作原理与生命周期),JSP生命周期还包括将JSP文件编译成servlet

  • 编译阶段:
    servlet容器解析JSP文件、将JSP文件转为servlet,随后编译servlet源文件、生成servlet类

  • 初始化阶段:jspInit()
    加载与JSP对应的servlet类,创建实例并调用它的初始化方法
    (一般来说只执行一次)

  • 执行阶段:_jspService()
    调用与JSP对应的servlet实例的服务方法(一切与请求相关的交互行为,直到被销毁)

  • 销毁阶段:jspDestroy()
    调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

代码示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<html>
<head><title>life.jsp</title>
</head>
<body><%!private int initVar=0;private int serviceVar=0;private int destroyVar=0;
%><%!public void jspInit(){initVar++;System.out.println("jspInit(): JSP被初始化了"+initVar+"次");}public void jspDestroy(){destroyVar++;System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次");}
%><%serviceVar++;System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");String content1="初始化次数 : "+initVar;String content2="响应客户请求次数 : "+serviceVar;String content3="销毁次数 : "+destroyVar;
%>
<h1>JSP demo</h1>
<p><%=content1 %></p>
<p><%=content2 %></p>
<p><%=content3 %></p></body>
</html>

JSP注释

<!-- html注释内容,查看源码时能看到 --><%-- jsp注释,查看⻚⾯源码时看不到 --%>

主要注释:

语法 描述
<%-- 注释 --%> JSP注释,注释内容不会被发送至浏览器甚至不会被编译
<!-- 注释 --> HTML注释,通过浏览器查看网页源代码时可以看见注释内容
<% 代表静态 <%常量
%> 代表静态 %> 常量
\’ 在属性中使用的单引号
\" 在属性中使用的双引号

JSP中嵌套Java代码

使用小脚本:<% java代码%>

基本格式:

声明标签:
<%!变量或者⽅法声明%>表达式标签:
<%= 表达式%> 在⻚⾯上显示的效果程序代码标签:
<%java代码%> ⻚⾯上动态展示内容page指令:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>代码示例:<body><%! int i=10;%><!--成员变量--><%! public void show(){}%> <!--成员⽅法--><%=i%> <!--输出变量值--></body>

JSP语法

中文编码问题

如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

脚本程序

脚本程序可以包含任意Java语句、变量、方法或表达式,只要它们在脚本语言中有效

任何文本、HTML标签、JSP元素必须写在脚本程序的外面

语法格式:

一、
<% 代码片段 %>二、等价的xml格式:
<jsp:scriptlet>代码片段
</jsp:scriptlet>

声明变量

一个声明语句可以声明一个或多个变量、方法

一、
<%! declaration; [ declaration; ]+ ... %>二、等价的xml语句
<jsp:declaration>代码片段
</jsp:declaration>

代码示例:

<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>

表达式

一个JSP表达式中包含的脚本语言表达式先被转化成String,再插入到表达式出现的地方

表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式

一、
<%= 表达式 %>二、 等价的xml语句
<jsp:expression>表达式
</jsp:expression>

代码示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>demo</title>
</head>
<body><p>今天的日期是: <%= (new java.util.Date()).toLocaleString()%></p>
</body>
</html>

输出:

今天的日期是: 2021-9-21 13:40:07

指令

JSP指令用来设置JSP页面相关的属性

语法格式:

<%@ directive attribute="value" %>
directive:指令名称 attribute 属性名 value:属性值

三种指令标签:

指令名称 描述
<%@ page … %> 定义页面依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %> 包含其他文件
<%@ taglib … %> 引入标签库的定义(可以是自定义标签)

Page指令

Page指令为容器提供当前页面的使用说明⼀个JSP页面可以包含多个page指令

Page指令的语法格式:

<%@ page attribute="value" %>
属性名 属性值 描述
language java 解释该JSP⽂件时采⽤的语⾔,⼀般为java语⾔,默认为java
extends 任何类的全名 编译该JSP⽂件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等⽅法
import 任何包名、类名 引⼊该JSP中⽤到的类、包等,import是唯⼀可以声明多次的page指令属性,⼀个import可以引⽤uogelei,中间⽤英⽂逗号隔开<%@ page import=包名.类名,包名.类名%>
session true、false 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使⽤,否则反之,默认为true
autoFlush true,false 是否运⾏缓存,如果为true,则使⽤out.println()等⽅法输出的字符串并不是⽴刻到达客户端服务器的,⽽是暂时存到缓存⾥,缓存满了或者程序⾏完毕或者执⾏out.flush()操作时才到客户端,默认为true
buffer none或者数字KB 指定缓存大小,当autoFlush设为true时有效,例如<%@ pagebuffer=10kb%>
isThreadSafe true,false 是否线程安全,如果为true,则运⾏多个线程同时运⾏该jsp程序,否则只运⾏⼀个线程,其余线程等待,默认为false
isErrorPage true,false 指定该页面是否为错误显示页面,如果为true,则该JSP内置有⼀个Exception对象exception,可直接使⽤,否则没有,默认为false
errorPage 某个JSP⻚⾯的相对路径 指明⼀个错误⻚⾯,如果该JSP程序抛出⼀个未捕捉的异常,则转到errorPage指定的⻚⾯,errorPage指定的⻚⾯通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常
contentType 有效的⽂档类型 客户端浏览器根据该属性判断⽂档类型,例如 HTML格式为text/html、纯⽂本格式为text/plain、JPG图像为image/jpeg、GIF图像image/gifWORD⽂档为application/msword,该属性常跟着charset设置编码⼀起,作⽤是通知服务器和浏览器都使⽤同⼀个码表
pageEncoding UTF8,ISO8859-1等

Include指令

JSP可以通过include指令来包含其他文件

被包含的文件可以是JSP文件、HTML文件或文本文件,包含的文件可以看作是JSP文件的一部分,会被同时编译执行

include 指令中的文件名实际上是⼀个相对的 URL 地址,如果没有给文件关联⼀个路径,JSP编译器默认在当前路径下寻找

语法格式:

<%@ include file="⽂件相对 url 地址" %>

Taglib指令

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签

uri属性确定标签库的位置,prefix属性指定标签库的前缀(可⾃定义)

语法格式:

<%@ taglib uri="uri" prefix="" %>

JSP内置对象

JSP中⼀共预先定义了9个对象:request、response、session、application、out、pagecontext、config、page、exception

request对象

作用:
代表客户端的请求信息,接受通过HTTP协议传送到服务器的数据(包括头信息、系统信息、请求方式以及请求参数等)

所属类型: javax.servlet.httpServletRequest

request对象的作用域为一次请求


response对象

作用:
代表对客户端的响应,将JSP容器处理过的对象传回到客户端

所属类型:HttpServletResponse

作用域:只在JSP页面内有效


session对象

由服务器自动创建的与用户请求相关的对象

服务器为每个用户都生成⼀个session对象,用于保存该用户的信息,跟踪用户的操作状态

session对象内部使用Map类来保存数据,保存数据的格式为 “Key/value”

session对象的value不仅仅局限于字符串类型


application对象

作用:
将信息保存在服务器中,直到服务器关闭(期间application对象中保存的信息会在整个应用中都有效)

与session对象相比,application对象生命周期更长,类似于系统的“全局变量”

  • 区别:
    request-单次请求
    session-浏览器访问期间(会话期间)
    application-服务器启动期间,所存的数据可以跨浏览器

out 对象

作用:
在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区

在使用out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间

待数据输出完毕后,要及时关闭输出流

代码示例:

out.print("<script type='text/javascript'>alert('⽤户名不存在');location.href='index.jsp'</script>");

pageContext 对象

作用:
取得任何范围的参数

通过它可以获取 JSP页面的out、request、reponse、session、application 等对象

pageContext对象的创建和初始化都由容器完成,在JSP页面中可以直接使用pageContext对象


config 对象

作用:
取得服务器的配置信息

通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象

当⼀个Servlet 初始化时,容器把某些信息通过config对象传递给这个Servlet,开发者可以在web.xml文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数

代码示例:

//将image路径转换成服务器端的路径
String url= config.getServletContext().getRealPath("/image");
<h1>url=<%=url %></h1>

page 对象

page 对象代表JSP本身,只有在JSP页面内才合法

page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针


exception 对象

作用:
显示异常信息,只有在包含 isErrorPage=“true” 的页面中使用

在⼀般的JSP页面中使用该对象将无法编译JSP文件

如果在JSP页面中出现没有捕获到的异常,会生成 exception 对象,并把exception 对象传送到在page指令中设定的错误页面中,再在错误页面中处理相应的exception 对象


状态码

状态码 消息 描述
100 Continue 只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求
101 Switching Protocols 服务器交换机协议
200 OK 请求被确认
201 Created 请求时完整的,新的资源被创建
202 Accepted 请求被接受,但未处理完
300 Multiple Choices 一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接
301 Moved Permanently 被请求的页面已经移动到了新的URL下
302 Found 被请求的页面暂时性地移动到了新的URL下
303 See Other 被请求的页面可以在一个不同的URL下找到
306 Unused 已经不再使用此状态码,但状态码被保留
307 Temporary Redirect 被请求的页面暂时性地移动到了新的URL下
400 Bad Request 服务器无法识别请求
401 Unauthorized 被请求的页面需要用户名和密码
402 Payment Required 目前还不能使用此状态码
403 Forbidden 禁止访问所请求的页面
404 Not Found 服务器无法找到所请求的页面
405 Method Not Allowed 请求中所指定的方法不被允许
406 Not Acceptable 服务器只能创建一个客户端无法接受的响应
407 Proxy Authentication Required 在请求被服务前必须认证一个代理服务器
408 Request Timeout 请求时间超过了服务器所能等待的时间,连接被断开
409 Conflict 请求有矛盾的地方
410 Gone 被请求的页面不再可用
411 Length Required "Content-Length"没有被定义,服务器拒绝接受请求
412 Precondition Failed 请求的前提条件被服务器评估为false
413 Request Entity Too Large 因为请求的实体太大,服务器拒绝接受请求
414 Request-url Too Long 服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息
415 Unsupported Media Type 服务器拒绝接受请求,因为媒体类型不被支持
500 Internal Server Error 请求不完整,服务器遇见了出乎意料的状况
501 Not Implemented 请求不完整,服务器不提供所需要的功能
502 Bad Gateway 请求不完整,服务器从上游服务器接受了一个无效的响应
503 Service Unavailable 请求不完整,服务器暂时重启或关闭
504 Gateway Timeout 网关超时
505 HTTP Version Not Supported 服务器不支持所指定的HTTP版本

EL表达式

在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的一部分

在JSP中使用EL表达式,可以简化对象和变量的访问是EL表达式

语法:

${需要展示信息的名字}当表达式没有指定变量或者对象的范围时:
容器会依次从pageContext—>request—>session—>application中查找该变量或对象,
通过隐含对象获得指定作⽤域的值:
pageScope对象,⽤于获取当前⻚⾯的属性值
requestScope对象,⽤于获取请求范围的属性值
sessionScope对象,⽤于获取会话范围的属性值
applicationScope对象,⽤于获取程序范围的属性值语法:${requestScope.key}

基础操作符:

术语 定义
算术型 + 、-、 * /(div) 除 、 %(mod) 余数
逻辑型 and、&&、or、||、!、not
关系型 ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进⾏⽐较,或与布尔型、字符串型、整型或浮点型⽂字进⾏⽐较
Empty Empty操作符是⼀个前缀操作符⽤于判断⼀个值是否为null或者为empty如String str =“”; ${empty str} 返回值为true
条件型 A ?B :C。根据 A 赋值的结果来赋值 B 或 C

代码示例:

单个变量:${a+10}<br>
单个变量:${s}<br>
单个对象:${key.属性名}//对象类型Users u=new Users();u.setName("王⽼五");u.setPass("abc");pageContext.setAttribute("u1",u);user.name=${u1.name}user.pass=${u1.pass}// list集合对象:List list=new ArrayList();list.add("刘能");list.add(30);list.add(u);pageContext.setAttribute("list2",list);list1=${list2[0]}<br/>list2=${list2[1]}<br/>list3=${list2[2].pass}<br/>
// map集合:k1=${map1.k1}<br>k2=${map1.k2.username}--- ${map1.k2.password}判断变量是否有值或是否存在:  ${empty key值}List list2=new ArrayList();list2.add("aa");request.setAttribute("list222",list2);判断list中是否有数据:  ${empty list222}

JSTL

JSP标准标签库(JSTL)是JSP标签集合,封装了JSP应用的通用核心功能

JSTL支持通用的、结构化的任务(迭代、条件判断、XML文档操作、国际化标签、SQL标签),还提供了一个框架来使用集成JSTL的自定义标签,根据JSTL标签所提供的功能,可以将其分为5个类别:核心标签、格式化标签、sql标签、xml标签、jstl函数

  • 作用:
    简化jsp⻚⾯编写代码

  • 语法格式:
    ①standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下
    ②在JSP页面中引入<%@ taglib prefix=”页面使用的名称” uri=”功能范围的路径”%>

功能范围 前缀 uri
core c http://java/sun.com/jsp/jstl/core
i18n fmt http://java/sun.com/jsp/jstl/fmt
sql sql http://java/sun.com/jsp/jstl/sql
xml x http://java/sun.com/jsp/jstl/xml
functions fn http://java/sun.com/jsp/jstl/function

核心标签

核心标签是最常用的 JSTL标签

引用核心标签库语法:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

核心标签分类:

  • 表达式操作
    out、set、remove、catch
  • 流程控制
    if、choose、when、otherwise
  • 迭代操作
    forEach、forTokens
  • URL操作
    import、param、url、redirect

① <c:set>
主要⽤来将变量存储⾄JSP范围中 或是JavaBean的属性或Map对象中

名称 说明 是否必须写 默认值
Value 要被存储的值
var 存⼊的变量名称
scope var变量的JSP范围 Page
target JavaBean或Map对象
property 指定target对象的属性

② <c:out>
主要用来显示数据的内容

名称 说明 是否必须写 默认值
value 需要显示出来的值
default 如果value的值为null,则显示default的值
escapeXml 是否转换特殊字符,如:<转换成 & lt; True

③ <c:remove>
主要负责移除变量

名称 说明 是否必须写 默认值
Var 欲移除的变量名称
Scope var变量的jsp范围 Page

④ <c:if>
主要用于进行if判断,如果为true,则输出标签体中的内容

名称 说明 是否必须写 默认值
Test 表达式的结果为true,则执⾏体内容,false则相反
var 如果用来存储test运算的结果(true或false)
scope Var变量的JSP范围 page

⑤ <c:choose>,<c:when>,<c:otherwise>
作用相当于if-else

名称 说明 是否必须写 默认值
test 如果表达式的结果为true,则执⾏体内容,false则相反

⑥ <c:forEach>
循环控制,它可以将数组,集合(Collection)中的成员循序浏览一遍

名称 说明 是否必须写 默认值
var ⽤来存放现在指定的成员
items 被迭代的集合对象
varStatus ⽤来存放现在指的相关成员信息
begin 开始的位置 0
end 结束的位置 最后⼀个成员
step 每次迭代的间隔数 1

格式化标签:

① fmt:formatDate

  • 作用
    将日期类型格式化为指定模式的字符串
属性 描述
value 将要被格式化的数据
pattern 格式化的模式,与SimpleDateFormat的参数设置⼀样
var 格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在⻚⾯
scope 变量存放的域属性空间,默认page
type 其取值为date、time、both,表示给出的value是⽇期、时间、还是两者都包含,默认是date

②fmt:parseDate

  • 作用
    用于将指定字符串转化为日期类型

<fmt:parseDate value="${now }" pattern=“yyyy-MM-dd” var=“today”/>

属性 描述
Value 服务器获取的时间
Pattern 转换的格式
Var 页面显示的变量

③ fmt:formatNumber

  • 作用
    按照指定格式对数字进行格式化
属性 描述
maxIntegerDigits 整数部分最多的位数
minIntegerDigits 整数部分最少的位数
maxFrctionDigits 小数部分最多的位数
minFrctionDigits 小数部分最少的位数
var 存储格式化结果的变量
scope var属性的作⽤域
integerOnly 是否只解析整型数true或者浮点数false

【Javaweb】JSP基础教程相关推荐

  1. JSP基础教程:熟悉JSP服务器

    本篇文章由 泉州SEO www.234yp.com 整理发布,jsp入门教程 www.234yp.com/Article/176258.html 谢谢合作! jsp入门教程 熟悉JSP服务器 本&qu ...

  2. JavaWeb,利用HTML和CSS蛋糕商城注册页面实现------JAVA,JavaWeb入门基础教程

    主页 <html><head><meta charset="UTF-8"></head><frameset rows=&quo ...

  3. JSP学习笔记之基础教程

    JSP基础教程 什么是JSP JSP概念:Java 服务器页面 (Java Server Page ,JSP) 以扩展名== .jsp== 保存 在HTML中嵌入Java脚本语言 由应用服务器中的JS ...

  4. 黑马程序员最新版JavaWeb基础教程-学习笔记

    da@黑马程序员最新版JavaWeb基础教程-学习笔记 day06-HTML&CSS HTML HTML(HyperTest Markup Language):超文本标记语言 是一门语言,所有 ...

  5. JavaWeb核心技术系列教程(23)——JSP标签

    C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往--自定义View ...

  6. 黑马程序员最新版JavaWeb基础教程最后的案例学习记录

    黑马程序员最新版JavaWeb基础教程最后的案例学习记录这里写自定义目录标题 调试中我遇到的问题 调试中我遇到的问题 若db1报错: 则 改成自己的数据库名称 web.xml报错:则用这一段代码 &l ...

  7. 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(十五)——JSP基础语法   任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语

    javaweb学习总结(十五)--JSP基础语法 任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. ...

  8. Fikker反向代理服务器的网站缓存加速/网站加速基础教程

    2019独角兽企业重金招聘Python工程师标准>>> Fikker反向代理服务器的网站缓存加速/网站加速基础教程 - 简介篇 前言: 本教程是针对第一次接触和使用 Fikker 的 ...

  9. JSP基础--动作标签

    JSP基础--动作标签 JSP动作标签 1 JSP动作标签概述 动作标签的作用是用来简化Java脚本的! JSP动作标签是JavaWeb内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用 ...

最新文章

  1. SDN要防止七种认识偏差
  2. 地大计算机学院教授,张静(地大教授)
  3. DIV层+CSS实现锁屏
  4. mysql增删改查脚本_脚本方式实现数据库增删改查
  5. chrome同步_如何在Chrome中打开或关闭同步
  6. NLP复习资料(6)-第十章 语义分析
  7. 我为什么要用 Javascript 编写 CSS?
  8. JAVA day07 权限,封装,JavaBean(规范代码),static、final关键字
  9. 谈谈struts2的工作原理
  10. MTK: mtk 10A 建立socket连接问题
  11. java中的==和equals的区别
  12. java树广度优先_如何在功能上生成树广度优先 . (使用Haskell)
  13. lua jit android,某LuaJit游戏解密教程~~
  14. 记录每天背的单词,准备考研。(2月21日)
  15. 如何激活优动漫PAINT,获取优动漫PAINT序列号
  16. 结对项目——最长英语单词链
  17. 原生js编写的todos
  18. MySQL安装2出现Typical_Mysql安装 - osc_c7lpn2ge的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. jekins基本配置
  20. iPhone的13个隐秘功能

热门文章

  1. ESP8266读DHT11温湿度,开发微信小程序实时显示
  2. c语言上错误的英文,c语言简单问题,输入一行英文,提取其中的单词。总是有个错误找不到,麻烦高手...
  3. android 读取U盘apk文件信息,拔掉U盘导致进程被杀
  4. IDEA使用JDBC链接MySql数据库(使用工具类)案例转转好物购物平台
  5. 你在网上献的爱心,估值400亿
  6. R语言通过loess去除某个变量对数据的影响--CNV分析
  7. 做自媒体工具和软件有哪些?整理8类工具分享给大家!
  8. 人体穴位图--脚底部反射区图
  9. java 前后端解压缩字符串_接口实现后台GZIP压缩,pako.js 前端解压
  10. sql查询技巧之记录数