?) 创建可靠的文档结构(html标签包含head 和 body,在head只出现恰当的元素) 一个文档的对象模型 文档由多个Elements和TextNodes组成 (以及其它辅助nodes:详细可查看:nodes package tree). 其继承结构如下:Document继承Element继承Node. TextNode继承 Node. 一个Element包含一个子节点集合,并拥有一个父Element。他们还提供了一个唯一的子元素过滤列表。 参见 数据抽取:DOM遍历 数据抽取:Selector syntax
2.解析一个HTML字符串 存在问题 来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,或想修改它。怎么办?jsonu能够帮你轻松解决这些问题
解决方法 使用静态Jsoup.parse(String html) 方法或 Jsoup.parse(String html, String baseUri)示例代码:
1
2
3
String html =
"First parse "
+
"Parsed HTML into a doc.
"
;
Document doc = Jsoup.parse(html);
描述
parse(String html, String baseUri) 这方法能够将输入的HTML解析为一个新的文档 (Document),参数 baseUri 是用来将相对 URL 转成绝对URL,并指定从哪个网站获取文档。如这个方法不适用,你可以使用 parse(String html) 方法来解析成HTML字符串如上面的示例。.
只要解析的不是空字符串,就能返回一个结构合理的文档,其中包含(至少) 一个head和一个body元素。
一旦拥有了一个Document,你就可以使用Document中适当的方法或它父类 Element和Node中的方法来取得相关数据。
3.解析一个body片断
问题 假如你有一个HTML片断 (比如. 一个 div 包含一对 p 标签; 一个不完整的HTML文档) 想对它进行解析。这个HTML片断可以是用户提交的一条评论或在一个CMS页面中编辑body部分。
办法 使用Jsoup.parseBodyFragment(String html)方法.
1
2
3
String html =
"Lorem ipsum.
"
;
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
说明
parseBodyFragment 方法创建一个空壳的文档,并插入解析过的HTML到body元素中。假如你使用正常的 Jsoup.parse(String html) 方法,通常你也可以得到相同的结果,但是明确将用户输入作为 body片段处理,以确保用户所提供的任何糟糕的HTML都将被解析成body元素。
Document.body() 方法能够取得文档body元素的所有子元素,与 doc.getElementsByTag("body")相同。
保证安全Stay safe 假如你可以让用户输入HTML内容,那么要小心避免跨站脚本攻击。利用基于 Whitelist 的清除器和 clean(String bodyHtml, Whitelist whitelist)方法来清除用户输入的恶意内容。
4.从一个URL加载一个Document
存在问题
你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据。你可以使用下面解决方法:
解决方法
使用 Jsoup.connect(String url)
方法:
1
2
Document doc = Jsoup.connect(
"http://example.com/"
).get();
String title = doc.title();
说明
connect(String url)
方法创建一个新的 Connection
, 和 get()
取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。
Connection
接口还提供一个方法链来解决特殊请求,具体如下:
1
2
3
4
5
6
Document doc = Jsoup.connect(
"http://example.com"
)
.data(
"query"
,
"Java"
)
.userAgent(
"Mozilla"
)
.cookie(
"auth"
,
"token"
)
.timeout(
3000
)
.post();
这个方法只支持Web URLs (http
和https
协议); 假如你需要从一个文件加载,可以使用 parse(File in, String charsetName)
代替。
5.从一个文件加载一个文档
问题
在本机硬盘上有一个HTML文件,需要对它进行解析从中抽取数据或进行修改。
办法
可以使用静态 Jsoup.parse(File in, String charsetName, String baseUri)
方法:
1
2
File input =
new
File(
"/tmp/input.html"
);
Document doc = Jsoup.parse(input,
"UTF-8"
,
"http://example.com/"
);
说明
parse(File in, String charsetName, String baseUri)
这个方法用来加载和解析一个HTML文件。如在加载文件的时候发生错误,将抛出IOException,应作适当处理。
baseUri
参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串。
另外还有一个方法parse(File in, String charsetName)
,它使用文件的路径做为 baseUri
。 这个方法适用于如果被解析文件位于网站的本地文件系统,且相关链接也指向该文件系统。
6.使用DOM方法来遍历一个文档
问题
你有一个HTML文档要从中提取数据,并了解这个HTML文档的结构。
方法
将HTML解析成一个Document
之后,就可以使用类似于DOM的方法进行操作。示例代码:
1
2
3
4
5
6
7
8
9
File input =
new
File(
"/tmp/input.html"
);
Document doc = Jsoup.parse(input,
"UTF-8"
,
"http://example.com/"
);
Element content = doc.getElementById(
"content"
);
Elements links = content.getElementsByTag(
"a"
);
for
(Element link : links) {
String linkHref = link.attr(
"href"
);
String linkText = link.text();
}
说明
Elements这个对象提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的数据。具体如下:
查找元素
getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key)
(and related methods)
Element siblings: siblingElements()
, firstElementSibling()
, lastElementSibling()
;nextElementSibling()
, previousElementSibling()
Graph: parent()
, children()
, child(int index)
元素数据
attr(String key)
获取属性attr(String key, String value)
设置属性
attributes()
获取所有属性
id()
, className()
and classNames()
text()
获取文本内容text(String value)
设置文本内容
html()
获取元素内HTMLhtml(String value)
设置元素内的HTML内容
outerHtml()
获取元素外HTML内容
data()
获取数据内容(例如:script和style标签)
tag()
and tagName()
操作HTML和文本
append(String html)
, prepend(String html)
appendText(String text)
, prependText(String text)
appendElement(String tagName)
, prependElement(String tagName)
html(String value)
7.使用选择器语法来查找元素
问题
你想使用类似于CSS或jQuery的语法来查找和操作元素。
方法
可以使用Element.select(String selector)
和 Elements.select(String selector)
方法实现:
1
2
3
4
5
6
7
8
9
10
11
File input =
new
File(
"/tmp/input.html"
);
Document doc = Jsoup.parse(input,
"UTF-8"
,
"http://example.com/"
);
Elements links = doc.select(
"a[href]"
);
//带有href属性的a元素
Elements pngs = doc.select(
"img[src$=.png]"
);
//扩展名为.png的图片
Element masthead = doc.select(
"div.masthead"
).first();
//class等于masthead的div标签
Elements resultLinks = doc.select(
"h3.r > a"
);
//在h3元素之后的a元素
说明
jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。.
这个select
方法在Document
, Element
,或Elements
对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。
Select方法将返回一个Elements
集合,并提供一组方法来抽取和处理结果。
Selector选择器概述
tagname
: 通过标签查找元素,比如:a
ns|tag
: 通过标签在命名空间查找元素,比如:可以用 fb|name
语法来查找
元素
#id
: 通过ID查找元素,比如:#logo
.class
: 通过class名称查找元素,比如:.masthead
[attribute]
: 利用属性查找元素,比如:[href]
[^attr]
: 利用属性名前缀来查找元素,比如:可以用[^data-]
来查找带有HTML5 Dataset属性的元素
[attr=value]
: 利用属性值来查找元素,比如:[width=500]
[attr^=value]
, [attr$=value]
, [attr*=value]
: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:[href*=/path/]
[attr~=regex]
: 利用属性值匹配正则表达式来查找元素,比如: img[src~=(?i)\.(png|jpe?g)]
*
: 这个符号将匹配所有元素
Selector选择器组合使用
el#id
: 元素+ID,比如: div#logo
el.class
: 元素+class,比如: div.masthead
el[attr]
: 元素+class,比如: a[href]
任意组合,比如:a[href].highlight
ancestor child
: 查找某个元素下子元素,比如:可以用.body p
查找在"body"元素下的所有 p
元素
parent > child
: 查找某个父元素下的直接子元素,比如:可以用div.content > p
查找 p
元素,也可以用body > *
查找body标签下所有直接子元素
siblingA + siblingB
: 查找在A元素之前第一个同级元素B,比如:div.head + div
siblingA ~ siblingX
: 查找A元素之前的同级X元素,比如:h1 ~ p
el, el, el
:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo
伪选择器selectors
:lt(n)
: 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3)
表示小于三列的元素
:gt(n)
:查找哪些元素的同级索引值大于n
,比如
: div p:gt(2)
表示哪些div中有包含2个以上的p元素
:eq(n)
: 查找哪些元素的同级索引值与n
相等,比如:form input:eq(1)
表示包含一个input标签的Form元素
:has(seletor)
: 查找匹配选择器包含元素的元素,比如:div:has(p)
表示哪些div包含了p元素
:not(selector)
: 查找与选择器不匹配的元素,比如: div:not(.logo)
表示不包含 class="logo" 元素的所有 div 列表
:contains(text)
: 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
:containsOwn(text)
: 查找直接包含给定文本的元素
:matches(regex)
: 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
:matchesOwn(regex)
: 查找自身包含文本匹配指定正则表达式的元素
注意:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等
可以查看Selector
API参考来了解更详细的内容
8.从元素抽取属性,文本和HTML
问题
在解析获得一个Document实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。
方法
要取得一个属性的值,可以使用Node.attr(String key)
方法
对于一个元素中的文本,可以使用Element.text()
方法
对于要取得元素或属性中的HTML内容,可以使用Element.html()
, 或 Node.outerHtml()
方法
示例:
1
2
3
4
5
6
7
8
9
10
11
String html =
"An example link.
"
;
Document doc = Jsoup.parse(html);
//解析HTML字符串返回一个Document实现
Element link = doc.select(
"a"
).first();
//查找第一个a元素
String text = doc.body().text();
// "An example link"//取得字符串中的文本
String linkHref = link.attr(
"href"
);
// "http://example.com/"//取得链接地址
String linkText = link.text();
// "example""//取得链接地址中的文本
String linkOuterH = link.outerHtml();
// "example "
String linkInnerH = link.html();
// "example "//取得链接内的html内容
说明
上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用:
Element.id()
Element.tagName()
Element.className()
and Element.hasClass(String className)
这些访问器方法都有相应的setter方法来更改数据.
参见
Element
和Elements
集合类的参考文档
URLs处理
使用CSS选择器语法来查找元素
9.处理URLs
问题
你有一个包含相对URLs路径的HTML文档,需要将这些相对路径转换成绝对路径的URLs。
方法
在你解析文档时确保有指定base URI
,然后
使用 abs:
属性前缀来取得包含base URI
的绝对路径。代码如下:
1
2
3
4
5
Document doc = Jsoup.connect(
"http://www.open-open.com"
).get();
Element link = doc.select(
"a"
).first();
String relHref = link.attr(
"href"
);
// == "/"
String absHref = link.attr(
"abs:href"
);
// "http://www.open-open.com/"
说明
在HTML元素中,URLs经常写成相对于文档位置的相对路径: ...
. 当你使用 Node.attr(String key)
方法来取得a元素的href属性时,它将直接返回在HTML源码中指定定的值。
假如你需要取得一个绝对路径,需要在属性名前加 abs:
前缀。这样就可以返回包含根路径的URL地址attr("abs:href")
因此,在解析HTML文档时,定义base URI非常重要。
如果你不想使用abs:
前缀,还有一个方法能够实现同样的功能 Node.absUrl(String key)
。
10.示例程序: 获取所有链接
这个示例程序将展示如何从一个URL获得一个页面。然后提取页面中的所有链接、图片和其它辅助内容。并检查URLs和文本信息。
运行下面程序需要指定一个URLs作为参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import
org.jsoup.Jsoup;
import
org.jsoup.helper.Validate;
import
org.jsoup.nodes.Document;
import
org.jsoup.nodes.Element;
import
org.jsoup.select.Elements;
import
java.io.IOException;
/**
* Example program to list links from a URL.
*/
public
class
ListLinks {
public
static
void
main(String[] args)
throws
IOException {
// Validate.isTrue(args.length == 1, "usage: supply url to fetch");
String url =
"http://news.ycombinator.com/"
;
print(
"Fetching %s..."
, url);
Document doc = Jsoup.connect(url).get();
Elements links = doc.select(
"a[href]"
);
//"a[href]" //带有href属性的a元素
Elements media = doc.select(
"[src]"
);
//利用属性查找元素,比如:[href]
Elements imports = doc.select(
"link[href]"
);
print(
"\nMedia: (%d)"
, media.size());
for
(Element src : media) {
if
(src.tagName().equals(
"img"
))
print(
" * %s: <%s> %sx%s (%s)"
,
src.tagName(), src.attr(
"abs:src"
), src.attr(
"width"
), src.attr(
"height"
),
trim(src.attr(
"alt"
),
20
));
//src.attr("src")结果: 18x18 ()
//src.attr("abs:src")结果: 18x18 ()
else
print(
" * %s: <%s>"
, src.tagName(), src.attr(
"abs:src"
));
}
print(
"\nImports: (%d)"
, imports.size());
for
(Element link : imports) {
print(
" * %s <%s> (%s)"
, link.tagName(),link.attr(
"abs:href"
), link.attr(
"rel"
));
}
print(
"\nLinks: (%d)"
, links.size());
for
(Element link : links) {
print(
" * a: <%s> (%s)"
, link.attr(
"abs:href"
), trim(link.text(),
35
));
}
}
private
static
void
print(String msg, Object... args) {
System.out.println(String.format(msg, args));
}
private
static
String trim(String s,
int
width) {
if
(s.length() > width)
return
s.substring(
0
, width-
1
) +
"."
;
else
return
s;
}
}
//org/jsoup/examples/ListLinks.java
示例输入结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Fetching http:
//news.ycombinator.com/...
Media: (
38
)
* img: //ycombinator.com/images/y18.gif> 18x18 ()
* img: //ycombinator.com/images/s.gif> 10x1 ()
* img: //ycombinator.com/images/grayarrow.gif> x ()
* img: //ycombinator.com/images/s.gif> 0x10 ()
* script: //www.co2stats.com/propres.php?s=1138>
* img: //ycombinator.com/images/s.gif> 15x1 ()
* img: //ycombinator.com/images/hnsearch.png> x ()
* img: //ycombinator.com/images/s.gif> 25x1 ()
* img: //mixpanel.com/site_media/images/mixpanel_partner_logo_borderless.gif> x (Analytics by Mixpan.)
Imports: (
2
)
* link //ycombinator.com/news.css> (stylesheet)
* link //ycombinator.com/favicon.ico> (shortcut icon)
Links: (
141
)
* a: //ycombinator.com> ()
* a: //news.ycombinator.com/news> (Hacker News)
* a: //news.ycombinator.com/newest> (new)
* a: //news.ycombinator.com/newcomments> (comments)
* a: //news.ycombinator.com/leaders> (leaders)
* a: //news.ycombinator.com/jobs> (jobs)
* a: //news.ycombinator.com/submit> (submit)
* a: //news.ycombinator.com/x?fnid=JKhQjfU7gW> (login)
* a: //news.ycombinator.com/vote?for=1094578&dir=up&whence=%6e%65%77%73> ()
* a: //www.readwriteweb.com/archives/facebook_gets_faster_debuts_homegrown_php_compiler.php?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+readwriteweb+%28ReadWriteWeb%29&utm_content=Twitter> (Facebook speeds up PHP)
* a: //news.ycombinator.com/user?id=mcxx> (mcxx)
* a: //news.ycombinator.com/item?id=1094578> (9 comments)
* a: //news.ycombinator.com/vote?for=1094649&dir=up&whence=%6e%65%77%73> ()
* a: //groups.google.com/group/django-developers/msg/a65fbbc8effcd914> ("Tough. Django produces XHTML.")
* a: //news.ycombinator.com/user?id=andybak> (andybak)
* a: //news.ycombinator.com/item?id=1094649> (3 comments)
* a: //news.ycombinator.com/vote?for=1093927&dir=up&whence=%6e%65%77%73> ()
* a: //news.ycombinator.com/x?fnid=p2sdPLE7Ce> (More)
* a: //news.ycombinator.com/lists> (Lists)
* a: //news.ycombinator.com/rss> (RSS)
* a: //ycombinator.com/bookmarklet.html> (Bookmarklet)
* a: //ycombinator.com/newsguidelines.html> (Guidelines)
* a: //ycombinator.com/newsfaq.html> (FAQ)
* a: //ycombinator.com/newsnews.html> (News News)
* a: //news.ycombinator.com/item?id=363> (Feature Requests)
* a: //ycombinator.com> (Y Combinator)
* a: //ycombinator.com/w2010.html> (Apply)
* a: //ycombinator.com/lib.html> (Library)
* a: //www.webmynd.com/html/hackernews.html> ()
* a: //mixpanel.com/?from=yc> ()
11.设置属性的值
问题
在你解析一个Document之后可能想修改其中的某些属性值,然后再保存到磁盘或都输出到前台页面。
方法
可以使用属性设置方法 Element.attr(String key, String value)
, 和 Elements.attr(String key, String value)
.
假如你需要修改一个元素的 class
属性,可以使用 Element.addClass(String className)
和Element.removeClass(String className)
方法。
Elements
提供了批量操作元素属性和class的方法,比如:要为div中的每一个a元素都添加一个rel="nofollow"
可以使用如下方法:
1
doc.select(
"div.comments a"
).attr(
"rel"
,
"nofollow"
);
说明
与Element
中的其它方法一样,attr
方法也是返回当 Element
(或在使用选择器是返回 Elements
集合)。这样能够很方便使用方法连用的书写方式。比如:
1
doc.select(
"div.masthead"
).attr(
"title"
,
"jsoup"
).addClass(
"round-box"
);
12.设置一个元素的HTML内容
问题
你需要一个元素中的HTML内容
方法
可以使用Element
中的HTML设置方法具体如下:
1
2
3
4
5
6
7
8
9
Element div = doc.select(
"div"
).first();
//
div.html(
"lorem ipsum
"
);
//
div.prepend(
"First
"
);
//在div前添加html内容
div.append(
"Last
"
);
//在div之后添加html内容
// 添完后的结果:
Element span = doc.select(
"span"
).first();
// One
span.wrap(
" "
);
// 添完后的结果: One
说明
Element.html(String html)
这个方法将先清除元素中的HTML内容,然后用传入的HTML代替。
Element.prepend(String first)
和 Element.append(String last)
方法用于在分别在元素内部HTML的前面和后面添加HTML内容
Element.wrap(String around)
对元素包裹一个外部HTML内容。
参见
可以查看API参考文档中 Element.prependElement(String tag)
和Element.appendElement(String tag)
方法来创建新的元素并作为文档的子元素插入其中。
13.设置元素的文本内容
问题
你需要修改一个HTML文档中的文本内容
方法
可以使用Element
的设置方法::
1
2
3
4
5
Element div = doc.select(
"div"
).first();
//
div.text(
"five > four"
);
// five > four
div.prepend(
"First "
);
div.append(
" Last"
);
// now: First five > four Last
说明
文本设置方法与 HTML setter 方法一样:
Element.text(String text)
将清除一个元素中的内部HTML内容,然后提供的文本进行代替
Element.prepend(String first)
和 Element.append(String last)
将分别在元素的内部html前后添加文本节点。
对于传入的文本如果含有像 <
, >
等这样的字符,将以文本处理,而非HTML。
14.消除不受信任的HTML (来防止XSS攻击)
问题
在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。
方法
使用jsoup HTML Cleaner
方法进行清除,但需要指定一个可配置的 Whitelist
。
1
2
3
4
String unsafe =
"Link
"
;
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// now: Link
说明
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。所以我们经常只让用户输入纯文本的内容,但这样用户体验就比较差了。
一个更好的解决方法就是使用一个富文本编辑器WYSIWYG如CKEditor 和 TinyMCE。这些可以输出HTML并能够让用户可视化编辑。虽然他们可以在客户端进行校验,但是这样还不够安全,需要在服务器端进行校验并清除有害的HTML代码,这样才能确保输入到你网站的HTML是安全的。否则,攻击者能够绕过客户端的Javascript验证,并注入不安全的HMTL直接进入您的网站。
jsoup的whitelist清理器能够在服务器端对用户输入的HTML进行过滤,只输出一些安全的标签和属性。
jsoup提供了一系列的Whitelist
基本配置,能够满足大多数要求;但如有必要,也可以进行修改,不过要小心。
这个cleaner非常好用不仅可以避免XSS攻击,还可以限制用户可以输入的标签范围。
参见
参阅XSS cheat sheet ,有一个例子可以了解为什么不能使用正则表达式,而采用安全的whitelist parser-based清理器才是正确的选择。
参阅Cleaner
,了解如何返回一个 Document
对象,而不是字符串
参阅Whitelist
,了解如何创建一个自定义的whitelist
nofollow 链接属性了解
转发请注明出处:http://www.cnblogs.com/jycboy/p/jsoupdoc.html
你可能感兴趣的:(工具类)
HarmonyOS Next鸿蒙扫一扫功能实现
JohnLiu_
HarmonyOS Next harmonyos 华为 扫一扫 鸿蒙
直接使用的是华为官方提供的api,封装成一个工具类方便调用。import{common}from'@kit.AbilityKit';import{scanBarcode,scanCore}from'@kit.ScanKit';exportnamespaceScanUtil{exportasyncfunctionstartScan(context:common.Context):Promise{if
上传文件到钉盘流程详解
jspyth
开发场景案例分析 开发语言 java 后端
文章目录前言准备工作实现过程Maven依赖封装一个工具类获取文件上传信息unionId获取钉盘目录spaceId创建上传到钉盘前言 本文详解如何通过钉钉的API实现上传文件到钉盘目录,代码通过JAVA实现。准备工作1、在钉钉开发者后台创建一个钉钉企业内部应用;2、创建并保存好应用的appKey和appSecret,后面用于获取调用API的请求token;3、应用中配置好所需权限:企业存储文件上传
SpringBoot 获取 ApplicationContext
loveLifeLoveCoding
springboot spring boot java spring
1.概念ApplicationContext是什么?简单来说就是Spring中的容器,可以用来获取容器中的各种bean组件,注册监听事件,加载资源文件等功能2.获取ApplicationContext的方式2.1.创建工具类通过此工具类,可以方便的获取bean组件,获取配置信息等importorg.springframework.beans.BeansException;importorg.spr
PCL 点云视窗类CloudViewer
LeonDL168
PCL 算法 计算机视觉 人工智能 视觉检测 图像处理
点云视窗类CloudViewer是简单显示点云的可视化工具类,可以让用户用尽可能少的代码查看点云。注意:点云视窗类不能应用于多线程应用程序中。简单点云可视化如果用户想用几行代码可视化程序中所对应的地物,可以使用下面的代码:#include//...voidfoo(){pcl::PointCloud::Ptrcloud;//...为cloud添加对应的场景pcl::visualization::Cl
麻雀虽小,五脏俱全 - Java工具类库 - Hutool
waiter_chen
Hutool官网:https://www.hutool.cn官方参考文档:https://www.hutool.cn/docsAsetoftoolsthatkeepJavasweet.——Htool特点通过静态方法封装,类函数式语言般,降低学习成本,提高工作效率整合多方用户需求,减少代码搜索成本,避免网络上参差不齐的代码出现导致的bugutil包提供多方公用类和公用工具方法,节省开发封装时间,减少
Java:数学相关类
昭关969
java 开发语言
Math类Math类是数学工具类,用于数学计算,构造方法是私有的,方法都是静态的,因此直接类名调用staticintabs(inta)求参数绝对值staticdoubleceil(doublea)向上取整staticdoublefloor(doublea)向下取整staticlonground(doublea)四舍五入staticintmax(inta,intb)求较大值staticintmin(
文件大小自动转换工具类
小卡车555
java
根据传入的文件大小,自动转换为B、KB、MB、GB、TBimportjava.text.DecimalFormat;publicclassFileSizeUtil{/***文件单位*/privatestaticfinalString[]units=newString[]{"B","KB","MB","GB","TB"};/***文件大小自动转换*@paramsize*@return*/public
JS 获取时间
买买买买菜
/**针对Ext的工具类*/exportvarMrYangUtil=function(){/****获得当前时间*/this.getCurrentDate=function(){returnnewDate();};/****获得本周起止时间*/this.getCurrentWeek=function(){//起止日期数组varstartStop=newArray();//获取当前时间varcurr
java基础-线程间通信方式
问道飞鱼
Java开发技术 java 开发语言
文章目录1.wait()和notify()2.volatile关键字3.Java.util.concurrent包提供的工具类Semaphore(信号量)BlockingQueue(阻塞队列)4.Atomic类在Java中,线程间的通信是非常重要的,尤其是在多线程编程中,它有助于协调线程的行为,确保资源的正确访问和更新。Java提供了多种方式来实现线程间的通信,主要包括以下几种方法:1.wait(
JavaSE之static关键字
麦芒疯狂生长!
JavaSE java 开发语言
不积跬步无以至千里,不积小流无已成江海一、认识static我们在学习一个关键字时,首先要关注这个关键字有什么用?我们为什么要学习它?这里给大家先介绍一下static都会出现在我们日常项目的哪些位置。static主要会出现在工具类和测试类当中,这里讲一下什么是JavaBean类、工具类和测试类。1、JavaBean类:用来描述一类事物的类,比如Student类、Teacher类、Dog类、Cat类等
Cookie & Session & JWT认证 & Filter & Interceptor
aDreamerOutOfTheSky
java spring spring boot
文章目录前言一、Cookie和Session二、JWT1.三部分2.使用3.另外一种使用3.1引入依赖3.1定义工具类三、Filter过滤器3.1实现Filter接口,并且增加@WebFilter注解3.2启动类上增加注解3.3Filter过滤实现登陆校验3.4拦截器实现登陆校验总结前言本文介绍了Cookie,Session,JWT,过滤器,拦截器的相关知识一、Cookie和Session浏览器请
数仓开发之DWD层完整使用 (第五章)
小坏讲微服务
数据仓库 hadoop scala kafka
数仓开发之DWD层完整使用一、流量域未精加工的事务事实表1、主要任务1)数据清洗(ETL)2)新老访客状态标记修复3)分流2、思路1)数据清洗(ETL)2)新老访客状态标记修复(1)前端埋点新老访客状态标记设置规则(2)新老访客状态标记修复思路3)利用侧输出流实现数据拆分(1)埋点日志结构分析(2)分流日志分类(3)分流思路3、图解4、代码1)在KafkaUtil工具类中补充getKafkaPro
OkHttp搞定Http请求
头秃到底
文章目录OkHttp依赖包创建OkHttpClient构造UrlHeader头设定Get请求同步Get异步GetPost请求Json内容Form表单文件上传Put请求Json内容参数方式Delete请求OkHttp工具类OkHttp官方文档仓库OkHttp是一款高效的HTTP客户端框架:HTTP/2支持允许对同一主机的所有请求共享一个套接字。连接池可以减少请求延迟(如果HTTP/2不可用)。透明G
Java数组和字符串
bala_jiang
Java java 开发语言
前言介绍Java数组和字符串的定义和使用。目录前言一、数组(一)、数组概述(二)、数组的使用1.数组的声明和初始化(1)、静态初始化(2)、动态初始化(3)、数组默认初始化值2.数组的长度3.数组元素访问和遍历数组4.数组的扩容与拷贝(三)、二维数组(四)、数组工具类1.booleanequals(数组1,数组2)2.StringtoString(数组)3.voidfill(数组,值)4.void
配置QT程序的命令行参数
码农飞飞
QT+QML qt ui 开发语言 json
在开发一些非UI程序的时候,我们习惯通过命令行参数给程序传递一些配置项和参数。这时候在程序里面解析这些配置项和参数就成了一个让人头疼的问题。其实针对QT命令行参数的解析,QT提供了现成的工具类QCommandLineParser,通过使用工具类可以极大的简化我们解析命令行参数的工作量。这里介绍一下命令行参数解析类的使用方法。获取程序的版本信息对于一些通用产品,比如git或者electron等等我们
使用jackson将xml和对象、List相互转换
齐 飞
xml list java spring boot 后端
文章目录JacksonXml常用注解常用的配置属性相关依赖jackson工具类xml和对象相互转换xml数据实体类xml转为对象对象转为xmlxml和List相互转换xml数据实体类List转xmlxml转List方法1方法2@JacksonXmlElementWrapper的useWrapping参数区别总结JacksonXmlJackson是一个广泛使用的JSON处理库,但在处理XML数据时,
日志工具类-RiZhiHelp
taozi_5188
asp.net常用功能和代码
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.IO;namespaceRiZhi{publicclassRiZhiHelp{privateconststringPath=@"E:\自己学习\RiZhi\Log\";publicstaticvoidWriteLog(s
Java集合
golove666
后端 java 集合框架 Java集合 线程安全
Java集合一、什么是Java集合?主要组成部分:二、Collections工具类1.**排序相关方法**:2.**查找和替换相关方法**:3.**同步和不可变集合相关方法**:4.**打乱顺序相关方法**:5.**集合频率与填充相关方法**:6.**集合比较相关方法**:7.**集合旋转相关方法**:8.**集合交换相关方法**:9.**集合填充相关方法**:10.**空集合相关方法**:三、集
Java 获取中文拼音和首字母
颇有几分姿色
java基础 java
需求:获取中文首字母当做用户登录名。获取用户姓名拼音做其他逻辑。不需要定制化使用hutool封装的PinyinUtil即可,我这里需要自己定制,所以写了个工具类。实现基于搜狐的Pinyin4j库。依赖:cn.hutoolhutool-all5.4.2com.belerwebpinyin4j2.5.1PinyinUtils代码示例PinyinUtils提供了以下主要方法:toHanYuPinyinS
Java 入门指南:Java 并发编程 —— 同步工具类 Semephore(信号量)
ZachOn1y
Java java 开发语言 intellij-idea 个人开发 团队开发 java-ee
文章目录同步工具类Semephore核心功能限制并发访问量公平与非公平策略灵活性与适应性常用方法使用示例同步工具类JUC(Java.util.concurrent)是Java提供的用于并发编程的工具类库,其中包含了一些通信工具类,用于在多个线程之间进行协调和通信,特别是在多线程和网络通信方面。这些工具类提供了丰富的功能,帮助开发者高效地实现复杂的并发控制和网络通信需求。SemephoreSemap
Java 入门指南:Java 并发编程 —— 同步工具类 CountDownLatch(倒计时门闩)
ZachOn1y
Java java 后端 个人开发 java-ee 团队开发
文章目录同步工具类CountDownLatch常用方法使用步骤适用场景使用示例同步工具类JUC(Java.util.concurrent)是Java提供的用于并发编程的工具类库,其中包含了一些通信工具类,用于在多个线程之间进行协调和通信,特别是在多线程和网络通信方面。这些工具类提供了丰富的功能,帮助开发者高效地实现复杂的并发控制和网络通信需求。CountDownLatchCountDownLatc
aliyun图片存储OSS工具类
码农娟
工具专栏 java
pom.xml配置jar包com.aliyun.ossaliyun-sdk-oss3.17.4yml配置相关key#oss配置oss:#AKaccessKey:accessKey#SKsecretKey:secretKey#访问域名:以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.comendpoint:https://oss-cn-h
Java封装大华SDK,实现门禁一体机的常用功能
香蕉i
java 物联网
Java封装大华SDK,实现门禁人脸一体机的常用功能大华sdk的相关资料在网上很少,刚接触比较难上手,这里将本人近期的研究成果进行分享。从大华官网下载相应环境下的sdk:自定义开发的工具类,这里主要实现的功能有://1、远程开门//openDoor();//2、开门记录//findAccessRecords();//3、指定数量查询人员信息//findUserInfos();//4、通过ID查询人
Java Springboot MultipartFile 进行Excel文件解析,并返回list map 对象 - 工具类
VinfolHu
java java spring boot excel
JavaSpringbootMultipartFile进行Excel文件解析,并返回listmap对象主要实现代码如下:importlombok.extern.slf4j.Slf4j;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.ss.usermodel.CellType;importorg.apache
Java+selenium+chrome+linux/windows实现数据获取
fox_初始化
Java selenium chrome 测试工具 java linux windows
背景:在进行业务数据获取或者自动化测试时,通常会使用模拟chrome方式启动页面,然后获取页面的数据。在本地可以使用windows的chromedriver.exe进行打开chrome页面、点击等操作。在linux下通常使用无界面无弹窗的方式进行操作。接下来是实现方案。代码层面:关键工具类:ChromeDriverUtilpublicclassChromeDriverUtil{publicWebD
Mybatis工具—数据库操作器(SqlRunner)
乐只乐之
mybatis mybatis 数据库 java
MyBatis提供了一个用于操作数据库的SqlRunner工具类,对JDBC做了很好的封装。结合工具类SQL,能够很方便地通过Java代码执行SQL语句并检索SQL执行结果。如下示例代码所示:Stringsql=newSQL().SELECT("*").FROM("user_info").WHERE("id=#{id}","name=#{name}").toString();Connectio
JDBC
yulijun6943
java jdbc java mysql 数据库 大数据
JDBC一概念二JDBC开发步骤【`重点`】三ResultSet(结果集)3.1接收结果集3.2遍历ResultSet中的数据3.3常见错误四PreparedStatement【`重点`】4.1PreparedStatement的应用4.1.1动态参数绑定五封装工具类5.1重用性方案5.2跨平台方案5.2.1六ORM6.1实体类(entity):零散数据的载体七DAO数据访问对象(DataAcce
JAVA XML转JSON工具类
张志飞
xml json
packagecom.cm.util.xmlutl;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;importorg.apache.log4j.Logger;importorg.dom4j.*;importjava.io.File;importjava.io.FileInputStream;im
tio websocket 客户端 java 代码 工具类
java知路
websocket 网络协议 网络
为了更好地组织代码并提高可复用性,我们可以将WebSocket客户端封装成一个工具类。这样可以在多个地方方便地使用WebSocket客户端功能。以下是使用tio库实现的一个WebSocket客户端工具类。1.添加依赖确保项目中添加了tio的依赖。如果使用的是Maven,可以在pom.xml文件中添加以下依赖:com.github.xiaoymintio-core2.1.10com.github.x
JWT生成、解析token
睆小白
java android 开发语言
目录1.导入JWT相关依赖2.JWT生成token3.JWT解析token4.测试结果5.JWT加密、解密工具类1.导入JWT相关依赖io.jsonwebtokenjjwt-api0.10.2io.jsonwebtokenjjwt-impl0.10.2io.jsonwebtokenjjwt-jackson0.10.22.JWT生成token/***获取JWT令牌*@return*/publicst
SQL的各种连接查询
xieke90
UNION ALL UNION 外连接 内连接 JOIN
一、内连接
概念:内连接就是使用比较运算符根据每个表共有的列的值匹配两个表中的行。
内连接(join 或者inner join )
SQL语法:
select * fron
java编程思想--复用类
百合不是茶
java 继承 代理 组合 final类
复用类看着标题都不知道是什么,再加上java编程思想翻译的比价难懂,所以知道现在才看这本软件界的奇书
一:组合语法:就是将对象的引用放到新类中即可
代码:
package com.wj.reuse;
/**
*
* @author Administrator 组
[开源与生态系统]国产CPU的生态系统
comsci
cpu
计算机要从娃娃抓起...而孩子最喜欢玩游戏....
要让国产CPU在国内市场形成自己的生态系统和产业链,国家和企业就不能够忘记游戏这个非常关键的环节....
投入一些资金和资源,人力和政策,让游
JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
商人shang
jvm内存
jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
HotSpot虚拟机GC算法采用分代收
页面上调用 QQ
oloz
qq
<A href="tencent://message/?uin=707321921&Site=有事Q我&Menu=yes">
<img style="border:0px;" src=http://wpa.qq.com/pa?p=1:707321921:1></a>
一些问题
文强chu
问题
1.eclipse 导出 doc 出现“The Javadoc command does not exist.” javadoc command 选择 jdk/bin/javadoc.exe 2.tomcate 配置 web 项目 .....
SQL:3.mysql * 必须得放前面 否则 select&nbs
生活没有安全感
小桔子
生活 孤独 安全感
圈子好小,身边朋友没几个,交心的更是少之又少。在深圳,除了男朋友,没几个亲密的人。不知不觉男朋友成了唯一的依靠,毫不夸张的说,业余生活的全部。现在感情好,也很幸福的。但是说不准难免人心会变嘛,不发生什么大家都乐融融,发生什么很难处理。我想说如果不幸被分手(无论原因如何),生活难免变化很大,在深圳,我没交心的朋友。明
php 基础语法
aichenglong
php 基本语法
1 .1 php变量必须以$开头
<?php
$a=” b”;
echo
?>
1 .2 php基本数据库类型 Integer float/double Boolean string
1 .3 复合数据类型 数组array和对象 object
1 .4 特殊数据类型 null 资源类型(resource) $co
mybatis tools 配置详解
AILIKES
mybatis
MyBatis Generator中文文档
MyBatis Generator中文文档地址:
http://generator.sturgeon.mopaas.com/
该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看中文版的文档的也会有一定的障碍,所以本章根据该中文文档以及实际应用,使用通俗的语言来讲解详细的配置。
本文使用Markdown进行编辑,但是博客显示效
继承与多态的探讨
百合不是茶
JAVA面向对象 继承 对象
继承 extends 多态
继承是面向对象最经常使用的特征之一:继承语法是通过继承发、基类的域和方法 //继承就是从现有的类中生成一个新的类,这个新类拥有现有类的所有extends是使用继承的关键字:
在A类中定义属性和方法;
class A{
//定义属性
int age;
//定义方法
public void go
JS的undefined与null的实例
bijian1013
JavaScript JavaScript
<form name="theform" id="theform">
</form>
<script language="javascript">
var a
alert(typeof(b)); //这里提示undefined
if(theform.datas
TDD实践(一)
bijian1013
java 敏捷 TDD
一.TDD概述
TDD:测试驱动开发,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完全部功能的开发。
[Maven学习笔记十]Maven Profile与资源文件过滤器
bit1129
maven
什么是Maven Profile
Maven Profile的含义是针对编译打包环境和编译打包目的配置定制,可以在不同的环境上选择相应的配置,例如DB信息,可以根据是为开发环境编译打包,还是为生产环境编译打包,动态的选择正确的DB配置信息
Profile的激活机制
1.Profile可以手工激活,比如在Intellij Idea的Maven Project视图中可以选择一个P
【Hive八】Hive用户自定义生成表函数(UDTF)
bit1129
hive
1. 什么是UDTF
UDTF,是User Defined Table-Generating Functions,一眼看上去,貌似是用户自定义生成表函数,这个生成表不应该理解为生成了一个HQL Table, 貌似更应该理解为生成了类似关系表的二维行数据集
2. 如何实现UDTF
继承org.apache.hadoop.hive.ql.udf.generic
tfs restful api 加auth 2.0认计
ronin47
目前思考如何给tfs的ngx-tfs api增加安全性。有如下两点:
一是基于客户端的ip设置。这个比较容易实现。
二是基于OAuth2.0认证,这个需要lua,实现起来相对于一来说,有些难度。
现在重点介绍第二种方法实现思路。
前言:我们使用Nginx的Lua中间件建立了OAuth2认证和授权层。如果你也有此打算,阅读下面的文档,实现自动化并获得收益。SeatGe
jdk环境变量配置
byalias
java jdk
进行java开发,首先要安装jdk,安装了jdk后还要进行环境变量配置:
1、下载jdk(http://java.sun.com/javase/downloads/index.jsp),我下载的版本是:jdk-7u79-windows-x64.exe
2、安装jdk-7u79-windows-x64.exe
3、配置环境变量:右击"计算机"-->&quo
《代码大全》表驱动法-Table Driven Approach-2
bylijinnan
java
package com.ljn.base;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.uti
SQL 数值四舍五入 小数点后保留2位
chicony
四舍五入
1.round() 函数是四舍五入用,第一个参数是我们要被操作的数据,第二个参数是设置我们四舍五入之后小数点后显示几位。
2.numeric 函数的2个参数,第一个表示数据长度,第二个参数表示小数点后位数。
例如:
select cast(round(12.5,2) as numeric(5,2))  
c++运算符重载
CrazyMizzz
C++
一、加+,减-,乘*,除/ 的运算符重载
Rational operator*(const Rational &x) const{
return Rational(x.a * this->a);
}
在这里只写乘法的,加减除的写法类似
二、<<输出,>>输入的运算符重载
&nb
hive DDL语法汇总
daizj
hive 修改列 DDL 修改表
hive DDL语法汇总
1、对表重命名
hive> ALTER TABLE table_name RENAME TO new_table_name;
2、修改表备注
hive> ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comm
jbox使用说明
dcj3sjt126com
Web
参考网址:http://www.kudystudio.com/jbox/jbox-demo.html jBox v2.3 beta [
点击下载]
技术交流QQGroup:172543951 100521167
[2011-11-11] jBox v2.3 正式版
- [调整&修复] IE6下有iframe或页面有active、applet控件
UISegmentedControl 开发笔记
dcj3sjt126com
// typedef NS_ENUM(NSInteger, UISegmentedControlStyle) {
// UISegmentedControlStylePlain, // large plain
&
Slick生成表映射文件
ekian
scala
Scala添加SLICK进行数据库操作,需在sbt文件上添加slick-codegen包
"com.typesafe.slick" %% "slick-codegen" % slickVersion
因为我是连接SQL Server数据库,还需添加slick-extensions,jtds包
"com.typesa
ES-TEST
gengzg
test
package com.MarkNum;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation
为何外键不再推荐使用
hugh.wang
mysql DB
表的关联,是一种逻辑关系,并不需要进行物理上的“硬关联”,而且你所期望的关联,其实只是其数据上存在一定的联系而已,而这种联系实际上是在设计之初就定义好的固有逻辑。
在业务代码中实现的时候,只要按照设计之初的这种固有关联逻辑来处理数据即可,并不需要在数据库层面进行“硬关联”,因为在数据库层面通过使用外键的方式进行“硬关联”,会带来很多额外的资源消耗来进行一致性和完整性校验,即使很多时候我们并不
领域驱动设计
julyflame
VO DAO 设计模式 DTO po
概念:
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对
单例设计模式
hm4123660
java Singleton 单例设计模式 懒汉式 饿汉式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
&nb
logback
zhb8015
log logback
一、logback的介绍
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-class
整合Kafka到Spark Streaming——代码示例和挑战
Stark_Summer
spark storm zookeeper PARALLELISM processing
作者Michael G. Noll是瑞士的一位工程师和研究员,效力于Verisign,是Verisign实验室的大规模数据分析基础设施(基础Hadoop)的技术主管。本文,Michael详细的演示了如何将Kafka整合到Spark Streaming中。 期间, Michael还提到了将Kafka整合到 Spark Streaming中的一些现状,非常值得阅读,虽然有一些信息在Spark 1.2版
spring-master-slave-commondao
王新春
DAO spring dataSource slave master
互联网的web项目,都有个特点:请求的并发量高,其中请求最耗时的db操作,又是系统优化的重中之重。
为此,往往搭建 db的 一主多从库的 数据库架构。作为web的DAO层,要保证针对主库进行写操作,对多个从库进行读操作。当然在一些请求中,为了避免主从复制的延迟导致的数据不一致性,部分的读操作也要到主库上。(这种需求一般通过业务垂直分开,比如下单业务的代码所部署的机器,读去应该也要从主库读取数