Parsed HTML into a doc.
"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("html"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[s("code",[t._v("parse(String html, String baseUri)")]),t._v(" 这方法能够将输入的 HTML 解析为一个新的文档 (Document),参数 baseUri 是用来将相对 URL 转成绝对 URL,并指定从哪个网站获取文档。如这个方法不适用,你可以使用 "),s("code",[t._v("parse(String html)")]),t._v(" 方法来解析成 HTML 字符串如上面的示例。")]),t._v(" "),s("p",[t._v("只要解析的不是空字符串,就能返回一个结构合理的文档,其中包含(至少) 一个 head 和一个 body 元素。")]),t._v(" "),s("p",[t._v("一旦拥有了一个 Document,你就可以使用 Document 中适当的方法或它父类 "),s("code",[t._v("Element")]),t._v("和"),s("code",[t._v("Node")]),t._v("中的方法来取得相关数据。")])]),t._v(" "),s("h3",{attrs:{id:"解析一个-body-片断"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#解析一个-body-片断"}},[t._v("#")]),t._v(" 解析一个 body 片断")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("假如你有一个 HTML 片断 (比如. 一个 "),s("code",[t._v("div")]),t._v(" 包含一对 "),s("code",[t._v("p")]),t._v(" 标签; 一个不完整的 HTML 文档) 想对它进行解析。这个 HTML 片断可以是用户提交的一条评论或在一个 CMS 页面中编辑 body 部分。")]),t._v(" "),s("p",[s("strong",[t._v("办法")])]),t._v(" "),s("p",[t._v("使用"),s("code",[t._v("Jsoup.parseBodyFragment(String html)")]),t._v("方法.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('String html = "Lorem ipsum.
";\nDocument doc = Jsoup.parseBodyFragment(html);\nElement body = doc.body();\n')])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[s("code",[t._v("parseBodyFragment")]),t._v(" 方法创建一个空壳的文档,并插入解析过的 HTML 到"),s("code",[t._v("body")]),t._v("元素中。假如你使用正常的 "),s("code",[t._v("Jsoup.parse(String html)")]),t._v(" 方法,通常你也可以得到相同的结果,但是明确将用户输入作为 body 片段处理,以确保用户所提供的任何糟糕的 HTML 都将被解析成 body 元素。")]),t._v(" "),s("p",[s("code",[t._v("Document.body()")]),t._v(" 方法能够取得文档 body 元素的所有子元素,与 "),s("code",[t._v('doc.getElementsByTag("body")')]),t._v("相同。")])]),t._v(" "),s("h4",{attrs:{id:"保证安全-stay-safe"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#保证安全-stay-safe"}},[t._v("#")]),t._v(" 保证安全 Stay safe")]),t._v(" "),s("p",[t._v("假如你可以让用户输入 HTML 内容,那么要小心避免跨站脚本攻击。利用基于 "),s("code",[t._v("Whitelist")]),t._v(" 的清除器和 "),s("code",[t._v("clean(String bodyHtml, Whitelist whitelist)")]),t._v("方法来清除用户输入的恶意内容。")]),t._v(" "),s("h3",{attrs:{id:"从-url-加载一个文档"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#从-url-加载一个文档"}},[t._v("#")]),t._v(" 从 URL 加载一个文档")]),t._v(" "),s("p",[t._v("使用 "),s("code",[t._v("Jsoup.connect(String url)")]),t._v("方法")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[s("code",[t._v("connect(String url)")]),t._v(" 方法创建一个新的 "),s("code",[t._v("Connection")]),t._v(", 和 "),s("code",[t._v("get()")]),t._v(" 取得和解析一个 HTML 文件。如果从该 URL 获取 HTML 时发生错误,便会抛出 IOException,应适当处理。")])]),t._v(" "),s("p",[s("code",[t._v("Connection")]),t._v(" 接口还提供一个方法链来解决特殊请求,具体如下:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("data")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"query"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Java"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("userAgent")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Mozilla"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cookie")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"auth"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"token"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("timeout")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3000")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"从一个文件加载一个文档"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#从一个文件加载一个文档"}},[t._v("#")]),t._v(" 从一个文件加载一个文档")]),t._v(" "),s("p",[t._v("可以使用静态 "),s("code",[t._v("Jsoup.parse(File in, String charsetName, String baseUri)")]),t._v(" 方法")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" input "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/input.html"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("input"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UTF-8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[s("code",[t._v("parse(File in, String charsetName, String baseUri)")]),t._v(" 这个方法用来加载和解析一个 HTML 文件。如在加载文件的时候发生错误,将抛出 IOException,应作适当处理。")]),t._v(" "),s("p",[s("code",[t._v("baseUri")]),t._v(" 参数用于解决文件中 URLs 是相对路径的问题。如果不需要可以传入一个空的字符串。")]),t._v(" "),s("p",[t._v("另外还有一个方法"),s("code",[t._v("parse(File in, String charsetName)")]),t._v(" ,它使用文件的路径做为 "),s("code",[t._v("baseUri")]),t._v("。 这个方法适用于如果被解析文件位于网站的本地文件系统,且相关链接也指向该文件系统。")])]),t._v(" "),s("h2",{attrs:{id:"解析"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#解析"}},[t._v("#")]),t._v(" 解析")]),t._v(" "),s("h3",{attrs:{id:"使用-dom-方法来遍历一个文档"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用-dom-方法来遍历一个文档"}},[t._v("#")]),t._v(" 使用 DOM 方法来遍历一个文档")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("你有一个 HTML 文档要从中提取数据,并了解这个 HTML 文档的结构。")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("p",[t._v("将 HTML 解析成一个"),s("code",[t._v("Document")]),t._v("之后,就可以使用类似于 DOM 的方法进行操作。示例代码:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" input "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/input.html"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("input"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UTF-8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Element")]),t._v(" content "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementById")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"content"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Elements")]),t._v(" links "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" content"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("getElementsByTag")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Element")]),t._v(" link "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" links"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" linkHref "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("attr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"href"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" linkText "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("text")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[s("code",[t._v("Elements")]),t._v(" 这个对象提供了一系列类似于 DOM 的方法来查找元素,抽取并处理其中的数据。")]),t._v(" "),s("p",[t._v("具体如下:")]),t._v(" "),s("h4",{attrs:{id:"查找元素"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#查找元素"}},[t._v("#")]),t._v(" 查找元素")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("getElementById(String id)")])]),t._v(" "),s("li",[s("code",[t._v("getElementsByTag(String tag)")])]),t._v(" "),s("li",[s("code",[t._v("getElementsByClass(String className)")])]),t._v(" "),s("li",[s("code",[t._v("getElementsByAttribute(String key)")]),t._v(" (and related methods)")]),t._v(" "),s("li",[t._v("Element siblings: "),s("code",[t._v("siblingElements()")]),t._v(", "),s("code",[t._v("firstElementSibling()")]),t._v(", "),s("code",[t._v("lastElementSibling()")]),t._v(";"),s("code",[t._v("nextElementSibling()")]),t._v(", "),s("code",[t._v("previousElementSibling()")])]),t._v(" "),s("li",[t._v("Graph: "),s("code",[t._v("parent()")]),t._v(", "),s("code",[t._v("children()")]),t._v(", "),s("code",[t._v("child(int index)")])])]),t._v(" "),s("h4",{attrs:{id:"元素数据"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#元素数据"}},[t._v("#")]),t._v(" 元素数据")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("attr(String key)")]),t._v("获取属性"),s("code",[t._v("attr(String key, String value)")]),t._v("设置属性")]),t._v(" "),s("li",[s("code",[t._v("attributes()")]),t._v("获取所有属性")]),t._v(" "),s("li",[s("code",[t._v("id()")]),t._v(", "),s("code",[t._v("className()")]),t._v(" and "),s("code",[t._v("classNames()")])]),t._v(" "),s("li",[s("code",[t._v("text()")]),t._v("获取文本内容"),s("code",[t._v("text(String value)")]),t._v(" 设置文本内容")]),t._v(" "),s("li",[s("code",[t._v("html()")]),t._v("获取元素内 HTML"),s("code",[t._v("html(String value)")]),t._v("设置元素内的 HTML 内容")]),t._v(" "),s("li",[s("code",[t._v("outerHtml()")]),t._v("获取元素外 HTML 内容")]),t._v(" "),s("li",[s("code",[t._v("data()")]),t._v("获取数据内容(例如:script 和 style 标签)")]),t._v(" "),s("li",[s("code",[t._v("tag()")]),t._v(" and "),s("code",[t._v("tagName()")])])]),t._v(" "),s("h4",{attrs:{id:"操作-html-和文本"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#操作-html-和文本"}},[t._v("#")]),t._v(" 操作 HTML 和文本")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("append(String html)")]),t._v(", "),s("code",[t._v("prepend(String html)")])]),t._v(" "),s("li",[s("code",[t._v("appendText(String text)")]),t._v(", "),s("code",[t._v("prependText(String text)")])]),t._v(" "),s("li",[s("code",[t._v("appendElement(String tagName)")]),t._v(", "),s("code",[t._v("prependElement(String tagName)")])]),t._v(" "),s("li",[s("code",[t._v("html(String value)")])])]),t._v(" "),s("h3",{attrs:{id:"使用选择器语法来查找元素"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#使用选择器语法来查找元素"}},[t._v("#")]),t._v(" 使用选择器语法来查找元素")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("你想使用类似于 CSS 或 jQuery 的语法来查找和操作元素。")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("p",[t._v("可以使用"),s("code",[t._v("Element.select(String selector)")]),t._v(" 和 "),s("code",[t._v("Elements.select(String selector)")]),t._v(" 方法实现:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" input "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/tmp/input.html"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("input"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UTF-8"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://example.com/"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Elements")]),t._v(" links "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a[href]"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//带有href属性的a元素")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Elements")]),t._v(" pngs "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"img[src$=.png]"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//扩展名为.png的图片")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Element")]),t._v(" masthead "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"div.masthead"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//class等于masthead的div标签")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Elements")]),t._v(" resultLinks "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"h3.r > a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//在h3元素之后的a元素")]),t._v("\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[t._v("jsoup elements 对象支持类似于"),s("a",{attrs:{href:"http://www.w3.org/TR/2009/PR-css3-selectors-20091215/",target:"_blank",rel:"noopener noreferrer"}},[t._v("CSS"),s("OutboundLink")],1),t._v(" (或"),s("a",{attrs:{href:"http://jquery.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("jquery"),s("OutboundLink")],1),t._v(")的选择器语法,来实现非常强大和灵活的查找功能。.")]),t._v(" "),s("p",[t._v("这个"),s("code",[t._v("select")]),t._v(" 方法在"),s("code",[t._v("Document")]),t._v(", "),s("code",[t._v("Element")]),t._v(",或"),s("code",[t._v("Elements")]),t._v("对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。")]),t._v(" "),s("p",[t._v("Select 方法将返回一个"),s("code",[t._v("Elements")]),t._v("集合,并提供一组方法来抽取和处理结果。")])]),t._v(" "),s("h4",{attrs:{id:"selector-选择器概述"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#selector-选择器概述"}},[t._v("#")]),t._v(" Selector 选择器概述")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("tagname")]),t._v(": 通过标签查找元素,比如:"),s("code",[t._v("a")])]),t._v(" "),s("li",[s("code",[t._v("ns|tag")]),t._v(": 通过标签在命名空间查找元素,比如:可以用 "),s("code",[t._v("fb|name")]),t._v(" 语法来查找 `` 元素")]),t._v(" "),s("li",[s("code",[t._v("#id")]),t._v(": 通过 ID 查找元素,比如:"),s("code",[t._v("#logo")])]),t._v(" "),s("li",[s("code",[t._v(".class")]),t._v(": 通过 class 名称查找元素,比如:"),s("code",[t._v(".masthead")])]),t._v(" "),s("li",[s("code",[t._v("[attribute]")]),t._v(": 利用属性查找元素,比如:"),s("code",[t._v("[href]")])]),t._v(" "),s("li",[s("code",[t._v("[^attr]")]),t._v(": 利用属性名前缀来查找元素,比如:可以用"),s("code",[t._v("[^data-]")]),t._v(" 来查找带有 HTML5 Dataset 属性的元素")]),t._v(" "),s("li",[s("code",[t._v("[attr=value]")]),t._v(": 利用属性值来查找元素,比如:"),s("code",[t._v("[width=500]")])]),t._v(" "),s("li",[s("code",[t._v("[attr^=value]")]),t._v(", "),s("code",[t._v("[attr$=value]")]),t._v(", "),s("code",[t._v("[attr*=value]")]),t._v(": 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:"),s("code",[t._v("[href*=/path/]")])]),t._v(" "),s("li",[s("code",[t._v("[attr\\~=regex]")]),t._v(": 利用属性值匹配正则表达式来查找元素,比如: "),s("code",[t._v("img[src\\~=(?i)\\.(png|jpe?g)]")])]),t._v(" "),s("li",[s("code",[t._v("*")]),t._v(": 这个符号将匹配所有元素")])]),t._v(" "),s("h4",{attrs:{id:"selector-选择器组合使用"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#selector-选择器组合使用"}},[t._v("#")]),t._v(" Selector 选择器组合使用")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("el##id")]),t._v(": 元素+ID,比如: "),s("code",[t._v("div##logo")])]),t._v(" "),s("li",[s("code",[t._v("el.class")]),t._v(": 元素+class,比如: "),s("code",[t._v("div.masthead")])]),t._v(" "),s("li",[s("code",[t._v("el[attr]")]),t._v(": 元素+class,比如: "),s("code",[t._v("a[href]")])]),t._v(" "),s("li",[t._v("任意组合,比如:"),s("code",[t._v("a[href].highlight")])]),t._v(" "),s("li",[s("code",[t._v("ancestor child")]),t._v(": 查找某个元素下子元素,比如:可以用"),s("code",[t._v(".body p")]),t._v(' 查找在"body"元素下的所有'),s("code",[t._v("p")]),t._v("元素")]),t._v(" "),s("li",[s("code",[t._v("parent > child")]),t._v(": 查找某个父元素下的直接子元素,比如:可以用"),s("code",[t._v("div.content > p")]),t._v(" 查找 "),s("code",[t._v("p")]),t._v(" 元素,也可以用"),s("code",[t._v("body > *")]),t._v(" 查找 body 标签下所有直接子元素")]),t._v(" "),s("li",[s("code",[t._v("siblingA + siblingB")]),t._v(": 查找在 A 元素之前第一个同级元素 B,比如:"),s("code",[t._v("div.head + div")])]),t._v(" "),s("li",[s("code",[t._v("siblingA \\~ siblingX")]),t._v(": 查找 A 元素之前的同级 X 元素,比如:"),s("code",[t._v("h1 \\~ p")])]),t._v(" "),s("li",[s("code",[t._v("el, el, el")]),t._v(":多个选择器组合,查找匹配任一选择器的唯一元素,例如:"),s("code",[t._v("div.masthead, div.logo")])])]),t._v(" "),s("h4",{attrs:{id:"伪选择器-selectors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#伪选择器-selectors"}},[t._v("#")]),t._v(" 伪选择器 selectors")]),t._v(" "),s("ul",[s("li",[s("code",[t._v(":lt(n)")]),t._v(": 查找哪些元素的同级索引值(它的位置在 DOM 树中是相对于它的父节点)小于 n,比如:"),s("code",[t._v("td:lt(3)")]),t._v(" 表示小于三列的元素")]),t._v(" "),s("li",[s("code",[t._v(":gt(n)")]),t._v(":查找哪些元素的同级索引值大于"),s("code",[t._v("n``,比如")]),t._v(": "),s("code",[t._v("div p:gt(2)")]),t._v("表示哪些 div 中有包含 2 个以上的 p 元素")]),t._v(" "),s("li",[s("code",[t._v(":eq(n)")]),t._v(": 查找哪些元素的同级索引值与"),s("code",[t._v("n")]),t._v("相等,比如:"),s("code",[t._v("form input:eq(1)")]),t._v("表示包含一个 input 标签的 Form 元素")]),t._v(" "),s("li",[s("code",[t._v(":has(seletor)")]),t._v(": 查找匹配选择器包含元素的元素,比如:"),s("code",[t._v("div:has(p)")]),t._v("表示哪些 div 包含了 p 元素")]),t._v(" "),s("li",[s("code",[t._v(":not(selector)")]),t._v(": 查找与选择器不匹配的元素,比如: "),s("code",[t._v("div:not(.logo)")]),t._v(" 表示不包含 class=logo 元素的所有 div 列表")]),t._v(" "),s("li",[s("code",[t._v(":contains(text)")]),t._v(": 查找包含给定文本的元素,搜索不区分大不写,比如: "),s("code",[t._v("p:contains(jsoup)")])]),t._v(" "),s("li",[s("code",[t._v(":containsOwn(text)")]),t._v(": 查找直接包含给定文本的元素")]),t._v(" "),s("li",[s("code",[t._v(":matches(regex)")]),t._v(": 查找哪些元素的文本匹配指定的正则表达式,比如:"),s("code",[t._v("div:matches((?i)login)")])]),t._v(" "),s("li",[s("code",[t._v(":matchesOwn(regex)")]),t._v(": 查找自身包含文本匹配指定正则表达式的元素")]),t._v(" "),s("li",[t._v("注意:上述伪选择器索引是从 0 开始的,也就是说第一个元素索引值为 0,第二个元素 index 为 1 等")])]),t._v(" "),s("p",[t._v("可以查看"),s("code",[t._v("Selector")]),t._v(" API 参考来了解更详细的内容")]),t._v(" "),s("h3",{attrs:{id:"从元素抽取属性-文本和-html"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#从元素抽取属性-文本和-html"}},[t._v("#")]),t._v(" 从元素抽取属性,文本和 HTML")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("在解析获得一个 Document 实例对象,并查找到一些元素之后,你希望取得在这些元素中的数据。")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("ul",[s("li",[t._v("要取得一个属性的值,可以使用"),s("code",[t._v("Node.attr(String key)")]),t._v(" 方法")]),t._v(" "),s("li",[t._v("对于一个元素中的文本,可以使用"),s("code",[t._v("Element.text()")]),t._v("方法")]),t._v(" "),s("li",[t._v("对于要取得元素或属性中的 HTML 内容,可以使用"),s("code",[t._v("Element.html()")]),t._v(", 或 "),s("code",[t._v("Node.outerHtml()")]),t._v("方法")])]),t._v(" "),s("p",[t._v("示例:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" html "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"
An example link.
\"")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("html"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//解析HTML字符串返回一个Document实现")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Element")]),t._v(" link "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//查找第一个a元素")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" text "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("text")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "An example link"//取得字符串中的文本')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" linkHref "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("attr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"href"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "http://example.com/"//取得链接地址')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" linkText "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("text")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "example""//取得链接地址中的文本')]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" linkOuterH "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("outerHtml")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "
example"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" linkInnerH "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("html")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "
example"//取得链接内的html内容')]),t._v("\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[t._v("上述方法是元素数据访问的核心办法。此外还其它一些方法可以使用:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("Element.id()")])]),t._v(" "),s("li",[s("code",[t._v("Element.tagName()")])]),t._v(" "),s("li",[s("code",[t._v("Element.className()")]),t._v(" and "),s("code",[t._v("Element.hasClass(String className)")])])]),t._v(" "),s("p",[t._v("这些访问器方法都有相应的 setter 方法来更改数据")])]),t._v(" "),s("p",[s("strong",[t._v("参见")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("Element")]),t._v("和"),s("code",[t._v("Elements")]),t._v("集合类的参考文档")]),t._v(" "),s("li",[s("a",{attrs:{href:"http://www.open-open.com/jsoup/working-with-urls.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("URLs 处理"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"http://www.open-open.com/jsoup/selector-syntax.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("使用 CSS 选择器语法来查找元素"),s("OutboundLink")],1)])]),t._v(" "),s("h3",{attrs:{id:"处理-urls"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#处理-urls"}},[t._v("#")]),t._v(" 处理 URLs")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("你有一个包含相对 URLs 路径的 HTML 文档,需要将这些相对路径转换成绝对路径的 URLs。")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("ol",[s("li",[t._v("在你解析文档时确保有指定"),s("code",[t._v("base URI")]),t._v(",然后")]),t._v(" "),s("li",[t._v("使用 "),s("code",[t._v("abs:")]),t._v(" 属性前缀来取得包含"),s("code",[t._v("base URI")]),t._v("的绝对路径。代码如下:")])]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Document")]),t._v(" doc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("connect")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://www.open-open.com"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Element")]),t._v(" link "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"a"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" relHref "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("attr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"href"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// == "/"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" absHref "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" link"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("attr")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abs:href"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "http://www.open-open.com/"')]),t._v("\n\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[t._v("在 HTML 元素中,URLs 经常写成相对于文档位置的相对路径: "),s("code",[t._v('
...')]),t._v(". 当你使用 "),s("code",[t._v("Node.attr(String key)")]),t._v(" 方法来取得 a 元素的 href 属性时,它将直接返回在 HTML 源码中指定定的值。")]),t._v(" "),s("p",[t._v("假如你需要取得一个绝对路径,需要在属性名前加 "),s("code",[t._v("abs:")]),t._v(" 前缀。这样就可以返回包含根路径的 URL 地址"),s("code",[t._v('attr("abs:href")')])]),t._v(" "),s("p",[t._v("因此,在解析 HTML 文档时,定义 base URI 非常重要。")]),t._v(" "),s("p",[t._v("如果你不想使用"),s("code",[t._v("abs:")]),t._v(" 前缀,还有一个方法能够实现同样的功能 "),s("code",[t._v("Node.absUrl(String key)")]),t._v("。")])]),t._v(" "),s("h2",{attrs:{id:"数据修改"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#数据修改"}},[t._v("#")]),t._v(" 数据修改")]),t._v(" "),s("h3",{attrs:{id:"设置属性的值"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#设置属性的值"}},[t._v("#")]),t._v(" 设置属性的值")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("在你解析一个 "),s("code",[t._v("Document")]),t._v(" 之后可能想修改其中的某些属性值,然后再保存到磁盘或都输出到前台页面。")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("p",[t._v("可以使用属性设置方法 "),s("code",[t._v("Element.attr(String key, String value)")]),t._v(", 和 "),s("code",[t._v("Elements.attr(String key, String value)")]),t._v(".")]),t._v(" "),s("p",[t._v("假如你需要修改一个元素的 "),s("code",[t._v("class")]),t._v(" 属性,可以使用 "),s("code",[t._v("Element.addClass(String className)")]),t._v(" 和"),s("code",[t._v("Element.removeClass(String className)")]),t._v(" 方法。")]),t._v(" "),s("p",[s("code",[t._v("Elements")]),t._v(" 提供了批量操作元素属性和 class 的方法,比如:要为 div 中的每一个 a 元素都添加一个"),s("code",[t._v('rel="nofollow"')]),t._v(" 可以使用如下方法:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('doc.select("div.comments a").attr("rel", "nofollow");\n\n')])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[t._v("与"),s("code",[t._v("Element")]),t._v("中的其它方法一样,"),s("code",[t._v("attr")]),t._v(" 方法也是返回当 "),s("code",[t._v("Element")]),t._v(" (或在使用选择器是返回 "),s("code",[t._v("Elements")]),t._v("集合)。这样能够很方便使用方法连用的书写方式。比如:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");\n')])])])]),t._v(" "),s("h3",{attrs:{id:"设置一个元素的-html-内容"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#设置一个元素的-html-内容"}},[t._v("#")]),t._v(" 设置一个元素的 HTML 内容")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("你需要一个元素中的 HTML 内容")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("p",[t._v("可以使用"),s("code",[t._v("Element")]),t._v("中的 HTML 设置方法具体如下:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Element")]),t._v(" div "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"div"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//
")]),t._v("\ndiv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("html")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"
lorem ipsum
"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//
")]),t._v("\ndiv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("prepend")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"
First
"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//在div前添加html内容")]),t._v("\ndiv"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("append")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"
Last
"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//在div之后添加html内容")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 添完后的结果:
")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Element")]),t._v(" span "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" doc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("select")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"span"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("first")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//
One")]),t._v("\nspan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wrap")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"
\"")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// 添完后的结果:
One')]),t._v("\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("ul",[s("li",[s("code",[t._v("Element.html(String html)")]),t._v(" 这个方法将先清除元素中的 HTML 内容,然后用传入的 HTML 代替。")]),t._v(" "),s("li",[s("code",[t._v("Element.prepend(String first)")]),t._v(" 和 "),s("code",[t._v("Element.append(String last)")]),t._v(" 方法用于在分别在元素内部 HTML 的前面和后面添加 HTML 内容")]),t._v(" "),s("li",[s("code",[t._v("Element.wrap(String around)")]),t._v(" 对元素包裹一个外部 HTML 内容。")])]),t._v(" "),s("p",[s("strong",[t._v("参见")])]),t._v(" "),s("p",[t._v("可以查看 API 参考文档中 "),s("code",[t._v("Element.prependElement(String tag)")]),t._v("和"),s("code",[t._v("Element.appendElement(String tag)")]),t._v(" 方法来创建新的元素并作为文档的子元素插入其中。")])]),t._v(" "),s("h3",{attrs:{id:"设置元素的文本内容"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#设置元素的文本内容"}},[t._v("#")]),t._v(" 设置元素的文本内容")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("你需要修改一个 HTML 文档中的文本内容")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("p",[t._v("可以使用"),s("code",[t._v("Element")]),t._v("的设置方法::")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('Element div = doc.select("div").first(); //
\ndiv.text("five > four"); //
five > four
\ndiv.prepend("First ");\ndiv.append(" Last");\n// now:
First five > four Last
\n')])])]),s("blockquote",[s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[t._v("文本设置方法与 "),s("a",{attrs:{href:"http://jsoup.org/cookbook/modifying-data/set-html",target:"_blank",rel:"noopener noreferrer"}},[t._v("HTML setter"),s("OutboundLink")],1),t._v(" 方法一样:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("Element.text(String text)")]),t._v(" 将清除一个元素中的内部 HTML 内容,然后提供的文本进行代替")]),t._v(" "),s("li",[s("code",[t._v("Element.prepend(String first)")]),t._v(" 和 "),s("code",[t._v("Element.append(String last)")]),t._v(" 将分别在元素的内部 html 前后添加文本节点。")])]),t._v(" "),s("p",[t._v("对于传入的文本如果含有像 "),s("code",[t._v("<")]),t._v(", "),s("code",[t._v(">")]),t._v(" 等这样的字符,将以文本处理,而非 HTML。")])]),t._v(" "),s("h2",{attrs:{id:"html-清理"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#html-清理"}},[t._v("#")]),t._v(" HTML 清理")]),t._v(" "),s("h3",{attrs:{id:"消除不受信任的-html-来防止-xss-攻击"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消除不受信任的-html-来防止-xss-攻击"}},[t._v("#")]),t._v(" 消除不受信任的 HTML (来防止 XSS 攻击)")]),t._v(" "),s("p",[s("strong",[t._v("问题")])]),t._v(" "),s("p",[t._v("在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该 HTML,以避免跨站脚本"),s("a",{attrs:{href:"http://en.wikipedia.org/wiki/Cross-site_scripting",target:"_blank",rel:"noopener noreferrer"}},[t._v("cross-site scripting"),s("OutboundLink")],1),t._v("攻击(XSS)。")]),t._v(" "),s("p",[s("strong",[t._v("方法")])]),t._v(" "),s("p",[t._v("使用 jsoup HTML "),s("code",[t._v("Cleaner")]),t._v(" 方法进行清除,但需要指定一个可配置的 "),s("code",[t._v("Whitelist")]),t._v("。")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" unsafe "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"
Link
\"")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" safe "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Jsoup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("clean")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("unsafe"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Whitelist")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("basic")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// now:
Link
')]),t._v("\n")])])]),s("p",[s("strong",[t._v("说明")])]),t._v(" "),s("p",[t._v("XSS 又叫 CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意攻击用户的特殊目的。XSS 属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。所以我们经常只让用户输入纯文本的内容,但这样用户体验就比较差了。")]),t._v(" "),s("p",[t._v("一个更好的解决方法就是使用一个富文本编辑器 WYSIWYG 如 "),s("a",{attrs:{href:"http://ckeditor.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("CKEditor"),s("OutboundLink")],1),t._v(" 和 "),s("a",{attrs:{href:"http://tinymce.moxiecode.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("TinyMCE"),s("OutboundLink")],1),t._v("。这些可以输出 HTML 并能够让用户可视化编辑。虽然他们可以在客户端进行校验,但是这样还不够安全,需要在服务器端进行校验并清除有害的 HTML 代码,这样才能确保输入到你网站的 HTML 是安全的。否则,攻击者能够绕过客户端的 Javascript 验证,并注入不安全的 HMTL 直接进入您的网站。")]),t._v(" "),s("p",[t._v("jsoup 的 whitelist 清理器能够在服务器端对用户输入的 HTML 进行过滤,只输出一些安全的标签和属性。")]),t._v(" "),s("p",[t._v("jsoup 提供了一系列的 "),s("code",[t._v("Whitelist")]),t._v(" 基本配置,能够满足大多数要求;但如有必要,也可以进行修改,不过要小心。")]),t._v(" "),s("p",[t._v("这个 cleaner 非常好用不仅可以避免 XSS 攻击,还可以限制用户可以输入的标签范围。")]),t._v(" "),s("p",[s("strong",[t._v("参见")])]),t._v(" "),s("ul",[s("li",[t._v("参阅"),s("a",{attrs:{href:"http://ha.ckers.org/xss.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("XSS cheat sheet"),s("OutboundLink")],1),t._v(" ,有一个例子可以了解为什么不能使用正则表达式,而采用安全的 whitelist parser-based 清理器才是正确的选择。")]),t._v(" "),s("li",[t._v("参阅"),s("code",[t._v("Cleaner")]),t._v(" ,了解如何返回一个 "),s("code",[t._v("Document")]),t._v(" 对象,而不是字符串")]),t._v(" "),s("li",[t._v("参阅"),s("code",[t._v("Whitelist")]),t._v(",了解如何创建一个自定义的 whitelist")]),t._v(" "),s("li",[s("a",{attrs:{href:"http://en.wikipedia.org/wiki/Nofollow",target:"_blank",rel:"noopener noreferrer"}},[t._v("nofollow"),s("OutboundLink")],1),t._v(" 链接属性了解")])]),t._v(" "),s("h2",{attrs:{id:"参考"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#参考"}},[t._v("#")]),t._v(" 参考")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/jhy/jsoup",target:"_blank",rel:"noopener noreferrer"}},[t._v("jsoup github 托管代码"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://jsoup.org/cookbook/",target:"_blank",rel:"noopener noreferrer"}},[t._v("jsoup Cookbook"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"http://www.open-open.com/jsoup/",target:"_blank",rel:"noopener noreferrer"}},[t._v("jsoup Cookbook(中文版)"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/code4craft/jsoup-learning",target:"_blank",rel:"noopener noreferrer"}},[t._v("不错的 jsoup 学习笔记"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/59.36b207a0.js b/assets/js/59.36b207a0.js
new file mode 100644
index 00000000..ab8dea33
--- /dev/null
+++ b/assets/js/59.36b207a0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{422:function(t,s,a){"use strict";a.r(s);var n=a(14),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"thumbnailator-快速入门"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#thumbnailator-快速入门"}},[t._v("#")]),t._v(" Thumbnailator 快速入门")]),t._v(" "),s("h2",{attrs:{id:"简介"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#简介"}},[t._v("#")]),t._v(" 简介")]),t._v(" "),s("p",[s("code",[t._v("Thumbnailator")]),t._v(" 是一个开源的 "),s("strong",[t._v("Java")]),t._v(" 项目,它提供了非常简单的 API 来对图片进行缩放、旋转以及加水印的处理。")]),t._v(" "),s("p",[t._v("有多简单呢?简单到一行代码就可以完成图片处理。形式如下:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"path/to/directory"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("listFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("640")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("480")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("outputFormat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Rename")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("PREFIX_DOT_THUMBNAIL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("当然,Thumbnailator 还有一些使用细节,下面我会一一道来。")]),t._v(" "),s("h2",{attrs:{id:"核心-api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#核心-api"}},[t._v("#")]),t._v(" 核心 API")]),t._v(" "),s("h3",{attrs:{id:"thumbnails"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#thumbnails"}},[t._v("#")]),t._v(" Thumbnails")]),t._v(" "),s("p",[s("code",[t._v("Thumbnails")]),t._v(" 是使用 Thumbnailator 创建缩略图的主入口。")]),t._v(" "),s("p",[t._v("它提供了一组初始化 "),s("code",[t._v("Thumbnails.Builder")]),t._v(" 的接口。")]),t._v(" "),s("p",[t._v("先看下这组接口的声明:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 可变长度参数列表")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("URL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("URL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" inputStreams"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v(" images"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 迭代器(所有实现 Iterable 接口的 Java 对象都可以,当然也包括 List、Set)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromFilenames")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" files"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("URL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromURLs")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("URL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" urls"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromInputStreams")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InputStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" inputStreams"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fromImages")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" images"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("很显然,"),s("strong",[t._v("Thumbnails 允许通过传入文件名、文件、网络图的 URL、图片流、图片缓存多种方式来初始化构造器")]),t._v("。")]),t._v(" "),s("p",[t._v("因此,你可以根据实际需求来灵活的选择图片的输入方式。")]),t._v(" "),s("p",[t._v("需要注意一点:"),s("strong",[t._v("如果输入是多个对象(无论你是直接输入容器对象或使用可变参数方式传入多个对象),则输出也必须选用输出多个对象的方式,否则会报异常。")])]),t._v(" "),s("h3",{attrs:{id:"thumbnails-builder"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#thumbnails-builder"}},[t._v("#")]),t._v(" Thumbnails.Builder")]),t._v(" "),s("p",[s("code",[t._v("Thumbnails.Builder")]),t._v(" 是 "),s("code",[t._v("Thumbnails")]),t._v(" 的内部静态类。它用于设置生成缩略图任务的相关参数。")]),t._v(" "),s("p",[s("strong",[s("em",[t._v("注:"),s("code",[t._v("Thumbnails.Builder")]),t._v(" 的构造函数是私有函数。所以,它只允许通过 "),s("code",[t._v("Thumbnails")]),t._v(" 的实例化函数来进行初始化。")])])]),t._v(" "),s("h4",{attrs:{id:"设置参数的函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#设置参数的函数"}},[t._v("#")]),t._v(" 设置参数的函数")]),t._v(" "),s("p",[s("code",[t._v("Thumbnails.Builder")]),t._v(" 提供了一组函数链形式的接口来设置缩放图参数。")]),t._v(" "),s("p",[t._v("以设置大小函数为例:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Builder")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("T")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" width"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")]),t._v(" height"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("updateStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Properties")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SIZE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("ALREADY_SET")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("updateStatus")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Properties")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("SCALE")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("CANNOT_SET")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("validateDimensions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("width"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" height"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("width "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" width"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("height "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" height"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("通过返回 this 指针,使得设置参数函数可以以链式调用的方式来使用,形式如下:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"original.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("160")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("160")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rotate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("90")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("watermark")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Positions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BOTTOM_RIGHT")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ImageIO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"watermark.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("outputQuality")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"image-with-watermark.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("好处,不言自明:那就是大大简化了代码。")]),t._v(" "),s("h4",{attrs:{id:"输出函数"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#输出函数"}},[t._v("#")]),t._v(" 输出函数")]),t._v(" "),s("p",[s("code",[t._v("Thumbnails.Builder")]),t._v(" 提供了一组重载函数来输出生成的缩放图。")]),t._v(" "),s("p",[t._v("函数声明如下:")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 返回图片缓存")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("asBufferedImages")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("asBufferedImage")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 返回文件列表")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("asFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" iterable"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("asFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Rename")]),t._v(" rename"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("asFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" destinationDir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Rename")]),t._v(" rename"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 创建文件")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" outFile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" outFilepath"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" iterable"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Rename")]),t._v(" rename"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" destinationDir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Rename")]),t._v(" rename"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 创建输出流")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toOutputStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OutputStream")]),t._v(" os"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toOutputStreams")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Iterable")]),s("span",{pre:!0,attrs:{class:"token generics"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("?")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("extends")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("OutputStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" iterable"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"工作流"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#工作流"}},[t._v("#")]),t._v(" 工作流")]),t._v(" "),s("p",[t._v("Thumbnailator 的工作步骤十分简单,可分为三步:")]),t._v(" "),s("ol",[s("li",[s("p",[s("strong",[t._v("输入")]),t._v(":"),s("code",[t._v("Thumbnails")]),t._v(" 根据输入初始化构造器—— "),s("code",[t._v("Thumbnails.Builder")]),t._v(" 。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("设置")]),t._v(":"),s("code",[t._v("Thumbnails.Builder")]),t._v(" 设置缩放图片的参数。")])]),t._v(" "),s("li",[s("p",[s("strong",[t._v("输出")]),t._v(":"),s("code",[t._v("Thumbnails.Builder")]),t._v(" 输出图片文件或图片流。")])])]),t._v(" "),s("blockquote",[s("p",[t._v("更多详情可以参考: "),s("a",{attrs:{href:"https://coobird.github.io/thumbnailator/javadoc/0.4.8/",target:"_blank",rel:"noopener noreferrer"}},[s("u",[t._v("Thumbnailator 官网 javadoc")]),s("OutboundLink")],1)])]),t._v(" "),s("h2",{attrs:{id:"实战"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#实战"}},[t._v("#")]),t._v(" 实战")]),t._v(" "),s("p",[t._v("前文介绍了 Thumbnailator 的核心 API,接下来我们就可以通过实战来看看 Thumbnailator 究竟可以做些什么。")]),t._v(" "),s("p",[t._v("Thumbnailator 生成什么样的图片,是根据设置参数来决定的。")]),t._v(" "),s("h3",{attrs:{id:"安装"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装"}},[t._v("#")]),t._v(" 安装")]),t._v(" "),s("p",[t._v("maven 项目中引入依赖:")]),t._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("net.coobird"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")]),t._v("groupId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("thumbnailator"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")]),t._v("artifactId")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("[0.4, 0.5)"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")]),t._v("version")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")]),t._v("dependency")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n")])])]),s("h3",{attrs:{id:"图片缩放"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#图片缩放"}},[t._v("#")]),t._v(" 图片缩放")]),t._v(" "),s("p",[s("code",[t._v("Thumbnails.Builder")]),t._v(" 的 "),s("code",[t._v("size")]),t._v(" 函数可以设置新图片精确的宽度和高度,也可以用 "),s("code",[t._v("scale")]),t._v(" 函数设置缩放比例。")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("size")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newFile_16_16.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newFile_scale_2.0.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newFile_scale_1.0_0.5.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("oldFile.png")])]),t._v(" "),s("p",[s("img",{attrs:{src:"http://upload-images.jianshu.io/upload_images/3101171-ba63439898602e8f.png",alt:"img"}})]),t._v(" "),s("p",[s("strong",[t._v("newFile_scale_1.0_0.5.png")])]),t._v(" "),s("p",[s("img",{attrs:{src:"http://upload-images.jianshu.io/upload_images/3101171-a01ea4515fff865d.png",alt:"img"}})]),t._v(" "),s("h3",{attrs:{id:"图片旋转"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#图片旋转"}},[t._v("#")]),t._v(" 图片旋转")]),t._v(" "),s("p",[s("code",[t._v("Thumbnails.Builder")]),t._v(" 的 "),s("code",[t._v("size")]),t._v(" 函数可以设置新图片的旋转角度。")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rotate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("90")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newFile_rotate_90.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rotate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("180")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newFile_rotate_180.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("newFile_rotate_90.png")])]),t._v(" "),s("p",[s("img",{attrs:{src:"http://upload-images.jianshu.io/upload_images/3101171-17d54bc33b38d45b.png",alt:"img"}})]),t._v(" "),s("h3",{attrs:{id:"加水印"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#加水印"}},[t._v("#")]),t._v(" 加水印")]),t._v(" "),s("p",[s("code",[t._v("Thumbnails.Builder")]),t._v(" 的 "),s("code",[t._v("watermark")]),t._v(" 函数可以为图片添加水印图片。第一个参数是水印的位置;第二个参数是水印图片的缓存数据;第三个参数是透明度。")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),t._v(" watermarkImage "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ImageIO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wartermarkFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("watermark")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Positions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BOTTOM_LEFT")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" watermarkImage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFile")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"newFile_watermark.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("wartermarkFile.png")])]),t._v(" "),s("p",[s("img",{attrs:{src:"http://upload-images.jianshu.io/upload_images/3101171-97909ee6c066c195.png?imageMogr2/auto-orient/strip",alt:"img"}})]),t._v(" "),s("p",[s("strong",[t._v("newFile_watermark.png")])]),t._v(" "),s("p",[s("img",{attrs:{src:"http://upload-images.jianshu.io/upload_images/3101171-93eb7ef71b811a0c.png",alt:"img"}})]),t._v(" "),s("h3",{attrs:{id:"批量处理图片"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#批量处理图片"}},[t._v("#")]),t._v(" 批量处理图片")]),t._v(" "),s("p",[t._v("下面以批量给图片加水印来展示一下如何处理多个图片文件。")]),t._v(" "),s("div",{staticClass:"language-java extra-class"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BufferedImage")]),t._v(" watermarkImage "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ImageIO")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("read")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"wartermarkFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),t._v(" destinationDir "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("File")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"D:\\\\watermark\\\\"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Thumbnails")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"oldFile2.png"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("scale")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("watermark")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Positions")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BOTTOM_LEFT")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" watermarkImage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("toFiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("destinationDir"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Rename")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("PREFIX_DOT_THUMBNAIL")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("blockquote",[s("p",[s("strong",[t._v("需要参考完整测试例代码请")]),t._v(" "),s("a",{attrs:{href:"https://github.com/dunwu/JavaParty/blob/master/toolbox/image/src/test/java/org/zp/image/ThumbnailatorTest.java",target:"_blank",rel:"noopener noreferrer"}},[s("u",[s("strong",[t._v("点击这里")])]),s("OutboundLink")],1)])]),t._v(" "),s("h2",{attrs:{id:"参考"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#参考"}},[t._v("#")]),t._v(" 参考")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/coobird/thumbnailator/wiki/Examples",target:"_blank",rel:"noopener noreferrer"}},[t._v("Thumbnailator 官方示例文档"),s("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/6.d144eb92.js b/assets/js/6.d144eb92.js
new file mode 100644
index 00000000..1c9c8aa7
--- /dev/null
+++ b/assets/js/6.d144eb92.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{369:function(t,e,a){"use strict";a.r(e);var s=a(14),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"javaweb-之-jsp-指南"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#javaweb-之-jsp-指南"}},[t._v("#")]),t._v(" JavaWeb 之 Jsp 指南")]),t._v(" "),e("h2",{attrs:{id:"简介"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#简介"}},[t._v("#")]),t._v(" 简介")]),t._v(" "),e("h3",{attrs:{id:"什么是-java-server-pages"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#什么是-java-server-pages"}},[t._v("#")]),t._v(" 什么是 Java Server Pages")]),t._v(" "),e("p",[e("code",[t._v("JSP")]),t._v("全称"),e("code",[t._v("Java Server Pages")]),t._v(",是一种动态网页开发技术。")]),t._v(" "),e("p",[t._v("它使用 JSP 标签在 HTML 网页中插入 Java 代码。标签通常以 "),e("code",[t._v("<%")]),t._v(" 开头以 "),e("code",[t._v("%>")]),t._v(" 结束。")]),t._v(" "),e("p",[t._v("JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。网页开发者们通过结合 HTML 代码、XHTML 代码、XML 元素以及嵌入 JSP 操作和命令来编写 JSP。")]),t._v(" "),e("p",[t._v("JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。")]),t._v(" "),e("p",[t._v("JSP 标签有多种功能,比如访问数据库、记录用户选择信息、访问 JavaBeans 组件等,还可以在不同的网页中传递控制信息和共享信息。")]),t._v(" "),e("h3",{attrs:{id:"为什么使用-jsp"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#为什么使用-jsp"}},[t._v("#")]),t._v(" 为什么使用 JSP")]),t._v(" "),e("p",[t._v("JSP 也是一种 Servlet,因此 JSP 能够完成 Servlet 能完成的任何工作。")]),t._v(" "),e("p",[t._v("JSP 程序与 CGI 程序有着相似的功能,但和 CGI 程序相比,JSP 程序有如下优势:")]),t._v(" "),e("ul",[e("li",[t._v("性能更加优越,因为 JSP 可以直接在 HTML 网页中动态嵌入元素而不需要单独引用 CGI 文件。")]),t._v(" "),e("li",[t._v("服务器调用的是已经编译好的 JSP 文件,而不像 CGI/Perl 那样必须先载入解释器和目标脚本。")]),t._v(" "),e("li",[t._v("JSP 基于 Java Servlets API,因此,JSP 拥有各种强大的企业级 Java API,包括 JDBC,JNDI,EJB,JAXP 等等。")]),t._v(" "),e("li",[t._v("JSP 页面可以与处理业务逻辑的 servlets 一起使用,这种模式被 Java servlet 模板引擎所支持。")])]),t._v(" "),e("p",[t._v("最后,JSP 是 Java EE 不可或缺的一部分,是一个完整的企业级应用平台。这意味着 JSP 可以用最简单的方式来实现最复杂的应用。")]),t._v(" "),e("h3",{attrs:{id:"jsp-的优势"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-的优势"}},[t._v("#")]),t._v(" JSP 的优势")]),t._v(" "),e("p",[t._v("以下列出了使用 JSP 带来的其他好处:")]),t._v(" "),e("ul",[e("li",[t._v("与 ASP 相比:JSP 有两大优势。首先,动态部分用 Java 编写,而不是 VB 或其他 MS 专用语言,所以更加强大与易用。第二点就是 JSP 易于移植到非 MS 平台上。")]),t._v(" "),e("li",[t._v("与纯 Servlets 相比:JSP 可以很方便的编写或者修改 HTML 网页而不用去面对大量的 println 语句。")]),t._v(" "),e("li",[t._v("与 SSI 相比:SSI 无法使用表单数据、无法进行数据库链接。")]),t._v(" "),e("li",[t._v("与 JavaScript 相比:虽然 JavaScript 可以在客户端动态生成 HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。")]),t._v(" "),e("li",[t._v("与静态 HTML 相比:静态 HTML 不包含动态信息。")])]),t._v(" "),e("h2",{attrs:{id:"jsp-工作原理"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-工作原理"}},[t._v("#")]),t._v(" JSP 工作原理")]),t._v(" "),e("p",[e("strong",[t._v("JSP 是一种 Servlet")]),t._v(",但工作方式和 Servlet 有所差别。")]),t._v(" "),e("p",[t._v("Servlet 是先将源代码编译为 class 文件后部署到服务器下的,"),e("strong",[t._v("先编译后部署")]),t._v("。")]),t._v(" "),e("p",[t._v("Jsp 是先将源代码部署到服务器再编译,"),e("strong",[t._v("先部署后编译")]),t._v("。")]),t._v(" "),e("p",[t._v("Jsp 会在客户端第一次请求 Jsp 文件时被编译为 HttpJspPage 类(Servlet 的一个子类)。该类会被服务器临时存放在服务器工作目录里。所以,第一次请求 Jsp 后,访问速度会变快就是这个道理。")]),t._v(" "),e("h3",{attrs:{id:"jsp-工作流程"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-工作流程"}},[t._v("#")]),t._v(" JSP 工作流程")]),t._v(" "),e("p",[t._v("网络服务器需要一个 JSP 引擎,也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。本教程使用内嵌 JSP 容器的 Apache 来支持 JSP 开发。")]),t._v(" "),e("p",[t._v("JSP 容器与 Web 服务器协同合作,为 JSP 的正常运行提供必要的运行环境和其他服务,并且能够正确识别专属于 JSP 网页的特殊元素。")]),t._v(" "),e("p",[t._v("下图显示了 JSP 容器和 JSP 文件在 Web 应用中所处的位置。")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/jsp-arch.jpg",alt:"img"}})]),t._v(" "),e("h4",{attrs:{id:"工作步骤"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#工作步骤"}},[t._v("#")]),t._v(" 工作步骤")]),t._v(" "),e("p",[t._v("以下步骤表明了 Web 服务器是如何使用 JSP 来创建网页的:")]),t._v(" "),e("ul",[e("li",[t._v("就像其他普通的网页一样,您的浏览器发送一个 HTTP 请求给服务器。")]),t._v(" "),e("li",[t._v("Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL 或者.jsp 文件来完成。")]),t._v(" "),e("li",[t._v("JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 servlet。这种转化只是简单地将所有模板文本改用 println()语句,并且将所有的 JSP 元素转化成 Java 代码。")]),t._v(" "),e("li",[t._v("JSP 引擎将 servlet 编译成可执行类,并且将原始请求传递给 servlet 引擎。")]),t._v(" "),e("li",[t._v("Web 服务器的某组件将会调用 servlet 引擎,然后载入并执行 servlet 类。在执行过程中,servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。")]),t._v(" "),e("li",[t._v("Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。")]),t._v(" "),e("li",[t._v("最终,Web 浏览器处理 HTTP response 中动态产生的 HTML 网页,就好像在处理静态网页一样。")])]),t._v(" "),e("p",[t._v("以上提及到的步骤可以用下图来表示:")]),t._v(" "),e("p",[t._v("一般情况下,JSP 引擎会检查 JSP 文件对应的 servlet 是否已经存在,并且检查 JSP 文件的修改日期是否早于 servlet。如果 JSP 文件的修改日期早于对应的 servlet,那么容器就可以确定 JSP 文件没有被修改过并且 servlet 有效。这使得整个流程与其他脚本语言(比如 PHP)相比要高效快捷一些。")]),t._v(" "),e("h3",{attrs:{id:"jsp-生命周期"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-生命周期"}},[t._v("#")]),t._v(" JSP 生命周期")]),t._v(" "),e("p",[t._v("理解 JSP 底层功能的关键就是去理解它们所遵守的生命周期。")]),t._v(" "),e("p",[t._v("JSP 生命周期就是从创建到销毁的整个过程,类似于 servlet 生命周期,区别在于 JSP 生命周期还包括将 JSP 文件编译成 servlet。")]),t._v(" "),e("p",[t._v("以下是 JSP 生命周期中所走过的几个阶段:")]),t._v(" "),e("ul",[e("li",[t._v("**编译阶段:**servlet 容器编译 servlet 源文件,生成 servlet 类")]),t._v(" "),e("li",[t._v("**初始化阶段:**加载与 JSP 对应的 servlet 类,创建其实例,并调用它的初始化方法")]),t._v(" "),e("li",[t._v("**执行阶段:**调用与 JSP 对应的 servlet 实例的服务方法")]),t._v(" "),e("li",[t._v("**销毁阶段:**调用与 JSP 对应的 servlet 实例的销毁方法,然后销毁 servlet 实例")])]),t._v(" "),e("p",[t._v("很明显,JSP 生命周期的四个主要阶段和 servlet 生命周期非常相似,下面给出图示:")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/jsp_life_cycle.jpg",alt:"img"}})]),t._v(" "),e("h4",{attrs:{id:"jsp-编译"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-编译"}},[t._v("#")]),t._v(" JSP 编译")]),t._v(" "),e("p",[t._v("当浏览器请求 JSP 页面时,JSP 引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个 JSP 文件。")]),t._v(" "),e("p",[t._v("编译的过程包括三个步骤:")]),t._v(" "),e("ul",[e("li",[t._v("解析 JSP 文件。")]),t._v(" "),e("li",[t._v("将 JSP 文件转为 servlet。")]),t._v(" "),e("li",[t._v("编译 servlet。")])]),t._v(" "),e("h4",{attrs:{id:"jsp-初始化"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-初始化"}},[t._v("#")]),t._v(" JSP 初始化")]),t._v(" "),e("p",[t._v("容器载入 JSP 文件后,它会在为请求提供任何服务前调用 jspInit()方法。如果您需要执行自定义的 JSP 初始化任务,复写 jspInit()方法就行了,就像下面这样:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("jspInit")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 初始化代码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("一般来讲程序只初始化一次,servlet 也是如此。通常情况下您可以在 jspInit()方法中初始化数据库连接、打开文件和创建查询表。")]),t._v(" "),e("h4",{attrs:{id:"jsp-执行"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-执行"}},[t._v("#")]),t._v(" JSP 执行")]),t._v(" "),e("p",[t._v("这一阶段描述了 JSP 生命周期中一切与请求相关的交互行为,直到被销毁。")]),t._v(" "),e("p",[t._v("当 JSP 网页完成初始化后,JSP 引擎将会调用 "),e("code",[t._v("_jspService()")]),t._v(" 方法。")]),t._v(" "),e("p",[e("code",[t._v("_jspService()")]),t._v(" 方法需要一个 HttpServletRequest 对象和一个 HttpServletResponse 对象作为它的参数,就像下面这样:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("_jspService")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HttpServletRequest")]),t._v(" request"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HttpServletResponse")]),t._v(" response"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 服务端处理代码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[e("code",[t._v("_jspService()")]),t._v(" 方法在每个 request 中被调用一次并且负责产生与之相对应的 response,并且它还负责产生所有 7 个 HTTP 方法的回应,比如 GET、POST、DELETE 等等。")]),t._v(" "),e("h4",{attrs:{id:"jsp-清理"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-清理"}},[t._v("#")]),t._v(" JSP 清理")]),t._v(" "),e("p",[t._v("JSP 生命周期的销毁阶段描述了当一个 JSP 网页从容器中被移除时所发生的一切。")]),t._v(" "),e("p",[t._v("jspDestroy()方法在 JSP 中等价于 servlet 中的销毁方法。当您需要执行任何清理工作时复写 jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。")]),t._v(" "),e("p",[t._v("jspDestroy()方法的格式如下:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("jspDestroy")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 清理代码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("h2",{attrs:{id:"语法"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#语法"}},[t._v("#")]),t._v(" 语法")]),t._v(" "),e("h3",{attrs:{id:"脚本"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#脚本"}},[t._v("#")]),t._v(" 脚本")]),t._v(" "),e("p",[t._v("脚本程序可以包含任意量的 Java 语句、变量、方法或表达式,只要它们在脚本语言中是有效的。")]),t._v(" "),e("p",[t._v("脚本程序的语法格式:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("<% 代码片段 %>\n")])])]),e("p",[t._v("或者,您也可以编写与其等价的 XML 语句,就像下面这样:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("
\n 代码片段\n\n")])])]),e("p",[t._v("任何文本、HTML 标签、JSP 元素必须写在脚本程序的外面。")]),t._v(" "),e("p",[t._v("下面给出一个示例,同时也是本教程的第一个 JSP 示例:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n \n
Hello World\n \n \n Hello World!
\n <% out.println("Your IP address is " + request.getRemoteAddr()); %>\n \n\n')])])]),e("p",[t._v("**注意:**请确保 Apache Tomcat 已经安装在 C:\\apache-tomcat-7.0.2 目录下并且运行环境已经正确设置。")]),t._v(" "),e("p",[t._v("将以上代码保存在 hello.jsp 中,然后将它放置在 C:\\apache-tomcat-7.0.2\\webapps\\ROOT 目录下,打开浏览器并在地址栏中输入 "),e("code",[t._v("http://localhost:8080/hello.jsp")]),t._v(" 。运行后得到以下结果:")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/jsp_hello_world.jpg",alt:"img"}})]),t._v(" "),e("h4",{attrs:{id:"中文编码问题"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#中文编码问题"}},[t._v("#")]),t._v(" 中文编码问题")]),t._v(" "),e("p",[t._v("如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码:"),e("code",[t._v("<>")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n')])])]),e("p",[t._v("接下来我们将以上程序修改为:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n\n \n
\n
菜鸟教程(runoob.com)\n \n \n Hello World!
\n <% out.println("你的 IP 地址 " + request.getRemoteAddr()); %>\n \n\n')])])]),e("p",[t._v("这样中文就可以正常显示了。")]),t._v(" "),e("h3",{attrs:{id:"jsp-声明"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-声明"}},[t._v("#")]),t._v(" JSP 声明")]),t._v(" "),e("p",[t._v("一个声明语句可以声明一个或多个变量、方法,供后面的 Java 代码使用。在 JSP 文件中,您必须先声明这些变量和方法然后才能使用它们。")]),t._v(" "),e("p",[t._v("JSP 声明的语法格式:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("<%! declaration; [ declaration; ]+ ... %>\n")])])]),e("p",[t._v("或者,您也可以编写与其等价的 XML 语句,就像下面这样:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("
\n 代码片段\n\n")])])]),e("p",[t._v("程序示例:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("<%! int i = 0; %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %>\n")])])]),e("h3",{attrs:{id:"jsp-表达式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-表达式"}},[t._v("#")]),t._v(" JSP 表达式")]),t._v(" "),e("p",[t._v("一个 JSP 表达式中包含的脚本语言表达式,先被转化成 String,然后插入到表达式出现的地方。")]),t._v(" "),e("p",[t._v("由于表达式的值会被转化成 String,所以您可以在一个文本行中使用表达式而不用去管它是否是 HTML 标签。")]),t._v(" "),e("p",[t._v("表达式元素中可以包含任何符合 Java 语言规范的表达式,但是不能使用分号来结束表达式。")]),t._v(" "),e("p",[t._v("JSP 表达式的语法格式:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("<%= 表达式 %>\n")])])]),e("p",[t._v("同样,您也可以编写与之等价的 XML 语句:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("
\n 表达式\n\n")])])]),e("p",[t._v("程序示例:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n\n \n
\n
菜鸟教程(runoob.com)\n \n \n
\n 今天的日期是: <%= (new java.util.Date()).toLocaleString()%>\n
\n \n\n')])])]),e("p",[t._v("运行后得到以下结果:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("今天的日期是: 2016-6-25 13:40:07\n")])])]),e("hr"),t._v(" "),e("h3",{attrs:{id:"jsp-注释"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-注释"}},[t._v("#")]),t._v(" JSP 注释")]),t._v(" "),e("p",[t._v("JSP 注释主要有两个作用:为代码作注释以及将某段代码注释掉。")]),t._v(" "),e("p",[t._v("JSP 注释的语法格式:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n\n \n
\n
JSP注释示例\n \n \n <%-- 该部分注释在网页中不会被显示--%>\n
\n 今天的日期是: <%= (new java.util.Date()).toLocaleString()%>\n
\n \n\n')])])]),e("p",[t._v("运行后得到以下结果:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("今天的日期是: 2016-6-25 13:41:26\n")])])]),e("p",[t._v("不同情况下使用注释的语法规则:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[e("strong",[t._v("语法")])]),t._v(" "),e("th",[t._v("描述")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[e("code",[t._v("<%-- 注释 --%>")])]),t._v(" "),e("td",[t._v("JSP 注释,注释内容不会被发送至浏览器甚至不会被编译")])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("\x3c!-- 注释 --\x3e")])]),t._v(" "),e("td",[t._v("HTML 注释,通过浏览器查看网页源代码时可以看见注释内容")])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("<%")])]),t._v(" "),e("td",[t._v("代表静态 "),e("code",[t._v("<%")]),t._v(" 常量")])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("%>")])]),t._v(" "),e("td",[t._v("代表静态 "),e("code",[t._v("%>")]),t._v(" 常量")])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("'")])]),t._v(" "),e("td",[t._v("在属性中使用的单引号")])]),t._v(" "),e("tr",[e("td",[e("code",[t._v('"')])]),t._v(" "),e("td",[t._v("在属性中使用的双引号")])])])]),t._v(" "),e("h3",{attrs:{id:"控制语句"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#控制语句"}},[t._v("#")]),t._v(" 控制语句")]),t._v(" "),e("p",[t._v("JSP 提供对 Java 语言的全面支持。您可以在 JSP 程序中使用 Java API 甚至建立 Java 代码块,包括判断语句和循环语句等等。")]),t._v(" "),e("h4",{attrs:{id:"if-else-语句"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#if-else-语句"}},[t._v("#")]),t._v(" if…else 语句")]),t._v(" "),e("p",[e("code",[t._v("If…else")]),t._v("块,请看下面这个例子:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%> <%! int day = 1; %>\n\n\n \n
\n
02.JSP语法 - if...else示例\n \n \n
IF...ELSE 实例
\n <% if (day == 1 | day == 7) { %>\n
今天是周末
\n <% } else { %>\n
今天不是周末
\n <% } %>\n \n\n')])])]),e("p",[t._v("运行后得到以下结果:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("IF...ELSE 实例\n今天不是周末\n")])])]),e("h4",{attrs:{id:"switch-case-语句"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#switch-case-语句"}},[t._v("#")]),t._v(" switch…case 语句")]),t._v(" "),e("p",[t._v("现在来看看 switch…case 块,与 if…else 块有很大的不同,它使用 out.println(),并且整个都装在脚本程序的标签中,就像下面这样:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%> <%! int day = 3; %>\n\n\n \n
\n
02.JSP语法 - switch...case示例\n \n \n
Sswitch...case示例
\n <% switch(day) { case 0: out.println("星期天"); break; case 1:\n out.println("星期一"); break; case 2: out.println("星期二"); break; case 3:\n out.println("星期三"); break; case 4: out.println("星期四"); break; case 5:\n out.println("星期五"); break; default: out.println("星期六"); } %>\n \n\n')])])]),e("p",[t._v("浏览器访问,运行后得出以下结果:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("SWITCH...CASE 实例\n\n星期三\n")])])]),e("h4",{attrs:{id:"循环语句"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#循环语句"}},[t._v("#")]),t._v(" 循环语句")]),t._v(" "),e("p",[t._v("在 JSP 程序中可以使用 Java 的三个基本循环类型:for,while,和 do…while。")]),t._v(" "),e("p",[t._v('让我们来看看 for 循环的例子,以下输出的不同字体大小的"菜鸟教程":')]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%> <%! int fontSize; %>\n\n\n \n
\n
菜鸟教程(runoob.com)\n \n \n
For 循环实例
\n <%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>\n
\n 菜鸟教程 \n <%}%>\n \n\n')])])]),e("p",[t._v("运行后得到以下结果:")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/7B4B85CF-FE4B-43CB-AAFF-F8594AD4342C.jpg",alt:"img"}})]),t._v(" "),e("p",[t._v("将上例改用 while 循环来写:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%> <%! int fontSize; %>\n\n\n \n
\n
菜鸟教程(runoob.com)\n \n \n
While 循环实例
\n <%while ( fontSize <= 3){ %>\n
\n 菜鸟教程 \n <%fontSize++;%> <%}%>\n \n\n')])])]),e("p",[t._v("浏览器访问,输出结果为(fontSize 初始化为 0,所以多输出了一行):")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/4F744CC9-E484-45BA-AF18-27AFCF4AD45C.jpg",alt:"img"}})]),t._v(" "),e("p",[t._v("JSP 运算符")]),t._v(" "),e("p",[t._v("JSP 支持所有 Java 逻辑和算术运算符。")]),t._v(" "),e("p",[t._v("下表罗列出了 JSP 常见运算符,优先级从高到底:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[e("strong",[t._v("类别")])]),t._v(" "),e("th",[e("strong",[t._v("操作符")])]),t._v(" "),e("th",[e("strong",[t._v("结合性")])])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("后缀")]),t._v(" "),e("td",[e("code",[t._v("() [] .")]),t._v(" (点运算符)")]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("一元")]),t._v(" "),e("td",[e("code",[t._v("++ - - ! ~")])]),t._v(" "),e("td",[t._v("右到左")])]),t._v(" "),e("tr",[e("td",[t._v("可乘性")]),t._v(" "),e("td",[e("code",[t._v("* / %")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("可加性")]),t._v(" "),e("td",[e("code",[t._v("+ -")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("移位")]),t._v(" "),e("td",[e("code",[t._v(">> >>> <<")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("关系")]),t._v(" "),e("td",[e("code",[t._v("> >= < <=")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("相等/不等")]),t._v(" "),e("td",[e("code",[t._v("== !=")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("位与")]),t._v(" "),e("td",[e("code",[t._v("&")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("位异或")]),t._v(" "),e("td",[e("code",[t._v("^")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("位或")]),t._v(" "),e("td",[e("code",[t._v("|")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("逻辑与")]),t._v(" "),e("td",[e("code",[t._v("&&")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("逻辑或")]),t._v(" "),e("td",[e("code",[t._v("| |")])]),t._v(" "),e("td",[t._v("左到右")])]),t._v(" "),e("tr",[e("td",[t._v("条件判断")]),t._v(" "),e("td",[e("code",[t._v("?:")])]),t._v(" "),e("td",[t._v("右到左")])]),t._v(" "),e("tr",[e("td",[t._v("赋值")]),t._v(" "),e("td",[e("code",[t._v("= += -= \\*= /= %= >>= <<= &= ^= | =")])]),t._v(" "),e("td",[t._v("右到左")])]),t._v(" "),e("tr",[e("td",[t._v("逗号")]),t._v(" "),e("td",[e("code",[t._v(",")])]),t._v(" "),e("td",[t._v("左到右")])])])]),t._v(" "),e("h3",{attrs:{id:"jsp-字面量"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-字面量"}},[t._v("#")]),t._v(" JSP 字面量")]),t._v(" "),e("p",[t._v("JSP 语言定义了以下几个字面量:")]),t._v(" "),e("ul",[e("li",[t._v("布尔值(boolean):true 和 false;")]),t._v(" "),e("li",[t._v("整型(int):与 Java 中的一样;")]),t._v(" "),e("li",[t._v("浮点型(float):与 Java 中的一样;")]),t._v(" "),e("li",[t._v("字符串(string):以单引号或双引号开始和结束;")]),t._v(" "),e("li",[t._v("Null:null。")])]),t._v(" "),e("h2",{attrs:{id:"指令"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#指令"}},[t._v("#")]),t._v(" 指令")]),t._v(" "),e("p",[t._v("JSP 指令用来设置整个 JSP 页面相关的属性,如网页的编码方式和脚本语言。")]),t._v(" "),e("p",[t._v("JSP 指令以开"),e("code",[t._v("<%@")]),t._v("开始,以"),e("code",[t._v("%>")]),t._v("结束。")]),t._v(" "),e("p",[t._v("JSP 指令语法格式如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ directive attribute="value" %>\n')])])]),e("p",[t._v("指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。")]),t._v(" "),e("p",[t._v("JSP 中的三种指令标签:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[e("strong",[t._v("指令")])]),t._v(" "),e("th",[e("strong",[t._v("描述")])])])]),t._v(" "),e("tbody",[e("tr",[e("td",[e("code",[t._v("<%@ page ... %>")])]),t._v(" "),e("td",[t._v("定义网页依赖属性,比如脚本语言、error 页面、缓存需求等等")])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("<%@ include ... %>")])]),t._v(" "),e("td",[t._v("包含其他文件")])]),t._v(" "),e("tr",[e("td",[e("code",[t._v("<%@ taglib ... %>")])]),t._v(" "),e("td",[t._v("引入标签库的定义,可以是自定义标签")])])])]),t._v(" "),e("h3",{attrs:{id:"page-指令"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#page-指令"}},[t._v("#")]),t._v(" Page 指令")]),t._v(" "),e("p",[t._v("Page 指令为容器提供当前页面的使用说明。一个 JSP 页面可以包含多个"),e("code",[t._v("page")]),t._v("指令。")]),t._v(" "),e("p",[t._v("Page 指令的语法格式:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page attribute="value" %>\n')])])]),e("p",[t._v("等价的 XML 格式:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('
\n')])])]),e("p",[t._v("例:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8" %>\n')])])]),e("h4",{attrs:{id:"属性"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#属性"}},[t._v("#")]),t._v(" 属性")]),t._v(" "),e("p",[t._v("下表列出与 Page 指令相关的属性:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[e("strong",[t._v("属性")])]),t._v(" "),e("th",[e("strong",[t._v("描述")])])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("buffer")]),t._v(" "),e("td",[t._v("指定 out 对象使用缓冲区的大小")])]),t._v(" "),e("tr",[e("td",[t._v("autoFlush")]),t._v(" "),e("td",[t._v("控制 out 对象的 缓存区")])]),t._v(" "),e("tr",[e("td",[t._v("contentType")]),t._v(" "),e("td",[t._v("指定当前 JSP 页面的 MIME 类型和字符编码")])]),t._v(" "),e("tr",[e("td",[t._v("errorPage")]),t._v(" "),e("td",[t._v("指定当 JSP 页面发生异常时需要转向的错误处理页面")])]),t._v(" "),e("tr",[e("td",[t._v("isErrorPage")]),t._v(" "),e("td",[t._v("指定当前页面是否可以作为另一个 JSP 页面的错误处理页面")])]),t._v(" "),e("tr",[e("td",[t._v("extends")]),t._v(" "),e("td",[t._v("指定 servlet 从哪一个类继承")])]),t._v(" "),e("tr",[e("td",[t._v("import")]),t._v(" "),e("td",[t._v("导入要使用的 Java 类")])]),t._v(" "),e("tr",[e("td",[t._v("info")]),t._v(" "),e("td",[t._v("定义 JSP 页面的描述信息")])]),t._v(" "),e("tr",[e("td",[t._v("isThreadSafe")]),t._v(" "),e("td",[t._v("指定对 JSP 页面的访问是否为线程安全")])]),t._v(" "),e("tr",[e("td",[t._v("language")]),t._v(" "),e("td",[t._v("定义 JSP 页面所用的脚本语言,默认是 Java")])]),t._v(" "),e("tr",[e("td",[t._v("session")]),t._v(" "),e("td",[t._v("指定 JSP 页面是否使用 session")])]),t._v(" "),e("tr",[e("td",[t._v("isELIgnored")]),t._v(" "),e("td",[t._v("指定是否执行 EL 表达式")])]),t._v(" "),e("tr",[e("td",[t._v("isScriptingEnabled")]),t._v(" "),e("td",[t._v("确定脚本元素能否被使用")])])])]),t._v(" "),e("h3",{attrs:{id:"include-指令"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#include-指令"}},[t._v("#")]),t._v(" Include 指令")]),t._v(" "),e("p",[t._v("JSP 可以通过"),e("code",[t._v("include")]),t._v("指令来包含其他文件。")]),t._v(" "),e("p",[t._v("被包含的文件可以是 JSP 文件、HTML 文件或文本文件。包含的文件就好像是该 JSP 文件的一部分,会被同时编译执行。")]),t._v(" "),e("p",[t._v("Include 指令的语法格式如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ include file="文件相对 url 地址" %>\n')])])]),e("p",[e("strong",[t._v("include")]),t._v(" 指令中的文件名实际上是一个相对的 URL 地址。")]),t._v(" "),e("p",[t._v("如果您没有给文件关联一个路径,JSP 编译器默认在当前路径下寻找。")]),t._v(" "),e("p",[t._v("等价的 XML 语法:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('
\n')])])]),e("h3",{attrs:{id:"taglib-指令"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#taglib-指令"}},[t._v("#")]),t._v(" Taglib 指令")]),t._v(" "),e("p",[t._v("JSP 允许用户自定义标签,一个自定义标签库就是自定义标签的集合。")]),t._v(" "),e("p",[e("code",[t._v("taglib")]),t._v("指令引入一个自定义标签集合的定义,包括库路径、自定义标签。")]),t._v(" "),e("p",[e("code",[t._v("taglib")]),t._v("指令的语法:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ taglib uri="uri" prefix="prefixOfTag" %>\n')])])]),e("p",[t._v("uri 属性确定标签库的位置,prefix 属性指定标签库的前缀。")]),t._v(" "),e("p",[t._v("等价的 XML 语法:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('
\n')])])]),e("h2",{attrs:{id:"jsp-动作元素"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-动作元素"}},[t._v("#")]),t._v(" JSP 动作元素")]),t._v(" "),e("p",[t._v("JSP 动作元素是一组 JSP 内置的标签,只需要书写很少的标记代码就能使用 JSP 提供的丰富功能。JSP 动作元素是对常用的 JSP 功能的抽象与封装,包括两种,自定义 JSP 动作元素与标准 JSP 动作元素。")]),t._v(" "),e("p",[t._v("与 JSP 指令元素不同的是,JSP 动作元素在请求处理阶段起作用。JSP 动作元素是用 XML 语法写成的。")]),t._v(" "),e("p",[t._v("利用 JSP 动作可以动态地插入文件、重用 JavaBean 组件、把用户重定向到另外的页面、为 Java 插件生成 HTML 代码。")]),t._v(" "),e("p",[t._v("动作元素只有一种语法,它符合 XML 标准:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('
\n')])])]),e("p",[t._v("动作元素基本上都是预定义的函数,JSP 规范定义了一系列的标准动作,它用 JSP 作为前缀,可用的标准动作元素如下:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("语法")]),t._v(" "),e("th",[t._v("描述")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("jsp:include")]),t._v(" "),e("td",[t._v("在页面被请求的时候引入一个文件。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:useBean")]),t._v(" "),e("td",[t._v("寻找或者实例化一个 JavaBean。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:setProperty")]),t._v(" "),e("td",[t._v("设置 JavaBean 的属性。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:getProperty")]),t._v(" "),e("td",[t._v("输出某个 JavaBean 的属性。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:forward")]),t._v(" "),e("td",[t._v("把请求转到一个新的页面。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:plugin")]),t._v(" "),e("td",[t._v("根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:element")]),t._v(" "),e("td",[t._v("定义动态 XML 元素")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:attribute")]),t._v(" "),e("td",[t._v("设置动态定义的 XML 元素属性。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:body")]),t._v(" "),e("td",[t._v("设置动态定义的 XML 元素内容。")])]),t._v(" "),e("tr",[e("td",[t._v("jsp:text")]),t._v(" "),e("td",[t._v("在 JSP 页面和文档中使用写入文本的模板")])])])]),t._v(" "),e("h3",{attrs:{id:"常见的属性"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#常见的属性"}},[t._v("#")]),t._v(" 常见的属性")]),t._v(" "),e("p",[t._v("所有的动作要素都有两个属性:id 属性和 scope 属性。")]),t._v(" "),e("ul",[e("li",[t._v("**id 属性:**id 属性是动作元素的唯一标识,可以在 JSP 页面中引用。动作元素创建的 id 值可以通过 PageContext 来调用。")]),t._v(" "),e("li",[t._v("**scope 属性:**该属性用于识别动作元素的生命周期。 id 属性和 scope 属性有直接关系,scope 属性定义了相关联 id 对象的寿命。 scope 属性有四个可能的值: (a) page, (b)request, (c)session, 和 (d) application。")])]),t._v(" "),e("h3",{attrs:{id:"jsp-include"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-include"}},[t._v("#")]),t._v(" "),e("code",[t._v("
")])]),t._v(" "),e("p",[e("code",[t._v("")]),t._v(" 用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。")]),t._v(" "),e("p",[t._v("如果被包含的文件为 JSP 程序,则会先执行 JSP 程序,再将执行结果包含进来。")]),t._v(" "),e("p",[t._v("语法格式如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n')])])]),e("p",[t._v("前面已经介绍过 include 指令,它是在 JSP 文件被转换成 Servlet 的时候引入文件,而这里的 jsp:include 动作不同,插入文件的时间是在页面被请求的时候。")]),t._v(" "),e("p",[t._v("以下是 include 动作相关的属性列表。")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("属性")]),t._v(" "),e("th",[t._v("描述")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("page")]),t._v(" "),e("td",[t._v("包含在页面中的相对 URL 地址。")])]),t._v(" "),e("tr",[e("td",[t._v("flush")]),t._v(" "),e("td",[t._v("布尔属性,定义在包含资源前是否刷新缓存区。")])])])]),t._v(" "),e("p",[t._v("示例:")]),t._v(" "),e("p",[t._v("以下我们定义了两个文件 "),e("strong",[t._v("date.jsp")]),t._v(" 和 "),e("strong",[t._v("main.jsp")]),t._v(",代码如下所示:")]),t._v(" "),e("p",[t._v("date.jsp 文件代码:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n 今天的日期是: <%= (new java.util.Date())%>\n
\n')])])]),e("p",[t._v("main.jsp 文件代码:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n\n \n \n 菜鸟教程(runoob.com)\n \n \n include 动作实例
\n \n \n\n')])])]),e("p",[t._v("现在将以上两个文件放在服务器的根目录下,访问 main.jsp 文件。显示结果如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("include 动作实例\n\n今天的日期是: 2016-6-25 14:08:17\n")])])]),e("h3",{attrs:{id:"jsp-usebean"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-usebean"}},[t._v("#")]),t._v(" "),e("code",[t._v("")])]),t._v(" "),e("p",[e("strong",[t._v("jsp:useBean")]),t._v(" 动作用来加载一个将在 JSP 页面中使用的 JavaBean。")]),t._v(" "),e("p",[t._v("这个功能非常有用,因为它使得我们可以发挥 Java 组件复用的优势。")]),t._v(" "),e("p",[t._v("jsp:useBean 动作最简单的语法为:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n')])])]),e("p",[t._v("在类载入后,我们既可以通过 jsp:setProperty 和 jsp:getProperty 动作来修改和检索 bean 的属性。")]),t._v(" "),e("p",[t._v("以下是 useBean 动作相关的属性列表。")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("属性")]),t._v(" "),e("th",[t._v("描述")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("class")]),t._v(" "),e("td",[t._v("指定 Bean 的完整包名。")])]),t._v(" "),e("tr",[e("td",[t._v("type")]),t._v(" "),e("td",[t._v("指定将引用该对象变量的类型。")])]),t._v(" "),e("tr",[e("td",[t._v("beanName")]),t._v(" "),e("td",[t._v("通过 java.beans.Beans 的 instantiate() 方法指定 Bean 的名字。")])])])]),t._v(" "),e("p",[t._v("在给出具体实例前,让我们先来看下 jsp:setProperty 和 jsp:getProperty 动作元素:")]),t._v(" "),e("h3",{attrs:{id:"jsp-setproperty"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-setproperty"}},[t._v("#")]),t._v(" "),e("code",[t._v("")])]),t._v(" "),e("p",[t._v("jsp:setProperty 用来设置已经实例化的 Bean 对象的属性,有两种用法。首先,你可以在 jsp:useBean 元素的外面(后面)使用 jsp:setProperty,如下所示:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n...\n\n')])])]),e("p",[t._v("此时,不管 jsp:useBean 是找到了一个现有的 Bean,还是新创建了一个 Bean 实例,jsp:setProperty 都会执行。第二种用法是把 jsp:setProperty 放入 jsp:useBean 元素的内部,如下所示:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n...\n \n\n')])])]),e("p",[t._v("此时,jsp:setProperty 只有在新建 Bean 实例时才会执行,如果是使用现有实例则不执行 jsp:setProperty。")]),t._v(" "),e("p",[t._v("jsp:setProperty 动作有下面四个属性,如下表:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("属性")]),t._v(" "),e("th",[t._v("描述")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("name")]),t._v(" "),e("td",[t._v("name 属性是必需的。它表示要设置属性的是哪个 Bean。")])]),t._v(" "),e("tr",[e("td",[t._v("property")]),t._v(" "),e("td",[t._v('property 属性是必需的。它表示要设置哪个属性。有一个特殊用法:如果 property 的值是"*",表示所有名字和 Bean 属性名字匹配的请求参数都将被传递给相应的属性 set 方法。')])]),t._v(" "),e("tr",[e("td",[t._v("value")]),t._v(" "),e("td",[t._v('value 属性是可选的。该属性用来指定 Bean 属性的值。字符串数据会在目标类中通过标准的 valueOf 方法自动转换成数字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean 和 Boolean 类型的属性值(比如"true")通过 Boolean.valueOf 转换,int 和 Integer 类型的属性值(比如"42")通过 Integer.valueOf 转换。 value 和 param 不能同时使用,但可以使用其中任意一个。')])]),t._v(" "),e("tr",[e("td",[t._v("param")]),t._v(" "),e("td",[t._v("param 是可选的。它指定用哪个请求参数作为 Bean 属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把 null 传递给 Bean 属性的 set 方法。因此,你可以让 Bean 自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。")])])])]),t._v(" "),e("h3",{attrs:{id:"jsp-getproperty"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-getproperty"}},[t._v("#")]),t._v(" "),e("code",[t._v("")])]),t._v(" "),e("p",[t._v("jsp:getProperty 动作提取指定 Bean 属性的值,转换成字符串,然后输出。语法格式如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n...\n\n')])])]),e("p",[t._v("下表是与 getProperty 相关联的属性:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("属性")]),t._v(" "),e("th",[t._v("描述")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("name")]),t._v(" "),e("td",[t._v("要检索的 Bean 属性名称。Bean 必须已定义。")])]),t._v(" "),e("tr",[e("td",[t._v("property")]),t._v(" "),e("td",[t._v("表示要提取 Bean 属性的值")])])])]),t._v(" "),e("p",[t._v("实例")]),t._v(" "),e("p",[t._v("以下实例我们使用了 Bean:")]),t._v(" "),e("div",{staticClass:"language-java extra-class"},[e("pre",{pre:!0,attrs:{class:"language-java"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("package")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("com"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("runoob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("main")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TestBean")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" message "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"菜鸟教程"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("getMessage")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("setMessage")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("message "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" message"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("编译以上实例文件 TestBean.java :")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("$ javac TestBean.java\n")])])]),e("p",[t._v("编译完成后会在当前目录下生成一个 "),e("strong",[t._v("TestBean.class")]),t._v(" 文件, 将该文件拷贝至当前 JSP 项目的 "),e("strong",[t._v("WebContent/WEB-INF/classes/com/runoob/main")]),t._v(" 下( com/runoob/main 包路径,没有需要手动创建)。")]),t._v(" "),e("p",[t._v("下面是一个 Eclipse 中目录结构图:")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/6AC33FBA-0B76-4BFD-A690-E856E9E01900.jpg",alt:"img"}})]),t._v(" "),e("p",[t._v("下面是一个很简单的例子,它的功能是装载一个 Bean,然后设置/读取它的 message 属性。")]),t._v(" "),e("p",[t._v("现在让我们在 main.jsp 文件中调用该 Bean:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n\n \n \n 菜鸟教程(runoob.com)\n \n \n Jsp 使用 JavaBean 实例
\n \n\n \n\n 输出信息....
\n\n \n \n\n')])])]),e("p",[t._v("浏览器访问,执行以上文件,输出如下所示:")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/D7AD87A8-3392-4D4E-8731-18806B0644CD.jpg",alt:"img"}})]),t._v(" "),e("h3",{attrs:{id:"jsp-forward"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-forward"}},[t._v("#")]),t._v(" "),e("code",[t._v("")])]),t._v(" "),e("p",[t._v("jsp:forward 动作把请求转到另外的页面。jsp:forward 标记只有一个属性 page。语法格式如下所示:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n')])])]),e("p",[t._v("以下是 forward 相关联的属性:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("属性")]),t._v(" "),e("th",[t._v("描述")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("page")]),t._v(" "),e("td",[t._v("page 属性包含的是一个相对 URL。page 的值既可以直接给出,也可以在请求的时候动态计算,可以是一个 JSP 页面或者一个 Java Servlet.")])])])]),t._v(" "),e("p",[t._v("实例")]),t._v(" "),e("p",[t._v("以下实例我们使用了两个文件,分别是: date.jsp 和 main.jsp。")]),t._v(" "),e("p",[t._v("date.jsp 文件代码如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n 今天的日期是: <%= (new java.util.Date()).toLocaleString()%>\n
\n')])])]),e("p",[t._v("main.jsp 文件代码:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n\n \n \n 菜鸟教程(runoob.com)\n \n \n forward 动作实例
\n \n \n\n')])])]),e("p",[t._v("现在将以上两个文件放在服务器的根目录下,访问 main.jsp 文件。显示结果如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("今天的日期是: 2016-6-25 14:37:25\n")])])]),e("h3",{attrs:{id:"jsp-plugin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-plugin"}},[t._v("#")]),t._v(" "),e("code",[t._v("")])]),t._v(" "),e("p",[t._v("jsp:plugin 动作用来根据浏览器的类型,插入通过 Java 插件 运行 Java Applet 所必需的 OBJECT 或 EMBED 元素。")]),t._v(" "),e("p",[t._v("如果需要的插件不存在,它会下载插件,然后执行 Java 组件。 Java 组件可以是一个 applet 或一个 JavaBean。")]),t._v(" "),e("p",[t._v("plugin 动作有多个对应 HTML 元素的属性用于格式化 Java 组件。param 元素可用于向 Applet 或 Bean 传递参数。")]),t._v(" "),e("p",[t._v("以下是使用 plugin 动作元素的典型实例:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n \n \n\n \n Unable to initialize Java Plugin\n \n\n\n')])])]),e("p",[t._v("如果你有兴趣可以尝试使用 applet 来测试 "),e("code",[t._v("jsp:plugin")]),t._v(" 动作元素,"),e("code",[t._v("")]),t._v(" 元素是一个新元素,在组件出现故障的错误是发送给用户错误信息。")]),t._v(" "),e("h3",{attrs:{id:"jsp-element-、-jsp-attribute-、-jsp-body"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-element-、-jsp-attribute-、-jsp-body"}},[t._v("#")]),t._v(" "),e("code",[t._v("")]),t._v(" 、 "),e("code",[t._v("")]),t._v("、"),e("code",[t._v("")])]),t._v(" "),e("p",[e("code",[t._v("")]),t._v(" 、 "),e("code",[t._v("")]),t._v("、"),e("code",[t._v("")]),t._v(" 动作元素动态定义 XML 元素。动态是非常重要的,这就意味着 XML 元素在编译时是动态生成的而非静态。")]),t._v(" "),e("p",[t._v("以下实例动态定义了 XML 元素:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('<%@ page language="java" contentType="text/html; charset=UTF-8"\npageEncoding="UTF-8"%>\n\n\n \n \n 菜鸟教程(runoob.com)\n \n \n \n \n 属性值\n \n \n XML 元素的主体\n \n \n \n\n')])])]),e("p",[t._v("浏览器访问以下页面,输出结果如下所示:")]),t._v(" "),e("p",[e("img",{attrs:{src:"http://www.runoob.com/wp-content/uploads/2014/01/7D8C47F0-0DDE-4F1D-8BE1-B2C9C955683E.jpg",alt:"img"}})]),t._v(" "),e("h3",{attrs:{id:"jsp-text"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jsp-text"}},[t._v("#")]),t._v(" "),e("code",[t._v("")])]),t._v(" "),e("p",[e("a",{attrs:{href:"jsp:text"}},[t._v("jsp:text")]),t._v("动作元素允许在 JSP 页面和文档中使用写入文本的模板,语法格式如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("模板数据\n")])])]),e("p",[t._v("以上文本模板不能包含其他元素,只能只能包含文本和 EL 表达式(注:EL 表达式将在后续章节中介绍)。请注意,在 XML 文件中,您不能使用表达式如 ${whatever > 0},因为>符号是非法的。 你可以使用 ${whatever gt 0}表达式或者嵌入在一个 CDATA 部分的值。")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("]]>\n")])])]),e("p",[t._v("如果你需要在 XHTML 中声明 DOCTYPE,必须使用到 "),e("code",[t._v("")]),t._v(" 动作元素,实例如下:")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v(']]>\n\njsp:text action\n\n\n\n Welcome to JSP Programming\n\n\n\n