From 97ceec75eb5962c83b52e1923552c7e5380e16a1 Mon Sep 17 00:00:00 2001 From: Zhang Peng Date: Thu, 6 Feb 2020 10:22:42 +0800 Subject: [PATCH 01/37] update docs --- assets/eddx/java.eddx | Bin 0 -> 49877 bytes assets/eddx/javalib.eddx | Bin 0 -> 17762 bytes assets/javalib.xmind | Bin 774111 -> 0 bytes assets/javatool.xmind | Bin 65272 -> 0 bytes assets/maven.xmind | Bin 208150 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/eddx/java.eddx create mode 100644 assets/eddx/javalib.eddx diff --git a/assets/eddx/java.eddx b/assets/eddx/java.eddx new file mode 100644 index 0000000000000000000000000000000000000000..1fd2673039762adc7b5f7a1c5318d9f399818bda GIT binary patch literal 49877 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�no{xFmjG$RC>u(o0bS2@zv7%R73d<>Mk(Al{ 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 literal 0 HcmV?d00001 diff --git a/assets/eddx/javalib.eddx b/assets/eddx/javalib.eddx new file mode 100644 index 0000000000000000000000000000000000000000..cae1e282b653f448fbb198f68633a47bd36829a5 GIT binary patch literal 17762 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 z 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

$67l> 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 z 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%0D&;)xmN#BBthj;LF+V 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

  • ;Fo$PflB?VT`(p2tJHtREla>GZEft~QZOm3 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 HVS@92IMMTd diff --git a/assets/javatool.xmind b/assets/javatool.xmind index 99580d25a391cda9862bc3bcfb0bbf539236a1e5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 65272 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 diff --git a/assets/maven.xmind b/assets/maven.xmind index a53baf82bc46b31f6de0fcc5af6ec1bbba1b5e6e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 208150 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 Date: Fri, 7 Feb 2020 23:04:47 +0800 Subject: [PATCH 02/37] =?UTF-8?q?=E6=95=B4=E7=90=86=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- README.md | 121 +- assets/eddx/java.eddx | Bin 49877 -> 0 bytes assets/eddx/javalib.eddx | Bin 17762 -> 0 bytes assets/javalib.xmind | 0 assets/javatool.xmind | 0 assets/maven.xmind | 0 codes/README.md | 3 + codes/java-distributed/README.md | 3 + .../java-load-balance}/pom.xml | 39 +- .../javatech/ConsistentHashLoadBalance.java | 65 + .../io/github/dunwu/javatech/LoadBalance.java | 21 + .../java/io/github/dunwu/javatech/Node.java | 77 + .../dunwu/javatech/RandomLoadBalance.java | 85 + .../dunwu/javatech/RoundRobinLoadBalance.java | 87 + .../github/dunwu/javatech/package-info.java | 7 + .../javatech/support/CRCHashStrategy.java | 68 + .../javatech/support/FnvHashStrategy.java | 24 + .../dunwu/javatech/support/HashStrategy.java | 7 + .../javatech/support/JdkHashCodeStrategy.java | 10 + .../javatech/support/KetamaHashStrategy.java | 42 + .../javatech/support/MurmurHashStrategy.java | 51 + .../dunwu/javatech/LoadBalanceTests.java | 164 + .../github/dunwu/javatech/StatisticsUtil.java | 35 + codes/java-distributed/pom.xml | 17 + codes/javaee/README.md | 1 + codes/javaee/javaee-filter/pom.xml | 107 + .../dunwu/javaee/filter/CacheFilter.java | 97 + .../filter/CharacterEncodingFilter.java | 65 + .../javaee/filter/ExceptionHandlerFilter.java | 48 + .../dunwu/javaee/filter/FilterImpl.java | 36 + .../dunwu/javaee/filter/GZipFilter.java | 44 + .../javaee/filter/ImageRedirectFilter.java | 44 + .../github/dunwu/javaee/filter/LogFilter.java | 36 + .../github/dunwu/javaee/filter/MyFilter.java | 36 + .../javaee/filter/OutputReplaceFilter.java | 58 + .../dunwu/javaee/filter/PrivilegeFilter.java | 79 + .../dunwu/javaee/filter/UploadFilter.java | 24 + .../dunwu/javaee/filter/WaterMarkFilter.java | 49 + .../dunwu/javaee/filter/XSLTFilter.java | 69 + .../filter/exception/AccountException.java | 11 + .../filter/exception/BusinessException.java | 11 + .../dunwu/javaee/filter/test/Download.java | 36 + .../dunwu/javaee/filter/test/GZipTest.java | 34 + .../filter/wrapper/CacheResponseWrapper.java | 44 + .../filter/wrapper/GZipOutputStream.java | 74 + .../filter/wrapper/GZipResponseWrapper.java | 61 + .../wrapper/HttpCharacterResponseWrapper.java | 30 + .../filter/wrapper/UploadRequestWrapper.java | 105 + .../filter/wrapper/WaterMarkOutputStream.java | 55 + .../wrapper/WaterMarkResponseWrapper.java | 60 + .../src/main/resources/logback.xml | 45 + .../src/main/webapp/META-INF/MANIFEST.MF | 0 .../src/main/webapp/WEB-INF/logo.png | Bin 0 -> 10276 bytes .../main/webapp/WEB-INF/privilege.properties | 8 + .../main/webapp/WEB-INF/sensitive.properties | 7 + .../src/main/webapp/WEB-INF/web.xml | 182 + .../src/main/webapp/views/images/error.gif | Bin 0 -> 351 bytes .../src/main/webapp/views/images/mm.jpg | Bin 0 -> 241856 bytes .../src/main/webapp/views/images/sunset.jpg | Bin 0 -> 71189 bytes .../src/main/webapp/views/images/winter.jpg | Bin 0 -> 105542 bytes .../src/main/webapp/views/js/dojo.js | 6812 +++++++++++++++++ .../webapp/views/jsp/accountException.jsp | 44 + .../webapp/views/jsp/businessException.jsp | 24 + .../src/main/webapp/views/jsp/dispatcher.jsp | 13 + .../src/main/webapp/views/jsp/exception.jsp | 24 + .../src/main/webapp/views/jsp/image.jsp | 19 + .../src/main/webapp/views/jsp/index.jsp | 52 + .../main/webapp/views/jsp/testCacheFilter.jsp | 71 + .../views/jsp/testCharacterEncodingFilter.jsp | 28 + .../views/jsp/testExceptionHandlerFilter.jsp | 29 + .../main/webapp/views/jsp/testGZipFilter.jsp | 66 + .../views/jsp/testOutputReplaceFilter.jsp | 19 + .../webapp/views/jsp/testUploadFilter.jsp | 43 + .../webapp/views/jsp/testWaterMarkFilter.jsp | 16 + .../src/main/webapp/views/xml/book.xml | 6 + .../src/main/webapp/views/xml/book.xsl | 40 + .../src/main/webapp/views/xml/demo.xml | 78 + .../src/main/webapp/views/xml/messageLog.xsl | Bin 0 -> 9852 bytes .../src/main/webapp/views/xml/thinkInJava.xml | 7 + .../src/main/webapp/views/xml/xml.xsl | 18 + .../javaee/server/FilterDemosBootstrap.java | 35 + .../dunwu/javaee/server/JettyFactory.java | 131 + .../src/test/resources/jetty/webdefault.xml | 534 ++ codes/javaee/javaee-jsp/pom.xml | 91 + .../com/sun/products/applet/demo/Graph.java | 486 ++ .../github/dunwu/javaee/jsp/bean/Counter.java | 15 + .../github/dunwu/javaee/jsp/bean/Message.java | 15 + .../github/dunwu/javaee/jsp/bean/Person.java | 35 + .../github/dunwu/javaee/jsp/util/IpUtil.java | 16 + .../dunwu/javaee/jsp/util/ip/IPEntry.java | 51 + .../dunwu/javaee/jsp/util/ip/IPSeeker.java | 709 ++ .../github/dunwu/javaee/jsp/util/ip/QQWry.dat | Bin 0 -> 824560 bytes .../github/dunwu/javaee/jsp/util/ip/Test.java | 35 + .../dunwu/javaee/jsp/util/ip/Utils.java | 106 + .../javaee-jsp/src/main/resources/logback.xml | 46 + .../src/main/webapp/META-INF/MANIFEST.MF | 3 + .../main/webapp/WEB-INF/META-INF/MANIFEST.MF | 3 + .../webapp/WEB-INF/resources/jsp/index.jsp | 16 + .../src/main/webapp/WEB-INF/web.xml | 25 + .../main/webapp/examples/02.grammar/break.jsp | 26 + .../main/webapp/examples/02.grammar/for.jsp | 54 + .../main/webapp/examples/02.grammar/if.jsp | 68 + .../main/webapp/examples/02.grammar/if2.jsp | 17 + .../webapp/examples/02.grammar/scriptlet.jsp | 16 + .../webapp/examples/02.grammar/switch.jsp | 37 + .../main/webapp/examples/02.grammar/while.jsp | 23 + .../webapp/examples/03.directive/foot.jsp | 13 + .../webapp/examples/03.directive/head.jsp | 20 + .../webapp/examples/03.directive/include.jsp | 18 + .../webapp/examples/03.directive/page.jsp | 17 + .../main/webapp/examples/04.action/date.jsp | 4 + .../webapp/examples/04.action/jspforward.jsp | 23 + .../webapp/examples/04.action/jspinclude.jsp | 14 + .../webapp/examples/04.action/jspplugin.jsp | 33 + .../webapp/examples/04.action/jspuseBean.jsp | 55 + .../webapp/examples/04.action/jspuseBean2.jsp | 43 + .../webapp/examples/04.action/useBean.html | 42 + .../examples/05.implicit_object/error.jsp | 11 + .../examples/05.implicit_object/exception.jsp | 14 + .../webapp/examples/cookie/readCookie.jsp | 31 + .../main/webapp/examples/cookie/session.jsp | 71 + .../webapp/examples/cookie/writeCookie.jsp | 41 + .../main/webapp/examples/locale/language.jsp | 23 + .../main/webapp/examples/locale/language2.jsp | 20 + .../webapp/examples/locale/localeCurrency.jsp | 20 + .../webapp/examples/locale/localeDate.jsp | 20 + .../webapp/examples/locale/localePercent.jsp | 20 + .../main/webapp/examples/practice/date.jsp | 24 + .../examples/practice/form/checkbox.html | 17 + .../examples/practice/form/checkbox.jsp | 23 + .../examples/practice/form/checkbox2.html | 17 + .../examples/practice/form/checkbox2.jsp | 29 + .../examples/practice/form/formGet.html | 17 + .../webapp/examples/practice/form/formGet.jsp | 20 + .../examples/practice/form/formPost.html | 17 + .../examples/practice/form/formPost.jsp | 24 + .../webapp/examples/practice/hitCount.jsp | 27 + .../examples/practice/mail/sendMail.jsp | 55 + .../webapp/examples/practice/redirect.jsp | 20 + .../main/webapp/examples/practice/refresh.jsp | 30 + .../webapp/examples/uncheck/01.helloWorld.jsp | 10 + .../examples/uncheck/01.helloWorld_zh.jsp | 13 + .../main/webapp/examples/uncheck/02.life.jsp | 45 + .../webapp/examples/uncheck/03.yourIp.jsp | 15 + .../webapp/examples/uncheck/configuration.jsp | 14 + .../src/main/webapp/images/bg-btn-blue.gif | Bin 0 -> 827 bytes .../src/main/webapp/images/mail.gif | Bin 0 -> 226 bytes .../src/main/webapp/images/vertical_line.gif | Bin 0 -> 301 bytes .../src/main/webapp/views/css/style.css | 51 + .../src/main/webapp/views/jsp/action.jsp | 7 + .../src/main/webapp/views/jsp/action/date.jsp | 4 + .../main/webapp/views/jsp/action/forward.jsp | 12 + .../webapp/views/jsp/action/getProperty.jsp | 19 + .../main/webapp/views/jsp/action/include.jsp | 12 + .../main/webapp/views/jsp/action/useBean.html | 38 + .../main/webapp/views/jsp/action/useBean.jsp | 53 + .../src/main/webapp/views/jsp/application.jsp | 15 + .../src/main/webapp/views/jsp/break.jsp | 27 + .../src/main/webapp/views/jsp/comment.jsp | 21 + .../src/main/webapp/views/jsp/counter.jsp | 43 + .../src/main/webapp/views/jsp/directive.jsp | 4 + .../views/jsp/directive/include/foot.jsp | 13 + .../views/jsp/directive/include/head.jsp | 23 + .../views/jsp/directive/include/include.jsp | 15 + .../views/jsp/directive/page/contentType.jsp | 12 + .../views/jsp/directive/page/errorPage.jsp | 13 + .../views/jsp/directive/page/isErrorPage.jsp | 12 + .../src/main/webapp/views/jsp/el.jsp | 26 + .../src/main/webapp/views/jsp/error.jsp | 11 + .../src/main/webapp/views/jsp/exception.jsp | 14 + .../src/main/webapp/views/jsp/grammar/for.jsp | 53 + .../src/main/webapp/views/jsp/grammar/if.jsp | 48 + .../main/webapp/views/jsp/grammar/while.jsp | 23 + .../src/main/webapp/views/jsp/greeting.jsp | 44 + .../src/main/webapp/views/jsp/index.jsp | 25 + .../src/main/webapp/views/jsp/life.jsp | 15 + .../src/main/webapp/views/jsp/method.jsp | 84 + .../src/main/webapp/views/jsp/plugin.jsp | 33 + .../src/main/webapp/views/jsp/return.jsp | 27 + .../src/main/webapp/views/jsp/scriptlet.jsp | 17 + .../src/main/webapp/views/jsp/taglib.jsp | 14 + .../dunwu/javaee/server/JettyFactory.java | 114 + .../github/dunwu/javaee/server/Profiles.java | 34 + .../dunwu/javaee/server/QuickStartServer.java | 35 + .../src/test/resources/jetty/webdefault.xml | 534 ++ .../javaee-jsp/src/test/resources/logback.xml | 46 + codes/javaee/javaee-jstl/pom.xml | 118 + .../io/github/dunwu/javaee/bean/Person.java | 107 + .../io/github/dunwu/javaee/util/Example.java | 14 + .../dunwu/javaee/util/Example_es_ES.java | 13 + .../github/dunwu/javaee/util/Pagination.java | 204 + .../javaee-jstl/src/main/resources/init.sql | 45 + .../src/main/resources/logback.xml | 46 + .../src/main/resources/messages.properties | 2 + .../main/resources/messages_zh_CN.properties | 2 + .../main/resources/sql/create_employees.sql | 12 + .../main/resources/sql/create_students.sql | 12 + .../src/main/webapp/WEB-INF/web.xml | 25 + .../src/main/webapp/examples/core/c_catch.jsp | 20 + .../main/webapp/examples/core/c_choose.jsp | 23 + .../main/webapp/examples/core/c_forEach.jsp | 13 + .../main/webapp/examples/core/c_forTokens.jsp | 13 + .../src/main/webapp/examples/core/c_if.jsp | 14 + .../main/webapp/examples/core/c_import.jsp | 12 + .../src/main/webapp/examples/core/c_out.jsp | 20 + .../src/main/webapp/examples/core/c_param.jsp | 21 + .../main/webapp/examples/core/c_redirect.jsp | 11 + .../main/webapp/examples/core/c_remove.jsp | 14 + .../src/main/webapp/examples/core/c_set.jsp | 12 + .../src/main/webapp/examples/core/c_url.jsp | 14 + .../main/webapp/examples/fmt/fmt_bundle.jsp | 18 + .../webapp/examples/fmt/fmt_formatDate.jsp | 33 + .../webapp/examples/fmt/fmt_formatNumber.jsp | 33 + .../main/webapp/examples/fmt/fmt_message.jsp | 26 + .../webapp/examples/fmt/fmt_parseDate.jsp | 19 + .../webapp/examples/fmt/fmt_parseNumber.jsp | 20 + .../examples/fmt/fmt_requestEncoding.jsp | 20 + .../webapp/examples/fmt/fmt_setLocale.jsp | 26 + .../webapp/examples/fmt/fmt_setTimeZone.jsp | 18 + .../main/webapp/examples/fmt/fmt_timeZone.jsp | 42 + .../webapp/examples/function/fn_contains.jsp | 24 + .../function/fn_containsIgnoreCase.jsp | 24 + .../webapp/examples/function/fn_endsWith.jsp | 24 + .../webapp/examples/function/fn_escapeXml.jsp | 23 + .../webapp/examples/function/fn_indexOf.jsp | 18 + .../main/webapp/examples/function/fn_join.jsp | 18 + .../webapp/examples/function/fn_length.jsp | 19 + .../webapp/examples/function/fn_replace.jsp | 19 + .../webapp/examples/function/fn_split.jsp | 23 + .../examples/function/fn_startsWith.jsp | 21 + .../webapp/examples/function/fn_substring.jsp | 17 + .../examples/function/fn_substringAfter.jsp | 17 + .../examples/function/fn_substringBefore.jsp | 17 + .../examples/function/fn_toLowerCase.jsp | 17 + .../examples/function/fn_toUpperCase.jsp | 17 + .../main/webapp/examples/function/fn_trim.jsp | 19 + .../webapp/examples/sql/sql_dateParam.jsp | 52 + .../main/webapp/examples/sql/sql_param.jsp | 47 + .../main/webapp/examples/sql/sql_query.jsp | 40 + .../webapp/examples/sql/sql_setDataSource.jsp | 18 + .../webapp/examples/sql/sql_transaction.jsp | 60 + .../main/webapp/examples/sql/sql_update.jsp | 44 + .../main/webapp/examples/uncheck/bundle.jsp | 41 + .../main/webapp/examples/uncheck/catch.jsp | 26 + .../main/webapp/examples/uncheck/choose.jsp | 21 + .../main/webapp/examples/uncheck/contains.jsp | 35 + .../examples/uncheck/containsIgnoreCase.jsp | 33 + .../webapp/examples/uncheck/dateParam.jsp | 80 + .../main/webapp/examples/uncheck/endsWith.jsp | 70 + .../webapp/examples/uncheck/escapeXml.jsp | 21 + .../src/main/webapp/examples/uncheck/fmt.jsp | 14 + .../src/main/webapp/examples/uncheck/fn.jsp | 14 + .../main/webapp/examples/uncheck/forEach.jsp | 76 + .../examples/uncheck/forEachWithList.jsp | 196 + .../webapp/examples/uncheck/forTokens.jsp | 39 + .../webapp/examples/uncheck/formatDate.jsp | 77 + .../webapp/examples/uncheck/formatNumber.jsp | 89 + .../src/main/webapp/examples/uncheck/if.jsp | 56 + .../main/webapp/examples/uncheck/import.jsp | 25 + .../main/webapp/examples/uncheck/index.jsp | 16 + .../main/webapp/examples/uncheck/indexOf.jsp | 16 + .../src/main/webapp/examples/uncheck/join.jsp | 20 + .../main/webapp/examples/uncheck/length.jsp | 18 + .../src/main/webapp/examples/uncheck/out.jsp | 14 + .../main/webapp/examples/uncheck/param.jsp | 17 + .../main/webapp/examples/uncheck/parse.jsp | 51 + .../webapp/examples/uncheck/parseDate.jsp | 16 + .../webapp/examples/uncheck/parseNumber.jsp | 16 + .../main/webapp/examples/uncheck/query.jsp | 57 + .../examples/uncheck/queryPagination.jsp | 79 + .../webapp/examples/uncheck/queryReflect.jsp | 75 + .../main/webapp/examples/uncheck/redirect.jsp | 14 + .../main/webapp/examples/uncheck/remove.jsp | 21 + .../examples/uncheck/requestEncoding.jsp | 26 + .../src/main/webapp/examples/uncheck/set.jsp | 34 + .../webapp/examples/uncheck/setBundle.jsp | 23 + .../webapp/examples/uncheck/setDataSource.jsp | 27 + .../webapp/examples/uncheck/setLocale.jsp | 68 + .../webapp/examples/uncheck/setTimeZone.jsp | 43 + .../src/main/webapp/examples/uncheck/sina.xml | 300 + .../main/webapp/examples/uncheck/split.jsp | 21 + .../src/main/webapp/examples/uncheck/sql.jsp | 16 + .../webapp/examples/uncheck/substring.jsp | 21 + .../main/webapp/examples/uncheck/timeZone.jsp | 81 + .../webapp/examples/uncheck/transaction.jsp | 91 + .../main/webapp/examples/uncheck/update.jsp | 65 + .../src/main/webapp/examples/uncheck/url.jsp | 15 + .../main/webapp/examples/uncheck/x_choose.jsp | 43 + .../webapp/examples/uncheck/x_forEach.jsp | 44 + .../src/main/webapp/examples/uncheck/x_if.jsp | 42 + .../main/webapp/examples/uncheck/x_out.jsp | 25 + .../main/webapp/examples/uncheck/x_set.jsp | 38 + .../webapp/examples/uncheck/x_transform.jsp | 107 + .../src/main/webapp/examples/uncheck/xml.jsp | 25 + .../src/main/webapp/examples/xml/x_choose.jsp | 42 + .../main/webapp/examples/xml/x_forEach.jsp | 36 + .../src/main/webapp/examples/xml/x_if.jsp | 40 + .../src/main/webapp/examples/xml/x_out.jsp | 35 + .../src/main/webapp/examples/xml/x_param.jsp | 33 + .../src/main/webapp/examples/xml/x_parse.jsp | 22 + .../src/main/webapp/examples/xml/x_set.jsp | 31 + .../main/webapp/examples/xml/x_transform.jsp | 31 + .../javaee-jstl/src/main/webapp/xml/books.xml | 12 + .../javaee-jstl/src/main/webapp/xml/style.xsl | 32 + .../dunwu/javaee/server/JettyFactory.java | 114 + .../github/dunwu/javaee/server/Profiles.java | 34 + .../dunwu/javaee/server/QuickStartServer.java | 35 + .../src/test/resources/jetty/webdefault.xml | 534 ++ codes/javaee/javaee-listener/pom.xml | 97 + .../javaee/listener/LoginSessionListener.java | 89 + .../MyHttpSessionActivationListener.java | 46 + .../MyHttpSessionAttributeListener.java | 44 + .../MyHttpSessionBindingListener.java | 28 + .../listener/MyHttpSessionListener.java | 48 + .../MyServletContextAttributeListener.java | 33 + .../listener/MyServletContextListener.java | 38 + .../MyServletRequestAttributeListener.java | 33 + .../listener/MyServletRequestListener.java | 61 + .../javaee/listener/PersonInfoListener.java | 78 + .../javaee/listener/bean/PersonInfo.java | 51 + .../listener/util/ApplicationConstants.java | 28 + .../src/main/resources/logback.xml | 46 + .../src/main/webapp/META-INF/MANIFEST.MF | 3 + .../src/main/webapp/META-INF/context.xml | 5 + .../webapp/WEB-INF/resources/jsp/index.jsp | 16 + .../src/main/webapp/WEB-INF/web.xml | 57 + .../javaee-listener/src/main/webapp/a.gif | Bin 0 -> 120 bytes .../javaee-listener/src/main/webapp/aa.html | 17 + .../src/main/webapp/active.jsp | 24 + .../javaee-listener/src/main/webapp/b.gif | Bin 0 -> 128 bytes .../javaee-listener/src/main/webapp/index.jsp | 22 + .../src/main/webapp/listener.jsp | 91 + .../src/main/webapp/online.jsp | 55 + .../main/webapp/testLoginSessionListener.jsp | 70 + .../dunwu/javaee/server/JettyFactory.java | 131 + .../javaee/server/ListenerDemosBootstrap.java | 35 + .../src/test/resources/jetty/webdefault.xml | 534 ++ codes/javaee/javaee-oss/pom.xml | 149 + .../javaee/oss/encode/digest/DsaCoder.java | 81 + .../javaee/oss/encode/digest/HmacCoder.java | 38 + .../javaee/oss/encode/digest/MdCoder.java | 46 + .../javaee/oss/encode/digest/ShaCoder.java | 56 + .../javaee/oss/encode/encrypt/AESCoder.java | 129 + .../javaee/oss/encode/encrypt/Base64Demo.java | 25 + .../javaee/oss/encode/encrypt/DESCoder.java | 130 + .../oss/encode/encrypt/DESedeCoder.java | 73 + .../javaee/oss/encode/encrypt/PBECoder.java | 91 + .../javaee/oss/encode/encrypt/RSACoder.java | 142 + .../oss/encode/sample/DownloadPolicy.java | 111 + .../oss/encode/sample/ModifyPolicy.java | 95 + .../javaee/oss/encode/sample/TokenUtil.java | 158 + .../oss/encode/sample/UploadConstant.java | 35 + .../oss/encode/sample/UploadPolicy.java | 153 + .../dunwu/javaee/oss/html/CnblogParser.java | 52 + .../dunwu/javaee/oss/html/XiamiParser.java | 109 + .../dunwu/javaee/oss/image/ImageUtil.java | 142 + .../dunwu/javaee/oss/image/QRCodeUtil.java | 60 + .../javaee/oss/image/dto/BarcodeParamDTO.java | 87 + .../javaee/oss/image/dto/ImageParamDTO.java | 181 + .../dunwu/javaee/oss/jms/JMSHelloWorld.java | 140 + .../dunwu/javaee/oss/jms/JMSReceiver.java | 62 + .../dunwu/javaee/oss/jms/JMSSender.java | 77 + .../dunwu/javaee/oss/logging/JclDemo.java | 29 + .../dunwu/javaee/oss/logging/Slf4jDemo.java | 28 + .../dunwu/javaee/oss/mail/ForwardMail.java | 110 + .../dunwu/javaee/oss/mail/MailConfigDTO.java | 72 + .../github/dunwu/javaee/oss/mail/MailDTO.java | 104 + .../dunwu/javaee/oss/mail/MailUtil.java | 202 + .../javaee/oss/mail/SendAttachmentMail.java | 84 + .../javaee/oss/mail/SendTemplateMail.java | 81 + .../dunwu/javaee/oss/mail/SendTextMail.java | 67 + .../dunwu/javaee/oss/mail/StoreMail.java | 66 + .../dunwu/javaee/oss/mail/sendHtmlMail.java | 84 + .../javaee/oss/template/LoadVelocityDemo.java | 94 + .../oss/template/VelocityHelloWorld.java | 42 + .../oss/template/VelocityHelloWorld2.java | 47 + .../javaee/oss/template/VelocityUtil.java | 46 + .../src/main/resources/html/example.html | 8 + .../src/main/resources/images/lion.jpg | Bin 0 -> 16791 bytes .../src/main/resources/images/lion2.jpg | Bin 0 -> 31726 bytes .../javaee-oss/src/main/resources/log4j.xml | 46 + .../javaee-oss/src/main/resources/logback.xml | 188 + .../src/main/resources/mail/mail.properties | 5 + .../src/main/resources/template/footer.vm | 16 + .../src/main/resources/template/header.vm | 6 + .../src/main/resources/template/hello.vm | 3 + .../src/main/resources/template/mail.vm | 140 + .../resources/template/velocity.properties | 4 + .../dunwu/javaee/oss/html/JsoupTest.java | 105 + .../dunwu/javaee/oss/image/ImageUtilTest.java | 66 + .../javaee/oss/image/QRCodeUtilTest.java | 99 + .../javaee/oss/image/ThumbnailatorTest.java | 141 + .../javaee/oss/template/VelocityUtilTest.java | 23 + .../dunwu/javaee/oss/test/JUnitExecTest.java | 85 + .../test/resources/html/jsoup-cookbook.html | 107 + .../src/test/resources/images/lion.jpg | Bin 0 -> 16791 bytes .../src/test/resources/images/lion2.jpg | Bin 0 -> 31726 bytes .../test/resources/images/lion2_watermark.png | Bin 0 -> 139930 bytes .../src/test/resources/images/wartermark.png | Bin 0 -> 16722 bytes .../javaee-oss/src/test/resources/logback.xml | 68 + codes/javaee/javaee-servlet/pom.xml | 84 + .../javaee/servlet/AnnotationServlet.java | 85 + .../javaee/servlet/ContextParamServlet.java | 64 + .../dunwu/javaee/servlet/FirstServlet.java | 92 + .../dunwu/javaee/servlet/ForwardServlet.java | 47 + .../dunwu/javaee/servlet/HelloServlet.java | 108 + .../dunwu/javaee/servlet/ImageServlet.java | 94 + .../javaee/servlet/InitParamServlet.java | 81 + .../javaee/servlet/InjectionServlet.java | 54 + .../javaee/servlet/LifeCycleServlet.java | 138 + .../dunwu/javaee/servlet/PostServlet.java | 153 + .../dunwu/javaee/servlet/RedirectServlet.java | 78 + .../dunwu/javaee/servlet/RequestServlet.java | 187 + .../javaee/servlet/ThreadSafetyServlet.java | 34 + .../dunwu/javaee/servlet/UploadServlet.java | 175 + .../servlet/upload/ProgressUploadServlet.java | 121 + .../javaee/servlet/upload/UploadListener.java | 19 + .../javaee/servlet/upload/UploadStatus.java | 45 + .../src/main/resources/logback.xml | 46 + .../src/main/webapp/META-INF/MANIFEST.MF | 3 + .../src/main/webapp/WEB-INF/notice.html | 116 + .../src/main/webapp/WEB-INF/web.xml | 216 + .../javaee-servlet/src/main/webapp/index.jsp | 33 + .../views/jsp/postPersonalInformation.html | 152 + .../dunwu/javaee/server/JettyFactory.java | 114 + .../github/dunwu/javaee/server/Profiles.java | 34 + .../dunwu/javaee/server/QuickStartServer.java | 35 + .../src/test/resources/jetty/webdefault.xml | 534 ++ .../src/test/resources/logback.xml | 46 + codes/javaee/javaee-session/pom.xml | 88 + .../dunwu/javaee/cookie/AddCookies.java | 68 + .../dunwu/javaee/cookie/DeleteCookies.java | 75 + .../dunwu/javaee/cookie/ReadCookies.java | 76 + .../dunwu/javaee/cookie/bean/Person.java | 65 + .../dunwu/javaee/cookie/bean/Topic.java | 42 + .../javaee/session/SessionTrackServlet.java | 69 + .../src/main/resources/logback.xml | 45 + .../src/main/webapp/META-INF/MANIFEST.MF | 3 + .../src/main/webapp/META-INF/context.xml | 4 + .../src/main/webapp/WEB-INF/web.xml | 49 + .../src/main/webapp/encodeURL.jsp | 15 + .../javaee-session/src/main/webapp/index.jsp | 26 + .../src/main/webapp/views/css/style.css | 51 + .../main/webapp/views/images/bg-btn-blue.gif | Bin 0 -> 827 bytes .../src/main/webapp/views/images/cookie.gif | Bin 0 -> 592 bytes .../main/webapp/views/images/errorstate.gif | Bin 0 -> 609 bytes .../src/main/webapp/views/images/mail.gif | Bin 0 -> 226 bytes .../webapp/views/images/vertical_line.gif | Bin 0 -> 301 bytes .../webapp/views/jsp/cookie/addCookies.jsp | 16 + .../main/webapp/views/jsp/cookie/base64.jsp | 35 + .../webapp/views/jsp/cookie/base64_decode.jsp | 32 + .../main/webapp/views/jsp/cookie/cookie.gif | Bin 0 -> 592 bytes .../main/webapp/views/jsp/cookie/cookie.jsp | 81 + .../views/jsp/cookie/cookieAttribute.jsp | 30 + .../webapp/views/jsp/cookie/cookieDomain.jsp | 27 + .../main/webapp/views/jsp/cookie/encoding.jsp | 33 + .../main/webapp/views/jsp/cookie/history.js | 27 + .../main/webapp/views/jsp/cookie/history.jsp | 64 + .../webapp/views/jsp/cookie/javascript.jsp | 106 + .../main/webapp/views/jsp/cookie/login.jsp | 68 + .../webapp/views/jsp/cookie/loginCookie.jsp | 165 + .../main/webapp/views/jsp/cookie/maxAge.jsp | 26 + .../webapp/views/jsp/cookie/setCookie.jsp | 109 + .../main/webapp/views/jsp/session/session.jsp | 94 + .../main/webapp/views/jsp/session/vote.jsp | 52 + .../main/webapp/views/jsp/session/welcome.jsp | 63 + .../dunwu/javaee/server/JettyFactory.java | 114 + .../github/dunwu/javaee/server/Profiles.java | 34 + .../dunwu/javaee/server/QuickStartServer.java | 35 + .../src/test/resources/jetty/webdefault.xml | 534 ++ codes/javaee/javaee-taglib/pom.xml | 118 + .../github/dunwu/javaee/taglib/Copyright.java | 62 + .../github/dunwu/javaee/taglib/HelloTag.java | 24 + .../github/dunwu/javaee/taglib/HelloTag2.java | 24 + .../github/dunwu/javaee/taglib/HelloTag3.java | 38 + .../dunwu/javaee/taglib/bean/Person.java | 105 + .../javaee/taglib/function/Function.java | 62 + .../dunwu/javaee/taglib/tags/AddTag.java | 32 + .../dunwu/javaee/taglib/tags/Copyright.java | 57 + .../dunwu/javaee/taglib/tags/Copyright2.java | 33 + .../taglib/tags/DynamicAttributeTag.java | 58 + .../dunwu/javaee/taglib/tags/HelloTag.java | 32 + .../dunwu/javaee/taglib/tags/IteratorTag.java | 31 + .../dunwu/javaee/taglib/tags/LoopTag.java | 40 + .../javaee/taglib/tags/ToLowerCaseTag.java | 23 + .../javaee/taglib/tags/table/Column.java | 64 + .../dunwu/javaee/taglib/tags/table/Table.java | 203 + .../taglib/tags2/MultiAttributeTag.java | 44 + .../dunwu/javaee/taglib/tags2/MultiTag.java | 34 + .../dunwu/javaee/taglib/tags2/RepeatTag.java | 17 + .../javaee/taglib/tags2/ToUpperCaseTag.java | 28 + .../dunwu/javaee/taglib/test/Messages.java | 34 + .../dunwu/javaee/taglib/test/TestMessage.java | 9 + .../javaee/taglib/test/messages.properties | 1 + .../src/main/resources/copyright.properties | 1 + .../src/main/resources/logback.xml | 46 + .../src/main/webapp/WEB-INF/tld/function.tld | 44 + .../src/main/webapp/WEB-INF/tld/hello.tld | 10 + .../src/main/webapp/WEB-INF/tld/hello2.tld | 10 + .../src/main/webapp/WEB-INF/tld/hello3.tld | 13 + .../src/main/webapp/WEB-INF/tld/taglib.tld | 149 + .../src/main/webapp/WEB-INF/web.xml | 25 + .../javaee-taglib/src/main/webapp/dynamic.jsp | 18 + .../src/main/webapp/function.jsp | 46 + .../javaee-taglib/src/main/webapp/hello.jsp | 15 + .../src/main/webapp/images/I.png | Bin 0 -> 148 bytes .../src/main/webapp/images/L.png | Bin 0 -> 153 bytes .../src/main/webapp/images/Lminus.png | Bin 0 -> 219 bytes .../src/main/webapp/images/Lplus.png | Bin 0 -> 224 bytes .../src/main/webapp/images/T.png | Bin 0 -> 152 bytes .../src/main/webapp/images/Thumbs.db | Bin 0 -> 56832 bytes .../src/main/webapp/images/Tminus.png | Bin 0 -> 207 bytes .../src/main/webapp/images/Tplus.png | Bin 0 -> 222 bytes .../src/main/webapp/images/asc.gif | Bin 0 -> 118 bytes .../src/main/webapp/images/bg-btn-blue.gif | Bin 0 -> 827 bytes .../src/main/webapp/images/bg_4.jpg | Bin 0 -> 16432 bytes .../src/main/webapp/images/blank.png | Bin 0 -> 144 bytes .../src/main/webapp/images/bottom-left.gif | Bin 0 -> 916 bytes .../src/main/webapp/images/bottom-right.gif | Bin 0 -> 916 bytes .../src/main/webapp/images/btn-go-dark.gif | Bin 0 -> 276 bytes .../src/main/webapp/images/delete.gif | Bin 0 -> 74 bytes .../src/main/webapp/images/delimiter.gif | Bin 0 -> 43 bytes .../src/main/webapp/images/desc.gif | Bin 0 -> 118 bytes .../src/main/webapp/images/edit.gif | Bin 0 -> 162 bytes .../src/main/webapp/images/element.gif | Bin 0 -> 330 bytes .../src/main/webapp/images/file.png | Bin 0 -> 251 bytes .../src/main/webapp/images/foldericon.png | Bin 0 -> 229 bytes .../main/webapp/images/ibm-tab-background.gif | Bin 0 -> 2538 bytes .../src/main/webapp/images/ibm_logo.gif | Bin 0 -> 360 bytes .../main/webapp/images/left-nav-corner.gif | Bin 0 -> 909 bytes .../images/leftnav-overview-highlight.gif | Bin 0 -> 128 bytes .../src/main/webapp/images/line01.gif | Bin 0 -> 46 bytes .../webapp/images/masthead-links-gradient.gif | Bin 0 -> 264 bytes .../src/main/webapp/images/memo.gif | Bin 0 -> 902 bytes .../src/main/webapp/images/new.png | Bin 0 -> 251 bytes .../src/main/webapp/images/next.gif | Bin 0 -> 302 bytes .../src/main/webapp/images/openfoldericon.png | Bin 0 -> 232 bytes .../main/webapp/images/pagetools-gradient.gif | Bin 0 -> 986 bytes .../webapp/images/pagetools_gradient_a.gif | Bin 0 -> 946 bytes .../src/main/webapp/images/password.gif | Bin 0 -> 239 bytes .../src/main/webapp/images/prev.gif | Bin 0 -> 303 bytes .../src/main/webapp/images/project.png | Bin 0 -> 742 bytes .../src/main/webapp/images/pspbrwse.jbf | Bin 0 -> 5674 bytes .../src/main/webapp/images/rl-bullet.gif | Bin 0 -> 46 bytes .../src/main/webapp/images/role.gif | Bin 0 -> 597 bytes .../src/main/webapp/images/team.gif | Bin 0 -> 159 bytes .../main/webapp/images/template-gradient.gif | Bin 0 -> 659 bytes .../main/webapp/images/top-content-shadow.gif | Bin 0 -> 325 bytes .../src/main/webapp/images/top-left.gif | Bin 0 -> 917 bytes .../src/main/webapp/images/top-right.gif | Bin 0 -> 922 bytes .../src/main/webapp/images/trans.gif | Bin 0 -> 43 bytes .../javaee-taglib/src/main/webapp/index.jsp | 83 + .../javaee-taglib/src/main/webapp/loop.jsp | 15 + .../javaee-taglib/src/main/webapp/multi.jsp | 13 + .../src/main/webapp/multiAttribute.jsp | 21 + .../src/main/webapp/style/style.css | 66 + .../javaee-taglib/src/main/webapp/table.jsp | 184 + .../src/main/webapp/taglib/copyright.jsp | 13 + .../src/main/webapp/taglib/helloTag.jsp | 9 + .../src/main/webapp/taglib/helloTag2.jsp | 11 + .../src/main/webapp/taglib/helloTag3.jsp | 9 + .../javaee-taglib/src/main/webapp/test.jsp | 38 + .../src/main/webapp/toLowerCase.jsp | 13 + .../src/main/webapp/toUpperCase.jsp | 15 + .../javaee-taglib/src/main/webapp/vote.gif | Bin 0 -> 65 bytes .../dunwu/javaee/server/JettyFactory.java | 114 + .../github/dunwu/javaee/server/Profiles.java | 34 + .../dunwu/javaee/server/QuickStartServer.java | 35 + .../src/test/resources/jetty/webdefault.xml | 534 ++ codes/javaee/javaee-websocket/pom.xml | 120 + .../dunwu/javaee/servlet/SocketServlet.java | 58 + .../javaee/websocket/WebSocketServer.java | 118 + .../WebSocketServerConfigurator.java | 19 + .../src/main/resources/logback.xml | 43 + .../src/main/webapp/WEB-INF/web.xml | 23 + .../src/main/webapp/websocketA.html | 60 + .../src/main/webapp/websocketB.html | 60 + .../github/dunwu/javaee/server/DevServer.java | 137 + .../src/test/resources/jetty/webdefault.xml | 534 ++ .../src/test/resources/logback.xml | 43 + codes/javaee/pom.xml | 111 + codes/javalib/javalib-bean/README.md | 373 - codes/javalib/javalib-bean/pom.xml | 60 - .../github/dunwu/javalib/lombok/DataDemo.java | 23 - .../javalib/lombok/EqualsAndHashCodeDemo.java | 57 - .../javalib/lombok/GetterAndSetterDemo.java | 23 - .../dunwu/javalib/lombok/NonNullDemo.java | 23 - .../github/dunwu/javalib/lombok/Person.java | 26 - .../dunwu/javalib/lombok/ToStringDemo.java | 24 - .../dunwu/javalib/lombok/package-info.java | 8 - .../dunwu/javalib/lombok/LombokTest.java | 116 - codes/javalib/javalib-cli/pom.xml | 78 - .../io/github/dunwu/javalib/AnsiSystem.java | 244 - .../java/io/github/dunwu/javalib/CliDemo.java | 56 - .../java/io/github/dunwu/javalib/CliUtil.java | 28 - .../github/dunwu/javalib/SystemInfoUtil.java | 265 - .../dunwu/javalib/constant/AnsiBgColor.java | 44 - .../dunwu/javalib/constant/AnsiColor.java | 44 - .../dunwu/javalib/constant/AnsiElement.java | 11 - .../dunwu/javalib/constant/AnsiSgr.java | 42 - .../github/dunwu/javalib/constant/Color.java | 36 - .../io/github/dunwu/javalib/CliUtilTests.java | 17 - .../github/dunwu/javalib/SystemInfoTest.java | 320 - codes/javalib/javalib-io-binary/pom.xml | 71 - .../io/github/dunwu/javalib/io/FstDemo.java | 73 - .../dunwu/javalib/io/JdkSerializeDemo.java | 78 - .../io/github/dunwu/javalib/io/KryoDemo.java | 114 - .../dunwu/javalib/io/bean/BeanUtils.java | 33 - .../dunwu/javalib/io/bean/TestBean.java | 59 - .../javalib/io/SerializePerformanceTest.java | 63 - codes/javalib/javalib-io-json/pom.xml | 84 - .../github/dunwu/javalib/json/bean/Group.java | 42 - .../github/dunwu/javalib/json/bean/User.java | 25 - .../json/fastjson/FastjsonFeildBean.java | 140 - .../json/fastjson/JacksonAnnotationBean.java | 55 - .../javalib/json/gson/GsonAnnotationBean.java | 52 - .../javalib/json/gson/VersionedClass.java | 21 - .../github/dunwu/javalib/json/TestBean.java | 56 - .../github/dunwu/javalib/json/TestBean2.java | 50 - .../json/fastjson/FastjsonCaseTests.java | 56 - .../fastjson/FastjsonPerformanceTests.java | 50 - .../javalib/json/gson/GsonCaseTests.java | 80 - .../json/gson/GsonPerformanceTests.java | 53 - .../json/jackson/JacksonPerformanceTests.java | 53 - .../dunwu/javalib/json/util/BeanUtils.java | 74 - codes/javalib/javalib-io/pom.xml | 71 - .../dunwu/javalib/serialize/FstDemo.java | 28 - .../javalib/serialize/JdkSerializeDemo.java | 36 - .../io/github/dunwu/javalib/bean/Person.java | 42 - .../json/fastjson/FastjsonAnnotationBean.java | 95 - .../javalib/json/fastjson/FastjsonTests.java | 51 - .../json/jackson/JacksonAnnotationBean.java | 55 - .../javalib/json/jackson/JacksonTests.java | 101 - .../javalib/serialize/SerializeTest.java | 48 - .../javalib-log/javalib-log-log4j/pom.xml | 64 - .../github/dunwu/javalib/log/Log4jDemo.java | 27 - .../src/main/resources/log4j.xml | 44 - .../javalib-log/javalib-log-log4j2/pom.xml | 63 - .../github/dunwu/javalib/log/Log4j2Demo.java | 27 - .../src/main/resources/log4j2.xml | 45 - .../github/dunwu/javalib/log/LogbackDemo.java | 27 - .../src/main/resources/logback.xml | 44 - codes/javalib/javalib-log/pom.xml | 18 - codes/javalib/javalib-mvel/pom.xml | 46 - .../github/dunwu/javalib/mvel/BasicRule.java | 128 - .../dunwu/javalib/mvel/DefaultRuleEngine.java | 163 - .../github/dunwu/javalib/mvel/MvelRule.java | 34 - .../dunwu/javalib/mvel/MvelRuleSet.java | 34 - .../io/github/dunwu/javalib/mvel/Rule.java | 61 - .../dunwu/javalib/mvel/RuleConstant.java | 33 - .../dunwu/javalib/mvel/RuleContext.java | 8 - .../github/dunwu/javalib/mvel/RuleEngine.java | 54 - .../dunwu/javalib/mvel/RuleEngineBuilder.java | 45 - .../dunwu/javalib/mvel/RuleEngineParams.java | 93 - .../src/main/resources/logback.xml | 143 - .../github/dunwu/javalib/mvel/ClassTests.java | 44 - .../dunwu/javalib/mvel/SalaryRuleTest.java | 79 - .../io/github/dunwu/javalib/mvel/demo.mvel | 56 - .../src/test/resources/SalaryRule.json | 51 - codes/javalib/javalib-test/pom.xml | 85 - .../github/dunwu/javalib/jmh/QuickStart.java | 43 - .../javalib/jmh/StringBuilderBenchmark.java | 45 - .../dunwu/javalib/lombok/Calculator.java | 9 - .../github/dunwu/javalib/lombok/Person.java | 34 - .../src/main/resources/logback.xml | 15 - .../dunwu/javalib/junit4/JUnitTest.java | 71 - .../dunwu/javalib/junit5/AssertionsTests.java | 151 - .../javalib/junit5/AssumptionsTests.java | 43 - .../javalib/junit5/DisplayNameTests.java | 32 - .../dunwu/javalib/junit5/DynamicTests.java | 117 - .../dunwu/javalib/junit5/NestedTests.java | 84 - .../javalib/junit5/ParameterizedTests.java | 32 - .../dunwu/javalib/junit5/RepeatedTests.java | 46 - .../dunwu/javalib/junit5/StandardTests.java | 52 - .../dunwu/javalib/mockito/MockitoTest.java | 225 - codes/javalib/javalib-text/pom.xml | 53 - .../dunwu/javalib/office/PinyinDemo.java | 15 - .../github/dunwu/javalib/office/WordUtil.java | 263 - .../dunwu/javalib/office/WordUtilTest.java | 111 - codes/javalib/pom.xml | 26 - .../javatool-embedded-server/README.md | 50 - .../javatool/javatool-embedded-server/pom.xml | 93 - .../javatool/controller/HelloController.java | 56 - .../javatool/controller/IndexController.java | 31 - .../javatool/server/SimpleTomcatServer.java | 41 - .../dunwu/javatool/server/TomcatServer.java | 133 - .../src/main/resources/logback.xml | 47 - .../properties/application-develop.properties | 11 - .../properties/application-test.properties | 11 - .../main/resources/spring/spring-servlet.xml | 22 - .../src/main/resources/tomcat/conf/server.xml | 37 - .../src/main/resources/tomcat/conf/web.xml | 4703 ------------ .../src/main/webapp/WEB-INF/web.xml | 47 - .../src/main/webapp/views/jsp/hello.jsp | 16 - .../src/main/webapp/views/jsp/index.jsp | 28 - codes/javatool/javatool-examples/pom.xml | 60 - .../io/github/dunwu/javatool/ElasticDemo.java | 47 - .../src/main/resources/log4j.xml | 55 - .../src/main/resources/logback.xml | 66 - codes/javatool/pom.xml | 19 - docs/.remarkrc | 9 + docs/.textlint.terms.json | 8 + docs/.textlintrc.js | 23 + docs/.vuepress/config.js | 128 + docs/.vuepress/enhanceApp.js | 7 + docs/.vuepress/public/favicon.ico | Bin 0 -> 16958 bytes .../public/images/dunwu-logo-100.png | Bin 0 -> 7664 bytes .../public/images/dunwu-logo-200.png | Bin 0 -> 18730 bytes .../.vuepress/public/images/dunwu-logo-50.png | Bin 0 -> 2804 bytes docs/.vuepress/public/images/dunwu-logo.png | Bin 0 -> 15561 bytes docs/README.md | 110 +- docs/appendix/README.md | 3 - docs/appendix/resources.md | 66 - docs/book.json | 69 - docs/cover.jpg | Bin 117622 -> 0 bytes docs/coverpage.md | 9 - docs/index.html | 154 - docs/javaee/README.md | 19 + docs/javaee/javaee-cookie-sesion.md | 574 ++ docs/javaee/javaee-filter-listener.md | 190 + docs/javaee/javaee-interview.md | 254 + docs/javaee/javaee-jsp.md | 1716 +++++ docs/javaee/javaee-servlet.md | 296 + docs/javalib/README.md | 51 - docs/javalib/dozer.md | 793 -- docs/javalib/freemark.md | 240 - docs/javalib/javalib-binary.md | 338 - docs/javalib/javalib-json.md | 551 -- docs/javalib/javalib-log.md | 762 -- docs/javalib/javalib-util.md | 7 - docs/javalib/javamail.md | 466 -- docs/javalib/jmh.md | 325 - docs/javalib/jsoup.md | 461 -- docs/javalib/junit.md | 582 -- docs/javalib/lombok.md | 373 - docs/javalib/mockito.md | 562 -- docs/javalib/reflections.md | 100 - docs/javalib/thumbnailator.md | 244 - docs/javalib/zxing.md | 93 - docs/javatool/README.md | 33 +- docs/javatool/build/README.md | 22 +- docs/javatool/build/maven/README.md | 5 +- docs/javatool/build/maven/maven-action.md | 103 +- .../build/maven/maven-checkstyle-plugin.md | 15 +- docs/javatool/build/maven/maven-deploy.md | 27 +- docs/javatool/build/maven/maven-pom.md | 35 +- docs/javatool/build/maven/maven-quickstart.md | 60 +- docs/javatool/build/maven/maven-settings.md | 26 +- docs/javatool/elastic/README.md | 49 - docs/javatool/elastic/elastic-beats-ops.md | 238 - docs/javatool/elastic/elastic-beats.md | 296 - .../elastic/elastic-elasticsearch-ops.md | 208 - .../javatool/elastic/elastic-elasticsearch.md | 536 -- docs/javatool/elastic/elastic-kibana-ops.md | 346 - docs/javatool/elastic/elastic-kibana.md | 307 - docs/javatool/elastic/elastic-logstash-ops.md | 495 -- docs/javatool/elastic/elastic-logstash.md | 519 -- docs/javatool/elastic/elastic-quickstart.md | 276 - docs/javatool/ide/README.md | 10 +- docs/javatool/ide/eclipse.md | 14 - .../ide/{intellij.md => intellij-idea.md} | 0 docs/javatool/{test => }/jmeter.md | 0 docs/javatool/monitor/README.md | 4 + docs/javatool/monitor/arthas.md | 412 + docs/javatool/monitor/skywalking.md | 27 + docs/package-lock.json | 1104 --- docs/package.json | 60 +- docs/sidebar.md | 42 - pom.xml | 21 +- prettier.config.js | 9 - 771 files changed, 39937 insertions(+), 23484 deletions(-) delete mode 100644 assets/eddx/java.eddx delete mode 100644 assets/eddx/javalib.eddx delete mode 100644 assets/javalib.xmind delete mode 100644 assets/javatool.xmind delete mode 100644 assets/maven.xmind create mode 100644 codes/README.md create mode 100644 codes/java-distributed/README.md rename codes/{javalib/javalib-log/javalib-log-logback => java-distributed/java-load-balance}/pom.xml (52%) create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/ConsistentHashLoadBalance.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/LoadBalance.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/Node.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RandomLoadBalance.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RoundRobinLoadBalance.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/package-info.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/CRCHashStrategy.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/FnvHashStrategy.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/HashStrategy.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/JdkHashCodeStrategy.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/KetamaHashStrategy.java create mode 100644 codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/MurmurHashStrategy.java create mode 100644 codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/LoadBalanceTests.java create mode 100644 codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/StatisticsUtil.java create mode 100644 codes/java-distributed/pom.xml create mode 100644 codes/javaee/README.md create mode 100644 codes/javaee/javaee-filter/pom.xml create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CacheFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CharacterEncodingFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ExceptionHandlerFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/FilterImpl.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/GZipFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ImageRedirectFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/LogFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/MyFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/OutputReplaceFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/PrivilegeFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/UploadFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/WaterMarkFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/XSLTFilter.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/AccountException.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/BusinessException.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/Download.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/GZipTest.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/CacheResponseWrapper.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipOutputStream.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipResponseWrapper.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/HttpCharacterResponseWrapper.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/UploadRequestWrapper.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkOutputStream.java create mode 100644 codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkResponseWrapper.java create mode 100644 codes/javaee/javaee-filter/src/main/resources/logback.xml rename codes/{javatool/javatool-embedded-server => javaee/javaee-filter}/src/main/webapp/META-INF/MANIFEST.MF (100%) create mode 100644 codes/javaee/javaee-filter/src/main/webapp/WEB-INF/logo.png create mode 100644 codes/javaee/javaee-filter/src/main/webapp/WEB-INF/privilege.properties create mode 100644 codes/javaee/javaee-filter/src/main/webapp/WEB-INF/sensitive.properties create mode 100644 codes/javaee/javaee-filter/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/images/error.gif create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/images/mm.jpg create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/images/sunset.jpg create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/images/winter.jpg create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/js/dojo.js create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/accountException.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/businessException.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/dispatcher.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/exception.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/image.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/index.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCacheFilter.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCharacterEncodingFilter.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/testExceptionHandlerFilter.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/testGZipFilter.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/testOutputReplaceFilter.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/testUploadFilter.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/jsp/testWaterMarkFilter.jsp create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xml create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xsl create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/xml/demo.xml create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/xml/messageLog.xsl create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/xml/thinkInJava.xml create mode 100644 codes/javaee/javaee-filter/src/main/webapp/views/xml/xml.xsl create mode 100644 codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/FilterDemosBootstrap.java create mode 100644 codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java create mode 100644 codes/javaee/javaee-filter/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-jsp/pom.xml create mode 100644 codes/javaee/javaee-jsp/src/main/java/com/sun/products/applet/demo/Graph.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Counter.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Message.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Person.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/IpUtil.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPEntry.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPSeeker.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/QQWry.dat create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/Test.java create mode 100644 codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/Utils.java create mode 100644 codes/javaee/javaee-jsp/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/META-INF/MANIFEST.MF create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/resources/jsp/index.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/break.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/for.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if2.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/scriptlet.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/switch.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/while.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/foot.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/head.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/include.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/page.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/date.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspforward.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspinclude.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspplugin.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean2.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/useBean.html create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/error.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/exception.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/readCookie.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/session.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/writeCookie.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language2.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeCurrency.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeDate.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localePercent.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/date.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.html create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.html create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.html create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.html create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/hitCount.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/mail/sendMail.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/redirect.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/practice/refresh.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld_zh.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/02.life.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/03.yourIp.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/configuration.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/images/bg-btn-blue.gif create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/images/mail.gif create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/images/vertical_line.gif create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/css/style.css create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/date.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/forward.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/getProperty.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/include.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.html create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/application.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/break.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/comment.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/counter.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/foot.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/head.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/include.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/contentType.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/errorPage.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/isErrorPage.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/el.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/error.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/exception.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/for.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/if.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/while.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/greeting.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/index.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/life.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/method.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/plugin.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/return.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/scriptlet.jsp create mode 100644 codes/javaee/javaee-jsp/src/main/webapp/views/jsp/taglib.jsp create mode 100644 codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java create mode 100644 codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/Profiles.java create mode 100644 codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java create mode 100644 codes/javaee/javaee-jsp/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-jsp/src/test/resources/logback.xml create mode 100644 codes/javaee/javaee-jstl/pom.xml create mode 100644 codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/bean/Person.java create mode 100644 codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example.java create mode 100644 codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example_es_ES.java create mode 100644 codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Pagination.java create mode 100644 codes/javaee/javaee-jstl/src/main/resources/init.sql create mode 100644 codes/javaee/javaee-jstl/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-jstl/src/main/resources/messages.properties create mode 100644 codes/javaee/javaee-jstl/src/main/resources/messages_zh_CN.properties create mode 100644 codes/javaee/javaee-jstl/src/main/resources/sql/create_employees.sql create mode 100644 codes/javaee/javaee-jstl/src/main/resources/sql/create_students.sql create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_catch.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_choose.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forEach.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forTokens.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_if.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_import.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_out.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_param.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_redirect.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_remove.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_set.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_url.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_bundle.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatDate.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatNumber.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_message.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseDate.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseNumber.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_requestEncoding.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setLocale.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setTimeZone.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_timeZone.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_contains.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_containsIgnoreCase.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_endsWith.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_escapeXml.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_indexOf.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_join.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_length.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_replace.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_split.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_startsWith.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substring.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringAfter.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringBefore.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toLowerCase.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toUpperCase.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_trim.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_dateParam.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_param.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_query.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_setDataSource.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_transaction.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_update.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/bundle.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/catch.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/choose.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/contains.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/containsIgnoreCase.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/dateParam.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/endsWith.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/escapeXml.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fmt.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fn.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEach.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEachWithList.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forTokens.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatDate.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatNumber.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/if.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/import.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/index.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/indexOf.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/join.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/length.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/out.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/param.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parse.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseDate.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseNumber.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/query.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryPagination.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryReflect.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/redirect.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/remove.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/requestEncoding.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/set.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setBundle.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setDataSource.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setLocale.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setTimeZone.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sina.xml create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/split.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sql.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/substring.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/timeZone.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/transaction.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/update.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/url.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_choose.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_forEach.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_if.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_out.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_set.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_transform.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/xml.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_choose.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_forEach.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_if.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_out.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_param.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_parse.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_set.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_transform.jsp create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/xml/books.xml create mode 100644 codes/javaee/javaee-jstl/src/main/webapp/xml/style.xsl create mode 100644 codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java create mode 100644 codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/Profiles.java create mode 100644 codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java create mode 100644 codes/javaee/javaee-jstl/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-listener/pom.xml create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/LoginSessionListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionActivationListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionAttributeListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionBindingListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextAttributeListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestAttributeListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/PersonInfoListener.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/bean/PersonInfo.java create mode 100644 codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/util/ApplicationConstants.java create mode 100644 codes/javaee/javaee-listener/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-listener/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 codes/javaee/javaee-listener/src/main/webapp/META-INF/context.xml create mode 100644 codes/javaee/javaee-listener/src/main/webapp/WEB-INF/resources/jsp/index.jsp create mode 100644 codes/javaee/javaee-listener/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-listener/src/main/webapp/a.gif create mode 100644 codes/javaee/javaee-listener/src/main/webapp/aa.html create mode 100644 codes/javaee/javaee-listener/src/main/webapp/active.jsp create mode 100644 codes/javaee/javaee-listener/src/main/webapp/b.gif create mode 100644 codes/javaee/javaee-listener/src/main/webapp/index.jsp create mode 100644 codes/javaee/javaee-listener/src/main/webapp/listener.jsp create mode 100644 codes/javaee/javaee-listener/src/main/webapp/online.jsp create mode 100644 codes/javaee/javaee-listener/src/main/webapp/testLoginSessionListener.jsp create mode 100644 codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java create mode 100644 codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/ListenerDemosBootstrap.java create mode 100644 codes/javaee/javaee-listener/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-oss/pom.xml create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/DsaCoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/HmacCoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/MdCoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/ShaCoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/AESCoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/Base64Demo.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESCoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESedeCoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/PBECoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/RSACoder.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/DownloadPolicy.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/ModifyPolicy.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/TokenUtil.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadConstant.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadPolicy.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/CnblogParser.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/XiamiParser.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/ImageUtil.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/QRCodeUtil.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/BarcodeParamDTO.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/ImageParamDTO.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSHelloWorld.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSReceiver.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSSender.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/JclDemo.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/Slf4jDemo.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/ForwardMail.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailConfigDTO.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailDTO.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailUtil.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendAttachmentMail.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTemplateMail.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTextMail.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/StoreMail.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/sendHtmlMail.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/LoadVelocityDemo.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld2.java create mode 100644 codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityUtil.java create mode 100644 codes/javaee/javaee-oss/src/main/resources/html/example.html create mode 100644 codes/javaee/javaee-oss/src/main/resources/images/lion.jpg create mode 100644 codes/javaee/javaee-oss/src/main/resources/images/lion2.jpg create mode 100644 codes/javaee/javaee-oss/src/main/resources/log4j.xml create mode 100644 codes/javaee/javaee-oss/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-oss/src/main/resources/mail/mail.properties create mode 100644 codes/javaee/javaee-oss/src/main/resources/template/footer.vm create mode 100644 codes/javaee/javaee-oss/src/main/resources/template/header.vm create mode 100644 codes/javaee/javaee-oss/src/main/resources/template/hello.vm create mode 100644 codes/javaee/javaee-oss/src/main/resources/template/mail.vm create mode 100644 codes/javaee/javaee-oss/src/main/resources/template/velocity.properties create mode 100644 codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/html/JsoupTest.java create mode 100644 codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ImageUtilTest.java create mode 100644 codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/QRCodeUtilTest.java create mode 100644 codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ThumbnailatorTest.java create mode 100644 codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/template/VelocityUtilTest.java create mode 100644 codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/test/JUnitExecTest.java create mode 100644 codes/javaee/javaee-oss/src/test/resources/html/jsoup-cookbook.html create mode 100644 codes/javaee/javaee-oss/src/test/resources/images/lion.jpg create mode 100644 codes/javaee/javaee-oss/src/test/resources/images/lion2.jpg create mode 100644 codes/javaee/javaee-oss/src/test/resources/images/lion2_watermark.png create mode 100644 codes/javaee/javaee-oss/src/test/resources/images/wartermark.png create mode 100644 codes/javaee/javaee-oss/src/test/resources/logback.xml create mode 100644 codes/javaee/javaee-servlet/pom.xml create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/AnnotationServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ContextParamServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/FirstServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ForwardServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/HelloServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ImageServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InitParamServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InjectionServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/LifeCycleServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/PostServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RedirectServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RequestServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ThreadSafetyServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/UploadServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/ProgressUploadServlet.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadListener.java create mode 100644 codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadStatus.java create mode 100644 codes/javaee/javaee-servlet/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-servlet/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/notice.html create mode 100644 codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-servlet/src/main/webapp/index.jsp create mode 100644 codes/javaee/javaee-servlet/src/main/webapp/views/jsp/postPersonalInformation.html create mode 100644 codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java create mode 100644 codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/Profiles.java create mode 100644 codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java create mode 100644 codes/javaee/javaee-servlet/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-servlet/src/test/resources/logback.xml create mode 100644 codes/javaee/javaee-session/pom.xml create mode 100644 codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/AddCookies.java create mode 100644 codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/DeleteCookies.java create mode 100644 codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/ReadCookies.java create mode 100644 codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Person.java create mode 100644 codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Topic.java create mode 100644 codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/session/SessionTrackServlet.java create mode 100644 codes/javaee/javaee-session/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-session/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 codes/javaee/javaee-session/src/main/webapp/META-INF/context.xml create mode 100644 codes/javaee/javaee-session/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-session/src/main/webapp/encodeURL.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/index.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/css/style.css create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/images/bg-btn-blue.gif create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/images/cookie.gif create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/images/errorstate.gif create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/images/mail.gif create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/images/vertical_line.gif create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/addCookies.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64_decode.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookie.gif create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookie.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieAttribute.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieDomain.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/encoding.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.js create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/javascript.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/login.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/loginCookie.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/maxAge.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/setCookie.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/session/session.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/session/vote.jsp create mode 100644 codes/javaee/javaee-session/src/main/webapp/views/jsp/session/welcome.jsp create mode 100644 codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java create mode 100644 codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/Profiles.java create mode 100644 codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java create mode 100644 codes/javaee/javaee-session/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-taglib/pom.xml create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/Copyright.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag2.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag3.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/bean/Person.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/function/Function.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/AddTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright2.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/DynamicAttributeTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/HelloTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/IteratorTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/LoopTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/ToLowerCaseTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Column.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Table.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiAttributeTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/RepeatTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/ToUpperCaseTag.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/Messages.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/TestMessage.java create mode 100644 codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/messages.properties create mode 100644 codes/javaee/javaee-taglib/src/main/resources/copyright.properties create mode 100644 codes/javaee/javaee-taglib/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/function.tld create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello.tld create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello2.tld create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello3.tld create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/taglib.tld create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/dynamic.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/function.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/hello.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/I.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/L.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/Lminus.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/Lplus.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/T.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/Thumbs.db create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/Tminus.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/Tplus.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/asc.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/bg-btn-blue.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/bg_4.jpg create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/blank.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/bottom-left.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/bottom-right.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/btn-go-dark.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/delete.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/delimiter.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/desc.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/edit.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/element.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/file.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/foldericon.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/ibm-tab-background.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/ibm_logo.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/left-nav-corner.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/leftnav-overview-highlight.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/line01.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/masthead-links-gradient.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/memo.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/new.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/next.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/openfoldericon.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/pagetools-gradient.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/pagetools_gradient_a.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/password.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/prev.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/project.png create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/pspbrwse.jbf create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/rl-bullet.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/role.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/team.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/template-gradient.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/top-content-shadow.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/top-left.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/top-right.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/images/trans.gif create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/index.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/loop.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/multi.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/multiAttribute.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/style/style.css create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/table.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/taglib/copyright.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag2.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag3.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/test.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/toLowerCase.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/toUpperCase.jsp create mode 100644 codes/javaee/javaee-taglib/src/main/webapp/vote.gif create mode 100644 codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java create mode 100644 codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/Profiles.java create mode 100644 codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java create mode 100644 codes/javaee/javaee-taglib/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-websocket/pom.xml create mode 100644 codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/servlet/SocketServlet.java create mode 100644 codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServer.java create mode 100644 codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServerConfigurator.java create mode 100644 codes/javaee/javaee-websocket/src/main/resources/logback.xml create mode 100644 codes/javaee/javaee-websocket/src/main/webapp/WEB-INF/web.xml create mode 100644 codes/javaee/javaee-websocket/src/main/webapp/websocketA.html create mode 100644 codes/javaee/javaee-websocket/src/main/webapp/websocketB.html create mode 100644 codes/javaee/javaee-websocket/src/test/java/io/github/dunwu/javaee/server/DevServer.java create mode 100644 codes/javaee/javaee-websocket/src/test/resources/jetty/webdefault.xml create mode 100644 codes/javaee/javaee-websocket/src/test/resources/logback.xml create mode 100644 codes/javaee/pom.xml delete mode 100644 codes/javalib/javalib-bean/README.md delete mode 100644 codes/javalib/javalib-bean/pom.xml delete mode 100644 codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/DataDemo.java delete mode 100644 codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/EqualsAndHashCodeDemo.java delete mode 100644 codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/GetterAndSetterDemo.java delete mode 100644 codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/NonNullDemo.java delete mode 100644 codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/Person.java delete mode 100644 codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/ToStringDemo.java delete mode 100644 codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/package-info.java delete mode 100644 codes/javalib/javalib-bean/src/test/java/io/github/dunwu/javalib/lombok/LombokTest.java delete mode 100644 codes/javalib/javalib-cli/pom.xml delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/AnsiSystem.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliDemo.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliUtil.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/SystemInfoUtil.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiBgColor.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiColor.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiElement.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiSgr.java delete mode 100644 codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/Color.java delete mode 100644 codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/CliUtilTests.java delete mode 100644 codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/SystemInfoTest.java delete mode 100644 codes/javalib/javalib-io-binary/pom.xml delete mode 100644 codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/FstDemo.java delete mode 100644 codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/JdkSerializeDemo.java delete mode 100644 codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/KryoDemo.java delete mode 100644 codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/BeanUtils.java delete mode 100644 codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/TestBean.java delete mode 100644 codes/javalib/javalib-io-binary/src/test/java/io/github/dunwu/javalib/io/SerializePerformanceTest.java delete mode 100644 codes/javalib/javalib-io-json/pom.xml delete mode 100644 codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/Group.java delete mode 100644 codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/User.java delete mode 100644 codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/FastjsonFeildBean.java delete mode 100644 codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/JacksonAnnotationBean.java delete mode 100644 codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/GsonAnnotationBean.java delete mode 100644 codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/VersionedClass.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean2.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonCaseTests.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonPerformanceTests.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonCaseTests.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonPerformanceTests.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonPerformanceTests.java delete mode 100644 codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/util/BeanUtils.java delete mode 100644 codes/javalib/javalib-io/pom.xml delete mode 100644 codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/FstDemo.java delete mode 100644 codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/JdkSerializeDemo.java delete mode 100644 codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/bean/Person.java delete mode 100644 codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonAnnotationBean.java delete mode 100644 codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonTests.java delete mode 100644 codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonAnnotationBean.java delete mode 100644 codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonTests.java delete mode 100644 codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/serialize/SerializeTest.java delete mode 100644 codes/javalib/javalib-log/javalib-log-log4j/pom.xml delete mode 100644 codes/javalib/javalib-log/javalib-log-log4j/src/main/java/io/github/dunwu/javalib/log/Log4jDemo.java delete mode 100644 codes/javalib/javalib-log/javalib-log-log4j/src/main/resources/log4j.xml delete mode 100644 codes/javalib/javalib-log/javalib-log-log4j2/pom.xml delete mode 100644 codes/javalib/javalib-log/javalib-log-log4j2/src/main/java/io/github/dunwu/javalib/log/Log4j2Demo.java delete mode 100644 codes/javalib/javalib-log/javalib-log-log4j2/src/main/resources/log4j2.xml delete mode 100644 codes/javalib/javalib-log/javalib-log-logback/src/main/java/io/github/dunwu/javalib/log/LogbackDemo.java delete mode 100644 codes/javalib/javalib-log/javalib-log-logback/src/main/resources/logback.xml delete mode 100644 codes/javalib/javalib-log/pom.xml delete mode 100644 codes/javalib/javalib-mvel/pom.xml delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/BasicRule.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/DefaultRuleEngine.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRule.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRuleSet.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/Rule.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleConstant.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleContext.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngine.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineBuilder.java delete mode 100644 codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineParams.java delete mode 100644 codes/javalib/javalib-mvel/src/main/resources/logback.xml delete mode 100644 codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/ClassTests.java delete mode 100644 codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/SalaryRuleTest.java delete mode 100644 codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/demo.mvel delete mode 100644 codes/javalib/javalib-mvel/src/test/resources/SalaryRule.json delete mode 100644 codes/javalib/javalib-test/pom.xml delete mode 100644 codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/QuickStart.java delete mode 100644 codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/StringBuilderBenchmark.java delete mode 100644 codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Calculator.java delete mode 100644 codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Person.java delete mode 100644 codes/javalib/javalib-test/src/main/resources/logback.xml delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit4/JUnitTest.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssertionsTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssumptionsTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DisplayNameTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DynamicTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/NestedTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/ParameterizedTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/RepeatedTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/StandardTests.java delete mode 100644 codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/mockito/MockitoTest.java delete mode 100644 codes/javalib/javalib-text/pom.xml delete mode 100644 codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/PinyinDemo.java delete mode 100644 codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/WordUtil.java delete mode 100644 codes/javalib/javalib-text/src/test/java/io/github/dunwu/javalib/office/WordUtilTest.java delete mode 100644 codes/javalib/pom.xml delete mode 100644 codes/javatool/javatool-embedded-server/README.md delete mode 100644 codes/javatool/javatool-embedded-server/pom.xml delete mode 100644 codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/HelloController.java delete mode 100644 codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/IndexController.java delete mode 100644 codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/SimpleTomcatServer.java delete mode 100644 codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/TomcatServer.java delete mode 100644 codes/javatool/javatool-embedded-server/src/main/resources/logback.xml delete mode 100644 codes/javatool/javatool-embedded-server/src/main/resources/properties/application-develop.properties delete mode 100644 codes/javatool/javatool-embedded-server/src/main/resources/properties/application-test.properties delete mode 100644 codes/javatool/javatool-embedded-server/src/main/resources/spring/spring-servlet.xml delete mode 100644 codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/server.xml delete mode 100644 codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/web.xml delete mode 100644 codes/javatool/javatool-embedded-server/src/main/webapp/WEB-INF/web.xml delete mode 100644 codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/hello.jsp delete mode 100644 codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/index.jsp delete mode 100644 codes/javatool/javatool-examples/pom.xml delete mode 100644 codes/javatool/javatool-examples/src/main/java/io/github/dunwu/javatool/ElasticDemo.java delete mode 100644 codes/javatool/javatool-examples/src/main/resources/log4j.xml delete mode 100644 codes/javatool/javatool-examples/src/main/resources/logback.xml delete mode 100644 codes/javatool/pom.xml create mode 100644 docs/.remarkrc create mode 100644 docs/.textlint.terms.json create mode 100644 docs/.textlintrc.js create mode 100644 docs/.vuepress/config.js create mode 100644 docs/.vuepress/enhanceApp.js create mode 100644 docs/.vuepress/public/favicon.ico create mode 100644 docs/.vuepress/public/images/dunwu-logo-100.png create mode 100644 docs/.vuepress/public/images/dunwu-logo-200.png create mode 100644 docs/.vuepress/public/images/dunwu-logo-50.png create mode 100644 docs/.vuepress/public/images/dunwu-logo.png delete mode 100644 docs/appendix/README.md delete mode 100644 docs/appendix/resources.md delete mode 100644 docs/book.json delete mode 100644 docs/cover.jpg delete mode 100644 docs/coverpage.md delete mode 100644 docs/index.html create mode 100644 docs/javaee/README.md create mode 100644 docs/javaee/javaee-cookie-sesion.md create mode 100644 docs/javaee/javaee-filter-listener.md create mode 100644 docs/javaee/javaee-interview.md create mode 100644 docs/javaee/javaee-jsp.md create mode 100644 docs/javaee/javaee-servlet.md delete mode 100644 docs/javalib/README.md delete mode 100644 docs/javalib/dozer.md delete mode 100644 docs/javalib/freemark.md delete mode 100644 docs/javalib/javalib-binary.md delete mode 100644 docs/javalib/javalib-json.md delete mode 100644 docs/javalib/javalib-log.md delete mode 100644 docs/javalib/javalib-util.md delete mode 100644 docs/javalib/javamail.md delete mode 100644 docs/javalib/jmh.md delete mode 100644 docs/javalib/jsoup.md delete mode 100644 docs/javalib/junit.md delete mode 100644 docs/javalib/lombok.md delete mode 100644 docs/javalib/mockito.md delete mode 100644 docs/javalib/reflections.md delete mode 100644 docs/javalib/thumbnailator.md delete mode 100644 docs/javalib/zxing.md delete mode 100644 docs/javatool/elastic/README.md delete mode 100644 docs/javatool/elastic/elastic-beats-ops.md delete mode 100644 docs/javatool/elastic/elastic-beats.md delete mode 100644 docs/javatool/elastic/elastic-elasticsearch-ops.md delete mode 100644 docs/javatool/elastic/elastic-elasticsearch.md delete mode 100644 docs/javatool/elastic/elastic-kibana-ops.md delete mode 100644 docs/javatool/elastic/elastic-kibana.md delete mode 100644 docs/javatool/elastic/elastic-logstash-ops.md delete mode 100644 docs/javatool/elastic/elastic-logstash.md delete mode 100644 docs/javatool/elastic/elastic-quickstart.md rename docs/javatool/ide/{intellij.md => intellij-idea.md} (100%) rename docs/javatool/{test => }/jmeter.md (100%) create mode 100644 docs/javatool/monitor/README.md create mode 100644 docs/javatool/monitor/arthas.md create mode 100644 docs/javatool/monitor/skywalking.md delete mode 100644 docs/package-lock.json delete mode 100644 docs/sidebar.md delete mode 100644 prettier.config.js diff --git a/.gitignore b/.gitignore index 4a99239d..83948575 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,7 @@ package-lock.json node_modules # temp folders -build +.temp dist _book _jsdoc diff --git a/README.md b/README.md index 26f15fee..4a6aff5f 100644 --- a/README.md +++ b/README.md @@ -10,77 +10,70 @@

    JavaTutorial

    -> ☕ **JavaTutorial** 是一个 Java 教程,汇集一个老司机在 Java 领域的十年积累。 +> ☕ **java-tutorial** 是一个 Java 教程,汇集一个老司机在 Java 领域的十年积累。 > > - 🔁 项目同步维护:[Github](https://github.com/dunwu/java-tutorial/) | [Gitee](https://gitee.com/turnon/java-tutorial/) > - 📖 电子书阅读:[Github Pages](https://dunwu.github.io/java-tutorial/) | [Gitee Pages](https://turnon.gitee.io/java-tutorial/) -## [JavaLib](docs/javalib/README.md) - -> 各种主流 Java 库的应用。 - -- [Dozer 应用指南](docs/javalib/dozer.md) -- [Freemark 应用指南](docs/javalib/freemark.md) -- [Java 与 JSON](docs/javalib/javalib-json.md) -- [细说 Java 主流日志工具库](docs/javalib/javalib-log.md) -- [细说 Java 主流工具包](docs/javalib/javalib-util.md) -- [JavaMail 应用指南](docs/javalib/javamail.md) -- [Jsoup 应用指南](docs/javalib/jsoup.md) -- [JUnit5 应用指南](docs/javalib/junit.md) -- [Lombok 应用指南](docs/javalib/lombok.md) -- [Mockito 应用指南](docs/javalib/mockito.md) -- [Reflections 应用指南](docs/javalib/reflections.md) -- [Thumbnailator 应用指南](docs/javalib/thumbnailator.md) -- [ZXing 应用指南](docs/javalib/zxing.md) - -## [JavaTool](docs/javatool/README.md) - -> 各种主流 Java 工具的应用。 - -- [构建工具](docs/javatool/build/README.md) - - [Maven 教程 📚](docs/javatool/build/maven/README.md) - - [Maven 快速指南](docs/javatool/build/maven/maven-quickstart.md) - - [Maven 教程之 pom.xml 详解](docs/javatool/build/maven/maven-pom.md) - - [Maven 教程之 settings.xml 详解](docs/javatool/build/maven/maven-settings.md) - - [Maven 实战问题和最佳实践](docs/javatool/build/maven/maven-action.md) - - [Maven 教程之发布 jar 到私服或中央仓库](docs/javatool/build/maven/maven-deploy.md) - - [Maven 插件之代码检查](docs/javatool/build/maven/maven-checkstyle-plugin.md) - - [Ant 简易教程](docs/javatool/build/ant.md) -- [搜索引擎 Elastic](docs/javatool/elastic/README.md) - - [Elastic 技术栈快速入门](docs/javatool/elastic/elastic-quickstart.md) - - [ElasticSearch](docs/javatool/elastic/elastic-elasticsearch.md) - - [Beats](docs/javatool/elastic/elastic-beats.md) - - [Kibana](docs/javatool/elastic/elastic-kibana.md) - - [Logstash](docs/javatool/elastic/elastic-logstash.md) - - [ElasticSearch 运维](docs/javatool/elastic/elastic-elasticsearch-ops.md) - - [Beats 运维](docs/javatool/elastic/elastic-beats-ops.md) - - [Kibana 运维](docs/javatool/elastic/elastic-kibana-ops.md) - - [Logstash 运维](docs/javatool/elastic/elastic-logstash-ops.md) -- [Java IDE](docs/javatool/ide/README.md) - - [Intellij IDEA 应用指南](docs/javatool/ide/intellij.md) - - [Eclipse 应用指南](docs/javatool/ide/eclipse.md) -- **测试** - - [Jmeter 应用指南](docs/javatool/test/jmeter.md) - -## [JavaCore 教程](https://dunwu.github.io/javacore/) - -> Java 核心技术教程。内容包含:Java 基础特性、Java 高级特性、Java 并发、JVM、Java IO 等。 - -## [JavaWeb 教程](https://dunwu.github.io/javaweb/) - -> Java Web 技术教程。内容包含:JavaEE、分布式应用技术等。 - -## [Spring 教程](https://dunwu.github.io/spring-tutorial/) - -> Spring 教程。 - -## [Spring Boot 教程](https://dunwu.github.io/spring-boot-tutorial/) - -> Spring Boot 教程 +## javacore + +> 📚 [javacore](https://dunwu.github.io/javacore/) 是一个 Java 核心技术教程。内容包含:Java 基础特性、Java 高级特性、Java 并发、JVM、Java IO 等。 + +## javaee + +> [☕ JavaEE](docs/javaee/README.md) 技术是 Java Web 的基石 + +- [JavaEE 面经](docs/javaee/javaee-interview.md) +- [JavaEE 之 Servlet 指南](docs/javaee/javaee-servlet.md) +- [JavaEE 之 Jsp 指南](docs/javaee/javaee-jsp.md) +- [JavaEE 之 Filter 和 Listener](docs/javaee/javaee-filter-listener.md) +- [JavaEE 之 Cookie 和 Session](docs/javaee/javaee-cookie-sesion.md) + +## javatech + +> 📚 [javatech](https://dunwu.github.io/javatech/) 是一个 Java 应用技术教程。内容包含 Java 开发中常见应用技术,如:框架、缓存、消息队列、存储、安全、微服务、测试、服务器等。 + +## spring-tutorial + +> 📚 [spring-tutorial](https://dunwu.github.io/spring-tutorial/) 是一个 Spring 实战教程。 + +## spring-boot-tutorial + +> 📚 [Spring Boot 教程](https://dunwu.github.io/spring-boot-tutorial/) 是一个 Spring Boot 实战教程。 + +## javatool + +### 构建 + +> Java 项目需要通过 [**构建工具**](docs/javatool/build) 来管理项目依赖,完成编译、打包、发布、生成 JavaDoc 等任务。 +> +> - 目前最主流的构建工具是 Maven,它的功能非常强大。 +> - Gradle 号称是要替代 Maven 等构件工具,它的版本管理确实简洁,但是需要学习 Groovy,学习成本比 Maven 高。 +> - Ant 功能比 Maven 和 Gradle 要弱,现代 Java 项目基本不用了,但也有一些传统的 Java 项目还在使用。 + +- [Maven](docs/javatool/build/maven) 📚 +- [Ant](docs/javatool/build/ant.md) + +### IDE + +> 自动有了 [**IDE**](docs/javatool/ide),写代码从此就告别了刀耕火种的蛮荒时代。 +> +> - [Eclipse](docs/javatool/ide/eclipse.md) 是久负盛名的开源 Java IDE,我的学生时代一直使用它写 Java。 +> - 曾经抗拒从转 [Intellij Idea](docs/javatool/ide/intellij-idea.md) ,但后来发现真香,不得不说,确实是目前最优秀的 Java IDE。 +> - 你可以在 [vscode](docs/javatool/ide/vscode.md) 中写各种语言,只要安装相应插件即可。如果你的项目中使用了很多种编程语言,又懒得在多个 IDE 之间切换,那么就用 vscode 来一网打尽吧。 + +- [Intellij Idea](docs/javatool/ide/intellij-idea.md) +- [Eclipse](docs/javatool/ide/eclipse.md) +- [vscode](docs/javatool/ide/vscode.md) + +### 监控 + +- [Arthas](docs/javatool/monitor/arthas.md) +- [SkyWalking](docs/javatool/monitor/skywalking.md) --- -## 相关技术栈 +## 其他技术栈 - [db-tutorial](https://dunwu.github.io/db-tutorial/) - 是对数据库领域开发经验的总结。内容包含:关系型数据库和 Nosql 理论、Mysql、Redis 等。 - [algorithm-tutorial](https://dunwu.github.io/algorithm-tutorial/) - 是对数据结构和算法的总结。内容包含:一些基本的数据结构、算法。 diff --git a/assets/eddx/java.eddx b/assets/eddx/java.eddx deleted file mode 100644 index 1fd2673039762adc7b5f7a1c5318d9f399818bda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49877 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�no{xFmjG$RC>u(o0bS2@zv7%R73d<>Mk(Al{ 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 diff --git a/assets/eddx/javalib.eddx b/assets/eddx/javalib.eddx deleted file mode 100644 index cae1e282b653f448fbb198f68633a47bd36829a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17762 zcmc$_b8s(F^Edd7ZQHhO+sRFGW9P=UZQD+6Y}>YN+uZxS&+gXm-Kza_Yip{{^z=E? z-E(@X&zVp4D9V6fQ9ZC);3ROBsDpo)MKt2cn01E&BjBSmatxas4=-sTXl2x=7 z`WaDuIPL^ky$NuFHWK9e#loPV4FYD0uf#=G5~@L>?s_)hqnU+_6*gSY&RnN8XV*$` zt;)yKP>Cwlc_GVs6By%z7+2~RLb5wHGW7}VbCmP_-La0Mf^O-aGjyZ8cQla?d7jWC zvQ0WGd8)*JTQ_U7ZC0~w6Qzj~c^Lo)3~8Y4s4|%WKdd@_C=b%UfkHDT@UDnMqZ3)V zshy^bN+ea$o#3%NzzJo@D+%W+N>}Nx;z_)aeMn!6Mid zKq6?H5!2z8MPvfualq zX^*#{x+N6-!+vYxE9 zHPs!bD`%CEV2T>m7&VxUX8oEk)=cUl$-ZS3V|Jf3h(TCOfK1U#EE%vFSNWii1C*t2 zWOgNRkiF$St|zI}{?}G*X-Q5wRVtd%Z_!zPseGgSA=|OtCfZwjjwjilUK{hqz(Zp`+3v%1s7#t@}iJ6+bzP<>O=S=(Cuq51 z#HPWKkleb6ZYt12Z?iAti7={dhN~4-Ypel4X+su;cx1kef zpMyAUNy7$n?zbNM%I_iL{r(N}Vx<#jM=USJJo&Y9r4-XGd<0Wo-R8UlVryg%-M(L& zPYA;>ykY9qkL4PQ>$LfQJZ`+ZYLe&}PP<>5jK(Rbf- zZp>WwpXDe)ICqufbaB{qUusgL4*R%os)@?~VqeIW5bc>>3uir*DUvZs^Pk zPsdnnUy0wl_+W<_jO2?d&zm07Sz;+`*WdR&1$-VjdL$8S&yEKiHho?tNC71wR~L=X z0w1vg8%y&jmQ=WKQZ8;NkAbLNSaTQd?<9%|M_#z1Q5wMa0lh)9e~ zgq!{-n&dete6cK^{d`^Z z@UOc+o+8y!-)n*1@w$@Bgv5v*9U52S#UI4T!N~<0e{3xPnbaC+q;FAVe(9g_%u*AJ z+#ZkkzQ5J@J|7qUyx$k==nL;@a@|{c#HALUdaXBYVQapI80%0Mi*xKG3UbX=Cns=$n)3# z8*N&x0<2C;B&XGo`aWvMK&5MG!a8C-%EbZ zCA9nAV3(*e#(n+dw*2gU(-8)Zi-h>m`z22%kQF@`t`yp5hYDw9X!kJ+9 zajffauc79Z;19*9eH*%ctGno6+!of@3&JhQYb&_Hdq~<9h7^ z42UC&1h(D}&!oa=-YA8BL=I8k;?Dcf1@~KSq$a{^cRGg|6o!e+*l#A-NYPeAb=6@$ zg-c&dP*}JxZkn8k*ZN){rv1>gM0A58N4?WIiezLQK2hA1l2i2TKZuS)DO{$18flBE zjz1B!5nsMToozS2b{@I_gfn#+w$4C7??8irjm=(5lzAy+hE9nhf zJ8FkLV+v-P3Ud{d;o`~_U(;y`E!D1AhfhyV-4>u?QmRMWsrM6f?D z*XbSL<%6cD{A0=n5z7WG*+NEemt`!qUwG!{hxgQ#R?wR)&p`(xAim)|G=4T(7+t5bK+us(UZP8!1NprRR zb4$G+%(h+6w%xPB`g@_)ruv{8a65;OZAlY=Ggau%JKKR~2xnM!n;qxuZL?C1Y|lhu zAMY%BauB>m`c=X;Pr_L|`w=<{SjTS%_2Y1(Fs6?{31ncA^@)J}K%s80VLTONV0y{Q zodwhHr%YCFSNQPvF_(pN-{>gT!k}9nkQK*pajJ4uZ3?7_d5i0wMKkLy1ph*5FpY`3 z`OrW~P1XCmcb$>W4H~ug3I^j5Sevl!Xpr}Lo;SbiUfr&}8PKV`;%hJv7rQxlwS)Z> z7CI>G^l`f>>}+#c=vf6TQ)8^hw0BKaRl)sRLfGtO&qJ&ON(CtL!fy~F}$HfG@0i$0)dq8KB(mEjH zDwzqIu9Sp`A^YTZTaF)Zvl(qIid$@T-&9m)rk|V?>)^pdq}0p;zBMXj zb@hqZC;}+Wh_GQ_t;|La6>TxLg{SO-I%3B0Tbdq0K_Xyq(wz^dVct&nH_b>v zOVZ2#Bx%#B@5wgyEiBg;q1r*LD_2(GnzsJqw6&sW=netb&#~6nu=*w&oFM4=MSb#OY~N?LVAq zb3j!1a6^lii_BnI#iP4e02+wQu&)k>h6VnFw#}(p!~rTICLWpYCgBb7(l->Y6=9Mt z_bxnP<2>#~$Zb;_wgO-<9JG`bkFsGh9Mt@F^Fq;#YayUVPPn!)6x%b0?2_@y9T5HZ zGCb*6<-1pr?q!dJK|fi)2_n@<%Qu#lv#J&L?QWR2mR-n(5bzg^M?yx!QbCp2$B1jB z-kX?UDJKvWKLsaYHd7FniYL0kF6jy#6Zi*7JyMd&4lxiq9taNElk)d?{rnn^M}B0E zdEDKXbdj-OjY5VOMvv3eCJZn2;;LTkkEsQbqEnmGA|K&OhaD#W zjx!LQUr0?MBT=~RRc?1)ymWKncfoOAfL`}Rk-&I(VG#e)?s;#)4riVH0)N{;jHK^s zgsyQlepS6$xe8r3cOr9KEEZAXMqNoSoMz%G!xvi?5^b#@D{qKNL5+L`5?PI4S>!ra zsZ(J>6>di>)>djqBWToSx?{KA12YQ0OpwG=?})60)J~p{L-Qv1TkxtZqNEcAH$5{v zOIFDlOBsF^8(CK#0&qL#VQ2ApMr9_P3t#5B(z5~*gHr9jzx<+qb%bfEDbJYylUw`^ zzaWzYV?^;{rEis(1qY2P3J2d04)Mn(?rsZ7|M|YdoNa+Fphqh5UH*DaFjmX>_X-g9 zp=+H(U=?jl@l<8+m!kqi7ab>Uha1qPVEEll;1y+Ni%D%Zj8k0b6q_3of6(ELx!lv1 zOOJPjEm_5m6l-MW`cfaE7WojGAbr_J|KpAD_SLI3zsQMKSV%1#;Rd1U0;^7bm&B-K zG~1;(lm-|JL`^^{aB@EVWA>j_g8FBMSy+~P-o1MnCcoq){a?P%)~U&!ku}*-UWG0V z#TcfYSK=UT6L=nje##DOC#ce$CKwBjR#=0NxY{XT^>4V^TI;knJWN7|cBki^P?q~V zLYd74>%cGSNjdqPdZ-tu{9iveR3z@LfXk;&Fjpfeb4p%B;&&+5U1z8(4Er#Ro{&lx z@H>xEgrhG09d3RB-ZOs?-k^&Op4qF8!0x;HDdn#IwM(#^J>nY10lA95B_?P*QVM+f zw8sh!JWqDa~y!%^?#x09O3=wofI9ol`eA^ z7dzxU7PV4}Q@VITY==XjeaGGKMPjs0#2!gIWjGHaRZ+S}bAL`9;W{27I@NJC)+}@3kytY$2L+F;BTUbbw@~|7$UQ@+@z0C4 zh_{xD>n@ZokRJ8x31-*8v~~_9Kvq+y*9T+t2AmtXKLP=agtpWrb470JK?z(|nM&B* z!kem2>l^^e9Ap_9$M~M=)n)_UU4%F0jz~!q`2%wwn~yFfAfTJm5T&kF7}8ex>(8mV zS#)@Jl$j{={6J%W~`m{;%|k5rq9MapDBB~>1z%7HyQU!Z2OSWNPQ%+ zwQADWdzSqD%EBPX-NLt4RY5r3iX1fFNct#df24r@quFtZ!xr$ zAz>OaS4is10eYA^OkE|5EwDFuiMr`)-MYKARq`Gq>9Fh;t%uwm$pm4c?VNnEe@ ze#y0tUq>Um8YL&*8hCPq$i2)LzZw<0k}MdUZN+WFS(-U+!{y|N<7(c3Kje|%qT%77 z(TnV#^7oVOuKc=UCXG%3k$dI1SvEgycHXc6!jS=9ZEO%O_Z0E7^&cjcQ9y$5zXKihyPwc|Kh;IXw4?uX8^eFZFA&F>A`KQw{6CZi zJ|zSHkt%U*|1bng zga+S%Ld!4Gm{1R320jmTes6ME6B4q>hh{;Egn9v=AHesa;tS5kOvL|@DhsKiHO+-g=4P^6Q_!Nvd}Y%s_T|(3y8q2>Ok$v7W}9vp+W~k zMC`Qv8#2#0sJqZIrJUB&*BRpL9Y)X}i;8ujqVty|w#cAN%*F0CJwpx%DI~@xk_eKu zMCaA{nH8Lg1a`iDSAq3&8S;CR8@BCg#>aa6lmn*bWg7d7{l;@LtT172W{#GMoasyW z7qpzuza1{QZ=g>H<9>Irg40??c`EDcz!%sFQ{n9GcSLtb@QcPmfPjgg&}d(`N#_9r zM(-)X`+>V6&zXh<qFvRlDyi$`Ji z)y-4ZpVhM;kpG~5{}bE$-%-C$r4pAJBmlrg8|eRm`Z50(^^; zyY3m~1t7+z13?CmQnon%f?8PM<73%cc;yFlyxjert9_o&k%g#k(9d9mEx zyj(HcehM`GI>`OJh48e#7_R1X2H*DaX02G^cio!v(Mieh=yG{SbWTe4xC&>hf4PYH zvShDXSx4!xj=mc6`2w;$@4_!6uPlmbT$&XqsN=IASy(q;>}ayrU^6EL&V{S)+*oh; zYPZOE+A^Oo^0afj*dwnZ8_B#y9Eho?l<`oJl9@!KtS6_M3i9D?90<4W+C?BjMT#oE zlJ5*>BaEhiFxxtCd+3{V>0M`=tSFOM4Tq^klvYRKv6U_5W+*y+lQ39qm@HhTYA>$%VU{JWhGi&J;y z+4KN=tHaz-%ajj!(|D!uuetK4poa0|#TdXk>AK3=bL=V#1FJahRDUdaz5Ky}5s#N( zT__g2?)v6sJ>U6l-*kUE>+kM(y5}45>(}l)PG{B&sYQwI1@|&%TprX(hu+t>ukSZE zzXnX^%SO5PPpm#b6?;QN^Lgj%A{8O&)pC-;D7J`wUK57L>tX6c;EN>XB5X09r>H|I zl1BtPwx;GvCU#}LL9Z@gQ{#fO>~GH;2?$wLpWc>sQq>qB_j-j#a@)Zsggpc467DYR z_|0^8=%eTRVXMU#Mw#af-_^p9YvE5L0ttqcNSZ2|SPCmkj^?R+?ujbhmWLliN{rL| za~YqVV9Pc8)o=X@c-RX!#%n#RID z#X#R{0E^e=vKeWe&a&|}UXxB^W~mg}qXQy?Q{B3*8|1{3D8#%4P-r->y+--RpFw-) zRCqB)L1%tJXE2bY3nylnScS}3g$X8pZlb>KX>Dr{cMDi)N)xzlW4xoV>yvO?8rjtr@|^_zW3i&?5$q*HgbBqSr+43EJx1o zS=a3YeQ1sj{fT=LD=Y8C+pJo!0w?dvSeCo1lPR@N4U7jB3I5;dmr^4I66oa|3Lz;Y z7?#@j8Jr^u!m@QDAEvvwvgFqoqR>~8zqj_jCQ$`ks_$V?Lg$=}<*bYyJc}56$!0!j z$=}M2^a|ZmO|UuLfV5sit=%|kv$XK8u`lNmvwQf>wRMPk5JDTExw_TRQ9xJC7x~YkXnYOGD@o{R)G)5WQ;=(J{ z=??VF!HG3g(YIiq;(EC-;%;(&Jdtb&g`4|(*MJ(x|J>G+kq!AP8hAWYfSx z#})3lHXyAFN8@>DgjPF`EEjv*UF|{VG-tz-tHi=Xx8SXthgk2y51~w2kX#+uSINl{ z=s+sVQr<*^^f_J>UtL~#7{$MDG1XvMBR$WWgRJ3~PbQrTGYmreOEmM;ca8PRlaclu zu}vJJq-Jq!>PrB-fq?-_h`3tn72EC;W4E`Q;v%N^a+CtYom|UwoZOcr9)cwx7+S=4 zFiE24%@L4_x{x|fB{*ua=7~8v#T4YihyUT6iK~}6jesW~>1#SPN7t*`H(K8?0X25B z$M5l3sw14u$20-PgU!najVm<3zElq&Dicq%M`Zzme*o!cck4!;gB!qJGul8cm;|n-W^{i)g^oSx!cm4DJw2*`{#&pL2!q;KHR2B4S7H_x4FtNfMg3(6okQ*N@qTpE@Y>*U z0J*du9cF3IY({GypIH zdiA+8K^cSGGai4T_{GOR^vfTKU=A|-VFC z2WJ6ofJ0(YdQ?pn>?x~5;^+7ZMXQEdkP|1MRiay1eF#51fD0uok9kHl7EC`pYXTeA z4{ZR;D<42de^i1XytlRggQExBxDNwhOvH~Vhz`*F#ZsR)z9fM@7%O6K`JM%?2qXvw zKm({!0#o-MAo|Gw=#fT2{?Wg4V$cW?KcLs}8yt7{BkQCO3-Y zx}2_X*&$X@#$OheLS%=&9OC8d7UnH>NJ!io@n&SZmoLwg2L8|`*6Ig7={L%s`Oj9vsCoyLVS-Bb_oXJsFaFJE3}cgvOBU3d&R-CX;jMUXgxMEv zD6VPZXQxktS5q`KSMqBwoR5X9S<-$$*df*kdJA1hQKI)%l1_#9ss%RQrX1TY#f7|$ zwpFPhuIzouKWB;fO?_BT#QhQ}59XXGXsQq_476cx@^B@~4@4F1aYm&SGuPQJu`?T# ze_vlXd0srTOGjQvKEmp#T)wc7s>-nSl#+W2d=8VEDk^#^h?}yK)oyObD~hWs(e*T= zd+NC#K=T$FUi&S-`=J{hmeo22E-KJ;R&KSRkz$UV;Jg2hw;NcUxO#9dOa_{AwYW2x ztIr_P15b(jWrzb78*>DFyMa*I1&J3nEZNdZwWyD=&?UMKBDc*-5jwPz?7u>(mXK!>|3qDjV6Do3t3g;9NUcQz;^LSaJVOb4Mi;Ugk=*5mt4 z%>bFquYJG470QrcZh=dZOoDl)(c}4Xl{z%1q!|`7E>lM)i-7>cfqa zFx_X~as+5ov#8=9#63bV2^P7DIAHTwCH!L#W|cn8Xv7PE-R?`VY`p z9kb9eLZ=nYy~ezH~i;<3Dd3|Q*2zW1J46BY%rDYBnZ*P}c63S;^~9zH=nOcovV zmm;<$!_CBM8CZ|7AwH}GQ~G|se_e~zw+h7ERI9#s@WB1huchnFg=?9+x!BA!db4Nw zeFc(oKnH}x`JnAAoRs-XRk{b!j7pO%{_+Svka^R_wMt%7SXN2B$Lci?R&XHM|9qMcX1!m4Z-d@Kcpi+XtTB zpvs`PHPcdQto}Zy8OAX_LX}IwoVLwMQE@I$zEPQpd~gV%XJhWpR8=yBx27OG_Dj>I zVKSpkpe58(7o7~Rw0XkTNJulv1zyZdW^x2B)b8pRoC0E#Xa{0TMFv>HmvQ;MQ3vgS zu(eQI$}9FE^9fEV;UTV{aY0zp7ZiCc;{HqrmjT(tocoQ+&v4l}(gN)sLt~-?QT`!3 zL2vHnyUYT*+=SLmXF&#s8|JYRcdwa5V=Kj;8lQD6p<>D#kV|x|Sl7bhD$O6;k+*@j zCf_~w%haaeC}krxxmwH`JyoxH#|O0cNedrf8N;{duS?c1+hjE%tO0I?>*tG^1TW>P7$^#*IEO2n6i! za#-B(%=%^4-R)Otma>+P)(RYht#R#zI2)SbrmZ0~upBry_IWtB<|M$aRc`~3xdss{ zzFRZu%rKpT2pN}ovzQ?^CVQBL@3g-`Bqdd%fp(6rHfe#sR$$ok32qr%ilAC~lY@KH zl|ic3AJbIP8gh#$jl>kwRA?O8ZWu9G)1I?p^2zcjjhe;z*5dwS^_P+r7Z#aGwH}hr zgj2C9{f;4?vR;}kgHCL>;(y-#W1G;xbfMhH{yA0r&nf9%8X!Y8B3NuUvfX6DlJfWt z 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 示例代码。 diff --git a/codes/java-distributed/README.md b/codes/java-distributed/README.md new file mode 100644 index 00000000..a96b29fe --- /dev/null +++ b/codes/java-distributed/README.md @@ -0,0 +1,3 @@ +# Java 和分布式 + +> 分布式系统中常用算法的 Java 实现方案 diff --git a/codes/javalib/javalib-log/javalib-log-logback/pom.xml b/codes/java-distributed/java-load-balance/pom.xml similarity index 52% rename from codes/javalib/javalib-log/javalib-log-logback/pom.xml rename to codes/java-distributed/java-load-balance/pom.xml index fbe141a3..362b6129 100644 --- a/codes/javalib/javalib-log/javalib-log-logback/pom.xml +++ b/codes/java-distributed/java-load-balance/pom.xml @@ -4,48 +4,35 @@ xmlns="http://maven.apache.org/POM/4.0.0"> 4.0.0 - io.github.dunwu - javalib-log-logback + + io.github.dunwu + dunwu-parent + 0.5.1 + + + io.github.dunwu.javatech + java-distributed-load-balance 1.0.0 - log4j2 示例 + jar + ${project.artifactId} UTF-8 1.8 ${java.version} ${java.version} - 1.2.3 - - - ch.qos.logback - logback-classic - ${logback.version} - - ch.qos.logback - logback-access - ${logback.version} + io.github.dunwu + dunwu-tool-core + 0.5.1 - - junit junit - 4.12 test - - - - - true - src/main/resources - - - - diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/ConsistentHashLoadBalance.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/ConsistentHashLoadBalance.java new file mode 100644 index 00000000..53b4a998 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/ConsistentHashLoadBalance.java @@ -0,0 +1,65 @@ +package io.github.dunwu.javatech; + +import io.github.dunwu.javatech.support.HashStrategy; +import io.github.dunwu.javatech.support.MurmurHashStrategy; + +import java.util.*; + +public class ConsistentHashLoadBalance implements LoadBalance { + + private HashStrategy hashStrategy = new MurmurHashStrategy(); + + private final static int VIRTUAL_NODE_SIZE = 1000; + + private final static String VIRTUAL_NODE_SUFFIX = "&&"; + + private Set nodes = new LinkedHashSet<>(); + + private TreeMap hashRing = new TreeMap<>(); + + @Override + public void buildInList(final Collection collection) { + this.nodes = new LinkedHashSet<>(collection); + this.hashRing = buildConsistentHashRing(this.nodes); + } + + @Override + public void addNode(V node) { + this.nodes.add(node); + this.hashRing = buildConsistentHashRing(this.nodes); + } + + @Override + public void removeNode(V node) { + this.nodes.removeIf(v -> v.equals(node)); + this.hashRing = buildConsistentHashRing(this.nodes); + } + + @Override + public V next() { + return next(UUID.randomUUID().toString()); + } + + public V next(String key) { + int hashCode = hashStrategy.hashCode(key); + // 向右找到第一个 key + Map.Entry entry = hashRing.ceilingEntry(hashCode); + if (entry == null) { + // 想象成一个环,超过尾部则取第一个 key + entry = hashRing.firstEntry(); + } + return entry.getValue(); + } + + private TreeMap buildConsistentHashRing(Set nodes) { + TreeMap hashRing = new TreeMap<>(); + for (V node : nodes) { + for (int i = 0; i < VIRTUAL_NODE_SIZE; i++) { + // 新增虚拟节点的方式如果有影响,也可以抽象出一个由物理节点扩展虚拟节点的类 + hashRing.put(hashStrategy.hashCode(node + VIRTUAL_NODE_SUFFIX + i), node); + } + } + return hashRing; + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/LoadBalance.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/LoadBalance.java new file mode 100644 index 00000000..06dda46e --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/LoadBalance.java @@ -0,0 +1,21 @@ +package io.github.dunwu.javatech; + +import java.util.Collection; + +/** + * 负载均衡策略接口 + * + * @author
    Zhang Peng + * @since 2020-01-21 + */ +public interface LoadBalance { + + void buildInList(Collection collection); + + void addNode(V node); + + void removeNode(V node); + + V next(); + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/Node.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/Node.java new file mode 100644 index 00000000..c6957e5d --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/Node.java @@ -0,0 +1,77 @@ +package io.github.dunwu.javatech; + +import java.util.Objects; + +/** + * 负载均衡节点 + * + * @author Zhang Peng + * @since 2020-01-23 + */ +public class Node implements Comparable { + + public static final Integer DEFAULT_WEIGHT = 1; + + protected String url; + + protected Integer weight; + + public Node(String url) { + this.url = url; + this.weight = DEFAULT_WEIGHT; + } + + public Node(String url, Integer weight) { + this.url = url; + this.weight = weight; + } + + @Override + public int compareTo(Node o) { + return url.compareTo(o.url); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Node)) { + return false; + } + Node node = (Node) o; + return url.equals(node.url); + } + + @Override + public int hashCode() { + return Objects.hash(url); + } + + @Override + public String toString() { + return "Node{" + + "url='" + url + '\'' + + ", weight=" + weight + + '}'; + } + + public String getUrl() { + return url; + } + + public Node setUrl(String url) { + this.url = url; + return this; + } + + public Integer getWeight() { + return weight; + } + + public Node setWeight(Integer weight) { + this.weight = weight; + return this; + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RandomLoadBalance.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RandomLoadBalance.java new file mode 100644 index 00000000..441a0196 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RandomLoadBalance.java @@ -0,0 +1,85 @@ +package io.github.dunwu.javatech; + +import io.github.dunwu.tool.collection.CollectionUtil; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +/** + * (加权)随机负载均衡策略 + * + * @author Zhang Peng + * @see Zhang Peng + * @since 2020-01-20 + */ +public class RandomLoadBalance implements LoadBalance { + + private boolean weightMode; + + private final Random random = ThreadLocalRandom.current(); + + private Set nodes = Collections.emptyNavigableSet(); + + public RandomLoadBalance() { + this.weightMode = false; + } + + public RandomLoadBalance(boolean weightMode) { + this.weightMode = weightMode; + } + + @Override + public void buildInList(final Collection collection) { + this.nodes = new LinkedHashSet<>(collection); + } + + @Override + public void addNode(V node) { + this.nodes.add(node); + } + + @Override + public void removeNode(V node) { + this.nodes.remove(node); + } + + @Override + public V next() { + if (weightMode) { + return getNextInWeightMode(); + } else { + return getNextInNormalMode(); + } + } + + private V getNextInWeightMode() { + if (CollectionUtil.isEmpty(nodes)) { + return null; + } + + List list = new ArrayList<>(); + for (V node : nodes) { + for (int i = 0; i < node.getWeight(); i++) { + list.add(node); + } + } + + int totalWeight = nodes.stream().mapToInt(Node::getWeight).sum(); + int number = random.nextInt(totalWeight); + return list.get(number); + } + + private V getNextInNormalMode() { + if (CollectionUtil.isEmpty(nodes)) { + return null; + } + + int number = random.nextInt(nodes.size()); + Iterator iterator = nodes.iterator(); + while (number-- > 0) { + iterator.next(); + } + return iterator.next(); + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RoundRobinLoadBalance.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RoundRobinLoadBalance.java new file mode 100644 index 00000000..e886a385 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/RoundRobinLoadBalance.java @@ -0,0 +1,87 @@ +package io.github.dunwu.javatech; + +import io.github.dunwu.tool.collection.CollectionUtil; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * (加权)轮询负载均衡策略 + * + * @author Zhang Peng + * @since 2020-01-20 + */ +public class RoundRobinLoadBalance implements LoadBalance { + + private boolean weightMode; + + private AtomicInteger offset = new AtomicInteger(0); + + private Set nodes = Collections.emptyNavigableSet(); + + public RoundRobinLoadBalance() { + this.weightMode = false; + } + + public RoundRobinLoadBalance(boolean weightMode) { + this.weightMode = weightMode; + } + + @Override + public void buildInList(final Collection collection) { + this.offset = new AtomicInteger(0); + this.nodes = new LinkedHashSet<>(collection); + } + + @Override + public void addNode(V node) { + this.nodes.add(node); + } + + @Override + public void removeNode(V node) { + this.nodes.remove(node); + } + + @Override + public V next() { + if (weightMode) { + return getNextInWeightMode(); + } else { + return getNextInNormalMode(); + } + } + + private V getNextInWeightMode() { + if (CollectionUtil.isEmpty(nodes)) { + return null; + } + + int totalWeight = nodes.stream().mapToInt(Node::getWeight).sum(); + int number = offset.getAndIncrement() % totalWeight; + + for (V node : nodes) { + if (node.getWeight() > number) { + return node; + } + number -= node.getWeight(); + } + return null; + } + + private V getNextInNormalMode() { + if (CollectionUtil.isEmpty(this.nodes)) { + return null; + } + + int size = this.nodes.size(); + offset.compareAndSet(size, 0); + int number = offset.getAndIncrement(); + Iterator iterator = nodes.iterator(); + while (number-- > 0) { + iterator.next(); + } + return iterator.next(); + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/package-info.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/package-info.java new file mode 100644 index 00000000..8633bb5a --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/package-info.java @@ -0,0 +1,7 @@ +/** + * 负载均衡算法实现 + * + * @author Zhang Peng + * @since 2020-01-22 + */ +package io.github.dunwu.javatech; diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/CRCHashStrategy.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/CRCHashStrategy.java new file mode 100644 index 00000000..8622bb51 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/CRCHashStrategy.java @@ -0,0 +1,68 @@ +package io.github.dunwu.javatech.support; + +import java.nio.charset.StandardCharsets; + +public class CRCHashStrategy implements HashStrategy { + + private static final int LOOKUP_TABLE[] = { 0x0000, 0x1021, 0x2042, 0x3063, + 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, + 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, + 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, + 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, + 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, + 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, + 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, + 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, + 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, + 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, + 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, + 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, + 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, + 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, + 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, + 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, + 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, + 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, + 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, + 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, + 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, + 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, + 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, + 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, + 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, + 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, + 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, + 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, + 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, + 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, + 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, + 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, }; + + /** + * Create a CRC16 checksum from the bytes. implementation is from mp911de/lettuce, modified with some more + * optimizations + * + * @param bytes + * @return CRC16 as integer value + */ + public static int getCRC16(byte[] bytes) { + int crc = 0x0000; + + for (byte b : bytes) { + crc = ((crc << 8) ^ LOOKUP_TABLE[((crc >>> 8) ^ (b & 0xFF)) & 0xFF]); + } + return crc & 0xFFFF; + } + + public static int getCRC16(String key) { + return getCRC16(key.getBytes(StandardCharsets.UTF_8)); + } + + @Override + public int hashCode(String key) { + // optimization with modulo operator with power of 2 + // equivalent to getCRC16(key) % 16384 + return getCRC16(key) & (16384 - 1); + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/FnvHashStrategy.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/FnvHashStrategy.java new file mode 100644 index 00000000..807f3c33 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/FnvHashStrategy.java @@ -0,0 +1,24 @@ +package io.github.dunwu.javatech.support; + +public class FnvHashStrategy implements HashStrategy { + + private static final long FNV_32_INIT = 2166136261L; + + private static final int FNV_32_PRIME = 16777619; + + @Override + public int hashCode(String key) { + final int p = FNV_32_PRIME; + int hash = (int) FNV_32_INIT; + for (int i = 0; i < key.length(); i++) + hash = (hash ^ key.charAt(i)) * p; + hash += hash << 13; + hash ^= hash >> 7; + hash += hash << 3; + hash ^= hash >> 17; + hash += hash << 5; + hash = Math.abs(hash); + return hash; + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/HashStrategy.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/HashStrategy.java new file mode 100644 index 00000000..2ad6deef --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/HashStrategy.java @@ -0,0 +1,7 @@ +package io.github.dunwu.javatech.support; + +public interface HashStrategy { + + int hashCode(String key); + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/JdkHashCodeStrategy.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/JdkHashCodeStrategy.java new file mode 100644 index 00000000..f4a8389c --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/JdkHashCodeStrategy.java @@ -0,0 +1,10 @@ +package io.github.dunwu.javatech.support; + +public class JdkHashCodeStrategy implements HashStrategy { + + @Override + public int hashCode(String key) { + return key.hashCode(); + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/KetamaHashStrategy.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/KetamaHashStrategy.java new file mode 100644 index 00000000..8e98ef1f --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/KetamaHashStrategy.java @@ -0,0 +1,42 @@ +package io.github.dunwu.javatech.support; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class KetamaHashStrategy implements HashStrategy { + + private static MessageDigest md5Digest; + + static { + try { + md5Digest = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("MD5 not supported", e); + } + } + + @Override + public int hashCode(String key) { + byte[] bKey = computeMd5(key); + long rv = ((long) (bKey[3] & 0xFF) << 24) + | ((long) (bKey[2] & 0xFF) << 16) + | ((long) (bKey[1] & 0xFF) << 8) + | (bKey[0] & 0xFF); + return (int) (rv & 0xffffffffL); + } + + /** + * Get the md5 of the given key. + */ + public static byte[] computeMd5(String k) { + MessageDigest md5; + try { + md5 = (MessageDigest) md5Digest.clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeException("clone of MD5 not supported", e); + } + md5.update(k.getBytes()); + return md5.digest(); + } + +} diff --git a/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/MurmurHashStrategy.java b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/MurmurHashStrategy.java new file mode 100644 index 00000000..a100f3d3 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/main/java/io/github/dunwu/javatech/support/MurmurHashStrategy.java @@ -0,0 +1,51 @@ +package io.github.dunwu.javatech.support; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class MurmurHashStrategy implements HashStrategy { + + @Override + public int hashCode(String key) { + + ByteBuffer buf = ByteBuffer.wrap(key.getBytes()); + int seed = 0x1234ABCD; + + ByteOrder byteOrder = buf.order(); + buf.order(ByteOrder.LITTLE_ENDIAN); + + long m = 0xc6a4a7935bd1e995L; + int r = 47; + + long h = seed ^ (buf.remaining() * m); + + long k; + while (buf.remaining() >= 8) { + k = buf.getLong(); + + k *= m; + k ^= k >>> r; + k *= m; + + h ^= k; + h *= m; + } + + if (buf.remaining() > 0) { + ByteBuffer finish = ByteBuffer.allocate(8).order( + ByteOrder.LITTLE_ENDIAN); + // for big-endian version, do this first: + // finish.position(8-buf.remaining()); + finish.put(buf).rewind(); + h ^= finish.getLong(); + h *= m; + } + h ^= h >>> r; + h *= m; + h ^= h >>> r; + + buf.order(byteOrder); + return (int) (h & 0xffffffffL); + } + +} diff --git a/codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/LoadBalanceTests.java b/codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/LoadBalanceTests.java new file mode 100644 index 00000000..412c74a8 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/LoadBalanceTests.java @@ -0,0 +1,164 @@ +package io.github.dunwu.javatech; + +import org.junit.Test; + +import java.util.*; + +/** + * 负载均衡测试 + * + * @author Zhang Peng + * @since 2020-01-20 + */ +public class LoadBalanceTests { + + /** + * 生成 100 个样本节点,权重值为 10 以内的随机数 + */ + private List initNodes() { + Random random = new Random(); + List nodes = new ArrayList<>(); + for (int i = 1; i <= 100; i++) { + Node node = new Node("192.168.0." + i, random.nextInt(10)); + nodes.add(node); + } + return nodes; + } + + /** + * 统计负载均衡命中次数,样本数为 10000 次访问 + */ + private Map staticLoadBalance(LoadBalance algorithm) { + Map staticMap = new TreeMap<>(); + + for (int i = 0; i < 10000; i++) { + Node node = algorithm.next(); + // System.out.printf(">>>> url = %s\n", node.url); + if (staticMap.containsKey(node)) { + Long value = staticMap.get(node); + staticMap.put(node, ++value); + } else { + staticMap.put(node, 1L); + } + } + + System.out.println("======================= 统计数据 ======================="); + staticMap.forEach((key, value) -> { + System.out.printf("key = %s, value = %s\n", key, value); + }); + System.out.printf("方差:%s, ", StatisticsUtil.variance(staticMap.values().toArray(new Long[0]))); + System.out.printf("标准差:%s\n", StatisticsUtil.standardDeviation(staticMap.values().toArray(new Long[] {}))); + return staticMap; + } + + @Test + public void randomLoadBalanceDistribution() { + List nodes = initNodes(); + + LoadBalance loadBalance = new RandomLoadBalance<>(); + loadBalance.buildInList(nodes); + System.out.println("======================= 随机负载均衡 ======================="); + staticLoadBalance(loadBalance); + + LoadBalance loadBalance2 = new RandomLoadBalance<>(true); + loadBalance2.buildInList(nodes); + System.out.println("======================= 加权随机负载均衡 ======================="); + staticLoadBalance(loadBalance2); + } + + @Test + public void randomLoadBalanceUpdateNodes() { + List oldNodes = initNodes(); + List newNodes = oldNodes.subList(0, 80); + + LoadBalance oldLoadBalance = new RandomLoadBalance<>(); + oldLoadBalance.buildInList(oldNodes); + LoadBalance newLoadBalance = new RandomLoadBalance<>(); + newLoadBalance.buildInList(newNodes); + + double count = 0.0d; + int size = newNodes.size(); + for (int i = 0; i < newNodes.size(); i++) { + Node oldNode = oldLoadBalance.next(); + Node newNode = newLoadBalance.next(); + if (oldNode.equals(newNode)) count++; + } + System.out.println(count / size); + } + + @Test + public void roundRobinLoadBalanceDistribution() { + List nodes = initNodes(); + + LoadBalance loadBalance = new RoundRobinLoadBalance<>(); + loadBalance.buildInList(nodes); + System.out.println("======================= 轮询负载均衡 ======================="); + staticLoadBalance(loadBalance); + + LoadBalance loadBalance2 = new RoundRobinLoadBalance<>(true); + loadBalance2.buildInList(nodes); + System.out.println("======================= 加权轮询负载均衡 ======================="); + staticLoadBalance(loadBalance2); + } + + @Test + public void roundRobinLoadBalanceUpdateNodes() { + List oldNodes = initNodes(); + List newNodes = oldNodes.subList(0, 80); + + LoadBalance oldLoadBalance = new RoundRobinLoadBalance<>(); + oldLoadBalance.buildInList(oldNodes); + LoadBalance newLoadBalance = new RoundRobinLoadBalance<>(); + newLoadBalance.buildInList(newNodes); + + double count = 0.0d; + int size = newNodes.size(); + for (int i = 0; i < newNodes.size(); i++) { + Node oldNode = oldLoadBalance.next(); + Node newNode = newLoadBalance.next(); + if (oldNode.equals(newNode)) count++; + } + System.out.println(count / size); + } + + @Test + public void consistentHashLoadBalanceDistribution() { + LoadBalance loadBalance = new ConsistentHashLoadBalance<>(); + loadBalance.buildInList(initNodes()); + System.out.println("======================= 一致性 Hash 负载均衡 ======================="); + staticLoadBalance(loadBalance); + } + + /** + * 测试节点新增删除后的变化程度 + */ + @Test + public void testNodeAddAndRemove() { + // 构造 10000 随机请求 + List keys = new ArrayList<>(); + for (int i = 0; i < 10000; i++) { + keys.add(UUID.randomUUID().toString()); + } + + List nodes = new ArrayList<>(); + for (int i = 1; i <= 100; i++) { + Node node = new Node("192.168.0." + i); + nodes.add(node); + } + + List newNodes = nodes.subList(0, 80); + ConsistentHashLoadBalance oldLoadBalance = new ConsistentHashLoadBalance<>(); + oldLoadBalance.buildInList(nodes); + ConsistentHashLoadBalance newLoadBalance = new ConsistentHashLoadBalance<>(); + newLoadBalance.buildInList(newNodes); + + int count = 0; + for (String key : keys) { + Node oldNode = oldLoadBalance.next(key); + Node newNode = newLoadBalance.next(key); + if (oldNode.equals(newNode)) count++; + } + System.out.println(count / 10000D); + } + +} diff --git a/codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/StatisticsUtil.java b/codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/StatisticsUtil.java new file mode 100644 index 00000000..be6fafe9 --- /dev/null +++ b/codes/java-distributed/java-load-balance/src/test/java/io/github/dunwu/javatech/StatisticsUtil.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javatech; + +public class StatisticsUtil { + + // 方差 s^2=[(x1-x)^2 +...(xn-x)^2]/n + public static double variance(Long[] array) { + int m = array.length; + double sum = 0; + for (Long item : array) {// 求和 + sum += item; + } + double avg = sum / m;// 求平均值 + double value = 0; + for (Long item : array) {// 求方差 + value += (item - avg) * (item - avg); + } + return value / m; + } + + // 标准差σ=sqrt(s^2) + public static double standardDeviation(Long[] array) { + int m = array.length; + double sum = 0; + for (Long item : array) {// 求和 + sum += item; + } + double avg = sum / m;// 求平均值 + double value = 0; + for (Long item : array) {// 求方差 + value += (item - avg) * (item - avg); + } + return Math.sqrt(value / m); + } + +} diff --git a/codes/java-distributed/pom.xml b/codes/java-distributed/pom.xml new file mode 100644 index 00000000..35fd5860 --- /dev/null +++ b/codes/java-distributed/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + io.github.dunwu.javatech + java-distributed + 1.0.0 + pom + JAVA-DISTRIBUTED + JAVA-DISTRIBUTED 示例源码 + + + java-load-balance + + + diff --git a/codes/javaee/README.md b/codes/javaee/README.md new file mode 100644 index 00000000..7587bd07 --- /dev/null +++ b/codes/javaee/README.md @@ -0,0 +1 @@ +# JavaEE 示例代码 \ No newline at end of file diff --git a/codes/javaee/javaee-filter/pom.xml b/codes/javaee/javaee-filter/pom.xml new file mode 100644 index 00000000..a0f8f7e9 --- /dev/null +++ b/codes/javaee/javaee-filter/pom.xml @@ -0,0 +1,107 @@ + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + javaee-filter + 1.0.0 + war + javaee-filter + JavaEE 学习笔记之 Filter + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + + + org.slf4j + jcl-over-slf4j + + + + + + net.coobird + thumbnailator + + + + + + commons-fileupload + commons-fileupload + + + commons-io + commons-io + + + org.apache.commons + commons-lang3 + + + + + + javax.servlet + javax.servlet-api + provided + + + + + + org.eclipse.jetty + jetty-webapp + test + + + org.eclipse.jetty + jetty-server + test + + + org.eclipse.jetty + jetty-annotations + test + + + org.eclipse.jetty + apache-jsp + test + + + + + + junit + junit + test + + + org.assertj + assertj-core + test + + + + + diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CacheFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CacheFilter.java new file mode 100644 index 00000000..b7bb001a --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CacheFilter.java @@ -0,0 +1,97 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.wrapper.CacheResponseWrapper; + +import java.io.*; +import java.net.URLEncoder; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class CacheFilter extends MyFilter { + + private ServletContext servletContext; + + // 缓存文件夹,使用Tomcat工作目录 + private File temporalDir; + + // 缓存时间,配置在Filter初始化参数中 + private long cacheTime = Long.MAX_VALUE; + + @Override + public void init(FilterConfig filterConfig) { + super.init(filterConfig); + temporalDir = (File) filterConfig.getServletContext().getAttribute("javax.servlet.context.tempdir"); + servletContext = filterConfig.getServletContext(); + cacheTime = new Long(filterConfig.getInitParameter("cacheTime")); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + // 如果为 POST, 则不经过缓存 + if ("POST".equalsIgnoreCase(httpServletRequest.getMethod())) { + chain.doFilter(httpServletRequest, httpServletResponse); + return; + } + + // 请求的 URI + String uri = httpServletRequest.getRequestURI(); + if (uri == null) { + uri = ""; + } + uri = uri.replace(httpServletRequest.getContextPath() + "/", ""); + uri = uri.trim().length() == 0 ? "index.jsp" : uri; + uri = httpServletRequest.getQueryString() == null ? uri : (uri + "?" + httpServletRequest.getQueryString()); + + // 对应的缓存文件 + File cacheFile = new File(temporalDir, URLEncoder.encode(uri, "UTF-8")); + System.out.println(cacheFile); + + // 如果缓存文件不存在 或者已经超出缓存时间 则请求 Servlet + if (!cacheFile.exists() || cacheFile.length() == 0 + || cacheFile.lastModified() < System.currentTimeMillis() - cacheTime) { + + CacheResponseWrapper cacheResponse = new CacheResponseWrapper(httpServletResponse); + + chain.doFilter(httpServletRequest, cacheResponse); + + // 将内容写入缓存文件 + char[] content = cacheResponse.getCacheWriter().toCharArray(); + + temporalDir.mkdirs(); + cacheFile.createNewFile(); + + Writer writer = new OutputStreamWriter(new FileOutputStream(cacheFile), "UTF-8"); + writer.write(content); + writer.close(); + } + + // 请求的ContentType + String mimeType = servletContext.getMimeType(httpServletRequest.getRequestURI()); + httpServletResponse.setContentType(mimeType); + + // 读取缓存文件的内容,写入客户端浏览器 + Reader ins = new InputStreamReader(new FileInputStream(cacheFile), "UTF-8"); + StringBuffer buffer = new StringBuffer(); + char[] cbuf = new char[1024]; + int len; + while ((len = ins.read(cbuf)) > -1) { + buffer.append(cbuf, 0, len); + } + ins.close(); + // 输出到客户端 + httpServletResponse.getWriter().write(buffer.toString()); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CharacterEncodingFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CharacterEncodingFilter.java new file mode 100644 index 00000000..7b90de06 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/CharacterEncodingFilter.java @@ -0,0 +1,65 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.wrapper.UploadRequestWrapper; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class CharacterEncodingFilter extends MyFilter { + + private String characterEncoding; + + private boolean enabled; + + @Override + public void init(FilterConfig config) { + super.init(config); + + characterEncoding = config.getInitParameter("characterEncoding"); + enabled = "true".equalsIgnoreCase(characterEncoding.trim()) || "1".equalsIgnoreCase(characterEncoding.trim()); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + if (enabled || StringUtils.isNotBlank(characterEncoding)) { + request.setCharacterEncoding(characterEncoding); + response.setCharacterEncoding(characterEncoding); + } + + logger.info("系统设置HTTP请求和应答的默认编码为 {}", characterEncoding); + chain.doFilter(request, response); + } + + public static class UploadFilter implements Filter { + + @Override + public void destroy() { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + UploadRequestWrapper uploadRequest = new UploadRequestWrapper((HttpServletRequest) request); + + chain.doFilter(uploadRequest, response); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ExceptionHandlerFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ExceptionHandlerFilter.java new file mode 100644 index 00000000..aba7ca1a --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ExceptionHandlerFilter.java @@ -0,0 +1,48 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.exception.AccountException; +import io.github.dunwu.javaee.filter.exception.BusinessException; +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class ExceptionHandlerFilter extends MyFilter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + try { + chain.doFilter(request, response); + } catch (Exception e) { + logger.info("{} 捕捉到异常", this.getClass().getName()); + Throwable rootCause = e; + + while (rootCause.getCause() != null) { + rootCause = rootCause.getCause(); + } + + String message = rootCause.getMessage(); + + message = message == null ? "异常:" + rootCause.getClass().getName() : message; + + request.setAttribute("message", message); + request.setAttribute("e", e); + + if (rootCause instanceof AccountException) { + request.getRequestDispatcher("/views/jsp/accountException.jsp").forward(request, response); + } else if (rootCause instanceof BusinessException) { + request.getRequestDispatcher("/views/jsp/businessException.jsp").forward(request, response); + } else { + request.getRequestDispatcher("/views/jsp/exception.jsp").forward(request, response); + } + } + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/FilterImpl.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/FilterImpl.java new file mode 100644 index 00000000..7424572d --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/FilterImpl.java @@ -0,0 +1,36 @@ +package io.github.dunwu.javaee.filter; + +import java.io.IOException; +import javax.servlet.*; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class FilterImpl implements Filter { + + private boolean enable; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // 初始化代码 + enable = "true".equals(filterConfig.getInitParameter("enable")); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + System.out.println("befor doFilter(). "); + + chain.doFilter(request, response); + + System.out.println("after doFitler(). "); + } + + @Override + public void destroy() { + // 资源销毁代码 + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/GZipFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/GZipFilter.java new file mode 100644 index 00000000..96a39a07 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/GZipFilter.java @@ -0,0 +1,44 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.wrapper.GZipResponseWrapper; +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class GZipFilter extends MyFilter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + String acceptEncoding = httpServletRequest.getHeader("Accept-Encoding"); + System.out.println("Accept-Encoding: " + acceptEncoding); + + if (acceptEncoding != null && acceptEncoding.toLowerCase().indexOf("gzip") != -1) { + + // 如果客户浏览器支持 GZIP 格式, 则使用 GZIP 压缩数据 + GZipResponseWrapper gzipResponse = new GZipResponseWrapper(httpServletResponse); + chain.doFilter(httpServletRequest, gzipResponse); + + // 输出压缩数据 + gzipResponse.finishResponse(); + } else { + // 否则, 不压缩 + chain.doFilter(httpServletRequest, httpServletResponse); + } + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ImageRedirectFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ImageRedirectFilter.java new file mode 100644 index 00000000..9fca074a --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/ImageRedirectFilter.java @@ -0,0 +1,44 @@ +package io.github.dunwu.javaee.filter; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class ImageRedirectFilter extends MyFilter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + // 禁止缓存 + httpServletResponse.setHeader("Cache-Control", "no-store"); + httpServletResponse.setHeader("Pragrma", "no-cache"); + httpServletResponse.setDateHeader("Expires", 0); + + // 链接来源地址 + String referer = httpServletRequest.getHeader("referer"); + + if (referer == null || !referer.contains(httpServletRequest.getServerName())) { + // 如果 链接地址来自其他网站,则返回错误图片 + httpServletRequest.getRequestDispatcher("/views/images/error.gif").forward(httpServletRequest, + httpServletResponse); + } else { + // 图片正常显示 + chain.doFilter(httpServletRequest, httpServletResponse); + } + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/LogFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/LogFilter.java new file mode 100644 index 00000000..c57eb31e --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/LogFilter.java @@ -0,0 +1,36 @@ +package io.github.dunwu.javaee.filter; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class LogFilter extends MyFilter { + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + + long startTime = System.currentTimeMillis(); + String requestURI = request.getRequestURI(); + + requestURI = request.getQueryString() == null ? requestURI : (requestURI + "?" + request.getQueryString()); + + chain.doFilter(request, response); + + long endTime = System.currentTimeMillis(); + + logger.info("{} 访问了 {},总用时 {} 毫秒", request.getRemoteAddr(), requestURI, (endTime - startTime)); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/MyFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/MyFilter.java new file mode 100644 index 00000000..5c6f76a3 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/MyFilter.java @@ -0,0 +1,36 @@ +package io.github.dunwu.javaee.filter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import javax.servlet.*; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public abstract class MyFilter implements Filter { + + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private String filterName; + + @Override + public void init(FilterConfig filterConfig) { + // 获取 Filter 的 name,配置在 web.xml 中 + filterName = filterConfig.getFilterName(); + logger.info("启动 Filter: {}", filterName); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + } + + @Override + public void destroy() { + logger.info("关闭 Filter: {}", filterName); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/OutputReplaceFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/OutputReplaceFilter.java new file mode 100644 index 00000000..96e6996f --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/OutputReplaceFilter.java @@ -0,0 +1,58 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.wrapper.HttpCharacterResponseWrapper; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Properties; +import javax.servlet.*; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class OutputReplaceFilter extends MyFilter { + + private Properties properties = new Properties(); + + @Override + public void init(FilterConfig filterConfig) { + super.init(filterConfig); + String file = filterConfig.getInitParameter("file"); + String realPath = filterConfig.getServletContext().getRealPath(file); + try { + properties.load(new FileInputStream(realPath)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + // 自定义的 response + HttpCharacterResponseWrapper wrapper = new HttpCharacterResponseWrapper((HttpServletResponse) response); + + // 提交给 Servlet 或者下一个 Filter + chain.doFilter(request, wrapper); + + // 得到缓存在自定义 response 中的输出内容 + String output = wrapper.getCharArrayWriter().toString(); + + // 修改,替换 + for (Object obj : properties.keySet()) { + String key = (String) obj; + output = output.replace(key, properties.getProperty(key)); + } + + // 输出 + PrintWriter out = response.getWriter(); + out.write(output); + out.println(""); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/PrivilegeFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/PrivilegeFilter.java new file mode 100644 index 00000000..37ef77b8 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/PrivilegeFilter.java @@ -0,0 +1,79 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.exception.AccountException; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class PrivilegeFilter extends MyFilter { + + private Properties pp = new Properties(); + + @Override + public void init(FilterConfig config) { + + // 从 初始化参数 中获取权 限配置文件 的位置 + String file = config.getInitParameter("file"); + String realPath = config.getServletContext().getRealPath(file); + try { + pp.load(new FileInputStream(realPath)); + } catch (Exception e) { + config.getServletContext().log("读取权限控制文件失败。", e); + } + } + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + HttpServletRequest request = (HttpServletRequest) req; + + // 获取访问的路径,例如:admin.jsp + String requestURI = request.getRequestURI().replace(request.getContextPath() + "/", ""); + + // 获取 action 参数,例如:add + String action = req.getParameter("action"); + action = action == null ? "" : action; + + // 拼接成 URI。例如:log.do?action=list + String uri = requestURI + "?action=" + action; + + // 从 session 中获取用户权限角色。 + String role = (String) request.getSession(true).getAttribute("role"); + role = role == null ? "guest" : role; + + boolean authentificated = false; + // 开始检查该用户角色是否有权限访问 uri + for (Object obj : pp.keySet()) { + String key = ((String) obj); + // 使用正则表达式验证 需要将 ? . 替换一下,并将通配符 * 处理一下 + if (uri.matches(key.replace("?", "\\?").replace(".", "\\.").replace("*", ".*"))) { + // 如果 role 匹配 + if (role.equals(pp.get(key))) { + authentificated = true; + break; + } + } + } + if (!authentificated) { + throw new RuntimeException(new AccountException("您无权访问该页面。请以合适的身份登陆后查看。")); + } + // 继续运行 + chain.doFilter(req, res); + } + + @Override + public void destroy() { + pp = null; + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/UploadFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/UploadFilter.java new file mode 100644 index 00000000..3ae65193 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/UploadFilter.java @@ -0,0 +1,24 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.wrapper.UploadRequestWrapper; +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +/** + * @author Zhang Peng + * @since 2017-04-04 + */ +public class UploadFilter extends MyFilter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + UploadRequestWrapper uploadRequest = new UploadRequestWrapper((HttpServletRequest) request); + chain.doFilter(uploadRequest, response); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/WaterMarkFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/WaterMarkFilter.java new file mode 100644 index 00000000..836b2065 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/WaterMarkFilter.java @@ -0,0 +1,49 @@ +package io.github.dunwu.javaee.filter; + +import io.github.dunwu.javaee.filter.wrapper.WaterMarkResponseWrapper; + +import java.io.IOException; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class WaterMarkFilter extends MyFilter { + + // 水印图片,配置在初始化参数中 + private String waterMarkFile; + + @Override + public void init(FilterConfig filterConfig) { + super.init(filterConfig); + String file = filterConfig.getInitParameter("waterMarkFile"); + waterMarkFile = filterConfig.getServletContext().getRealPath(file); + } + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + + String requestURI = request.getRequestURI(); + + String originImageFile = request.getServletContext().getRealPath("/") + requestURI; + + // 自定义的response + WaterMarkResponseWrapper waterMarkRes = new WaterMarkResponseWrapper(response, originImageFile, waterMarkFile); + + chain.doFilter(request, waterMarkRes); + + // 打水印,输出到客户端浏览器 + waterMarkRes.finishResponse(); + + logger.info("图片 {} 已添加水印图片 {}", originImageFile, waterMarkFile); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/XSLTFilter.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/XSLTFilter.java new file mode 100644 index 00000000..2e013440 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/XSLTFilter.java @@ -0,0 +1,69 @@ +package io.github.dunwu.javaee.filter; + +import java.io.CharArrayWriter; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +/** + * @author Zhang Peng + * @since 2017/3/28. + */ +public class XSLTFilter extends MyFilter { + + private ServletContext servletContext; + + @Override + public void init(FilterConfig filterConfig) { + super.init(filterConfig); + servletContext = filterConfig.getServletContext(); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + logger.info("{} 开始做过滤处理", this.getClass().getName()); + + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + // 格式样本文件:/book.xsl + Source styleSource = new StreamSource(servletContext.getRealPath("/views/xml/messageLog.xsl")); + + // 请求的 xml 文件 + Source xmlSource = new StreamSource(servletContext + .getRealPath(httpServletRequest.getRequestURI().replace(httpServletRequest.getContextPath() + "", ""))); + try { + + // 转换器工厂 + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + + // 转换器 + Transformer transformer = transformerFactory.newTransformer(styleSource); + + // 将转换的结果保存到该对象中 + CharArrayWriter charArrayWriter = new CharArrayWriter(); + StreamResult result = new StreamResult(charArrayWriter); + + // 转换 + transformer.transform(xmlSource, result); + + // 输出转换后的结果 + httpServletResponse.setContentType("text/html"); + httpServletResponse.setContentLength(charArrayWriter.toString().length()); + PrintWriter out = httpServletResponse.getWriter(); + out.write(charArrayWriter.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/AccountException.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/AccountException.java new file mode 100644 index 00000000..96a6d42b --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/AccountException.java @@ -0,0 +1,11 @@ +package io.github.dunwu.javaee.filter.exception; + +public class AccountException extends Exception { + + private static final long serialVersionUID = -3040955562136599570L; + + public AccountException(String msg) { + super(msg); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/BusinessException.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/BusinessException.java new file mode 100644 index 00000000..c3662556 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/exception/BusinessException.java @@ -0,0 +1,11 @@ +package io.github.dunwu.javaee.filter.exception; + +public class BusinessException extends Exception { + + private static final long serialVersionUID = -3040955562136599570L; + + public BusinessException(String msg) { + super(msg); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/Download.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/Download.java new file mode 100644 index 00000000..26c115bf --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/Download.java @@ -0,0 +1,36 @@ +package io.github.dunwu.javaee.filter.test; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; + +public class Download { + + public static void main(String[] args) throws Exception { + System.out.println(getContent("http://localhost:8080/filter/book/thinkInJava.xml")); + } + + public static String getContent(String url) throws Exception { + + URL r = new URL(url); + + r.openConnection(); + + InputStream ins = r.openStream(); + + Reader reader = new InputStreamReader(ins); + + int len = 0; + char[] tmp = new char[1024]; + + StringBuffer buffer = new StringBuffer(); + + while ((len = reader.read(tmp)) != -1) { + buffer.append(tmp, 0, len); + } + + return buffer.toString(); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/GZipTest.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/GZipTest.java new file mode 100644 index 00000000..9b4899aa --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/test/GZipTest.java @@ -0,0 +1,34 @@ +package io.github.dunwu.javaee.filter.test; + +import java.net.URL; +import java.net.URLConnection; +import java.text.NumberFormat; + +public class GZipTest { + + public static void main(String[] args) throws Exception { + test("http://localhost:8080/filter/dojo/dojo.js"); + test("http://localhost:8080/filter/image.jsp"); + test("http://localhost:8080/filter/winter.jpg"); + } + + public static void test(String url) throws Exception { + + /** 支持 GZIP 的连接 */ + URLConnection connGzip = new URL(url).openConnection(); + connGzip.setRequestProperty("Accept-Encoding", "gzip"); + int lengthGzip = connGzip.getContentLength(); + + /** 不支持 GZIP 的连接 */ + URLConnection connCommon = new URL(url).openConnection(); + int lengthCommon = connCommon.getContentLength(); + + double rate = new Double(lengthGzip) / lengthCommon; + + System.out.println("网址: " + url); + System.out.println("压缩后: " + lengthGzip + " byte, \t压缩前: " + lengthCommon + " byte, \t比率: " + + NumberFormat.getPercentInstance().format(rate)); + System.out.println(); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/CacheResponseWrapper.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/CacheResponseWrapper.java new file mode 100644 index 00000000..79d8bf0c --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/CacheResponseWrapper.java @@ -0,0 +1,44 @@ +package io.github.dunwu.javaee.filter.wrapper; + +import java.io.CharArrayWriter; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class CacheResponseWrapper extends HttpServletResponseWrapper { + + // 缓存字符类输出 + private CharArrayWriter cacheWriter = new CharArrayWriter(); + + public CacheResponseWrapper(HttpServletResponse response) throws IOException { + super(response); + } + + @Override + public PrintWriter getWriter() throws IOException { + return new PrintWriter(cacheWriter); + } + + @Override + public void flushBuffer() throws IOException { + cacheWriter.flush(); + } + + public void finishResponse() throws IOException { + cacheWriter.close(); + } + + public CharArrayWriter getCacheWriter() { + return cacheWriter; + } + + public void setCacheWriter(CharArrayWriter cacheWriter) { + this.cacheWriter = cacheWriter; + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipOutputStream.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipOutputStream.java new file mode 100644 index 00000000..48e1adc1 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipOutputStream.java @@ -0,0 +1,74 @@ +package io.github.dunwu.javaee.filter.wrapper; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPOutputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class GZipOutputStream extends ServletOutputStream { + + private HttpServletResponse response; + + // JDK 自带的压缩数据的类 + private GZIPOutputStream gzipOutputStream; + + // 将压缩后的数据存放到 ByteArrayOutputStream 对象中 + private ByteArrayOutputStream byteArrayOutputStream; + + public GZipOutputStream(HttpServletResponse response) throws IOException { + this.response = response; + byteArrayOutputStream = new ByteArrayOutputStream(); + gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream); + } + + public void write(int b) throws IOException { + gzipOutputStream.write(b); + } + + public void close() throws IOException { + + // 压缩完毕 一定要调用该方法 + gzipOutputStream.finish(); + + // 将压缩后的数据输出到客户端 + byte[] content = byteArrayOutputStream.toByteArray(); + + // 设定压缩方式为 GZIP, 客户端浏览器会自动将数据解压 + response.addHeader("Content-Encoding", "gzip"); + response.addHeader("Content-Length", Integer.toString(content.length)); + + // 输出 + ServletOutputStream out = response.getOutputStream(); + out.write(content); + out.close(); + } + + public void flush() throws IOException { + gzipOutputStream.flush(); + } + + public void write(byte[] b, int off, int len) throws IOException { + gzipOutputStream.write(b, off, len); + } + + public void write(byte[] b) throws IOException { + gzipOutputStream.write(b); + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipResponseWrapper.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipResponseWrapper.java new file mode 100644 index 00000000..f230b860 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/GZipResponseWrapper.java @@ -0,0 +1,61 @@ +package io.github.dunwu.javaee.filter.wrapper; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class GZipResponseWrapper extends HttpServletResponseWrapper { + + // 默认的 response + private HttpServletResponse response; + + // 自定义的 outputStream, 执行close()的时候对数据压缩,并输出 + private GZipOutputStream gzipOutputStream; + + // 自定义 printWriter,将内容输出到 GZipOutputStream 中 + private PrintWriter writer; + + public GZipResponseWrapper(HttpServletResponse response) throws IOException { + super(response); + this.response = response; + } + + public ServletOutputStream getOutputStream() throws IOException { + if (gzipOutputStream == null) { + gzipOutputStream = new GZipOutputStream(response); + } + return gzipOutputStream; + } + + public PrintWriter getWriter() throws IOException { + if (writer == null) { + writer = new PrintWriter(new OutputStreamWriter(new GZipOutputStream(response), "UTF-8")); + } + return writer; + } + + // 压缩后数据长度会发生变化 因此将该方法内容置空 + public void setContentLength(int contentLength) { + } + + public void flushBuffer() throws IOException { + gzipOutputStream.flush(); + } + + public void finishResponse() throws IOException { + if (gzipOutputStream != null) { + gzipOutputStream.close(); + } + if (writer != null) { + writer.close(); + } + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/HttpCharacterResponseWrapper.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/HttpCharacterResponseWrapper.java new file mode 100644 index 00000000..d9798ee2 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/HttpCharacterResponseWrapper.java @@ -0,0 +1,30 @@ +package io.github.dunwu.javaee.filter.wrapper; + +import java.io.CharArrayWriter; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class HttpCharacterResponseWrapper extends HttpServletResponseWrapper { + + private CharArrayWriter charArrayWriter = new CharArrayWriter(); + + public HttpCharacterResponseWrapper(HttpServletResponse response) { + super(response); + } + + @Override + public PrintWriter getWriter() throws IOException { + return new PrintWriter(charArrayWriter); + } + + public CharArrayWriter getCharArrayWriter() { + return charArrayWriter; + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/UploadRequestWrapper.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/UploadRequestWrapper.java new file mode 100644 index 00000000..612bf7c2 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/UploadRequestWrapper.java @@ -0,0 +1,105 @@ +package io.github.dunwu.javaee.filter.wrapper; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.apache.commons.fileupload.DiskFileUpload; +import org.apache.commons.fileupload.FileItem; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class UploadRequestWrapper extends HttpServletRequestWrapper { + + private static final String MULTIPART_HEADER = "Content-type"; + + // 是否是上传文件 + private boolean multipart; + + // map,保存所有的域 + private Map params = new HashMap(); + + @SuppressWarnings("all") + public UploadRequestWrapper(HttpServletRequest request) { + + super(request); + + // 判断是否为上传文件 + multipart = request.getHeader(MULTIPART_HEADER) != null + && request.getHeader(MULTIPART_HEADER).startsWith("multipart/form-data"); + + if (multipart) { + + try { + // 使用apache的工具解析 + DiskFileUpload upload = new DiskFileUpload(); + upload.setHeaderEncoding("utf8"); + + // 解析,获得所有的文本域与文件域 + List fileItems = upload.parseRequest(request); + + for (Iterator it = fileItems.iterator(); it.hasNext(); ) { + + // 遍历 + FileItem item = it.next(); + if (item.isFormField()) { + + // 如果是文本域,直接放到map里 + params.put(item.getFieldName(), item.getString("utf8")); + } else { + + // 否则,为文件,先获取文件名称 + String filename = item.getName().replace("\\", "/"); + filename = filename.substring(filename.lastIndexOf("/") + 1); + + // 保存到系统临时文件夹中 + File file = new File(System.getProperty("java.io.tmpdir"), filename); + + // 保存文件内容 + OutputStream ous = new FileOutputStream(file); + ous.write(item.get()); + ous.close(); + + // 放到map中 + params.put(item.getFieldName(), file); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static void main(String[] args) { + + System.out.println(System.getProperties().toString().replace(", ", "\r\n")); + } + + @Override + public Object getAttribute(String name) { + + // 如果为上传文件,则从map中取值 + if (multipart && params.containsKey(name)) { + return params.get(name); + } + return super.getAttribute(name); + } + + @Override + public String getParameter(String name) { + + // 如果为上传文件,则从map中取值 + if (multipart && params.containsKey(name)) { + return params.get(name).toString(); + } + return super.getParameter(name); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkOutputStream.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkOutputStream.java new file mode 100644 index 00000000..b94322c4 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkOutputStream.java @@ -0,0 +1,55 @@ +package io.github.dunwu.javaee.filter.wrapper; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class WaterMarkOutputStream extends ServletOutputStream { + + // 缓冲图片数据 + private ByteArrayOutputStream byteArrayOutputStream; + + public WaterMarkOutputStream() throws IOException { + byteArrayOutputStream = new ByteArrayOutputStream(); + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + + public void write(int b) throws IOException { + byteArrayOutputStream.write(b); + } + + public void close() throws IOException { + byteArrayOutputStream.close(); + } + + public void flush() throws IOException { + byteArrayOutputStream.flush(); + } + + public void write(byte[] b, int off, int len) throws IOException { + byteArrayOutputStream.write(b, off, len); + } + + public void write(byte[] b) throws IOException { + byteArrayOutputStream.write(b); + } + + public ByteArrayOutputStream getByteArrayOutputStream() { + return byteArrayOutputStream; + } + +} diff --git a/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkResponseWrapper.java b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkResponseWrapper.java new file mode 100644 index 00000000..5f57cca4 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/java/io/github/dunwu/javaee/filter/wrapper/WaterMarkResponseWrapper.java @@ -0,0 +1,60 @@ +package io.github.dunwu.javaee.filter.wrapper; + +import java.awt.image.BufferedImage; +import java.io.FileInputStream; +import java.io.IOException; +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import net.coobird.thumbnailator.Thumbnails; +import net.coobird.thumbnailator.geometry.Positions; + +/** + * @author Zhang Peng + * @since 2017/3/27. + */ +public class WaterMarkResponseWrapper extends HttpServletResponseWrapper { + + private String originFile; + + // 水印图片位置 + private String waterMarkFile; + + // 原response + private HttpServletResponse response; + + // 自定义servletOutputStream,用于缓冲图像数据 + private WaterMarkOutputStream waterMarkOutputStream; + + public WaterMarkResponseWrapper(HttpServletResponse response, String originFile, String waterMarkFile) + throws IOException { + super(response); + this.response = response; + this.originFile = originFile; + this.waterMarkFile = waterMarkFile; + this.waterMarkOutputStream = new WaterMarkOutputStream(); + } + + // 覆盖getOutputStream(),返回自定义的waterMarkOutputStream + public ServletOutputStream getOutputStream() throws IOException { + return waterMarkOutputStream; + } + + public void flushBuffer() throws IOException { + waterMarkOutputStream.flush(); + } + + // 将图像数据打水印,并输出到客户端浏览器 + public void finishResponse() throws IOException { + FileInputStream fileInputStream = new FileInputStream(waterMarkFile); + BufferedImage wartermarkImage = ImageIO.read(fileInputStream); + Thumbnails.Builder builder = Thumbnails.of(this.originFile); + builder.scale(1.0, 1.0); + builder.watermark(Positions.BOTTOM_RIGHT, wartermarkImage, 0.5f); + + // 打水印后的图片数据 + builder.toOutputStream(response.getOutputStream()); + } + +} diff --git a/codes/javaee/javaee-filter/src/main/resources/logback.xml b/codes/javaee/javaee-filter/src/main/resources/logback.xml new file mode 100644 index 00000000..5f9e7061 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/resources/logback.xml @@ -0,0 +1,45 @@ + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + diff --git a/codes/javatool/javatool-embedded-server/src/main/webapp/META-INF/MANIFEST.MF b/codes/javaee/javaee-filter/src/main/webapp/META-INF/MANIFEST.MF similarity index 100% rename from codes/javatool/javatool-embedded-server/src/main/webapp/META-INF/MANIFEST.MF rename to codes/javaee/javaee-filter/src/main/webapp/META-INF/MANIFEST.MF diff --git a/codes/javaee/javaee-filter/src/main/webapp/WEB-INF/logo.png b/codes/javaee/javaee-filter/src/main/webapp/WEB-INF/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..39ac67c335fcd99d244aecd0114e1f7e5347124a GIT binary patch literal 10276 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 + + + javaee-filter + + + + index.jsp + /views/jsp/index.jsp + + + index.jsp + / + + + + dispatcherServlet + /views/jsp/dispatcher.jsp + + + dispatcherServlet + *.do + + + + + + CacheFilter + + io.github.dunwu.javaee.filter.CacheFilter + + + cache + true + + + cacheTime + 1000000 + + + + CacheFilter + *.jsp + *.html + *.do + REQUEST + + + + characterEncodingFilter + + io.github.dunwu.javaee.filter.CharacterEncodingFilter + + + characterEncoding + UTF-8 + + + enable + true + + + + characterEncodingFilter + /* + + + + ExceptionHandlerFilter + + io.github.dunwu.javaee.filter.ExceptionHandlerFilter + + + + ExceptionHandlerFilter + /* + + + + GZipFilter + io.github.dunwu.javaee.filter.GZipFilter + + + GZipFilter + /* + + + + ImageRedirectFilter + + io.github.dunwu.javaee.filter.ImageRedirectFilter + + + + ImageRedirectFilter + /views/images/* + + + + LogFilter + io.github.dunwu.javaee.filter.LogFilter + + + LogFilter + /* + + + + OutputReplaceFilter + + io.github.dunwu.javaee.filter.OutputReplaceFilter + + + file + /WEB-INF/sensitive.properties + + + + OutputReplaceFilter + *.jsp + + + + UploadFilter + io.github.dunwu.javaee.filter.UploadFilter + + + UploadFilter + /* + + + + PrivilegeFilter + + io.github.dunwu.javaee.filter.PrivilegeFilter + + + file + /WEB-INF/privilege.properties + + + + PrivilegeFilter + *.do + + + + WaterMarkFilter + + io.github.dunwu.javaee.filter.WaterMarkFilter + + + waterMarkFile + /WEB-INF/logo.png + + + + WaterMarkFilter + *.jpg + *.png + *.bmp + + + + XSLTFilter + io.github.dunwu.javaee.filter.XSLTFilter + + + XSLTFilter + /views/xml/* + + + + + /views/jsp/index.html + /views/jsp/index.htm + /views/jsp/index.jsp + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/images/error.gif b/codes/javaee/javaee-filter/src/main/webapp/views/images/error.gif new file mode 100644 index 0000000000000000000000000000000000000000..b6922ac11cf64e16a15cf2976cdaa1e40118abed GIT binary patch literal 351 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%0A=1wj1uB0CSAuTbSQcNEAsyU_I2@f&xbxP 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 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/images/sunset.jpg b/codes/javaee/javaee-filter/src/main/webapp/views/images/sunset.jpg new file mode 100644 index 0000000000000000000000000000000000000000..860f6eec2ede6ba1755418558c4455f956950eba GIT binary patch literal 71189 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Μn$q=XvO=xQT> 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 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/images/winter.jpg b/codes/javaee/javaee-filter/src/main/webapp/views/images/winter.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6db32ca1db0a2131eb3ce9940da98970a4c9e689 GIT binary patch literal 105542 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�AJ8IP8Z%y9Oe^@u9?E(GAdhM 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 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/js/dojo.js b/codes/javaee/javaee-filter/src/main/webapp/views/js/dojo.js new file mode 100644 index 00000000..d5a0fc94 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/js/dojo.js @@ -0,0 +1,6812 @@ +/* + Copyright (c) 2004-2006, The Dojo Foundation + All Rights Reserved. + + Licensed under the Academic Free License version 2.1 or above OR the + modified BSD license. For more information on Dojo licensing, see: + + http://dojotoolkit.org/community/licensing.shtml + */ + +/* + This is a compiled version of Dojo, built for deployment and not for + development. To get an editable version, please visit: + + http://dojotoolkit.org + + for documentation and information on getting the source. + */ + +if (typeof dojo == 'undefined') { + var dj_global = this; + var dj_currentContext = this; + + function dj_undef(_1, _2) { + return (typeof (_2 || dj_currentContext)[_1] == 'undefined') + } + + if (dj_undef('djConfig', this)) { + var djConfig = {} + } + if (dj_undef('dojo', this)) { + var dojo = {} + } + dojo.global = function () { + return dj_currentContext + }; + dojo.locale = djConfig.locale; + dojo.version = { + major: 0, + minor: 4, + patch: 3, + flag: '-20070622', + revision: Number('$Rev: 8617 $'.match(/[0-9]+/)[0]), + toString: function () { + with (dojo.version) { + return major + '.' + minor + '.' + patch + flag + ' (' + revision + ')' + } + } + }; + dojo.evalProp = function (_3, _4, _5) { + if ((!_4) || (!_3)) { + return undefined + } + if (!dj_undef(_3, _4)) { + return _4[_3] + } + return (_5 ? (_4[_3] = {}) : undefined) + }; + dojo.parseObjPath = function (_6, _7, _8) { + var _9 = (_7 || dojo.global()); + var _a = _6.split('.'); + var _b = _a.pop(); + for (var i = 0, l = _a.length; i < l && _9; i++) { + _9 = dojo.evalProp(_a[i], _9, _8) + } + return {obj: _9, prop: _b} + }; + dojo.evalObjPath = function (_e, _f) { + if (typeof _e != 'string') { + return dojo.global() + } + if (_e.indexOf('.') == -1) { + return dojo.evalProp(_e, dojo.global(), _f) + } + var ref = dojo.parseObjPath(_e, dojo.global(), _f); + if (ref) { + return dojo.evalProp(ref.prop, ref.obj, _f) + } + return null + }; + dojo.errorToString = function (_11) { + if (!dj_undef('message', _11)) { + return _11.message + } else { + if (!dj_undef('description', _11)) { + return _11.description + } else { + return _11 + } + } + }; + dojo.raise = function (_12, _13) { + if (_13) { + _12 = _12 + ': ' + dojo.errorToString(_13) + } else { + _12 = dojo.errorToString(_12) + } + try { + if (djConfig.isDebug) { + dojo.hostenv.println('FATAL exception raised: ' + _12) + } + } catch (e) { + } + throw _13 || Error(_12) + }; + dojo.debug = function () { + }; + dojo.debugShallow = function (obj) { + }; + dojo.profile = { + start: function () { + }, end: function () { + }, stop: function () { + }, dump: function () { + } + }; + + function dj_eval(_15) { + return dj_global.eval ? dj_global.eval(_15) : eval(_15) + } + + dojo.unimplemented = function (_16, _17) { + var _18 = '\'' + _16 + '\' not implemented'; + if (_17 != null) { + _18 += ' ' + _17 + } + dojo.raise(_18) + }; + dojo.deprecated = function (_19, _1a, _1b) { + var _1c = 'DEPRECATED: ' + _19; + if (_1a) { + _1c += ' ' + _1a + } + if (_1b) { + _1c += ' -- will be removed in version: ' + _1b + } + dojo.debug(_1c) + }; + dojo.render = (function () { + function vscaffold(_1d, _1e) { + var tmp = {capable: false, support: {builtin: false, plugin: false}, prefixes: _1d}; + for (var i = 0; i < _1e.length; i++) { + tmp[_1e[i]] = false + } + return tmp + } + + return { + name: '', + ver: dojo.version, + os: {win: false, linux: false, osx: false}, + html: vscaffold(['html'], ['ie', 'opera', 'khtml', 'safari', 'moz']), + svg: vscaffold(['svg'], ['corel', 'adobe', 'batik']), + vml: vscaffold(['vml'], ['ie']), + swf: vscaffold(['Swf', 'Flash', 'Mm'], ['mm']), + swt: vscaffold(['Swt'], ['ibm']) + } + })(); + dojo.hostenv = (function () { + var _21 = { + isDebug: false, + allowQueryConfig: false, + baseScriptUri: '', + baseRelativePath: '', + libraryScriptUri: '', + iePreventClobber: false, + ieClobberMinimal: true, + preventBackButtonFix: true, + delayMozLoadingFix: false, + searchIds: [], + parseWidgets: true + }; + if (typeof djConfig == 'undefined') { + djConfig = _21 + } else { + for (var _22 in _21) { + if (typeof djConfig[_22] == 'undefined') { + djConfig[_22] = _21[_22] + } + } + } + return { + name_: '(unset)', version_: '(unset)', getName: function () { + return this.name_ + }, getVersion: function () { + return this.version_ + }, getText: function (uri) { + dojo.unimplemented('getText', 'uri=' + uri) + } + } + })(); + dojo.hostenv.getBaseScriptUri = function () { + if (djConfig.baseScriptUri.length) { + return djConfig.baseScriptUri + } + var uri = String(djConfig.libraryScriptUri || djConfig.baseRelativePath); + if (!uri) { + dojo.raise('Nothing returned by getLibraryScriptUri(): ' + uri) + } + var _25 = uri.lastIndexOf('/'); + djConfig.baseScriptUri = djConfig.baseRelativePath; + return djConfig.baseScriptUri + }; + (function () { + var _26 = { + pkgFileName: '__package__', + loading_modules_: {}, + loaded_modules_: {}, + addedToLoadingCount: [], + removedFromLoadingCount: [], + inFlightCount: 0, + modulePrefixes_: {dojo: {name: 'dojo', value: 'src'}}, + setModulePrefix: function (_27, _28) { + this.modulePrefixes_[_27] = {name: _27, value: _28} + }, + moduleHasPrefix: function (_29) { + var mp = this.modulePrefixes_; + return Boolean(mp[_29] && mp[_29].value) + }, + getModulePrefix: function (_2b) { + if (this.moduleHasPrefix(_2b)) { + return this.modulePrefixes_[_2b].value + } + return _2b + }, + getTextStack: [], + loadUriStack: [], + loadedUris: [], + post_load_: false, + modulesLoadedListeners: [], + unloadListeners: [], + loadNotifying: false + }; + for (var _2c in _26) { + dojo.hostenv[_2c] = _26[_2c] + } + })(); + dojo.hostenv.loadPath = function (_2d, _2e, cb) { + var uri; + if (_2d.charAt(0) == '/' || _2d.match(/^\w+:/)) { + uri = _2d + } else { + uri = this.getBaseScriptUri() + _2d + } + if (djConfig.cacheBust && dojo.render.html.capable) { + uri += '?' + String(djConfig.cacheBust).replace(/\W+/g, '') + } + try { + return !_2e ? this.loadUri(uri, cb) : this.loadUriAndCheck(uri, _2e, cb) + } catch (e) { + dojo.debug(e); + return false + } + }; + dojo.hostenv.loadUri = function (uri, cb) { + if (this.loadedUris[uri]) { + return true + } + var _33 = this.getText(uri, null, true); + if (!_33) { + return false + } + this.loadedUris[uri] = true; + if (cb) { + _33 = '(' + _33 + ')' + } + var _34 = dj_eval(_33); + if (cb) { + cb(_34) + } + return true + }; + dojo.hostenv.loadUriAndCheck = function (uri, _36, cb) { + var ok = true; + try { + ok = this.loadUri(uri, cb) + } catch (e) { + dojo.debug('failed loading ', uri, ' with error: ', e) + } + return Boolean(ok && this.findModule(_36, false)) + }; + dojo.loaded = function () { + }; + dojo.unloaded = function () { + }; + dojo.hostenv.loaded = function () { + this.loadNotifying = true; + this.post_load_ = true; + var mll = this.modulesLoadedListeners; + for (var x = 0; x < mll.length; x++) { + mll[x]() + } + this.modulesLoadedListeners = []; + this.loadNotifying = false; + dojo.loaded() + }; + dojo.hostenv.unloaded = function () { + var mll = this.unloadListeners; + while (mll.length) { + (mll.pop())() + } + dojo.unloaded() + }; + dojo.addOnLoad = function (obj, _3d) { + var dh = dojo.hostenv; + if (arguments.length == 1) { + dh.modulesLoadedListeners.push(obj) + } else { + if (arguments.length > 1) { + dh.modulesLoadedListeners.push(function () { + obj[_3d]() + }) + } + } + if (dh.post_load_ && dh.inFlightCount == 0 && !dh.loadNotifying) { + dh.callLoaded() + } + }; + dojo.addOnUnload = function (obj, _40) { + var dh = dojo.hostenv; + if (arguments.length == 1) { + dh.unloadListeners.push(obj) + } else { + if (arguments.length > 1) { + dh.unloadListeners.push(function () { + obj[_40]() + }) + } + } + }; + dojo.hostenv.modulesLoaded = function () { + if (this.post_load_) { + return + } + if (this.loadUriStack.length == 0 && this.getTextStack.length == 0) { + if (this.inFlightCount > 0) { + dojo.debug('files still in flight!'); + return + } + dojo.hostenv.callLoaded() + } + }; + dojo.hostenv.callLoaded = function () { + if (typeof setTimeout == 'object' || (djConfig['useXDomain'] && dojo.render.html.opera)) { + setTimeout('dojo.hostenv.loaded();', 0) + } else { + dojo.hostenv.loaded() + } + }; + dojo.hostenv.getModuleSymbols = function (_42) { + var _43 = _42.split('.'); + for (var i = _43.length; i > 0; i--) { + var _45 = _43.slice(0, i).join('.'); + if ((i == 1) && !this.moduleHasPrefix(_45)) { + _43[0] = '../' + _43[0] + } else { + var _46 = this.getModulePrefix(_45); + if (_46 != _45) { + _43.splice(0, i, _46); + break + } + } + } + return _43 + }; + dojo.hostenv._global_omit_module_check = false; + dojo.hostenv.loadModule = function (_47, _48, _49) { + if (!_47) { + return + } + _49 = this._global_omit_module_check || _49; + var _4a = this.findModule(_47, false); + if (_4a) { + return _4a + } + if (dj_undef(_47, this.loading_modules_)) { + this.addedToLoadingCount.push(_47) + } + this.loading_modules_[_47] = 1; + var _4b = _47.replace(/\./g, '/') + '.js'; + var _4c = _47.split('.'); + var _4d = this.getModuleSymbols(_47); + var _4e = ((_4d[0].charAt(0) != '/') && !_4d[0].match(/^\w+:/)); + var _4f = _4d[_4d.length - 1]; + var ok; + if (_4f == '*') { + _47 = _4c.slice(0, -1).join('.'); + while (_4d.length) { + _4d.pop(); + _4d.push(this.pkgFileName); + _4b = _4d.join('/') + '.js'; + if (_4e && _4b.charAt(0) == '/') { + _4b = _4b.slice(1) + } + ok = this.loadPath(_4b, !_49 ? _47 : null); + if (ok) { + break + } + _4d.pop() + } + } else { + _4b = _4d.join('/') + '.js'; + _47 = _4c.join('.'); + var _51 = !_49 ? _47 : null; + ok = this.loadPath(_4b, _51); + if (!ok && !_48) { + _4d.pop(); + while (_4d.length) { + _4b = _4d.join('/') + '.js'; + ok = this.loadPath(_4b, _51); + if (ok) { + break + } + _4d.pop(); + _4b = _4d.join('/') + '/' + this.pkgFileName + '.js'; + if (_4e && _4b.charAt(0) == '/') { + _4b = _4b.slice(1) + } + ok = this.loadPath(_4b, _51); + if (ok) { + break + } + } + } + if (!ok && !_49) { + dojo.raise('Could not load \'' + _47 + '\'; last tried \'' + _4b + '\'') + } + } + if (!_49 && !this['isXDomain']) { + _4a = this.findModule(_47, false); + if (!_4a) { + dojo.raise('symbol \'' + _47 + '\' is not defined after loading \'' + _4b + '\'') + } + } + return _4a + }; + dojo.hostenv.startPackage = function (_52) { + var _53 = String(_52); + var _54 = _53; + var _55 = _52.split(/\./); + if (_55[_55.length - 1] == '*') { + _55.pop(); + _54 = _55.join('.') + } + var _56 = dojo.evalObjPath(_54, true); + this.loaded_modules_[_53] = _56; + this.loaded_modules_[_54] = _56; + return _56 + }; + dojo.hostenv.findModule = function (_57, _58) { + var lmn = String(_57); + if (this.loaded_modules_[lmn]) { + return this.loaded_modules_[lmn] + } + if (_58) { + dojo.raise('no loaded module named \'' + _57 + '\'') + } + return null + }; + dojo.kwCompoundRequire = function (_5a) { + var _5b = _5a['common'] || []; + var _5c = _5a[dojo.hostenv.name_] ? _5b.concat(_5a[dojo.hostenv.name_] || []) : _5b.concat(_5a['default'] || []); + for (var x = 0; x < _5c.length; x++) { + var _5e = _5c[x]; + if (_5e.constructor == Array) { + dojo.hostenv.loadModule.apply(dojo.hostenv, _5e) + } else { + dojo.hostenv.loadModule(_5e) + } + } + }; + dojo.require = function (_5f) { + dojo.hostenv.loadModule.apply(dojo.hostenv, arguments) + }; + dojo.requireIf = function (_60, _61) { + var _62 = arguments[0]; + if ((_62 === true) || (_62 == 'common') || (_62 && dojo.render[_62].capable)) { + var _63 = []; + for (var i = 1; i < arguments.length; i++) { + _63.push(arguments[i]) + } + dojo.require.apply(dojo, _63) + } + }; + dojo.requireAfterIf = dojo.requireIf; + dojo.provide = function (_65) { + return dojo.hostenv.startPackage.apply(dojo.hostenv, arguments) + }; + dojo.registerModulePath = function (_66, _67) { + return dojo.hostenv.setModulePrefix(_66, _67) + }; + if (djConfig['modulePaths']) { + for (var param in djConfig['modulePaths']) { + dojo.registerModulePath(param, djConfig['modulePaths'][param]) + } + } + dojo.setModulePrefix = function (_68, _69) { + dojo.deprecated('dojo.setModulePrefix("' + _68 + '", "' + _69 + '")', 'replaced by dojo.registerModulePath', '0.5'); + return dojo.registerModulePath(_68, _69) + }; + dojo.exists = function (obj, _6b) { + var p = _6b.split('.'); + for (var i = 0; i < p.length; i++) { + if (!obj[p[i]]) { + return false + } + obj = obj[p[i]] + } + return true + }; + dojo.hostenv.normalizeLocale = function (_6e) { + var _6f = _6e ? _6e.toLowerCase() : dojo.locale; + if (_6f == 'root') { + _6f = 'ROOT' + } + return _6f + }; + dojo.hostenv.searchLocalePath = function (_70, _71, _72) { + _70 = dojo.hostenv.normalizeLocale(_70); + var _73 = _70.split('-'); + var _74 = []; + for (var i = _73.length; i > 0; i--) { + _74.push(_73.slice(0, i).join('-')) + } + _74.push(false); + if (_71) { + _74.reverse() + } + for (var j = _74.length - 1; j >= 0; j--) { + var loc = _74[j] || 'ROOT'; + var _78 = _72(loc); + if (_78) { + break + } + } + }; + dojo.hostenv.localesGenerated; + dojo.hostenv.registerNlsPrefix = function () { + dojo.registerModulePath('nls', 'nls') + }; + dojo.hostenv.preloadLocalizations = function () { + if (dojo.hostenv.localesGenerated) { + dojo.hostenv.registerNlsPrefix(); + + function preload(_79) { + _79 = dojo.hostenv.normalizeLocale(_79); + dojo.hostenv.searchLocalePath(_79, true, function (loc) { + for (var i = 0; i < dojo.hostenv.localesGenerated.length; i++) { + if (dojo.hostenv.localesGenerated[i] == loc) { + dojo['require']('nls.dojo_' + loc); + return true + } + } + return false + }) + } + + preload(); + var _7c = djConfig.extraLocale || []; + for (var i = 0; i < _7c.length; i++) { + preload(_7c[i]) + } + } + dojo.hostenv.preloadLocalizations = function () { + } + }; + dojo.requireLocalization = function (_7e, _7f, _80, _81) { + dojo.hostenv.preloadLocalizations(); + var _82 = dojo.hostenv.normalizeLocale(_80); + var _83 = [_7e, 'nls', _7f].join('.'); + var _84 = ''; + if (_81) { + var _85 = _81.split(','); + for (var i = 0; i < _85.length; i++) { + if (_82.indexOf(_85[i]) == 0) { + if (_85[i].length > _84.length) { + _84 = _85[i] + } + } + } + if (!_84) { + _84 = 'ROOT' + } + } + var _87 = _81 ? _84 : _82; + var _88 = dojo.hostenv.findModule(_83); + var _89 = null; + if (_88) { + if (djConfig.localizationComplete && _88._built) { + return + } + var _8a = _87.replace('-', '_'); + var _8b = _83 + '.' + _8a; + _89 = dojo.hostenv.findModule(_8b) + } + if (!_89) { + _88 = dojo.hostenv.startPackage(_83); + var _8c = dojo.hostenv.getModuleSymbols(_7e); + var _8d = _8c.concat('nls').join('/'); + var _8e; + dojo.hostenv.searchLocalePath(_87, _81, function (loc) { + var _90 = loc.replace('-', '_'); + var _91 = _83 + '.' + _90; + var _92 = false; + if (!dojo.hostenv.findModule(_91)) { + dojo.hostenv.startPackage(_91); + var _93 = [_8d]; + if (loc != 'ROOT') { + _93.push(loc) + } + _93.push(_7f); + var _94 = _93.join('/') + '.js'; + _92 = dojo.hostenv.loadPath(_94, null, function (_95) { + var _96 = function () { + }; + _96.prototype = _8e; + _88[_90] = new _96(); + for (var j in _95) { + _88[_90][j] = _95[j] + } + }) + } else { + _92 = true + } + if (_92 && _88[_90]) { + _8e = _88[_90] + } else { + _88[_90] = _8e + } + if (_81) { + return true + } + }) + } + if (_81 && _82 != _84) { + _88[_82.replace('-', '_')] = _88[_84.replace('-', '_')] + } + }; + (function () { + var _98 = djConfig.extraLocale; + if (_98) { + if (!_98 instanceof Array) { + _98 = [_98] + } + var req = dojo.requireLocalization; + dojo.requireLocalization = function (m, b, _9c, _9d) { + req(m, b, _9c, _9d); + if (_9c) { + return + } + for (var i = 0; i < _98.length; i++) { + req(m, b, _98[i], _9d) + } + } + } + })() +} +if (typeof window != 'undefined') { + (function () { + if (djConfig.allowQueryConfig) { + var _9f = document.location.toString(); + var _a0 = _9f.split('?', 2); + if (_a0.length > 1) { + var _a1 = _a0[1]; + var _a2 = _a1.split('&'); + for (var x in _a2) { + var sp = _a2[x].split('='); + if ((sp[0].length > 9) && (sp[0].substr(0, 9) == 'djConfig.')) { + var opt = sp[0].substr(9); + try { + djConfig[opt] = eval(sp[1]) + } catch (e) { + djConfig[opt] = sp[1] + } + } + } + } + } + if (((djConfig['baseScriptUri'] == '') || (djConfig['baseRelativePath'] == '')) && (document + && document.getElementsByTagName)) { + var _a6 = document.getElementsByTagName('script'); + var _a7 = /(__package__|dojo|bootstrap1)\.js([\?\.]|$)/i; + for (var i = 0; i < _a6.length; i++) { + var src = _a6[i].getAttribute('src'); + if (!src) { + continue + } + var m = src.match(_a7); + if (m) { + var _ab = src.substring(0, m.index); + if (src.indexOf('bootstrap1') > -1) { + _ab += '../' + } + if (!this['djConfig']) { + djConfig = {} + } + if (djConfig['baseScriptUri'] == '') { + djConfig['baseScriptUri'] = _ab + } + if (djConfig['baseRelativePath'] == '') { + djConfig['baseRelativePath'] = _ab + } + break + } + } + } + var dr = dojo.render; + var drh = dojo.render.html; + var drs = dojo.render.svg; + var dua = (drh.UA = navigator.userAgent); + var dav = (drh.AV = navigator.appVersion); + var t = true; + var f = false; + drh.capable = t; + drh.support.builtin = t; + dr.ver = parseFloat(drh.AV); + dr.os.mac = dav.indexOf('Macintosh') >= 0; + dr.os.win = dav.indexOf('Windows') >= 0; + dr.os.linux = dav.indexOf('X11') >= 0; + drh.opera = dua.indexOf('Opera') >= 0; + drh.khtml = (dav.indexOf('Konqueror') >= 0) || (dav.indexOf('Safari') >= 0); + drh.safari = dav.indexOf('Safari') >= 0; + var _b3 = dua.indexOf('Gecko'); + drh.mozilla = drh.moz = (_b3 >= 0) && (!drh.khtml); + if (drh.mozilla) { + drh.geckoVersion = dua.substring(_b3 + 6, _b3 + 14) + } + drh.ie = (document.all) && (!drh.opera); + drh.ie50 = drh.ie && dav.indexOf('MSIE 5.0') >= 0; + drh.ie55 = drh.ie && dav.indexOf('MSIE 5.5') >= 0; + drh.ie60 = drh.ie && dav.indexOf('MSIE 6.0') >= 0; + drh.ie70 = drh.ie && dav.indexOf('MSIE 7.0') >= 0; + var cm = document['compatMode']; + drh.quirks = (cm == 'BackCompat') || (cm == 'QuirksMode') || drh.ie55 || drh.ie50; + dojo.locale = dojo.locale || (drh.ie ? navigator.userLanguage : navigator.language).toLowerCase(); + dr.vml.capable = drh.ie; + drs.capable = f; + drs.support.plugin = f; + drs.support.builtin = f; + var _b5 = window['document']; + var tdi = _b5['implementation']; + if (drh.ie && (window.location.protocol == 'file:')) { + djConfig.ieForceActiveXXhr = true + } + if ((tdi) && (tdi['hasFeature']) && (tdi.hasFeature('org.w3c.dom.svg', '1.0'))) { + drs.capable = t; + drs.support.builtin = t; + drs.support.plugin = f + } + if (drh.safari) { + var tmp = dua.split('AppleWebKit/')[1]; + var ver = parseFloat(tmp.split(' ')[0]); + if (ver >= 420) { + drs.capable = t; + drs.support.builtin = t; + drs.support.plugin = f + } + } else { + } + })(); + dojo.hostenv.startPackage('dojo.hostenv'); + dojo.render.name = dojo.hostenv.name_ = 'browser'; + dojo.hostenv.searchIds = []; + dojo.hostenv._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']; + dojo.hostenv.getXmlhttpObject = function () { + var _b9 = null; + var _ba = null; + if (!dojo.render.html.ie || !djConfig.ieForceActiveXXhr) { + try { + _b9 = new XMLHttpRequest() + } catch (e) { + } + } + if (!_b9) { + for (var i = 0; i < 3; ++i) { + var _bc = dojo.hostenv._XMLHTTP_PROGIDS[i]; + try { + _b9 = new ActiveXObject(_bc) + } catch (e) { + _ba = e + } + if (_b9) { + dojo.hostenv._XMLHTTP_PROGIDS = [_bc]; + break + } + } + } + if (!_b9) { + return dojo.raise('XMLHTTP not available', _ba) + } + return _b9 + }; + dojo.hostenv._blockAsync = false; + dojo.hostenv.getText = function (uri, _be, _bf) { + if (!_be) { + this._blockAsync = true + } + var _c0 = this.getXmlhttpObject(); + + function isDocumentOk(_c1) { + var _c2 = _c1['status']; + return Boolean((!_c2) || ((200 <= _c2) && (300 > _c2)) || (_c2 == 304)) + } + + if (_be) { + var _c3 = this, _c4 = null, gbl = dojo.global(); + var xhr = dojo.evalObjPath('dojo.io.XMLHTTPTransport'); + _c0.onreadystatechange = function () { + if (_c4) { + gbl.clearTimeout(_c4); + _c4 = null + } + if (_c3._blockAsync || (xhr && xhr._blockAsync)) { + _c4 = gbl.setTimeout(function () { + _c0.onreadystatechange.apply(this) + }, 10) + } else { + if (4 == _c0.readyState) { + if (isDocumentOk(_c0)) { + _be(_c0.responseText) + } + } + } + } + } + _c0.open('GET', uri, _be ? true : false); + try { + _c0.send(null); + if (_be) { + return null + } + if (!isDocumentOk(_c0)) { + var err = Error('Unable to load ' + uri + ' status:' + _c0.status); + err.status = _c0.status; + err.responseText = _c0.responseText; + throw err + } + } catch (e) { + this._blockAsync = false; + if ((_bf) && (!_be)) { + return null + } else { + throw e + } + } + this._blockAsync = false; + return _c0.responseText + }; + dojo.hostenv.defaultDebugContainerId = 'dojoDebug'; + dojo.hostenv._println_buffer = []; + dojo.hostenv._println_safe = false; + dojo.hostenv.println = function (_c8) { + if (!dojo.hostenv._println_safe) { + dojo.hostenv._println_buffer.push(_c8) + } else { + try { + var _c9 = document.getElementById(djConfig.debugContainerId ? djConfig.debugContainerId : dojo.hostenv.defaultDebugContainerId); + if (!_c9) { + _c9 = dojo.body() + } + var div = document.createElement('div'); + div.appendChild(document.createTextNode(_c8)); + _c9.appendChild(div) + } catch (e) { + try { + document.write('
    ' + _c8 + '
    ') + } catch (e2) { + window.status = _c8 + } + } + } + }; + dojo.addOnLoad(function () { + dojo.hostenv._println_safe = true; + while (dojo.hostenv._println_buffer.length > 0) { + dojo.hostenv.println(dojo.hostenv._println_buffer.shift()) + } + }); + + function dj_addNodeEvtHdlr(_cb, _cc, fp) { + var _ce = _cb['on' + _cc] || function () { + }; + _cb['on' + _cc] = function () { + fp.apply(_cb, arguments); + _ce.apply(_cb, arguments) + }; + return true + } + + dojo.hostenv._djInitFired = false; + + function dj_load_init(e) { + dojo.hostenv._djInitFired = true; + var _d0 = (e && e.type) ? e.type.toLowerCase() : 'load'; + if (arguments.callee.initialized || (_d0 != 'domcontentloaded' && _d0 != 'load')) { + return + } + arguments.callee.initialized = true; + if (typeof (_timer) != 'undefined') { + clearInterval(_timer); + delete _timer + } + var _d1 = function () { + if (dojo.render.html.ie) { + dojo.hostenv.makeWidgets() + } + }; + if (dojo.hostenv.inFlightCount == 0) { + _d1(); + dojo.hostenv.modulesLoaded() + } else { + dojo.hostenv.modulesLoadedListeners.unshift(_d1) + } + } + + if (document.addEventListener) { + if (dojo.render.html.opera || (dojo.render.html.moz && (djConfig['enableMozDomContentLoaded'] === true))) { + document.addEventListener('DOMContentLoaded', dj_load_init, null) + } + window.addEventListener('load', dj_load_init, null) + } + if (dojo.render.html.ie && dojo.render.os.win) { + document.attachEvent('onreadystatechange', function (e) { + if (document.readyState == 'complete') { + dj_load_init() + } + }) + } + if (/(WebKit|khtml)/i.test(navigator.userAgent)) { + var _timer = setInterval(function () { + if (/loaded|complete/.test(document.readyState)) { + dj_load_init() + } + }, 10) + } + if (dojo.render.html.ie) { + dj_addNodeEvtHdlr(window, 'beforeunload', function () { + dojo.hostenv._unloading = true; + window.setTimeout(function () { + dojo.hostenv._unloading = false + }, 0) + }) + } + dj_addNodeEvtHdlr(window, 'unload', function () { + dojo.hostenv.unloaded(); + if ((!dojo.render.html.ie) || (dojo.render.html.ie && dojo.hostenv._unloading)) { + dojo.hostenv.unloaded() + } + }); + dojo.hostenv.makeWidgets = function () { + var _d3 = []; + if (djConfig.searchIds && djConfig.searchIds.length > 0) { + _d3 = _d3.concat(djConfig.searchIds) + } + if (dojo.hostenv.searchIds && dojo.hostenv.searchIds.length > 0) { + _d3 = _d3.concat(dojo.hostenv.searchIds) + } + if ((djConfig.parseWidgets) || (_d3.length > 0)) { + if (dojo.evalObjPath('dojo.widget.Parse')) { + var _d4 = new dojo.xml.Parse(); + if (_d3.length > 0) { + for (var x = 0; x < _d3.length; x++) { + var _d6 = document.getElementById(_d3[x]); + if (!_d6) { + continue + } + var _d7 = _d4.parseElement(_d6, null, true); + dojo.widget.getParser().createComponents(_d7) + } + } else { + if (djConfig.parseWidgets) { + var _d7 = _d4.parseElement(dojo.body(), null, true); + dojo.widget.getParser().createComponents(_d7) + } + } + } + } + }; + dojo.addOnLoad(function () { + if (!dojo.render.html.ie) { + dojo.hostenv.makeWidgets() + } + }); + try { + if (dojo.render.html.ie) { + document.namespaces.add('v', 'urn:schemas-microsoft-com:vml'); + document.createStyleSheet().addRule('v\\:*', 'behavior:url(#default#VML)') + } + } catch (e) { + } + dojo.hostenv.writeIncludes = function () { + }; + if (!dj_undef('document', this)) { + dj_currentDocument = this.document + } + dojo.doc = function () { + return dj_currentDocument + }; + dojo.body = function () { + return dojo.doc().body || dojo.doc().getElementsByTagName('body')[0] + }; + dojo.byId = function (id, doc) { + if ((id) && ((typeof id == 'string') || (id instanceof String))) { + if (!doc) { + doc = dj_currentDocument + } + var ele = doc.getElementById(id); + if (ele && (ele.id != id) && doc.all) { + ele = null; + eles = doc.all[id]; + if (eles) { + if (eles.length) { + for (var i = 0; i < eles.length; i++) { + if (eles[i].id == id) { + ele = eles[i]; + break + } + } + } else { + ele = eles + } + } + } + return ele + } + return id + }; + dojo.setContext = function (_dc, _dd) { + dj_currentContext = _dc; + dj_currentDocument = _dd + }; + dojo._fireCallback = function (_de, _df, _e0) { + if ((_df) && ((typeof _de == 'string') || (_de instanceof String))) { + _de = _df[_de] + } + return (_df ? _de.apply(_df, _e0 || []) : _de()) + }; + dojo.withGlobal = function (_e1, _e2, _e3, _e4) { + var _e5; + var _e6 = dj_currentContext; + var _e7 = dj_currentDocument; + try { + dojo.setContext(_e1, _e1.document); + _e5 = dojo._fireCallback(_e2, _e3, _e4) + } finally { + dojo.setContext(_e6, _e7) + } + return _e5 + }; + dojo.withDoc = function (_e8, _e9, _ea, _eb) { + var _ec; + var _ed = dj_currentDocument; + try { + dj_currentDocument = _e8; + _ec = dojo._fireCallback(_e9, _ea, _eb) + } finally { + dj_currentDocument = _ed + } + return _ec + } +} +dojo.requireIf((djConfig['isDebug'] || djConfig['debugAtAllCosts']), 'dojo.debug'); +dojo.requireIf(djConfig['debugAtAllCosts'] && !window.widget && !djConfig['useXDomain'], 'dojo.browser_debug'); +dojo.requireIf(djConfig['debugAtAllCosts'] && !window.widget && djConfig['useXDomain'], 'dojo.browser_debug_xd'); +dojo.provide('dojo.string.common'); +dojo.string.trim = function (str, wh) { + if (!str.replace) { + return str + } + if (!str.length) { + return str + } + var re = (wh > 0) ? (/^\s+/) : (wh < 0) ? (/\s+$/) : (/^\s+|\s+$/g); + return str.replace(re, '') +}; +dojo.string.trimStart = function (str) { + return dojo.string.trim(str, 1) +}; +dojo.string.trimEnd = function (str) { + return dojo.string.trim(str, -1) +}; +dojo.string.repeat = function (str, _f4, _f5) { + var out = ''; + for (var i = 0; i < _f4; i++) { + out += str; + if (_f5 && i < _f4 - 1) { + out += _f5 + } + } + return out +}; +dojo.string.pad = function (str, len, c, dir) { + var out = String(str); + if (!c) { + c = '0' + } + if (!dir) { + dir = 1 + } + while (out.length < len) { + if (dir > 0) { + out = c + out + } else { + out += c + } + } + return out +}; +dojo.string.padLeft = function (str, len, c) { + return dojo.string.pad(str, len, c, 1) +}; +dojo.string.padRight = function (str, len, c) { + return dojo.string.pad(str, len, c, -1) +}; +dojo.provide('dojo.string'); +dojo.provide('dojo.lang.common'); +dojo.lang.inherits = function (_103, _104) { + if (!dojo.lang.isFunction(_104)) { + dojo.raise('dojo.inherits: superclass argument [' + _104 + '] must be a function (subclass: [' + _103 + '\']') + } + _103.prototype = new _104(); + _103.prototype.constructor = _103; + _103.superclass = _104.prototype; + _103['super'] = _104.prototype +}; +dojo.lang._mixin = function (obj, _106) { + var tobj = {}; + for (var x in _106) { + if ((typeof tobj[x] == 'undefined') || (tobj[x] != _106[x])) { + obj[x] = _106[x] + } + } + if (dojo.render.html.ie + && (typeof (_106['toString']) == 'function') + && (_106['toString'] != obj['toString']) + && (_106['toString'] != tobj['toString'])) { + obj.toString = _106.toString + } + return obj +}; +dojo.lang.mixin = function (obj, _10a) { + for (var i = 1, l = arguments.length; i < l; i++) { + dojo.lang._mixin(obj, arguments[i]) + } + return obj +}; +dojo.lang.extend = function (_10d, _10e) { + for (var i = 1, l = arguments.length; i < l; i++) { + dojo.lang._mixin(_10d.prototype, arguments[i]) + } + return _10d +}; +dojo.inherits = dojo.lang.inherits; +dojo.mixin = dojo.lang.mixin; +dojo.extend = dojo.lang.extend; +dojo.lang.find = function (_111, _112, _113, _114) { + if (!dojo.lang.isArrayLike(_111) && dojo.lang.isArrayLike(_112)) { + dojo.deprecated('dojo.lang.find(value, array)', 'use dojo.lang.find(array, value) instead', '0.5'); + var temp = _111; + _111 = _112; + _112 = temp + } + var _116 = dojo.lang.isString(_111); + if (_116) { + _111 = _111.split('') + } + if (_114) { + var step = -1; + var i = _111.length - 1; + var end = -1 + } else { + var step = 1; + var i = 0; + var end = _111.length + } + if (_113) { + while (i != end) { + if (_111[i] === _112) { + return i + } + i += step + } + } else { + while (i != end) { + if (_111[i] == _112) { + return i + } + i += step + } + } + return -1 +}; +dojo.lang.indexOf = dojo.lang.find; +dojo.lang.findLast = function (_11a, _11b, _11c) { + return dojo.lang.find(_11a, _11b, _11c, true) +}; +dojo.lang.lastIndexOf = dojo.lang.findLast; +dojo.lang.inArray = function (_11d, _11e) { + return dojo.lang.find(_11d, _11e) > -1 +}; +dojo.lang.isObject = function (it) { + if (typeof it == 'undefined') { + return false + } + return (typeof it == 'object' || it === null || dojo.lang.isArray(it) || dojo.lang.isFunction(it)) +}; +dojo.lang.isArray = function (it) { + return (it && it instanceof Array || typeof it == 'array') +}; +dojo.lang.isArrayLike = function (it) { + if ((!it) || (dojo.lang.isUndefined(it))) { + return false + } + if (dojo.lang.isString(it)) { + return false + } + if (dojo.lang.isFunction(it)) { + return false + } + if (dojo.lang.isArray(it)) { + return true + } + if ((it.tagName) && (it.tagName.toLowerCase() == 'form')) { + return false + } + if (dojo.lang.isNumber(it.length) && isFinite(it.length)) { + return true + } + return false +}; +dojo.lang.isFunction = function (it) { + return (it instanceof Function || typeof it == 'function') +}; +(function () { + if ((dojo.render.html.capable) && (dojo.render.html['safari'])) { + dojo.lang.isFunction = function (it) { + if ((typeof (it) == 'function') && (it == '[object NodeList]')) { + return false + } + return (it instanceof Function || typeof it == 'function') + } + } +})(); +dojo.lang.isString = function (it) { + return (typeof it == 'string' || it instanceof String) +}; +dojo.lang.isAlien = function (it) { + if (!it) { + return false + } + return !dojo.lang.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)) +}; +dojo.lang.isBoolean = function (it) { + return (it instanceof Boolean || typeof it == 'boolean') +}; +dojo.lang.isNumber = function (it) { + return (it instanceof Number || typeof it == 'number') +}; +dojo.lang.isUndefined = function (it) { + return ((typeof (it) == 'undefined') && (it == undefined)) +}; +dojo.provide('dojo.lang.extras'); +dojo.lang.setTimeout = function (func, _12a) { + var _12b = window, _12c = 2; + if (!dojo.lang.isFunction(func)) { + _12b = func; + func = _12a; + _12a = arguments[2]; + _12c++ + } + if (dojo.lang.isString(func)) { + func = _12b[func] + } + var args = []; + for (var i = _12c; i < arguments.length; i++) { + args.push(arguments[i]) + } + return dojo.global().setTimeout(function () { + func.apply(_12b, args) + }, _12a) +}; +dojo.lang.clearTimeout = function (_12f) { + dojo.global().clearTimeout(_12f) +}; +dojo.lang.getNameInObj = function (ns, item) { + if (!ns) { + ns = dj_global + } + for (var x in ns) { + if (ns[x] === item) { + return String(x) + } + } + return null +}; +dojo.lang.shallowCopy = function (obj, deep) { + var i, ret; + if (obj === null) { + return null + } + if (dojo.lang.isObject(obj)) { + ret = new obj.constructor(); + for (i in obj) { + if (dojo.lang.isUndefined(ret[i])) { + ret[i] = deep ? dojo.lang.shallowCopy(obj[i], deep) : obj[i] + } + } + } else { + if (dojo.lang.isArray(obj)) { + ret = []; + for (i = 0; i < obj.length; i++) { + ret[i] = deep ? dojo.lang.shallowCopy(obj[i], deep) : obj[i] + } + } else { + ret = obj + } + } + return ret +}; +dojo.lang.firstValued = function () { + for (var i = 0; i < arguments.length; i++) { + if (typeof arguments[i] != 'undefined') { + return arguments[i] + } + } + return undefined +}; +dojo.lang.getObjPathValue = function (_138, _139, _13a) { + with (dojo.parseObjPath(_138, _139, _13a)) { + return dojo.evalProp(prop, obj, _13a) + } +}; +dojo.lang.setObjPathValue = function (_13b, _13c, _13d, _13e) { + dojo.deprecated('dojo.lang.setObjPathValue', 'use dojo.parseObjPath and the \'=\' operator', '0.6'); + if (arguments.length < 4) { + _13e = true + } + with (dojo.parseObjPath(_13b, _13d, _13e)) { + if (obj && (_13e || (prop in obj))) { + obj[prop] = _13c + } + } +}; +dojo.provide('dojo.io.common'); +dojo.io.transports = []; +dojo.io.hdlrFuncNames = ['load', 'error', 'timeout']; +dojo.io.Request = function (url, _140, _141, _142) { + if ((arguments.length == 1) && (arguments[0].constructor == Object)) { + this.fromKwArgs(arguments[0]) + } else { + this.url = url; + if (_140) { + this.mimetype = _140 + } + if (_141) { + this.transport = _141 + } + if (arguments.length >= 4) { + this.changeUrl = _142 + } + } +}; +dojo.lang.extend(dojo.io.Request, { + url: '', + mimetype: 'text/plain', + method: 'GET', + content: undefined, + transport: undefined, + changeUrl: undefined, + formNode: undefined, + sync: false, + bindSuccess: false, + useCache: false, + preventCache: false, + jsonFilter: function (_143) { + if ((this.mimetype == 'text/json-comment-filtered') || (this.mimetype == 'application/json-comment-filtered')) { + var _144 = _143.indexOf('/*'); + var _145 = _143.lastIndexOf('*/'); + if ((_144 == -1) || (_145 == -1)) { + dojo.debug('your JSON wasn\'t comment filtered!'); + return '' + } + return _143.substring(_144 + 2, _145) + } + dojo.debug('please consider using a mimetype of text/json-comment-filtered to avoid potential security issues with JSON endpoints'); + return _143 + }, + load: function (type, data, _148, _149) { + }, + error: function (type, _14b, _14c, _14d) { + }, + timeout: function (type, _14f, _150, _151) { + }, + handle: function (type, data, _154, _155) { + }, + timeoutSeconds: 0, + abort: function () { + }, + fromKwArgs: function (_156) { + if (_156['url']) { + _156.url = _156.url.toString() + } + if (_156['formNode']) { + _156.formNode = dojo.byId(_156.formNode) + } + if (!_156['method'] && _156['formNode'] && _156['formNode'].method) { + _156.method = _156['formNode'].method + } + if (!_156['handle'] && _156['handler']) { + _156.handle = _156.handler + } + if (!_156['load'] && _156['loaded']) { + _156.load = _156.loaded + } + if (!_156['changeUrl'] && _156['changeURL']) { + _156.changeUrl = _156.changeURL + } + _156.encoding = dojo.lang.firstValued(_156['encoding'], djConfig['bindEncoding'], ''); + _156.sendTransport = dojo.lang.firstValued(_156['sendTransport'], djConfig['ioSendTransport'], false); + var _157 = dojo.lang.isFunction; + for (var x = 0; x < dojo.io.hdlrFuncNames.length; x++) { + var fn = dojo.io.hdlrFuncNames[x]; + if (_156[fn] && _157(_156[fn])) { + continue + } + if (_156['handle'] && _157(_156['handle'])) { + _156[fn] = _156.handle + } + } + dojo.lang.mixin(this, _156) + } +}); +dojo.io.Error = function (msg, type, num) { + this.message = msg; + this.type = type || 'unknown'; + this.number = num || 0 +}; +dojo.io.transports.addTransport = function (name) { + this.push(name); + this[name] = dojo.io[name] +}; +dojo.io.bind = function (_15e) { + if (!(_15e instanceof dojo.io.Request)) { + try { + _15e = new dojo.io.Request(_15e) + } catch (e) { + dojo.debug(e) + } + } + var _15f = ''; + if (_15e['transport']) { + _15f = _15e['transport']; + if (!this[_15f]) { + dojo.io.sendBindError(_15e, 'No dojo.io.bind() transport with name \'' + _15e['transport'] + '\'.'); + return _15e + } + if (!this[_15f].canHandle(_15e)) { + dojo.io.sendBindError(_15e, 'dojo.io.bind() transport with name \'' + + _15e['transport'] + + '\' cannot handle this type of request.'); + return _15e + } + } else { + for (var x = 0; x < dojo.io.transports.length; x++) { + var tmp = dojo.io.transports[x]; + if ((this[tmp]) && (this[tmp].canHandle(_15e))) { + _15f = tmp; + break + } + } + if (_15f == '') { + dojo.io.sendBindError(_15e, 'None of the loaded transports for dojo.io.bind()' + ' can handle the request.'); + return _15e + } + } + this[_15f].bind(_15e); + _15e.bindSuccess = true; + return _15e +}; +dojo.io.sendBindError = function (_162, _163) { + if ((typeof _162.error == 'function' || typeof _162.handle == 'function') && (typeof setTimeout + == 'function' + || typeof setTimeout + == 'object')) { + var _164 = new dojo.io.Error(_163); + setTimeout(function () { + _162[(typeof _162.error == 'function') ? 'error' : 'handle']('error', _164, null, _162) + }, 50) + } else { + dojo.raise(_163) + } +}; +dojo.io.queueBind = function (_165) { + if (!(_165 instanceof dojo.io.Request)) { + try { + _165 = new dojo.io.Request(_165) + } catch (e) { + dojo.debug(e) + } + } + var _166 = _165.load; + _165.load = function () { + dojo.io._queueBindInFlight = false; + var ret = _166.apply(this, arguments); + dojo.io._dispatchNextQueueBind(); + return ret + }; + var _168 = _165.error; + _165.error = function () { + dojo.io._queueBindInFlight = false; + var ret = _168.apply(this, arguments); + dojo.io._dispatchNextQueueBind(); + return ret + }; + dojo.io._bindQueue.push(_165); + dojo.io._dispatchNextQueueBind(); + return _165 +}; +dojo.io._dispatchNextQueueBind = function () { + if (!dojo.io._queueBindInFlight) { + dojo.io._queueBindInFlight = true; + if (dojo.io._bindQueue.length > 0) { + dojo.io.bind(dojo.io._bindQueue.shift()) + } else { + dojo.io._queueBindInFlight = false + } + } +}; +dojo.io._bindQueue = []; +dojo.io._queueBindInFlight = false; +dojo.io.argsFromMap = function (map, _16b, last) { + var enc = /utf/i.test(_16b || '') ? encodeURIComponent : dojo.string.encodeAscii; + var _16e = []; + var _16f = {}; + for (var name in map) { + var _171 = function (elt) { + var val = enc(name) + '=' + enc(elt); + _16e[(last == name) ? 'push' : 'unshift'](val) + }; + if (!_16f[name]) { + var _174 = map[name]; + if (dojo.lang.isArray(_174)) { + dojo.lang.forEach(_174, _171) + } else { + _171(_174) + } + } + } + return _16e.join('&') +}; +dojo.io.setIFrameSrc = function (_175, src, _177) { + try { + var r = dojo.render.html; + if (!_177) { + if (r.safari) { + _175.location = src + } else { + frames[_175.name].location = src + } + } else { + var idoc; + if (r.ie) { + idoc = _175.contentWindow.document + } else { + if (r.safari) { + idoc = _175.document + } else { + idoc = _175.contentWindow + } + } + if (!idoc) { + _175.location = src; + + } else { + idoc.location.replace(src) + } + } + } catch (e) { + dojo.debug(e); + dojo.debug('setIFrameSrc: ' + e) + } +}; +dojo.provide('dojo.lang.array'); +dojo.lang.mixin(dojo.lang, { + has: function (obj, name) { + try { + return typeof obj[name] != 'undefined' + } catch (e) { + return false + } + }, isEmpty: function (obj) { + if (dojo.lang.isObject(obj)) { + var tmp = {}; + var _17e = 0; + for (var x in obj) { + if (obj[x] && (!tmp[x])) { + _17e++; + break + } + } + return _17e == 0 + } else { + if (dojo.lang.isArrayLike(obj) || dojo.lang.isString(obj)) { + return obj.length == 0 + } + } + }, map: function (arr, obj, _182) { + var _183 = dojo.lang.isString(arr); + if (_183) { + arr = arr.split('') + } + if (dojo.lang.isFunction(obj) && (!_182)) { + _182 = obj; + obj = dj_global + } else { + if (dojo.lang.isFunction(obj) && _182) { + var _184 = obj; + obj = _182; + _182 = _184 + } + } + if (Array.map) { + var _185 = Array.map(arr, _182, obj) + } else { + var _185 = []; + for (var i = 0; i < arr.length; ++i) { + _185.push(_182.call(obj, arr[i])) + } + } + if (_183) { + return _185.join('') + } else { + return _185 + } + }, reduce: function (arr, _188, obj, _18a) { + var _18b = _188; + if (arguments.length == 2) { + _18a = _188; + _18b = arr[0]; + arr = arr.slice(1) + } else { + if (arguments.length == 3) { + if (dojo.lang.isFunction(obj)) { + _18a = obj; + obj = null + } + } else { + if (dojo.lang.isFunction(obj)) { + var tmp = _18a; + _18a = obj; + obj = tmp + } + } + } + var ob = obj || dj_global; + dojo.lang.map(arr, function (val) { + _18b = _18a.call(ob, _18b, val) + }); + return _18b + }, forEach: function (_18f, _190, _191) { + if (dojo.lang.isString(_18f)) { + _18f = _18f.split('') + } + if (Array.forEach) { + Array.forEach(_18f, _190, _191) + } else { + if (!_191) { + _191 = dj_global + } + for (var i = 0, l = _18f.length; i < l; i++) { + _190.call(_191, _18f[i], i, _18f) + } + } + }, _everyOrSome: function (_194, arr, _196, _197) { + if (dojo.lang.isString(arr)) { + arr = arr.split('') + } + if (Array.every) { + return Array[_194 ? 'every' : 'some'](arr, _196, _197) + } else { + if (!_197) { + _197 = dj_global + } + for (var i = 0, l = arr.length; i < l; i++) { + var _19a = _196.call(_197, arr[i], i, arr); + if (_194 && !_19a) { + return false + } else { + if ((!_194) && (_19a)) { + return true + } + } + } + return Boolean(_194) + } + }, every: function (arr, _19c, _19d) { + return this._everyOrSome(true, arr, _19c, _19d) + }, some: function (arr, _19f, _1a0) { + return this._everyOrSome(false, arr, _19f, _1a0) + }, filter: function (arr, _1a2, _1a3) { + var _1a4 = dojo.lang.isString(arr); + if (_1a4) { + arr = arr.split('') + } + var _1a5; + if (Array.filter) { + _1a5 = Array.filter(arr, _1a2, _1a3) + } else { + if (!_1a3) { + if (arguments.length >= 3) { + dojo.raise('thisObject doesn\'t exist!') + } + _1a3 = dj_global + } + _1a5 = []; + for (var i = 0; i < arr.length; i++) { + if (_1a2.call(_1a3, arr[i], i, arr)) { + _1a5.push(arr[i]) + } + } + } + if (_1a4) { + return _1a5.join('') + } else { + return _1a5 + } + }, unnest: function () { + var out = []; + for (var i = 0; i < arguments.length; i++) { + if (dojo.lang.isArrayLike(arguments[i])) { + var add = dojo.lang.unnest.apply(this, arguments[i]); + out = out.concat(add) + } else { + out.push(arguments[i]) + } + } + return out + }, toArray: function (_1aa, _1ab) { + var _1ac = []; + for (var i = _1ab || 0; i < _1aa.length; i++) { + _1ac.push(_1aa[i]) + } + return _1ac + } +}); +dojo.provide('dojo.lang.func'); +dojo.lang.hitch = function (_1ae, _1af) { + var args = []; + for (var x = 2; x < arguments.length; x++) { + args.push(arguments[x]) + } + var fcn = (dojo.lang.isString(_1af) ? _1ae[_1af] : _1af) || function () { + }; + return function () { + var ta = args.concat([]); + for (var x = 0; x < arguments.length; x++) { + ta.push(arguments[x]) + } + return fcn.apply(_1ae, ta) + } +}; +dojo.lang.anonCtr = 0; +dojo.lang.anon = {}; +dojo.lang.nameAnonFunc = function (_1b5, _1b6, _1b7) { + var nso = (_1b6 || dojo.lang.anon); + if ((_1b7) || ((dj_global['djConfig']) && (djConfig['slowAnonFuncLookups'] == true))) { + for (var x in nso) { + try { + if (nso[x] === _1b5) { + return x + } + } catch (e) { + } + } + } + var ret = '__' + dojo.lang.anonCtr++; + while (typeof nso[ret] != 'undefined') { + ret = '__' + dojo.lang.anonCtr++ + } + nso[ret] = _1b5; + return ret +}; +dojo.lang.forward = function (_1bb) { + return function () { + return this[_1bb].apply(this, arguments) + } +}; +dojo.lang.curry = function (_1bc, func) { + var _1be = []; + _1bc = _1bc || dj_global; + if (dojo.lang.isString(func)) { + func = _1bc[func] + } + for (var x = 2; x < arguments.length; x++) { + _1be.push(arguments[x]) + } + var _1c0 = (func['__preJoinArity'] || func.length) - _1be.length; + + function gather(_1c1, _1c2, _1c3) { + var _1c4 = _1c3; + var _1c5 = _1c2.slice(0); + for (var x = 0; x < _1c1.length; x++) { + _1c5.push(_1c1[x]) + } + _1c3 = _1c3 - _1c1.length; + if (_1c3 <= 0) { + var res = func.apply(_1bc, _1c5); + _1c3 = _1c4; + return res + } else { + return function () { + return gather(arguments, _1c5, _1c3) + } + } + } + + return gather([], _1be, _1c0) +}; +dojo.lang.curryArguments = function (_1c8, func, args, _1cb) { + var _1cc = []; + var x = _1cb || 0; + for (x = _1cb; x < args.length; x++) { + _1cc.push(args[x]) + } + return dojo.lang.curry.apply(dojo.lang, [_1c8, func].concat(_1cc)) +}; +dojo.lang.tryThese = function () { + for (var x = 0; x < arguments.length; x++) { + try { + if (typeof arguments[x] == 'function') { + var ret = (arguments[x]()); + if (ret) { + return ret + } + } + } catch (e) { + dojo.debug(e) + } + } +}; +dojo.lang.delayThese = function (farr, cb, _1d2, _1d3) { + if (!farr.length) { + if (typeof _1d3 == 'function') { + _1d3() + } + return + } + if ((typeof _1d2 == 'undefined') && (typeof cb == 'number')) { + _1d2 = cb; + cb = function () { + } + } else { + if (!cb) { + cb = function () { + }; + if (!_1d2) { + _1d2 = 0 + } + } + } + setTimeout(function () { + (farr.shift())(); + cb(); + dojo.lang.delayThese(farr, cb, _1d2, _1d3) + }, _1d2) +}; +dojo.provide('dojo.string.extras'); +dojo.string.substituteParams = function (_1d4, hash) { + var map = (typeof hash == 'object') ? hash : dojo.lang.toArray(arguments, 1); + return _1d4.replace(/\%\{(\w+)\}/g, function (_1d7, key) { + if (typeof (map[key]) != 'undefined' && map[key] != null) { + return map[key] + } + dojo.raise('Substitution not found: ' + key) + }) +}; +dojo.string.capitalize = function (str) { + if (!dojo.lang.isString(str)) { + return '' + } + if (arguments.length == 0) { + str = this + } + var _1da = str.split(' '); + for (var i = 0; i < _1da.length; i++) { + _1da[i] = _1da[i].charAt(0).toUpperCase() + _1da[i].substring(1) + } + return _1da.join(' ') +}; +dojo.string.isBlank = function (str) { + if (!dojo.lang.isString(str)) { + return true + } + return (dojo.string.trim(str).length == 0) +}; +dojo.string.encodeAscii = function (str) { + if (!dojo.lang.isString(str)) { + return str + } + var ret = ''; + var _1df = escape(str); + var _1e0, re = /%u([0-9A-F]{4})/i; + while ((_1e0 = _1df.match(re))) { + var num = Number('0x' + _1e0[1]); + var _1e3 = escape('&#' + num + ';'); + ret += _1df.substring(0, _1e0.index) + _1e3; + _1df = _1df.substring(_1e0.index + _1e0[0].length) + } + ret += _1df.replace(/\+/g, '%2B'); + return ret +}; +dojo.string.escape = function (type, str) { + var args = dojo.lang.toArray(arguments, 1); + switch (type.toLowerCase()) { + case 'xml': + case 'html': + case 'xhtml': + return dojo.string.escapeXml.apply(this, args); + case 'sql': + return dojo.string.escapeSql.apply(this, args); + case 'regexp': + case 'regex': + return dojo.string.escapeRegExp.apply(this, args); + case 'javascript': + case 'jscript': + case 'js': + return dojo.string.escapeJavaScript.apply(this, args); + case 'ascii': + return dojo.string.encodeAscii.apply(this, args); + default: + return str + } +}; +dojo.string.escapeXml = function (str, _1e8) { + str = str.replace(/&/gm, '&').replace(//gm, '>').replace(/"/gm, '"'); + if (!_1e8) { + str = str.replace(/'/gm, ''') + } + return str +}; +dojo.string.escapeSql = function (str) { + return str.replace(/'/gm, '\'\'') +}; +dojo.string.escapeRegExp = function (str) { + return str.replace(/\\/gm, '\\\\').replace(/([\f\b\n\t\r[\^$|?*+(){}])/gm, '\\$1') +}; +dojo.string.escapeJavaScript = function (str) { + return str.replace(/(["'\f\b\n\t\r])/gm, '\\$1') +}; +dojo.string.escapeString = function (str) { + return ('"' + + str.replace(/(["\\])/g, '\\$1') + + '"').replace(/[\f]/g, '\\f').replace(/[\b]/g, '\\b').replace(/[\n]/g, '\\n').replace(/[\t]/g, '\\t').replace(/[\r]/g, '\\r') +}; +dojo.string.summary = function (str, len) { + if (!len || str.length <= len) { + return str + } + return str.substring(0, len).replace(/\.+$/, '') + '...' +}; +dojo.string.endsWith = function (str, end, _1f1) { + if (_1f1) { + str = str.toLowerCase(); + end = end.toLowerCase() + } + if ((str.length - end.length) < 0) { + return false + } + return str.lastIndexOf(end) == str.length - end.length +}; +dojo.string.endsWithAny = function (str) { + for (var i = 1; i < arguments.length; i++) { + if (dojo.string.endsWith(str, arguments[i])) { + return true + } + } + return false +}; +dojo.string.startsWith = function (str, _1f5, _1f6) { + if (_1f6) { + str = str.toLowerCase(); + _1f5 = _1f5.toLowerCase() + } + return str.indexOf(_1f5) == 0 +}; +dojo.string.startsWithAny = function (str) { + for (var i = 1; i < arguments.length; i++) { + if (dojo.string.startsWith(str, arguments[i])) { + return true + } + } + return false +}; +dojo.string.has = function (str) { + for (var i = 1; i < arguments.length; i++) { + if (str.indexOf(arguments[i]) > -1) { + return true + } + } + return false +}; +dojo.string.normalizeNewlines = function (text, _1fc) { + if (_1fc == '\n') { + text = text.replace(/\r\n/g, '\n'); + text = text.replace(/\r/g, '\n') + } else { + if (_1fc == '\r') { + text = text.replace(/\r\n/g, '\r'); + text = text.replace(/\n/g, '\r') + } else { + text = text.replace(/([^\r])\n/g, '$1\r\n').replace(/\r([^\n])/g, '\r\n$1') + } + } + return text +}; +dojo.string.splitEscaped = function (str, _1fe) { + var _1ff = []; + for (var i = 0, _201 = 0; i < str.length; i++) { + if (str.charAt(i) == '\\') { + i++; + continue + } + if (str.charAt(i) == _1fe) { + _1ff.push(str.substring(_201, i)); + _201 = i + 1 + } + } + _1ff.push(str.substr(_201)); + return _1ff +}; +dojo.provide('dojo.dom'); +dojo.dom.ELEMENT_NODE = 1; +dojo.dom.ATTRIBUTE_NODE = 2; +dojo.dom.TEXT_NODE = 3; +dojo.dom.CDATA_SECTION_NODE = 4; +dojo.dom.ENTITY_REFERENCE_NODE = 5; +dojo.dom.ENTITY_NODE = 6; +dojo.dom.PROCESSING_INSTRUCTION_NODE = 7; +dojo.dom.COMMENT_NODE = 8; +dojo.dom.DOCUMENT_NODE = 9; +dojo.dom.DOCUMENT_TYPE_NODE = 10; +dojo.dom.DOCUMENT_FRAGMENT_NODE = 11; +dojo.dom.NOTATION_NODE = 12; +dojo.dom.dojoml = 'http://www.dojotoolkit.org/2004/dojoml'; +dojo.dom.xmlns = { + svg: 'http://www.w3.org/2000/svg', + smil: 'http://www.w3.org/2001/SMIL20/', + mml: 'http://www.w3.org/1998/Math/MathML', + cml: 'http://www.xml-cml.org', + xlink: 'http://www.w3.org/1999/xlink', + xhtml: 'http://www.w3.org/1999/xhtml', + xul: 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', + xbl: 'http://www.mozilla.org/xbl', + fo: 'http://www.w3.org/1999/XSL/Format', + xsl: 'http://www.w3.org/1999/XSL/Transform', + xslt: 'http://www.w3.org/1999/XSL/Transform', + xi: 'http://www.w3.org/2001/XInclude', + xforms: 'http://www.w3.org/2002/01/xforms', + saxon: 'http://icl.com/saxon', + xalan: 'http://xml.apache.org/xslt', + xsd: 'http://www.w3.org/2001/XMLSchema', + dt: 'http://www.w3.org/2001/XMLSchema-datatypes', + xsi: 'http://www.w3.org/2001/XMLSchema-instance', + rdf: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + rdfs: 'http://www.w3.org/2000/01/rdf-schema#', + dc: 'http://purl.org/dc/elements/1.1/', + dcq: 'http://purl.org/dc/qualifiers/1.0', + 'soap-env': 'http://schemas.xmlsoap.org/soap/envelope/', + wsdl: 'http://schemas.xmlsoap.org/wsdl/', + AdobeExtensions: 'http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/' +}; +dojo.dom.isNode = function (wh) { + if (typeof Element == 'function') { + try { + return wh instanceof Element + } catch (e) { + } + } else { + return wh && !isNaN(wh.nodeType) + } +}; +dojo.dom.getUniqueId = function () { + var _203 = dojo.doc(); + do { + var id = 'dj_unique_' + (++arguments.callee._idIncrement) + } while (_203.getElementById(id)); + return id +}; +dojo.dom.getUniqueId._idIncrement = 0; +dojo.dom.firstElement = dojo.dom.getFirstChildElement = function (_205, _206) { + var node = _205.firstChild; + while (node && node.nodeType != dojo.dom.ELEMENT_NODE) { + node = node.nextSibling + } + if (_206 && node && node.tagName && node.tagName.toLowerCase() != _206.toLowerCase()) { + node = dojo.dom.nextElement(node, _206) + } + return node +}; +dojo.dom.lastElement = dojo.dom.getLastChildElement = function (_208, _209) { + var node = _208.lastChild; + while (node && node.nodeType != dojo.dom.ELEMENT_NODE) { + node = node.previousSibling + } + if (_209 && node && node.tagName && node.tagName.toLowerCase() != _209.toLowerCase()) { + node = dojo.dom.prevElement(node, _209) + } + return node +}; +dojo.dom.nextElement = dojo.dom.getNextSiblingElement = function (node, _20c) { + if (!node) { + return null + } + do { + node = node.nextSibling + } while (node && node.nodeType != dojo.dom.ELEMENT_NODE); + if (node && _20c && _20c.toLowerCase() != node.tagName.toLowerCase()) { + return dojo.dom.nextElement(node, _20c) + } + return node +}; +dojo.dom.prevElement = dojo.dom.getPreviousSiblingElement = function (node, _20e) { + if (!node) { + return null + } + if (_20e) { + _20e = _20e.toLowerCase() + } + do { + node = node.previousSibling + } while (node && node.nodeType != dojo.dom.ELEMENT_NODE); + if (node && _20e && _20e.toLowerCase() != node.tagName.toLowerCase()) { + return dojo.dom.prevElement(node, _20e) + } + return node +}; +dojo.dom.moveChildren = function (_20f, _210, trim) { + var _212 = 0; + if (trim) { + while (_20f.hasChildNodes() && _20f.firstChild.nodeType == dojo.dom.TEXT_NODE) { + _20f.removeChild(_20f.firstChild) + } + while (_20f.hasChildNodes() && _20f.lastChild.nodeType == dojo.dom.TEXT_NODE) { + _20f.removeChild(_20f.lastChild) + } + } + while (_20f.hasChildNodes()) { + _210.appendChild(_20f.firstChild); + _212++ + } + return _212 +}; +dojo.dom.copyChildren = function (_213, _214, trim) { + var _216 = _213.cloneNode(true); + return this.moveChildren(_216, _214, trim) +}; +dojo.dom.replaceChildren = function (node, _218) { + var _219 = []; + if (dojo.render.html.ie) { + for (var i = 0; i < node.childNodes.length; i++) { + _219.push(node.childNodes[i]) + } + } + dojo.dom.removeChildren(node); + node.appendChild(_218); + for (var i = 0; i < _219.length; i++) { + dojo.dom.destroyNode(_219[i]) + } +}; +dojo.dom.removeChildren = function (node) { + var _21c = node.childNodes.length; + while (node.hasChildNodes()) { + dojo.dom.removeNode(node.firstChild) + } + return _21c +}; +dojo.dom.replaceNode = function (node, _21e) { + return node.parentNode.replaceChild(_21e, node) +}; +dojo.dom.destroyNode = function (node) { + if (node.parentNode) { + node = dojo.dom.removeNode(node) + } + if (node.nodeType != 3) { + if (dojo.evalObjPath('dojo.event.browser.clean', false)) { + dojo.event.browser.clean(node) + } + if (dojo.render.html.ie) { + node.outerHTML = '' + } + } +}; +dojo.dom.removeNode = function (node) { + if (node && node.parentNode) { + return node.parentNode.removeChild(node) + } +}; +dojo.dom.getAncestors = function (node, _222, _223) { + var _224 = []; + var _225 = (_222 && (_222 instanceof Function || typeof _222 == 'function')); + while (node) { + if (!_225 || _222(node)) { + _224.push(node) + } + if (_223 && _224.length > 0) { + return _224[0] + } + node = node.parentNode + } + if (_223) { + return null + } + return _224 +}; +dojo.dom.getAncestorsByTag = function (node, tag, _228) { + tag = tag.toLowerCase(); + return dojo.dom.getAncestors(node, function (el) { + return ((el.tagName) && (el.tagName.toLowerCase() == tag)) + }, _228) +}; +dojo.dom.getFirstAncestorByTag = function (node, tag) { + return dojo.dom.getAncestorsByTag(node, tag, true) +}; +dojo.dom.isDescendantOf = function (node, _22d, _22e) { + if (_22e && node) { + node = node.parentNode + } + while (node) { + if (node == _22d) { + return true + } + node = node.parentNode + } + return false +}; +dojo.dom.innerXML = function (node) { + if (node.innerXML) { + return node.innerXML + } else { + if (node.xml) { + return node.xml + } else { + if (typeof XMLSerializer != 'undefined') { + return (new XMLSerializer()).serializeToString(node) + } + } + } +}; +dojo.dom.createDocument = function () { + var doc = null; + var _231 = dojo.doc(); + if (!dj_undef('ActiveXObject')) { + var _232 = ['MSXML2', 'Microsoft', 'MSXML', 'MSXML3']; + for (var i = 0; i < _232.length; i++) { + try { + doc = new ActiveXObject(_232[i] + '.XMLDOM') + } catch (e) { + } + if (doc) { + break + } + } + } else { + if ((_231.implementation) && (_231.implementation.createDocument)) { + doc = _231.implementation.createDocument('', '', null) + } + } + return doc +}; +dojo.dom.createDocumentFromText = function (str, _235) { + if (!_235) { + _235 = 'text/xml' + } + if (!dj_undef('DOMParser')) { + var _236 = new DOMParser(); + return _236.parseFromString(str, _235) + } else { + if (!dj_undef('ActiveXObject')) { + var _237 = dojo.dom.createDocument(); + if (_237) { + _237.async = false; + _237.loadXML(str); + return _237 + } else { + dojo.debug('toXml didn\'t work?') + } + } else { + var _238 = dojo.doc(); + if (_238.createElement) { + var tmp = _238.createElement('xml'); + tmp.innerHTML = str; + if (_238.implementation && _238.implementation.createDocument) { + var _23a = _238.implementation.createDocument('foo', '', null); + for (var i = 0; i < tmp.childNodes.length; i++) { + _23a.importNode(tmp.childNodes.item(i), true) + } + return _23a + } + return ((tmp.document) && (tmp.document.firstChild ? tmp.document.firstChild : tmp)) + } + } + } + return null +}; +dojo.dom.prependChild = function (node, _23d) { + if (_23d.firstChild) { + _23d.insertBefore(node, _23d.firstChild) + } else { + _23d.appendChild(node) + } + return true +}; +dojo.dom.insertBefore = function (node, ref, _240) { + if ((_240 != true) && (node === ref || node.nextSibling === ref)) { + return false + } + var _241 = ref.parentNode; + _241.insertBefore(node, ref); + return true +}; +dojo.dom.insertAfter = function (node, ref, _244) { + var pn = ref.parentNode; + if (ref == pn.lastChild) { + if ((_244 != true) && (node === ref)) { + return false + } + pn.appendChild(node) + } else { + return this.insertBefore(node, ref.nextSibling, _244) + } + return true +}; +dojo.dom.insertAtPosition = function (node, ref, _248) { + if ((!node) || (!ref) || (!_248)) { + return false + } + switch (_248.toLowerCase()) { + case 'before': + return dojo.dom.insertBefore(node, ref); + case 'after': + return dojo.dom.insertAfter(node, ref); + case 'first': + if (ref.firstChild) { + return dojo.dom.insertBefore(node, ref.firstChild) + } else { + ref.appendChild(node); + return true + } + break; + default: + ref.appendChild(node); + return true + } +}; +dojo.dom.insertAtIndex = function (node, _24a, _24b) { + var _24c = _24a.childNodes; + if (!_24c.length || _24c.length == _24b) { + _24a.appendChild(node); + return true + } + if (_24b == 0) { + return dojo.dom.prependChild(node, _24a) + } + return dojo.dom.insertAfter(node, _24c[_24b - 1]) +}; +dojo.dom.textContent = function (node, text) { + if (arguments.length > 1) { + var _24f = dojo.doc(); + dojo.dom.replaceChildren(node, _24f.createTextNode(text)); + return text + } else { + if (node.textContent != undefined) { + return node.textContent + } + var _250 = ''; + if (node == null) { + return _250 + } + for (var i = 0; i < node.childNodes.length; i++) { + switch (node.childNodes[i].nodeType) { + case 1: + case 5: + _250 += dojo.dom.textContent(node.childNodes[i]); + break; + case 3: + case 2: + case 4: + _250 += node.childNodes[i].nodeValue; + break; + default: + break + } + } + return _250 + } +}; +dojo.dom.hasParent = function (node) { + return Boolean(node && node.parentNode && dojo.dom.isNode(node.parentNode)) +}; +dojo.dom.isTag = function (node) { + if (node && node.tagName) { + for (var i = 1; i < arguments.length; i++) { + if (node.tagName == String(arguments[i])) { + return String(arguments[i]) + } + } + } + return '' +}; +dojo.dom.setAttributeNS = function (elem, _256, _257, _258) { + if (elem == null || ((elem == undefined) && (typeof elem == 'undefined'))) { + dojo.raise('No element given to dojo.dom.setAttributeNS') + } + if (!((elem.setAttributeNS == undefined) && (typeof elem.setAttributeNS == 'undefined'))) { + elem.setAttributeNS(_256, _257, _258) + } else { + var _259 = elem.ownerDocument; + var _25a = _259.createNode(2, _257, _256); + _25a.nodeValue = _258; + elem.setAttributeNode(_25a) + } +}; +dojo.provide('dojo.undo.browser'); +try { + if ((!djConfig['preventBackButtonFix']) && (!dojo.hostenv.post_load_)) { + document.write('') + } +} catch (e) { +} +if (dojo.render.html.opera) { + dojo.debug('Opera is not supported with dojo.undo.browser, so back/forward detection will not work.') +} +dojo.undo.browser = { + initialHref: (!dj_undef('window')) ? window.location.href : '', + initialHash: (!dj_undef('window')) ? window.location.hash : '', + moveForward: false, + historyStack: [], + forwardStack: [], + historyIframe: null, + bookmarkAnchor: null, + locationTimer: null, + setInitialState: function (args) { + this.initialState = this._createState(this.initialHref, args, this.initialHash) + }, + addToHistory: function (args) { + this.forwardStack = []; + var hash = null; + var url = null; + if (!this.historyIframe) { + if (djConfig['useXDomain'] && !djConfig['dojoIframeHistoryUrl']) { + dojo.debug('dojo.undo.browser: When using cross-domain Dojo builds,' + + ' please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl' + + ' to the path on your domain to iframe_history.html') + } + this.historyIframe = window.frames['djhistory'] + } + if (!this.bookmarkAnchor) { + this.bookmarkAnchor = document.createElement('a'); + dojo.body().appendChild(this.bookmarkAnchor); + this.bookmarkAnchor.style.display = 'none' + } + if (args['changeUrl']) { + hash = '#' + ((args['changeUrl'] !== true) ? args['changeUrl'] : (new Date()).getTime()); + if (this.historyStack.length == 0 && this.initialState.urlHash == hash) { + this.initialState = this._createState(url, args, hash); + return + } else { + if (this.historyStack.length > 0 && this.historyStack[this.historyStack.length - 1].urlHash == hash) { + this.historyStack[this.historyStack.length - 1] = this._createState(url, args, hash); + return + } + } + this.changingUrl = true; + setTimeout('window.location.href = \'' + hash + '\'; dojo.undo.browser.changingUrl = false;', 1); + this.bookmarkAnchor.href = hash; + if (dojo.render.html.ie) { + url = this._loadIframeHistory(); + var _25f = args['back'] || args['backButton'] || args['handle']; + var tcb = function (_261) { + if (window.location.hash != '') { + setTimeout('window.location.href = \'' + hash + '\';', 1) + } + _25f.apply(this, [_261]) + }; + if (args['back']) { + args.back = tcb + } else { + if (args['backButton']) { + args.backButton = tcb + } else { + if (args['handle']) { + args.handle = tcb + } + } + } + var _262 = args['forward'] || args['forwardButton'] || args['handle']; + var tfw = function (_264) { + if (window.location.hash != '') { + window.location.href = hash + } + if (_262) { + _262.apply(this, [_264]) + } + }; + if (args['forward']) { + args.forward = tfw + } else { + if (args['forwardButton']) { + args.forwardButton = tfw + } else { + if (args['handle']) { + args.handle = tfw + } + } + } + } else { + if (dojo.render.html.moz) { + if (!this.locationTimer) { + this.locationTimer = setInterval('dojo.undo.browser.checkLocation();', 200) + } + } + } + } else { + url = this._loadIframeHistory() + } + this.historyStack.push(this._createState(url, args, hash)) + }, + checkLocation: function () { + if (!this.changingUrl) { + var hsl = this.historyStack.length; + if ((window.location.hash == this.initialHash || window.location.href == this.initialHref) && (hsl == 1)) { + this.handleBackButton(); + return + } + if (this.forwardStack.length > 0) { + if (this.forwardStack[this.forwardStack.length - 1].urlHash == window.location.hash) { + this.handleForwardButton(); + return + } + } + if ((hsl >= 2) && (this.historyStack[hsl - 2])) { + if (this.historyStack[hsl - 2].urlHash == window.location.hash) { + this.handleBackButton(); + + } + } + } + }, + iframeLoaded: function (evt, _267) { + if (!dojo.render.html.opera) { + var _268 = this._getUrlQuery(_267.href); + if (_268 == null) { + if (this.historyStack.length == 1) { + this.handleBackButton() + } + return + } + if (this.moveForward) { + this.moveForward = false; + return + } + if (this.historyStack.length >= 2 && _268 == this._getUrlQuery(this.historyStack[this.historyStack.length + - 2].url)) { + this.handleBackButton() + } else { + if (this.forwardStack.length > 0 && _268 == this._getUrlQuery(this.forwardStack[this.forwardStack.length + - 1].url)) { + this.handleForwardButton() + } + } + } + }, + handleBackButton: function () { + var _269 = this.historyStack.pop(); + if (!_269) { + return + } + var last = this.historyStack[this.historyStack.length - 1]; + if (!last && this.historyStack.length == 0) { + last = this.initialState + } + if (last) { + if (last.kwArgs['back']) { + last.kwArgs['back']() + } else { + if (last.kwArgs['backButton']) { + last.kwArgs['backButton']() + } else { + if (last.kwArgs['handle']) { + last.kwArgs.handle('back') + } + } + } + } + this.forwardStack.push(_269) + }, + handleForwardButton: function () { + var last = this.forwardStack.pop(); + if (!last) { + return + } + if (last.kwArgs['forward']) { + last.kwArgs.forward() + } else { + if (last.kwArgs['forwardButton']) { + last.kwArgs.forwardButton() + } else { + if (last.kwArgs['handle']) { + last.kwArgs.handle('forward') + } + } + } + this.historyStack.push(last) + }, + _createState: function (url, args, hash) { + return {'url': url, 'kwArgs': args, 'urlHash': hash} + }, + _getUrlQuery: function (url) { + var _270 = url.split('?'); + if (_270.length < 2) { + return null + } else { + return _270[1] + } + }, + _loadIframeHistory: function () { + var url = (djConfig['dojoIframeHistoryUrl'] || dojo.hostenv.getBaseScriptUri() + 'iframe_history.html') + + '?' + + (new Date()).getTime(); + this.moveForward = true; + dojo.io.setIFrameSrc(this.historyIframe, url, false); + return url + } +}; +dojo.provide('dojo.io.BrowserIO'); +if (!dj_undef('window')) { + dojo.io.checkChildrenForFile = function (node) { + var _273 = false; + var _274 = node.getElementsByTagName('input'); + dojo.lang.forEach(_274, function (_275) { + if (_273) { + return + } + if (_275.getAttribute('type') == 'file') { + _273 = true + } + }); + return _273 + }; + dojo.io.formHasFile = function (_276) { + return dojo.io.checkChildrenForFile(_276) + }; + dojo.io.updateNode = function (node, _278) { + node = dojo.byId(node); + var args = _278; + if (dojo.lang.isString(_278)) { + args = {url: _278} + } + args.mimetype = 'text/html'; + args.load = function (t, d, e) { + while (node.firstChild) { + dojo.dom.destroyNode(node.firstChild) + } + node.innerHTML = d + }; + dojo.io.bind(args) + }; + dojo.io.formFilter = function (node) { + var type = (node.type || '').toLowerCase(); + return !node.disabled && node.name && !dojo.lang.inArray(['file', 'submit', 'image', 'reset', 'button'], type) + }; + dojo.io.encodeForm = function (_27f, _280, _281) { + if ((!_27f) || (!_27f.tagName) || (!_27f.tagName.toLowerCase() == 'form')) { + dojo.raise('Attempted to encode a non-form element.') + } + if (!_281) { + _281 = dojo.io.formFilter + } + var enc = /utf/i.test(_280 || '') ? encodeURIComponent : dojo.string.encodeAscii; + var _283 = []; + for (var i = 0; i < _27f.elements.length; i++) { + var elm = _27f.elements[i]; + if (!elm || elm.tagName.toLowerCase() == 'fieldset' || !_281(elm)) { + continue + } + var name = enc(elm.name); + var type = elm.type.toLowerCase(); + if (type == 'select-multiple') { + for (var j = 0; j < elm.options.length; j++) { + if (elm.options[j].selected) { + _283.push(name + '=' + enc(elm.options[j].value)) + } + } + } else { + if (dojo.lang.inArray(['radio', 'checkbox'], type)) { + if (elm.checked) { + _283.push(name + '=' + enc(elm.value)) + } + } else { + _283.push(name + '=' + enc(elm.value)) + } + } + } + var _289 = _27f.getElementsByTagName('input'); + for (var i = 0; i < _289.length; i++) { + var _28a = _289[i]; + if (_28a.type.toLowerCase() == 'image' && _28a.form == _27f && _281(_28a)) { + var name = enc(_28a.name); + _283.push(name + '=' + enc(_28a.value)); + _283.push(name + '.x=0'); + _283.push(name + '.y=0') + } + } + return _283.join('&') + '&' + }; + dojo.io.FormBind = function (args) { + this.bindArgs = {}; + if (args && args.formNode) { + this.init(args) + } else { + if (args) { + this.init({formNode: args}) + } + } + }; + dojo.lang.extend(dojo.io.FormBind, { + form: null, bindArgs: null, clickedButton: null, init: function (args) { + var form = dojo.byId(args.formNode); + if (!form || !form.tagName || form.tagName.toLowerCase() != 'form') { + throw new Error('FormBind: Couldn\'t apply, invalid form') + } else { + if (this.form == form) { + return + } else { + if (this.form) { + throw new Error('FormBind: Already applied to a form') + } + } + } + dojo.lang.mixin(this.bindArgs, args); + this.form = form; + this.connect(form, 'onsubmit', 'submit'); + for (var i = 0; i < form.elements.length; i++) { + var node = form.elements[i]; + if (node && node.type && dojo.lang.inArray(['submit', 'button'], node.type.toLowerCase())) { + this.connect(node, 'onclick', 'click') + } + } + var _290 = form.getElementsByTagName('input'); + for (var i = 0; i < _290.length; i++) { + var _291 = _290[i]; + if (_291.type.toLowerCase() == 'image' && _291.form == form) { + this.connect(_291, 'onclick', 'click') + } + } + }, onSubmit: function (form) { + return true + }, submit: function (e) { + e.preventDefault(); + if (this.onSubmit(this.form)) { + dojo.io.bind(dojo.lang.mixin(this.bindArgs, {formFilter: dojo.lang.hitch(this, 'formFilter')})) + } + }, click: function (e) { + var node = e.currentTarget; + if (node.disabled) { + return + } + this.clickedButton = node + }, formFilter: function (node) { + var type = (node.type || '').toLowerCase(); + var _298 = false; + if (node.disabled || !node.name) { + _298 = false + } else { + if (dojo.lang.inArray(['submit', 'button', 'image'], type)) { + if (!this.clickedButton) { + this.clickedButton = node + } + _298 = node == this.clickedButton + } else { + _298 = !dojo.lang.inArray(['file', 'submit', 'reset', 'button'], type) + } + } + return _298 + }, connect: function (_299, _29a, _29b) { + if (dojo.evalObjPath('dojo.event.connect')) { + dojo.event.connect(_299, _29a, this, _29b) + } else { + var fcn = dojo.lang.hitch(this, _29b); + _299[_29a] = function (e) { + if (!e) { + e = window.event + } + if (!e.currentTarget) { + e.currentTarget = e.srcElement + } + if (!e.preventDefault) { + e.preventDefault = function () { + window.event.returnValue = false + } + } + fcn(e) + } + } + } + }); + dojo.io.XMLHTTPTransport = new function () { + var _29e = this; + var _29f = {}; + this.useCache = false; + this.preventCache = false; + + function getCacheKey(url, _2a1, _2a2) { + return url + '|' + _2a1 + '|' + _2a2.toLowerCase() + } + + function addToCache(url, _2a4, _2a5, http) { + _29f[getCacheKey(url, _2a4, _2a5)] = http + } + + function getFromCache(url, _2a8, _2a9) { + return _29f[getCacheKey(url, _2a8, _2a9)] + } + + this.clearCache = function () { + _29f = {} + }; + + function doLoad(_2aa, http, url, _2ad, _2ae) { + if (((http.status >= 200) && (http.status < 300)) + || (http.status == 304) + || (http.status == 1223) + || (location.protocol == 'file:' && (http.status == 0 || http.status == undefined)) + || (location.protocol == 'chrome:' && (http.status == 0 || http.status == undefined))) { + var ret; + if (_2aa.method.toLowerCase() == 'head') { + var _2b0 = http.getAllResponseHeaders(); + ret = {}; + ret.toString = function () { + return _2b0 + }; + var _2b1 = _2b0.split(/[\r\n]+/g); + for (var i = 0; i < _2b1.length; i++) { + var pair = _2b1[i].match(/^([^:]+)\s*:\s*(.+)$/i); + if (pair) { + ret[pair[1]] = pair[2] + } + } + } else { + if (_2aa.mimetype == 'text/javascript') { + try { + ret = dj_eval(http.responseText) + } catch (e) { + dojo.debug(e); + dojo.debug(http.responseText); + ret = null + } + } else { + if (_2aa.mimetype.substr(0, 9) == 'text/json' || _2aa.mimetype.substr(0, 16) == 'application/json') { + try { + ret = dj_eval('(' + _2aa.jsonFilter(http.responseText) + ')') + } catch (e) { + dojo.debug(e); + dojo.debug(http.responseText); + ret = false + } + } else { + if ((_2aa.mimetype == 'application/xml') || (_2aa.mimetype == 'text/xml')) { + ret = http.responseXML; + if (!ret || typeof ret == 'string' || !http.getResponseHeader('Content-Type')) { + ret = dojo.dom.createDocumentFromText(http.responseText) + } + } else { + ret = http.responseText + } + } + } + } + if (_2ae) { + addToCache(url, _2ad, _2aa.method, http) + } + _2aa[(typeof _2aa.load == 'function') ? 'load' : 'handle']('load', ret, http, _2aa) + } else { + var _2b4 = new dojo.io.Error('XMLHttpTransport Error: ' + http.status + ' ' + http.statusText); + _2aa[(typeof _2aa.error == 'function') ? 'error' : 'handle']('error', _2b4, http, _2aa) + } + } + + function setHeaders(http, _2b6) { + if (_2b6['headers']) { + for (var _2b7 in _2b6['headers']) { + if (_2b7.toLowerCase() == 'content-type' && !_2b6['contentType']) { + _2b6['contentType'] = _2b6['headers'][_2b7] + } else { + http.setRequestHeader(_2b7, _2b6['headers'][_2b7]) + } + } + } + } + + this.inFlight = []; + this.inFlightTimer = null; + this.startWatchingInFlight = function () { + if (!this.inFlightTimer) { + this.inFlightTimer = setTimeout('dojo.io.XMLHTTPTransport.watchInFlight();', 10) + } + }; + this.watchInFlight = function () { + var now = null; + if (!dojo.hostenv._blockAsync && !_29e._blockAsync) { + for (var x = this.inFlight.length - 1; x >= 0; x--) { + try { + var tif = this.inFlight[x]; + if (!tif || tif.http._aborted || !tif.http.readyState) { + this.inFlight.splice(x, 1); + continue + } + if (4 == tif.http.readyState) { + this.inFlight.splice(x, 1); + doLoad(tif.req, tif.http, tif.url, tif.query, tif.useCache) + } else { + if (tif.startTime) { + if (!now) { + now = (new Date()).getTime() + } + if (tif.startTime + (tif.req.timeoutSeconds * 1000) < now) { + if (typeof tif.http.abort == 'function') { + tif.http.abort() + } + this.inFlight.splice(x, 1); + tif.req[(typeof tif.req.timeout + == 'function') ? 'timeout' : 'handle']('timeout', null, tif.http, tif.req) + } + } + } + } catch (e) { + try { + var _2bb = new dojo.io.Error('XMLHttpTransport.watchInFlight Error: ' + e); + tif.req[(typeof tif.req.error == 'function') ? 'error' : 'handle']('error', _2bb, tif.http, tif.req) + } catch (e2) { + dojo.debug('XMLHttpTransport error callback failed: ' + e2) + } + } + } + } + clearTimeout(this.inFlightTimer); + if (this.inFlight.length == 0) { + this.inFlightTimer = null; + return + } + this.inFlightTimer = setTimeout('dojo.io.XMLHTTPTransport.watchInFlight();', 10) + }; + var _2bc = dojo.hostenv.getXmlhttpObject() ? true : false; + this.canHandle = function (_2bd) { + var mlc = _2bd['mimetype'].toLowerCase() || ''; + return _2bc + && ((dojo.lang.inArray(['text/plain', 'text/html', 'application/xml', 'text/xml', 'text/javascript'], mlc)) + || (mlc.substr(0, 9) == 'text/json' || mlc.substr(0, 16) == 'application/json')) + && !(_2bd['formNode'] && dojo.io.formHasFile(_2bd['formNode'])) + }; + this.multipartBoundary = '45309FFF-BD65-4d50-99C9-36986896A96F'; + this.bind = function (_2bf) { + if (!_2bf['url']) { + if (!_2bf['formNode'] + && (_2bf['backButton'] || _2bf['back'] || _2bf['changeUrl'] || _2bf['watchForURL']) + && (!djConfig.preventBackButtonFix)) { + dojo.deprecated('Using dojo.io.XMLHTTPTransport.bind() to add to browser history without doing an IO request', 'Use dojo.undo.browser.addToHistory() instead.', '0.4'); + dojo.undo.browser.addToHistory(_2bf); + return true + } + } + var url = _2bf.url; + var _2c1 = ''; + if (_2bf['formNode']) { + var ta = _2bf.formNode.getAttribute('action'); + if ((ta) && (!_2bf['url'])) { + url = ta + } + var tp = _2bf.formNode.getAttribute('method'); + if ((tp) && (!_2bf['method'])) { + _2bf.method = tp + } + _2c1 += dojo.io.encodeForm(_2bf.formNode, _2bf.encoding, _2bf['formFilter']) + } + if (url.indexOf('#') > -1) { + dojo.debug('Warning: dojo.io.bind: stripping hash values from url:', url); + url = url.split('#')[0] + } + if (_2bf['file']) { + _2bf.method = 'post' + } + if (!_2bf['method']) { + _2bf.method = 'get' + } + if (_2bf.method.toLowerCase() == 'get') { + _2bf.multipart = false + } else { + if (_2bf['file']) { + _2bf.multipart = true + } else { + if (!_2bf['multipart']) { + _2bf.multipart = false + } + } + } + if (_2bf['backButton'] || _2bf['back'] || _2bf['changeUrl']) { + dojo.undo.browser.addToHistory(_2bf) + } + var _2c4 = _2bf['content'] || {}; + if (_2bf.sendTransport) { + _2c4['dojo.transport'] = 'xmlhttp' + } + do { + if (_2bf.postContent) { + _2c1 = _2bf.postContent; + break + } + if (_2c4) { + _2c1 += dojo.io.argsFromMap(_2c4, _2bf.encoding) + } + if (_2bf.method.toLowerCase() == 'get' || !_2bf.multipart) { + break + } + var t = []; + if (_2c1.length) { + var q = _2c1.split('&'); + for (var i = 0; i < q.length; ++i) { + if (q[i].length) { + var p = q[i].split('='); + t.push('--' + this.multipartBoundary, 'Content-Disposition: form-data; name="' + p[0] + '"', '', p[1]) + } + } + } + if (_2bf.file) { + if (dojo.lang.isArray(_2bf.file)) { + for (var i = 0; i < _2bf.file.length; ++i) { + var o = _2bf.file[i]; + t.push('--' + this.multipartBoundary, 'Content-Disposition: form-data; name="' + + o.name + + '"; filename="' + + ('fileName' in o ? o.fileName : o.name) + + '"', 'Content-Type: ' + ('contentType' + in o ? o.contentType : 'application/octet-stream'), '', o.content) + } + } else { + var o = _2bf.file; + t.push('--' + this.multipartBoundary, 'Content-Disposition: form-data; name="' + + o.name + + '"; filename="' + + ('fileName' in o ? o.fileName : o.name) + + '"', 'Content-Type: ' + ('contentType' + in o ? o.contentType : 'application/octet-stream'), '', o.content) + } + } + if (t.length) { + t.push('--' + this.multipartBoundary + '--', ''); + _2c1 = t.join('\r\n') + } + } while (false); + var _2ca = _2bf['sync'] ? false : true; + var _2cb = _2bf['preventCache'] || (this.preventCache == true && _2bf['preventCache'] != false); + var _2cc = _2bf['useCache'] == true || (this.useCache == true && _2bf['useCache'] != false); + if (!_2cb && _2cc) { + var _2cd = getFromCache(url, _2c1, _2bf.method); + if (_2cd) { + doLoad(_2bf, _2cd, url, _2c1, false); + return + } + } + var http = dojo.hostenv.getXmlhttpObject(_2bf); + var _2cf = false; + if (_2ca) { + var _2d0 = this.inFlight.push({ + 'req': _2bf, + 'http': http, + 'url': url, + 'query': _2c1, + 'useCache': _2cc, + 'startTime': _2bf.timeoutSeconds ? (new Date()).getTime() : 0 + }); + this.startWatchingInFlight() + } else { + _29e._blockAsync = true + } + if (_2bf.method.toLowerCase() == 'post') { + if (!_2bf.user) { + http.open('POST', url, _2ca) + } else { + http.open('POST', url, _2ca, _2bf.user, _2bf.password) + } + setHeaders(http, _2bf); + http.setRequestHeader('Content-Type', _2bf.multipart ? ('multipart/form-data; boundary=' + + this.multipartBoundary) : (_2bf.contentType || 'application/x-www-form-urlencoded')); + try { + http.send(_2c1) + } catch (e) { + if (typeof http.abort == 'function') { + http.abort() + } + doLoad(_2bf, {status: 404}, url, _2c1, _2cc) + } + } else { + var _2d1 = url; + if (_2c1 != '') { + _2d1 += (_2d1.indexOf('?') > -1 ? '&' : '?') + _2c1 + } + if (_2cb) { + _2d1 += (dojo.string.endsWithAny(_2d1, '?', '&') ? '' : (_2d1.indexOf('?') > -1 ? '&' : '?')) + + 'dojo.preventCache=' + + new Date().valueOf() + } + if (!_2bf.user) { + http.open(_2bf.method.toUpperCase(), _2d1, _2ca) + } else { + http.open(_2bf.method.toUpperCase(), _2d1, _2ca, _2bf.user, _2bf.password) + } + setHeaders(http, _2bf); + try { + http.send(null) + } catch (e) { + if (typeof http.abort == 'function') { + http.abort() + } + doLoad(_2bf, {status: 404}, url, _2c1, _2cc) + } + } + if (!_2ca) { + doLoad(_2bf, http, url, _2c1, _2cc); + _29e._blockAsync = false + } + _2bf.abort = function () { + try { + http._aborted = true + } catch (e) { + } + return http.abort() + }; + + }; + dojo.io.transports.addTransport('XMLHTTPTransport') + }; +} +dojo.provide('dojo.io.cookie'); +dojo.io.cookie.setCookie = function (name, _2d3, days, path, _2d6, _2d7) { + var _2d8 = -1; + if ((typeof days == 'number') && (days >= 0)) { + var d = new Date(); + d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000)); + _2d8 = d.toGMTString() + } + _2d3 = escape(_2d3); + document.cookie = name + '=' + _2d3 + ';' + (_2d8 != -1 ? ' expires=' + _2d8 + ';' : '') + (path ? 'path=' + + path : '') + (_2d6 ? '; domain=' + _2d6 : '') + (_2d7 ? '; secure' : '') +}; +dojo.io.cookie.set = dojo.io.cookie.setCookie; +dojo.io.cookie.getCookie = function (name) { + var idx = document.cookie.lastIndexOf(name + '='); + if (idx == -1) { + return null + } + var _2dc = document.cookie.substring(idx + name.length + 1); + var end = _2dc.indexOf(';'); + if (end == -1) { + end = _2dc.length + } + _2dc = _2dc.substring(0, end); + _2dc = unescape(_2dc); + return _2dc +}; +dojo.io.cookie.get = dojo.io.cookie.getCookie; +dojo.io.cookie.deleteCookie = function (name) { + dojo.io.cookie.setCookie(name, '-', 0) +}; +dojo.io.cookie.setObjectCookie = function (name, obj, days, path, _2e3, _2e4, _2e5) { + if (arguments.length == 5) { + _2e5 = _2e3; + _2e3 = null; + _2e4 = null + } + var _2e6 = [], _2e7, _2e8 = ''; + if (!_2e5) { + _2e7 = dojo.io.cookie.getObjectCookie(name) + } + if (days >= 0) { + if (!_2e7) { + _2e7 = {} + } + for (var prop in obj) { + if (obj[prop] == null) { + delete _2e7[prop] + } else { + if ((typeof obj[prop] == 'string') || (typeof obj[prop] == 'number')) { + _2e7[prop] = obj[prop] + } + } + } + prop = null; + for (var prop in _2e7) { + _2e6.push(escape(prop) + '=' + escape(_2e7[prop])) + } + _2e8 = _2e6.join('&') + } + dojo.io.cookie.setCookie(name, _2e8, days, path, _2e3, _2e4) +}; +dojo.io.cookie.getObjectCookie = function (name) { + var _2eb = null, _2ec = dojo.io.cookie.getCookie(name); + if (_2ec) { + _2eb = {}; + var _2ed = _2ec.split('&'); + for (var i = 0; i < _2ed.length; i++) { + var pair = _2ed[i].split('='); + var _2f0 = pair[1]; + if (isNaN(_2f0)) { + _2f0 = unescape(pair[1]) + } + _2eb[unescape(pair[0])] = _2f0 + } + } + return _2eb +}; +dojo.io.cookie.isSupported = function () { + if (typeof navigator.cookieEnabled != 'boolean') { + dojo.io.cookie.setCookie('__TestingYourBrowserForCookieSupport__', 'CookiesAllowed', 90, null); + var _2f1 = dojo.io.cookie.getCookie('__TestingYourBrowserForCookieSupport__'); + navigator.cookieEnabled = (_2f1 == 'CookiesAllowed'); + if (navigator.cookieEnabled) { + this.deleteCookie('__TestingYourBrowserForCookieSupport__') + } + } + return navigator.cookieEnabled +}; +if (!dojo.io.cookies) { + dojo.io.cookies = dojo.io.cookie +} +dojo.kwCompoundRequire({ + common: ['dojo.io.common'], + rhino: ['dojo.io.RhinoIO'], + browser: ['dojo.io.BrowserIO', 'dojo.io.cookie'], + dashboard: ['dojo.io.BrowserIO', 'dojo.io.cookie'] +}); +dojo.provide('dojo.io.*'); +dojo.provide('dojo.event.common'); +dojo.event = new function () { + this._canTimeout = dojo.lang.isFunction(dj_global['setTimeout']) || dojo.lang.isAlien(dj_global['setTimeout']); + + function interpolateArgs(args, _2f3) { + var dl = dojo.lang; + var ao = { + srcObj: dj_global, + srcFunc: null, + adviceObj: dj_global, + adviceFunc: null, + aroundObj: null, + aroundFunc: null, + adviceType: (args.length > 2) ? args[0] : 'after', + precedence: 'last', + once: false, + delay: null, + rate: 0, + adviceMsg: false, + maxCalls: -1 + }; + switch (args.length) { + case 0: + return; + case 1: + return; + case 2: + ao.srcFunc = args[0]; + ao.adviceFunc = args[1]; + break; + case 3: + if ((dl.isObject(args[0])) && (dl.isString(args[1])) && (dl.isString(args[2]))) { + ao.adviceType = 'after'; + ao.srcObj = args[0]; + ao.srcFunc = args[1]; + ao.adviceFunc = args[2] + } else { + if ((dl.isString(args[1])) && (dl.isString(args[2]))) { + ao.srcFunc = args[1]; + ao.adviceFunc = args[2] + } else { + if ((dl.isObject(args[0])) && (dl.isString(args[1])) && (dl.isFunction(args[2]))) { + ao.adviceType = 'after'; + ao.srcObj = args[0]; + ao.srcFunc = args[1]; + var _2f6 = dl.nameAnonFunc(args[2], ao.adviceObj, _2f3); + ao.adviceFunc = _2f6 + } else { + if ((dl.isFunction(args[0])) && (dl.isObject(args[1])) && (dl.isString(args[2]))) { + ao.adviceType = 'after'; + ao.srcObj = dj_global; + var _2f6 = dl.nameAnonFunc(args[0], ao.srcObj, _2f3); + ao.srcFunc = _2f6; + ao.adviceObj = args[1]; + ao.adviceFunc = args[2] + } + } + } + } + break; + case 4: + if ((dl.isObject(args[0])) && (dl.isObject(args[2]))) { + ao.adviceType = 'after'; + ao.srcObj = args[0]; + ao.srcFunc = args[1]; + ao.adviceObj = args[2]; + ao.adviceFunc = args[3] + } else { + if ((dl.isString(args[0])) && (dl.isString(args[1])) && (dl.isObject(args[2]))) { + ao.adviceType = args[0]; + ao.srcObj = dj_global; + ao.srcFunc = args[1]; + ao.adviceObj = args[2]; + ao.adviceFunc = args[3] + } else { + if ((dl.isString(args[0])) && (dl.isFunction(args[1])) && (dl.isObject(args[2]))) { + ao.adviceType = args[0]; + ao.srcObj = dj_global; + var _2f6 = dl.nameAnonFunc(args[1], dj_global, _2f3); + ao.srcFunc = _2f6; + ao.adviceObj = args[2]; + ao.adviceFunc = args[3] + } else { + if ((dl.isString(args[0])) + && (dl.isObject(args[1])) + && (dl.isString(args[2])) + && (dl.isFunction(args[3]))) { + ao.srcObj = args[1]; + ao.srcFunc = args[2]; + var _2f6 = dl.nameAnonFunc(args[3], dj_global, _2f3); + ao.adviceObj = dj_global; + ao.adviceFunc = _2f6 + } else { + if (dl.isObject(args[1])) { + ao.srcObj = args[1]; + ao.srcFunc = args[2]; + ao.adviceObj = dj_global; + ao.adviceFunc = args[3] + } else { + if (dl.isObject(args[2])) { + ao.srcObj = dj_global; + ao.srcFunc = args[1]; + ao.adviceObj = args[2]; + ao.adviceFunc = args[3] + } else { + ao.srcObj = ao.adviceObj = ao.aroundObj = dj_global; + ao.srcFunc = args[1]; + ao.adviceFunc = args[2]; + ao.aroundFunc = args[3] + } + } + } + } + } + } + break; + case 6: + ao.srcObj = args[1]; + ao.srcFunc = args[2]; + ao.adviceObj = args[3]; + ao.adviceFunc = args[4]; + ao.aroundFunc = args[5]; + ao.aroundObj = dj_global; + break; + default: + ao.srcObj = args[1]; + ao.srcFunc = args[2]; + ao.adviceObj = args[3]; + ao.adviceFunc = args[4]; + ao.aroundObj = args[5]; + ao.aroundFunc = args[6]; + ao.once = args[7]; + ao.delay = args[8]; + ao.rate = args[9]; + ao.adviceMsg = args[10]; + ao.maxCalls = (!isNaN(parseInt(args[11]))) ? args[11] : -1; + break + } + if (dl.isFunction(ao.aroundFunc)) { + var _2f6 = dl.nameAnonFunc(ao.aroundFunc, ao.aroundObj, _2f3); + ao.aroundFunc = _2f6 + } + if (dl.isFunction(ao.srcFunc)) { + ao.srcFunc = dl.getNameInObj(ao.srcObj, ao.srcFunc) + } + if (dl.isFunction(ao.adviceFunc)) { + ao.adviceFunc = dl.getNameInObj(ao.adviceObj, ao.adviceFunc) + } + if ((ao.aroundObj) && (dl.isFunction(ao.aroundFunc))) { + ao.aroundFunc = dl.getNameInObj(ao.aroundObj, ao.aroundFunc) + } + if (!ao.srcObj) { + dojo.raise('bad srcObj for srcFunc: ' + ao.srcFunc) + } + if (!ao.adviceObj) { + dojo.raise('bad adviceObj for adviceFunc: ' + ao.adviceFunc) + } + if (!ao.adviceFunc) { + dojo.debug('bad adviceFunc for srcFunc: ' + ao.srcFunc); + dojo.debugShallow(ao) + } + return ao + } + + this.connect = function () { + if (arguments.length == 1) { + var ao = arguments[0] + } else { + var ao = interpolateArgs(arguments, true) + } + if (dojo.lang.isString(ao.srcFunc) && (ao.srcFunc.toLowerCase() == 'onkey')) { + if (dojo.render.html.ie) { + ao.srcFunc = 'onkeydown'; + this.connect(ao) + } + ao.srcFunc = 'onkeypress' + } + if (dojo.lang.isArray(ao.srcObj) && ao.srcObj != '') { + var _2f8 = {}; + for (var x in ao) { + _2f8[x] = ao[x] + } + var mjps = []; + dojo.lang.forEach(ao.srcObj, function (src) { + if ((dojo.render.html.capable) && (dojo.lang.isString(src))) { + src = dojo.byId(src) + } + _2f8.srcObj = src; + mjps.push(dojo.event.connect.call(dojo.event, _2f8)) + }); + return mjps + } + var mjp = dojo.event.MethodJoinPoint.getForMethod(ao.srcObj, ao.srcFunc); + if (ao.adviceFunc) { + var mjp2 = dojo.event.MethodJoinPoint.getForMethod(ao.adviceObj, ao.adviceFunc) + } + mjp.kwAddAdvice(ao); + return mjp + }; + this.log = function (a1, a2) { + var _300; + if ((arguments.length == 1) && (typeof a1 == 'object')) { + _300 = a1 + } else { + _300 = {srcObj: a1, srcFunc: a2} + } + _300.adviceFunc = function () { + var _301 = []; + for (var x = 0; x < arguments.length; x++) { + _301.push(arguments[x]) + } + dojo.debug('(' + _300.srcObj + ').' + _300.srcFunc, ':', _301.join(', ')) + }; + this.kwConnect(_300) + }; + this.connectBefore = function () { + var args = ['before']; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]) + } + return this.connect.apply(this, args) + }; + this.connectAround = function () { + var args = ['around']; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]) + } + return this.connect.apply(this, args) + }; + this.connectOnce = function () { + var ao = interpolateArgs(arguments, true); + ao.once = true; + return this.connect(ao) + }; + this.connectRunOnce = function () { + var ao = interpolateArgs(arguments, true); + ao.maxCalls = 1; + return this.connect(ao) + }; + this._kwConnectImpl = function (_309, _30a) { + var fn = (_30a) ? 'disconnect' : 'connect'; + if (typeof _309['srcFunc'] == 'function') { + _309.srcObj = _309['srcObj'] || dj_global; + var _30c = dojo.lang.nameAnonFunc(_309.srcFunc, _309.srcObj, true); + _309.srcFunc = _30c + } + if (typeof _309['adviceFunc'] == 'function') { + _309.adviceObj = _309['adviceObj'] || dj_global; + var _30c = dojo.lang.nameAnonFunc(_309.adviceFunc, _309.adviceObj, true); + _309.adviceFunc = _30c + } + _309.srcObj = _309['srcObj'] || dj_global; + _309.adviceObj = _309['adviceObj'] || _309['targetObj'] || dj_global; + _309.adviceFunc = _309['adviceFunc'] || _309['targetFunc']; + return dojo.event[fn](_309) + }; + this.kwConnect = function (_30d) { + return this._kwConnectImpl(_30d, false) + }; + this.disconnect = function () { + if (arguments.length == 1) { + var ao = arguments[0] + } else { + var ao = interpolateArgs(arguments, true) + } + if (!ao.adviceFunc) { + return + } + if (dojo.lang.isString(ao.srcFunc) && (ao.srcFunc.toLowerCase() == 'onkey')) { + if (dojo.render.html.ie) { + ao.srcFunc = 'onkeydown'; + this.disconnect(ao) + } + ao.srcFunc = 'onkeypress' + } + if (!ao.srcObj[ao.srcFunc]) { + return null + } + var mjp = dojo.event.MethodJoinPoint.getForMethod(ao.srcObj, ao.srcFunc, true); + mjp.removeAdvice(ao.adviceObj, ao.adviceFunc, ao.adviceType, ao.once); + return mjp + }; + this.kwDisconnect = function (_310) { + return this._kwConnectImpl(_310, true) + } +}; +;dojo.event.MethodInvocation = function (_311, obj, args) { + this.jp_ = _311; + this.object = obj; + this.args = []; + for (var x = 0; x < args.length; x++) { + this.args[x] = args[x] + } + this.around_index = -1 +}; +dojo.event.MethodInvocation.prototype.proceed = function () { + this.around_index++; + if (this.around_index >= this.jp_.around.length) { + return this.jp_.object[this.jp_.methodname].apply(this.jp_.object, this.args) + } else { + var ti = this.jp_.around[this.around_index]; + var mobj = ti[0] || dj_global; + var meth = ti[1]; + return mobj[meth].call(mobj, this) + } +}; +dojo.event.MethodJoinPoint = function (obj, _319) { + this.object = obj || dj_global; + this.methodname = _319; + this.methodfunc = this.object[_319]; + this.squelch = false +}; +dojo.event.MethodJoinPoint.getForMethod = function (obj, _31b) { + if (!obj) { + obj = dj_global + } + var ofn = obj[_31b]; + if (!ofn) { + ofn = obj[_31b] = function () { + }; + if (!obj[_31b]) { + dojo.raise('Cannot set do-nothing method on that object ' + _31b) + } + } else { + if ((typeof ofn != 'function') && (!dojo.lang.isFunction(ofn)) && (!dojo.lang.isAlien(ofn))) { + return null + } + } + var _31d = _31b + '$joinpoint'; + var _31e = _31b + '$joinpoint$method'; + var _31f = obj[_31d]; + if (!_31f) { + var _320 = false; + if (dojo.event['browser']) { + if ((obj['attachEvent']) || (obj['nodeType']) || (obj['addEventListener'])) { + _320 = true; + dojo.event.browser.addClobberNodeAttrs(obj, [_31d, _31e, _31b]) + } + } + var _321 = ofn.length; + obj[_31e] = ofn; + _31f = obj[_31d] = new dojo.event.MethodJoinPoint(obj, _31e); + if (!_320) { + obj[_31b] = function () { + return _31f.run.apply(_31f, arguments) + } + } else { + obj[_31b] = function () { + var args = []; + if (!arguments.length) { + var evt = null; + try { + if (obj.ownerDocument) { + evt = obj.ownerDocument.parentWindow.event + } else { + if (obj.documentElement) { + evt = obj.documentElement.ownerDocument.parentWindow.event + } else { + if (obj.event) { + evt = obj.event + } else { + evt = window.event + } + } + } + } catch (e) { + evt = window.event + } + if (evt) { + args.push(dojo.event.browser.fixEvent(evt, this)) + } + } else { + for (var x = 0; x < arguments.length; x++) { + if ((x == 0) && (dojo.event.browser.isEvent(arguments[x]))) { + args.push(dojo.event.browser.fixEvent(arguments[x], this)) + } else { + args.push(arguments[x]) + } + } + } + return _31f.run.apply(_31f, args) + } + } + obj[_31b].__preJoinArity = _321 + } + return _31f +}; +dojo.lang.extend(dojo.event.MethodJoinPoint, { + squelch: false, unintercept: function () { + this.object[this.methodname] = this.methodfunc; + this.before = []; + this.after = []; + this.around = [] + }, disconnect: dojo.lang.forward('unintercept'), run: function () { + var obj = this.object || dj_global; + var args = arguments; + var _327 = []; + for (var x = 0; x < args.length; x++) { + _327[x] = args[x] + } + var _329 = function (marr) { + if (!marr) { + dojo.debug('Null argument to unrollAdvice()'); + return + } + var _32b = marr[0] || dj_global; + var _32c = marr[1]; + if (!_32b[_32c]) { + dojo.raise('function "' + _32c + '" does not exist on "' + _32b + '"') + } + var _32d = marr[2] || dj_global; + var _32e = marr[3]; + var msg = marr[6]; + var _330 = marr[7]; + if (_330 > -1) { + if (_330 == 0) { + return + } + marr[7]-- + } + var _331; + var to = { + args: [], jp_: this, object: obj, proceed: function () { + return _32b[_32c].apply(_32b, to.args) + } + }; + to.args = _327; + var _333 = parseInt(marr[4]); + var _334 = ((!isNaN(_333)) && (marr[4] !== null) && (typeof marr[4] != 'undefined')); + if (marr[5]) { + var rate = parseInt(marr[5]); + var cur = new Date(); + var _337 = false; + if ((marr['last']) && ((cur - marr.last) <= rate)) { + if (dojo.event._canTimeout) { + if (marr['delayTimer']) { + clearTimeout(marr.delayTimer) + } + var tod = parseInt(rate * 2); + var mcpy = dojo.lang.shallowCopy(marr); + marr.delayTimer = setTimeout(function () { + mcpy[5] = 0; + _329(mcpy) + }, tod) + } + return + } else { + marr.last = cur + } + } + if (_32e) { + _32d[_32e].call(_32d, to) + } else { + if ((_334) && ((dojo.render.html) || (dojo.render.svg))) { + dj_global['setTimeout'](function () { + if (msg) { + _32b[_32c].call(_32b, to) + } else { + _32b[_32c].apply(_32b, args) + } + }, _333) + } else { + if (msg) { + _32b[_32c].call(_32b, to) + } else { + _32b[_32c].apply(_32b, args) + } + } + } + }; + var _33a = function () { + if (this.squelch) { + try { + return _329.apply(this, arguments) + } catch (e) { + dojo.debug(e) + } + } else { + return _329.apply(this, arguments) + } + }; + if ((this['before']) && (this.before.length > 0)) { + dojo.lang.forEach(this.before.concat([]), _33a) + } + var _33b; + try { + if ((this['around']) && (this.around.length > 0)) { + var mi = new dojo.event.MethodInvocation(this, obj, args); + _33b = mi.proceed() + } else { + if (this.methodfunc) { + _33b = this.object[this.methodname].apply(this.object, args) + } + } + } catch (e) { + if (!this.squelch) { + dojo.debug(e, 'when calling', this.methodname, 'on', this.object, 'with arguments', args); + dojo.raise(e) + } + } + if ((this['after']) && (this.after.length > 0)) { + dojo.lang.forEach(this.after.concat([]), _33a) + } + return (this.methodfunc) ? _33b : null + }, getArr: function (kind) { + var type = 'after'; + if ((typeof kind == 'string') && (kind.indexOf('before') != -1)) { + type = 'before' + } else { + if (kind == 'around') { + type = 'around' + } + } + if (!this[type]) { + this[type] = [] + } + return this[type] + }, kwAddAdvice: function (args) { + this.addAdvice(args['adviceObj'], args['adviceFunc'], args['aroundObj'], args['aroundFunc'], args['adviceType'], args['precedence'], args['once'], args['delay'], args['rate'], args['adviceMsg'], args['maxCalls']) + }, addAdvice: function (_340, _341, _342, _343, _344, _345, once, _347, rate, _349, _34a) { + var arr = this.getArr(_344); + if (!arr) { + dojo.raise('bad this: ' + this) + } + var ao = [_340, _341, _342, _343, _347, rate, _349, _34a]; + if (once) { + if (this.hasAdvice(_340, _341, _344, arr) >= 0) { + return + } + } + if (_345 == 'first') { + arr.unshift(ao) + } else { + arr.push(ao) + } + }, hasAdvice: function (_34d, _34e, _34f, arr) { + if (!arr) { + arr = this.getArr(_34f) + } + var ind = -1; + for (var x = 0; x < arr.length; x++) { + var aao = (typeof _34e == 'object') ? (String(_34e)).toString() : _34e; + var a1o = (typeof arr[x][1] == 'object') ? (String(arr[x][1])).toString() : arr[x][1]; + if ((arr[x][0] == _34d) && (a1o == aao)) { + ind = x + } + } + return ind + }, removeAdvice: function (_355, _356, _357, once) { + var arr = this.getArr(_357); + var ind = this.hasAdvice(_355, _356, _357, arr); + if (ind == -1) { + return false + } + while (ind != -1) { + arr.splice(ind, 1); + if (once) { + break + } + ind = this.hasAdvice(_355, _356, _357, arr) + } + return true + } +}); +dojo.provide('dojo.event.topic'); +dojo.event.topic = new function () { + this.topics = {}; + this.getTopic = function (_35b) { + if (!this.topics[_35b]) { + this.topics[_35b] = new this.TopicImpl(_35b) + } + return this.topics[_35b] + }; + this.registerPublisher = function (_35c, obj, _35e) { + var _35c = this.getTopic(_35c); + _35c.registerPublisher(obj, _35e) + }; + this.subscribe = function (_35f, obj, _361) { + var _35f = this.getTopic(_35f); + _35f.subscribe(obj, _361) + }; + this.unsubscribe = function (_362, obj, _364) { + var _362 = this.getTopic(_362); + _362.unsubscribe(obj, _364) + }; + this.destroy = function (_365) { + this.getTopic(_365).destroy(); + delete this.topics[_365] + }; + this.publishApply = function (_366, args) { + var _366 = this.getTopic(_366); + _366.sendMessage.apply(_366, args) + }; + this.publish = function (_368, _369) { + var _368 = this.getTopic(_368); + var args = []; + for (var x = 1; x < arguments.length; x++) { + args.push(arguments[x]) + } + _368.sendMessage.apply(_368, args) + } +}; +;dojo.event.topic.TopicImpl = function (_36c) { + this.topicName = _36c; + this.subscribe = function (_36d, _36e) { + var tf = _36e || _36d; + var to = (!_36e) ? dj_global : _36d; + return dojo.event.kwConnect({srcObj: this, srcFunc: 'sendMessage', adviceObj: to, adviceFunc: tf}) + }; + this.unsubscribe = function (_371, _372) { + var tf = (!_372) ? _371 : _372; + var to = (!_372) ? null : _371; + return dojo.event.kwDisconnect({srcObj: this, srcFunc: 'sendMessage', adviceObj: to, adviceFunc: tf}) + }; + this._getJoinPoint = function () { + return dojo.event.MethodJoinPoint.getForMethod(this, 'sendMessage') + }; + this.setSquelch = function (_375) { + this._getJoinPoint().squelch = _375 + }; + this.destroy = function () { + this._getJoinPoint().disconnect() + }; + this.registerPublisher = function (_376, _377) { + dojo.event.connect(_376, _377, this, 'sendMessage') + }; + this.sendMessage = function (_378) { + } +}; +dojo.provide('dojo.event.browser'); +dojo._ie_clobber = new function () { + this.clobberNodes = []; + + function nukeProp(node, prop) { + try { + node[prop] = null + } catch (e) { + } + try { + delete node[prop] + } catch (e) { + } + try { + node.removeAttribute(prop) + } catch (e) { + } + } + + this.clobber = function (_37b) { + var na; + var tna; + if (_37b) { + tna = _37b.all || _37b.getElementsByTagName('*'); + na = [_37b]; + for (var x = 0; x < tna.length; x++) { + if (tna[x]['__doClobber__']) { + na.push(tna[x]) + } + } + } else { + try { + window.onload = null + } catch (e) { + } + na = (this.clobberNodes.length) ? this.clobberNodes : document.all + } + tna = null; + var _37f = {}; + for (var i = na.length - 1; i >= 0; i = i - 1) { + var el = na[i]; + try { + if (el && el['__clobberAttrs__']) { + for (var j = 0; j < el.__clobberAttrs__.length; j++) { + nukeProp(el, el.__clobberAttrs__[j]) + } + nukeProp(el, '__clobberAttrs__'); + nukeProp(el, '__doClobber__') + } + } catch (e) { + } + } + na = null + } +}; +; +if (dojo.render.html.ie) { + dojo.addOnUnload(function () { + dojo._ie_clobber.clobber(); + try { + if ((dojo['widget']) && (dojo.widget['manager'])) { + dojo.widget.manager.destroyAll() + } + } catch (e) { + } + if (dojo.widget) { + for (var name in dojo.widget._templateCache) { + if (dojo.widget._templateCache[name].node) { + dojo.dom.destroyNode(dojo.widget._templateCache[name].node); + dojo.widget._templateCache[name].node = null; + delete dojo.widget._templateCache[name].node + } + } + } + try { + window.onload = null + } catch (e) { + } + try { + window.onunload = null + } catch (e) { + } + dojo._ie_clobber.clobberNodes = [] + }) +} +dojo.event.browser = new function () { + var _384 = 0; + this.normalizedEventName = function (_385) { + switch (_385) { + case 'CheckboxStateChange': + case 'DOMAttrModified': + case 'DOMMenuItemActive': + case 'DOMMenuItemInactive': + case 'DOMMouseScroll': + case 'DOMNodeInserted': + case 'DOMNodeRemoved': + case 'RadioStateChange': + return _385; + break; + default: + var lcn = _385.toLowerCase(); + return (lcn.indexOf('on') == 0) ? lcn.substr(2) : lcn; + break + } + }; + this.clean = function (node) { + if (dojo.render.html.ie) { + dojo._ie_clobber.clobber(node) + } + }; + this.addClobberNode = function (node) { + if (!dojo.render.html.ie) { + return + } + if (!node['__doClobber__']) { + node.__doClobber__ = true; + dojo._ie_clobber.clobberNodes.push(node); + node.__clobberAttrs__ = [] + } + }; + this.addClobberNodeAttrs = function (node, _38a) { + if (!dojo.render.html.ie) { + return + } + this.addClobberNode(node); + for (var x = 0; x < _38a.length; x++) { + node.__clobberAttrs__.push(_38a[x]) + } + }; + this.removeListener = function (node, _38d, fp, _38f) { + if (!_38f) { + var _38f = false + } + _38d = dojo.event.browser.normalizedEventName(_38d); + if (_38d == 'key') { + if (dojo.render.html.ie) { + this.removeListener(node, 'onkeydown', fp, _38f) + } + _38d = 'keypress' + } + if (node.removeEventListener) { + node.removeEventListener(_38d, fp, _38f) + } + }; + this.addListener = function (node, _391, fp, _393, _394) { + if (!node) { + return + } + if (!_393) { + var _393 = false + } + _391 = dojo.event.browser.normalizedEventName(_391); + if (_391 == 'key') { + if (dojo.render.html.ie) { + this.addListener(node, 'onkeydown', fp, _393, _394) + } + _391 = 'keypress' + } + if (!_394) { + var _395 = function (evt) { + if (!evt) { + evt = window.event + } + var ret = fp(dojo.event.browser.fixEvent(evt, this)); + if (_393) { + dojo.event.browser.stopEvent(evt) + } + return ret + } + } else { + _395 = fp + } + if (node.addEventListener) { + node.addEventListener(_391, _395, _393); + return _395 + } else { + _391 = 'on' + _391; + if (typeof node[_391] == 'function') { + var _398 = node[_391]; + node[_391] = function (e) { + _398(e); + return _395(e) + } + } else { + node[_391] = _395 + } + if (dojo.render.html.ie) { + this.addClobberNodeAttrs(node, [_391]) + } + return _395 + } + }; + this.isEvent = function (obj) { + return (typeof obj != 'undefined') && (obj) && (typeof Event != 'undefined') && (obj.eventPhase) + }; + this.currentEvent = null; + this.callListener = function (_39b, _39c) { + if (typeof _39b != 'function') { + dojo.raise('listener not a function: ' + _39b) + } + dojo.event.browser.currentEvent.currentTarget = _39c; + return _39b.call(_39c, dojo.event.browser.currentEvent) + }; + this._stopPropagation = function () { + dojo.event.browser.currentEvent.cancelBubble = true + }; + this._preventDefault = function () { + dojo.event.browser.currentEvent.returnValue = false + }; + this.keys = { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_CLEAR: 12, + KEY_ENTER: 13, + KEY_SHIFT: 16, + KEY_CTRL: 17, + KEY_ALT: 18, + KEY_PAUSE: 19, + KEY_CAPS_LOCK: 20, + KEY_ESCAPE: 27, + KEY_SPACE: 32, + KEY_PAGE_UP: 33, + KEY_PAGE_DOWN: 34, + KEY_END: 35, + KEY_HOME: 36, + KEY_LEFT_ARROW: 37, + KEY_UP_ARROW: 38, + KEY_RIGHT_ARROW: 39, + KEY_DOWN_ARROW: 40, + KEY_INSERT: 45, + KEY_DELETE: 46, + KEY_HELP: 47, + KEY_LEFT_WINDOW: 91, + KEY_RIGHT_WINDOW: 92, + KEY_SELECT: 93, + KEY_NUMPAD_0: 96, + KEY_NUMPAD_1: 97, + KEY_NUMPAD_2: 98, + KEY_NUMPAD_3: 99, + KEY_NUMPAD_4: 100, + KEY_NUMPAD_5: 101, + KEY_NUMPAD_6: 102, + KEY_NUMPAD_7: 103, + KEY_NUMPAD_8: 104, + KEY_NUMPAD_9: 105, + KEY_NUMPAD_MULTIPLY: 106, + KEY_NUMPAD_PLUS: 107, + KEY_NUMPAD_ENTER: 108, + KEY_NUMPAD_MINUS: 109, + KEY_NUMPAD_PERIOD: 110, + KEY_NUMPAD_DIVIDE: 111, + KEY_F1: 112, + KEY_F2: 113, + KEY_F3: 114, + KEY_F4: 115, + KEY_F5: 116, + KEY_F6: 117, + KEY_F7: 118, + KEY_F8: 119, + KEY_F9: 120, + KEY_F10: 121, + KEY_F11: 122, + KEY_F12: 123, + KEY_F13: 124, + KEY_F14: 125, + KEY_F15: 126, + KEY_NUM_LOCK: 144, + KEY_SCROLL_LOCK: 145 + }; + this.revKeys = []; + for (var key in this.keys) { + this.revKeys[this.keys[key]] = key + } + this.fixEvent = function (evt, _39f) { + if (!evt) { + if (window['event']) { + evt = window.event + } + } + if ((evt['type']) && (evt['type'].indexOf('key') == 0)) { + evt.keys = this.revKeys; + for (var key in this.keys) { + evt[key] = this.keys[key] + } + if (evt['type'] == 'keydown' && dojo.render.html.ie) { + switch (evt.keyCode) { + case evt.KEY_SHIFT: + case evt.KEY_CTRL: + case evt.KEY_ALT: + case evt.KEY_CAPS_LOCK: + case evt.KEY_LEFT_WINDOW: + case evt.KEY_RIGHT_WINDOW: + case evt.KEY_SELECT: + case evt.KEY_NUM_LOCK: + case evt.KEY_SCROLL_LOCK: + case evt.KEY_NUMPAD_0: + case evt.KEY_NUMPAD_1: + case evt.KEY_NUMPAD_2: + case evt.KEY_NUMPAD_3: + case evt.KEY_NUMPAD_4: + case evt.KEY_NUMPAD_5: + case evt.KEY_NUMPAD_6: + case evt.KEY_NUMPAD_7: + case evt.KEY_NUMPAD_8: + case evt.KEY_NUMPAD_9: + case evt.KEY_NUMPAD_PERIOD: + break; + case evt.KEY_NUMPAD_MULTIPLY: + case evt.KEY_NUMPAD_PLUS: + case evt.KEY_NUMPAD_ENTER: + case evt.KEY_NUMPAD_MINUS: + case evt.KEY_NUMPAD_DIVIDE: + break; + case evt.KEY_PAUSE: + case evt.KEY_TAB: + case evt.KEY_BACKSPACE: + case evt.KEY_ENTER: + case evt.KEY_ESCAPE: + case evt.KEY_PAGE_UP: + case evt.KEY_PAGE_DOWN: + case evt.KEY_END: + case evt.KEY_HOME: + case evt.KEY_LEFT_ARROW: + case evt.KEY_UP_ARROW: + case evt.KEY_RIGHT_ARROW: + case evt.KEY_DOWN_ARROW: + case evt.KEY_INSERT: + case evt.KEY_DELETE: + case evt.KEY_F1: + case evt.KEY_F2: + case evt.KEY_F3: + case evt.KEY_F4: + case evt.KEY_F5: + case evt.KEY_F6: + case evt.KEY_F7: + case evt.KEY_F8: + case evt.KEY_F9: + case evt.KEY_F10: + case evt.KEY_F11: + case evt.KEY_F12: + case evt.KEY_F12: + case evt.KEY_F13: + case evt.KEY_F14: + case evt.KEY_F15: + case evt.KEY_CLEAR: + case evt.KEY_HELP: + evt.key = evt.keyCode; + break; + default: + if (evt.ctrlKey || evt.altKey) { + var _3a1 = evt.keyCode; + if (_3a1 >= 65 && _3a1 <= 90 && evt.shiftKey == false) { + _3a1 += 32 + } + if (_3a1 >= 1 && _3a1 <= 26 && evt.ctrlKey) { + _3a1 += 96 + } + evt.key = String.fromCharCode(_3a1) + } + } + } else { + if (evt['type'] == 'keypress') { + if (dojo.render.html.opera) { + if (evt.which == 0) { + evt.key = evt.keyCode + } else { + if (evt.which > 0) { + switch (evt.which) { + case evt.KEY_SHIFT: + case evt.KEY_CTRL: + case evt.KEY_ALT: + case evt.KEY_CAPS_LOCK: + case evt.KEY_NUM_LOCK: + case evt.KEY_SCROLL_LOCK: + break; + case evt.KEY_PAUSE: + case evt.KEY_TAB: + case evt.KEY_BACKSPACE: + case evt.KEY_ENTER: + case evt.KEY_ESCAPE: + evt.key = evt.which; + break; + default: + var _3a1 = evt.which; + if ((evt.ctrlKey || evt.altKey || evt.metaKey) && (evt.which + >= 65 + && evt.which + <= 90 + && evt.shiftKey + == false)) { + _3a1 += 32 + } + evt.key = String.fromCharCode(_3a1) + } + } + } + } else { + if (dojo.render.html.ie) { + if (!evt.ctrlKey && !evt.altKey && evt.keyCode >= evt.KEY_SPACE) { + evt.key = String.fromCharCode(evt.keyCode) + } + } else { + if (dojo.render.html.safari) { + switch (evt.keyCode) { + case 25: + evt.key = evt.KEY_TAB; + evt.shift = true; + break; + case 63232: + evt.key = evt.KEY_UP_ARROW; + break; + case 63233: + evt.key = evt.KEY_DOWN_ARROW; + break; + case 63234: + evt.key = evt.KEY_LEFT_ARROW; + break; + case 63235: + evt.key = evt.KEY_RIGHT_ARROW; + break; + case 63236: + evt.key = evt.KEY_F1; + break; + case 63237: + evt.key = evt.KEY_F2; + break; + case 63238: + evt.key = evt.KEY_F3; + break; + case 63239: + evt.key = evt.KEY_F4; + break; + case 63240: + evt.key = evt.KEY_F5; + break; + case 63241: + evt.key = evt.KEY_F6; + break; + case 63242: + evt.key = evt.KEY_F7; + break; + case 63243: + evt.key = evt.KEY_F8; + break; + case 63244: + evt.key = evt.KEY_F9; + break; + case 63245: + evt.key = evt.KEY_F10; + break; + case 63246: + evt.key = evt.KEY_F11; + break; + case 63247: + evt.key = evt.KEY_F12; + break; + case 63250: + evt.key = evt.KEY_PAUSE; + break; + case 63272: + evt.key = evt.KEY_DELETE; + break; + case 63273: + evt.key = evt.KEY_HOME; + break; + case 63275: + evt.key = evt.KEY_END; + break; + case 63276: + evt.key = evt.KEY_PAGE_UP; + break; + case 63277: + evt.key = evt.KEY_PAGE_DOWN; + break; + case 63302: + evt.key = evt.KEY_INSERT; + break; + case 63248: + case 63249: + case 63289: + break; + default: + evt.key = evt.charCode >= evt.KEY_SPACE ? String.fromCharCode(evt.charCode) : evt.keyCode + } + } else { + evt.key = evt.charCode > 0 ? String.fromCharCode(evt.charCode) : evt.keyCode + } + } + } + } + } + } + if (dojo.render.html.ie) { + if (!evt.target) { + evt.target = evt.srcElement + } + if (!evt.currentTarget) { + evt.currentTarget = (_39f ? _39f : evt.srcElement) + } + if (!evt.layerX) { + evt.layerX = evt.offsetX + } + if (!evt.layerY) { + evt.layerY = evt.offsetY + } + var doc = (evt.srcElement && evt.srcElement.ownerDocument) ? evt.srcElement.ownerDocument : document; + var _3a3 = ((dojo.render.html.ie55) || (doc['compatMode'] == 'BackCompat')) ? doc.body : doc.documentElement; + if (!evt.pageX) { + evt.pageX = evt.clientX + (_3a3.scrollLeft || 0) + } + if (!evt.pageY) { + evt.pageY = evt.clientY + (_3a3.scrollTop || 0) + } + if (evt.type == 'mouseover') { + evt.relatedTarget = evt.fromElement + } + if (evt.type == 'mouseout') { + evt.relatedTarget = evt.toElement + } + this.currentEvent = evt; + evt.callListener = this.callListener; + evt.stopPropagation = this._stopPropagation; + evt.preventDefault = this._preventDefault + } + return evt + }; + this.stopEvent = function (evt) { + if (window.event) { + evt.cancelBubble = true; + evt.returnValue = false + } else { + evt.preventDefault(); + evt.stopPropagation() + } + } +}; +;dojo.kwCompoundRequire({ + common: ['dojo.event.common', 'dojo.event.topic'], browser: ['dojo.event.browser'], dashboard: ['dojo.event.browser'] +}); +dojo.provide('dojo.event.*'); +dojo.provide('dojo.gfx.color'); +dojo.gfx.color.Color = function (r, g, b, a) { + if (dojo.lang.isArray(r)) { + this.r = r[0]; + this.g = r[1]; + this.b = r[2]; + this.a = r[3] || 1 + } else { + if (dojo.lang.isString(r)) { + var rgb = dojo.gfx.color.extractRGB(r); + this.r = rgb[0]; + this.g = rgb[1]; + this.b = rgb[2]; + this.a = g || 1 + } else { + if (r instanceof dojo.gfx.color.Color) { + this.r = r.r; + this.b = r.b; + this.g = r.g; + this.a = r.a + } else { + this.r = r; + this.g = g; + this.b = b; + this.a = a + } + } + } +}; +dojo.gfx.color.Color.fromArray = function (arr) { + return new dojo.gfx.color.Color(arr[0], arr[1], arr[2], arr[3]) +}; +dojo.extend(dojo.gfx.color.Color, { + toRgb: function (_3ab) { + if (_3ab) { + return this.toRgba() + } else { + return [this.r, this.g, this.b] + } + }, toRgba: function () { + return [this.r, this.g, this.b, this.a] + }, toHex: function () { + return dojo.gfx.color.rgb2hex(this.toRgb()) + }, toCss: function () { + return 'rgb(' + this.toRgb().join() + ')' + }, toString: function () { + return this.toHex() + }, blend: function (_3ac, _3ad) { + var rgb = null; + if (dojo.lang.isArray(_3ac)) { + rgb = _3ac + } else { + if (_3ac instanceof dojo.gfx.color.Color) { + rgb = _3ac.toRgb() + } else { + rgb = new dojo.gfx.color.Color(_3ac).toRgb() + } + } + return dojo.gfx.color.blend(this.toRgb(), rgb, _3ad) + } +}); +dojo.gfx.color.named = { + white: [255, 255, 255], + black: [0, 0, 0], + red: [255, 0, 0], + green: [0, 255, 0], + lime: [0, 255, 0], + blue: [0, 0, 255], + navy: [0, 0, 128], + gray: [128, 128, 128], + silver: [192, 192, 192] +}; +dojo.gfx.color.blend = function (a, b, _3b1) { + if (typeof a == 'string') { + return dojo.gfx.color.blendHex(a, b, _3b1) + } + if (!_3b1) { + _3b1 = 0 + } + _3b1 = Math.min(Math.max(-1, _3b1), 1); + _3b1 = ((_3b1 + 1) / 2); + var c = []; + for (var x = 0; x < 3; x++) { + c[x] = parseInt(b[x] + ((a[x] - b[x]) * _3b1)) + } + return c +}; +dojo.gfx.color.blendHex = function (a, b, _3b6) { + return dojo.gfx.color.rgb2hex(dojo.gfx.color.blend(dojo.gfx.color.hex2rgb(a), dojo.gfx.color.hex2rgb(b), _3b6)) +}; +dojo.gfx.color.extractRGB = function (_3b7) { + var hex = '0123456789abcdef'; + _3b7 = _3b7.toLowerCase(); + if (_3b7.indexOf('rgb') == 0) { + var _3b9 = _3b7.match(/rgba*\((\d+), *(\d+), *(\d+)/i); + var ret = _3b9.splice(1, 3); + return ret + } else { + var _3bb = dojo.gfx.color.hex2rgb(_3b7); + if (_3bb) { + return _3bb + } else { + return dojo.gfx.color.named[_3b7] || [255, 255, 255] + } + } +}; +dojo.gfx.color.hex2rgb = function (hex) { + var _3bd = '0123456789ABCDEF'; + var rgb = new Array(3); + if (hex.indexOf('#') == 0) { + hex = hex.substring(1) + } + hex = hex.toUpperCase(); + if (hex.replace(new RegExp('[' + _3bd + ']', 'g'), '') != '') { + return null + } + if (hex.length == 3) { + rgb[0] = hex.charAt(0) + hex.charAt(0); + rgb[1] = hex.charAt(1) + hex.charAt(1); + rgb[2] = hex.charAt(2) + hex.charAt(2) + } else { + rgb[0] = hex.substring(0, 2); + rgb[1] = hex.substring(2, 4); + rgb[2] = hex.substring(4) + } + for (var i = 0; i < rgb.length; i++) { + rgb[i] = _3bd.indexOf(rgb[i].charAt(0)) * 16 + _3bd.indexOf(rgb[i].charAt(1)) + } + return rgb +}; +dojo.gfx.color.rgb2hex = function (r, g, b) { + if (dojo.lang.isArray(r)) { + g = r[1] || 0; + b = r[2] || 0; + r = r[0] || 0 + } + var ret = dojo.lang.map([r, g, b], function (x) { + x = Number(x); + var s = x.toString(16); + while (s.length < 2) { + s = '0' + s + } + return s + }); + ret.unshift('#'); + return ret.join('') +}; +dojo.provide('dojo.lfx.Animation'); +dojo.lfx.Line = function (_3c6, end) { + this.start = _3c6; + this.end = end; + if (dojo.lang.isArray(_3c6)) { + var diff = []; + dojo.lang.forEach(this.start, function (s, i) { + diff[i] = this.end[i] - s + }, this); + this.getValue = function (n) { + var res = []; + dojo.lang.forEach(this.start, function (s, i) { + res[i] = (diff[i] * n) + s + }, this); + return res + } + } else { + var diff = end - _3c6; + this.getValue = function (n) { + return (diff * n) + this.start + } + } +}; +if ((dojo.render.html.khtml) && (!dojo.render.html.safari)) { + dojo.lfx.easeDefault = function (n) { + return (parseFloat('0.5') + ((Math.sin((n + parseFloat('1.5')) * Math.PI)) / 2)) + } +} else { + dojo.lfx.easeDefault = function (n) { + return (0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2)) + } +} +dojo.lfx.easeIn = function (n) { + return Math.pow(n, 3) +}; +dojo.lfx.easeOut = function (n) { + return (1 - Math.pow(1 - n, 3)) +}; +dojo.lfx.easeInOut = function (n) { + return ((3 * Math.pow(n, 2)) - (2 * Math.pow(n, 3))) +}; +dojo.lfx.IAnimation = function () { +}; +dojo.lang.extend(dojo.lfx.IAnimation, { + curve: null, + duration: 1000, + easing: null, + repeatCount: 0, + rate: 10, + handler: null, + beforeBegin: null, + onBegin: null, + onAnimate: null, + onEnd: null, + onPlay: null, + onPause: null, + onStop: null, + play: null, + pause: null, + stop: null, + connect: function (evt, _3d6, _3d7) { + if (!_3d7) { + _3d7 = _3d6; + _3d6 = this + } + _3d7 = dojo.lang.hitch(_3d6, _3d7); + var _3d8 = this[evt] || function () { + }; + this[evt] = function () { + var ret = _3d8.apply(this, arguments); + _3d7.apply(this, arguments); + return ret + }; + return this + }, + fire: function (evt, args) { + if (this[evt]) { + this[evt].apply(this, (args || [])) + } + return this + }, + repeat: function (_3dc) { + this.repeatCount = _3dc; + return this + }, + _active: false, + _paused: false +}); +dojo.lfx.Animation = function (_3dd, _3de, _3df, _3e0, _3e1, rate) { + dojo.lfx.IAnimation.call(this); + if (dojo.lang.isNumber(_3dd) || (!_3dd && _3de.getValue)) { + rate = _3e1; + _3e1 = _3e0; + _3e0 = _3df; + _3df = _3de; + _3de = _3dd; + _3dd = null + } else { + if (_3dd.getValue || dojo.lang.isArray(_3dd)) { + rate = _3e0; + _3e1 = _3df; + _3e0 = _3de; + _3df = _3dd; + _3de = null; + _3dd = null + } + } + if (dojo.lang.isArray(_3df)) { + this.curve = new dojo.lfx.Line(_3df[0], _3df[1]) + } else { + this.curve = _3df + } + if (_3de != null && _3de > 0) { + this.duration = _3de + } + if (_3e1) { + this.repeatCount = _3e1 + } + if (rate) { + this.rate = rate + } + if (_3dd) { + dojo.lang.forEach(['handler', 'beforeBegin', 'onBegin', 'onEnd', 'onPlay', 'onStop', 'onAnimate'], function (item) { + if (_3dd[item]) { + this.connect(item, _3dd[item]) + } + }, this) + } + if (_3e0 && dojo.lang.isFunction(_3e0)) { + this.easing = _3e0 + } +}; +dojo.inherits(dojo.lfx.Animation, dojo.lfx.IAnimation); +dojo.lang.extend(dojo.lfx.Animation, { + _startTime: null, _endTime: null, _timer: null, _percent: 0, _startRepeatCount: 0, play: function (_3e4, _3e5) { + if (_3e5) { + clearTimeout(this._timer); + this._active = false; + this._paused = false; + this._percent = 0 + } else { + if (this._active && !this._paused) { + return this + } + } + this.fire('handler', ['beforeBegin']); + this.fire('beforeBegin'); + if (_3e4 > 0) { + setTimeout(dojo.lang.hitch(this, function () { + this.play(null, _3e5) + }), _3e4); + return this + } + this._startTime = new Date().valueOf(); + if (this._paused) { + this._startTime -= (this.duration * this._percent / 100) + } + this._endTime = this._startTime + this.duration; + this._active = true; + this._paused = false; + var step = this._percent / 100; + var _3e7 = this.curve.getValue(step); + if (this._percent == 0) { + if (!this._startRepeatCount) { + this._startRepeatCount = this.repeatCount + } + this.fire('handler', ['begin', _3e7]); + this.fire('onBegin', [_3e7]) + } + this.fire('handler', ['play', _3e7]); + this.fire('onPlay', [_3e7]); + this._cycle(); + return this + }, pause: function () { + clearTimeout(this._timer); + if (!this._active) { + return this + } + this._paused = true; + var _3e8 = this.curve.getValue(this._percent / 100); + this.fire('handler', ['pause', _3e8]); + this.fire('onPause', [_3e8]); + return this + }, gotoPercent: function (pct, _3ea) { + clearTimeout(this._timer); + this._active = true; + this._paused = true; + this._percent = pct; + if (_3ea) { + this.play() + } + return this + }, stop: function (_3eb) { + clearTimeout(this._timer); + var step = this._percent / 100; + if (_3eb) { + step = 1 + } + var _3ed = this.curve.getValue(step); + this.fire('handler', ['stop', _3ed]); + this.fire('onStop', [_3ed]); + this._active = false; + this._paused = false; + return this + }, status: function () { + if (this._active) { + return this._paused ? 'paused' : 'playing' + } else { + return 'stopped' + } + return this + }, _cycle: function () { + clearTimeout(this._timer); + if (this._active) { + var curr = new Date().valueOf(); + var step = (curr - this._startTime) / (this._endTime - this._startTime); + if (step >= 1) { + step = 1; + this._percent = 100 + } else { + this._percent = step * 100 + } + if ((this.easing) && (dojo.lang.isFunction(this.easing))) { + step = this.easing(step) + } + var _3f0 = this.curve.getValue(step); + this.fire('handler', ['animate', _3f0]); + this.fire('onAnimate', [_3f0]); + if (step < 1) { + this._timer = setTimeout(dojo.lang.hitch(this, '_cycle'), this.rate) + } else { + this._active = false; + this.fire('handler', ['end']); + this.fire('onEnd'); + if (this.repeatCount > 0) { + this.repeatCount--; + this.play(null, true) + } else { + if (this.repeatCount == -1) { + this.play(null, true) + } else { + if (this._startRepeatCount) { + this.repeatCount = this._startRepeatCount; + this._startRepeatCount = 0 + } + } + } + } + } + return this + } +}); +dojo.lfx.Combine = function (_3f1) { + dojo.lfx.IAnimation.call(this); + this._anims = []; + this._animsEnded = 0; + var _3f2 = arguments; + if (_3f2.length == 1 && (dojo.lang.isArray(_3f2[0]) || dojo.lang.isArrayLike(_3f2[0]))) { + _3f2 = _3f2[0] + } + dojo.lang.forEach(_3f2, function (anim) { + this._anims.push(anim); + anim.connect('onEnd', dojo.lang.hitch(this, '_onAnimsEnded')) + }, this) +}; +dojo.inherits(dojo.lfx.Combine, dojo.lfx.IAnimation); +dojo.lang.extend(dojo.lfx.Combine, { + _animsEnded: 0, play: function (_3f4, _3f5) { + if (!this._anims.length) { + return this + } + this.fire('beforeBegin'); + if (_3f4 > 0) { + setTimeout(dojo.lang.hitch(this, function () { + this.play(null, _3f5) + }), _3f4); + return this + } + if (_3f5 || this._anims[0].percent == 0) { + this.fire('onBegin') + } + this.fire('onPlay'); + this._animsCall('play', null, _3f5); + return this + }, pause: function () { + this.fire('onPause'); + this._animsCall('pause'); + return this + }, stop: function (_3f6) { + this.fire('onStop'); + this._animsCall('stop', _3f6); + return this + }, _onAnimsEnded: function () { + this._animsEnded++; + if (this._animsEnded >= this._anims.length) { + this.fire('onEnd') + } + return this + }, _animsCall: function (_3f7) { + var args = []; + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args.push(arguments[i]) + } + } + var _3fa = this; + dojo.lang.forEach(this._anims, function (anim) { + anim[_3f7](args) + }, _3fa); + return this + } +}); +dojo.lfx.Chain = function (_3fc) { + dojo.lfx.IAnimation.call(this); + this._anims = []; + this._currAnim = -1; + var _3fd = arguments; + if (_3fd.length == 1 && (dojo.lang.isArray(_3fd[0]) || dojo.lang.isArrayLike(_3fd[0]))) { + _3fd = _3fd[0] + } + var _3fe = this; + dojo.lang.forEach(_3fd, function (anim, i, _401) { + this._anims.push(anim); + if (i < _401.length - 1) { + anim.connect('onEnd', dojo.lang.hitch(this, '_playNext')) + } else { + anim.connect('onEnd', dojo.lang.hitch(this, function () { + this.fire('onEnd') + })) + } + }, this) +}; +dojo.inherits(dojo.lfx.Chain, dojo.lfx.IAnimation); +dojo.lang.extend(dojo.lfx.Chain, { + _currAnim: -1, play: function (_402, _403) { + if (!this._anims.length) { + return this + } + if (_403 || !this._anims[this._currAnim]) { + this._currAnim = 0 + } + var _404 = this._anims[this._currAnim]; + this.fire('beforeBegin'); + if (_402 > 0) { + setTimeout(dojo.lang.hitch(this, function () { + this.play(null, _403) + }), _402); + return this + } + if (_404) { + if (this._currAnim == 0) { + this.fire('handler', ['begin', this._currAnim]); + this.fire('onBegin', [this._currAnim]) + } + this.fire('onPlay', [this._currAnim]); + _404.play(null, _403) + } + return this + }, pause: function () { + if (this._anims[this._currAnim]) { + this._anims[this._currAnim].pause(); + this.fire('onPause', [this._currAnim]) + } + return this + }, playPause: function () { + if (this._anims.length == 0) { + return this + } + if (this._currAnim == -1) { + this._currAnim = 0 + } + var _405 = this._anims[this._currAnim]; + if (_405) { + if (!_405._active || _405._paused) { + this.play() + } else { + this.pause() + } + } + return this + }, stop: function () { + var _406 = this._anims[this._currAnim]; + if (_406) { + _406.stop(); + this.fire('onStop', [this._currAnim]) + } + return _406 + }, _playNext: function () { + if (this._currAnim == -1 || this._anims.length == 0) { + return this + } + this._currAnim++; + if (this._anims[this._currAnim]) { + this._anims[this._currAnim].play(null, true) + } + return this + } +}); +dojo.lfx.combine = function (_407) { + var _408 = arguments; + if (dojo.lang.isArray(arguments[0])) { + _408 = arguments[0] + } + if (_408.length == 1) { + return _408[0] + } + return new dojo.lfx.Combine(_408) +}; +dojo.lfx.chain = function (_409) { + var _40a = arguments; + if (dojo.lang.isArray(arguments[0])) { + _40a = arguments[0] + } + if (_40a.length == 1) { + return _40a[0] + } + return new dojo.lfx.Chain(_40a) +}; +dojo.provide('dojo.html.common'); +dojo.lang.mixin(dojo.html, dojo.dom); +dojo.html.body = function () { + dojo.deprecated('dojo.html.body() moved to dojo.body()', '0.5'); + return dojo.body() +}; +dojo.html.getEventTarget = function (evt) { + if (!evt) { + evt = dojo.global().event || {} + } + var t = (evt.srcElement ? evt.srcElement : (evt.target ? evt.target : null)); + while ((t) && (t.nodeType != 1)) { + t = t.parentNode + } + return t +}; +dojo.html.getViewport = function () { + var _40d = dojo.global(); + var _40e = dojo.doc(); + var w = 0; + var h = 0; + if (dojo.render.html.mozilla) { + w = _40e.documentElement.clientWidth; + h = _40d.innerHeight + } else { + if (!dojo.render.html.opera && _40d.innerWidth) { + w = _40d.innerWidth; + h = _40d.innerHeight + } else { + if (!dojo.render.html.opera && dojo.exists(_40e, 'documentElement.clientWidth')) { + var w2 = _40e.documentElement.clientWidth; + if (!w || w2 && w2 < w) { + w = w2 + } + h = _40e.documentElement.clientHeight + } else { + if (dojo.body().clientWidth) { + w = dojo.body().clientWidth; + h = dojo.body().clientHeight + } + } + } + } + return {width: w, height: h} +}; +dojo.html.getScroll = function () { + var _412 = dojo.global(); + var _413 = dojo.doc(); + var top = _412.pageYOffset || _413.documentElement.scrollTop || dojo.body().scrollTop || 0; + var left = _412.pageXOffset || _413.documentElement.scrollLeft || dojo.body().scrollLeft || 0; + return {top: top, left: left, offset: {x: left, y: top}} +}; +dojo.html.getParentByType = function (node, type) { + var _418 = dojo.doc(); + var _419 = dojo.byId(node); + type = type.toLowerCase(); + while ((_419) && (_419.nodeName.toLowerCase() != type)) { + if (_419 == (_418['body'] || _418['documentElement'])) { + return null + } + _419 = _419.parentNode + } + return _419 +}; +dojo.html.getAttribute = function (node, attr) { + node = dojo.byId(node); + if ((!node) || (!node.getAttribute)) { + return null + } + var ta = typeof attr == 'string' ? attr : String(attr); + var v = node.getAttribute(ta.toUpperCase()); + if ((v) && (typeof v == 'string') && (v != '')) { + return v + } + if (v && v.value) { + return v.value + } + if ((node.getAttributeNode) && (node.getAttributeNode(ta))) { + return (node.getAttributeNode(ta)).value + } else { + if (node.getAttribute(ta)) { + return node.getAttribute(ta) + } else { + if (node.getAttribute(ta.toLowerCase())) { + return node.getAttribute(ta.toLowerCase()) + } + } + } + return null +}; +dojo.html.hasAttribute = function (node, attr) { + return dojo.html.getAttribute(dojo.byId(node), attr) ? true : false +}; +dojo.html.getCursorPosition = function (e) { + e = e || dojo.global().event; + var _421 = {x: 0, y: 0}; + if (e.pageX || e.pageY) { + _421.x = e.pageX; + _421.y = e.pageY + } else { + var de = dojo.doc().documentElement; + var db = dojo.body(); + _421.x = e.clientX + ((de || db)['scrollLeft']) - ((de || db)['clientLeft']); + _421.y = e.clientY + ((de || db)['scrollTop']) - ((de || db)['clientTop']) + } + return _421 +}; +dojo.html.isTag = function (node) { + node = dojo.byId(node); + if (node && node.tagName) { + for (var i = 1; i < arguments.length; i++) { + if (node.tagName.toLowerCase() == String(arguments[i]).toLowerCase()) { + return String(arguments[i]).toLowerCase() + } + } + } + return '' +}; +if (dojo.render.html.ie && !dojo.render.html.ie70) { + if (window.location.href.substr(0, 6).toLowerCase() != 'https:') { + (function () { + var _426 = dojo.doc().createElement('script'); + _426.src = 'javascript:\'dojo.html.createExternalElement=function(doc, tag){ return doc.createElement(tag); }\''; + dojo.doc().getElementsByTagName('head')[0].appendChild(_426) + })() + } +} else { + dojo.html.createExternalElement = function (doc, tag) { + return doc.createElement(tag) + } +} +dojo.html._callDeprecated = function (_429, _42a, args, _42c, _42d) { + dojo.deprecated('dojo.html.' + _429, 'replaced by dojo.html.' + _42a + '(' + (_42c ? 'node, {' + + _42c + + ': ' + + _42c + + '}' : '') + ')' + (_42d ? '.' + _42d : ''), '0.5'); + var _42e = []; + if (_42c) { + var _42f = {}; + _42f[_42c] = args[1]; + _42e.push(args[0]); + _42e.push(_42f) + } else { + _42e = args + } + var ret = dojo.html[_42a].apply(dojo.html, args); + if (_42d) { + return ret[_42d] + } else { + return ret + } +}; +dojo.html.getViewportWidth = function () { + return dojo.html._callDeprecated('getViewportWidth', 'getViewport', arguments, null, 'width') +}; +dojo.html.getViewportHeight = function () { + return dojo.html._callDeprecated('getViewportHeight', 'getViewport', arguments, null, 'height') +}; +dojo.html.getViewportSize = function () { + return dojo.html._callDeprecated('getViewportSize', 'getViewport', arguments) +}; +dojo.html.getScrollTop = function () { + return dojo.html._callDeprecated('getScrollTop', 'getScroll', arguments, null, 'top') +}; +dojo.html.getScrollLeft = function () { + return dojo.html._callDeprecated('getScrollLeft', 'getScroll', arguments, null, 'left') +}; +dojo.html.getScrollOffset = function () { + return dojo.html._callDeprecated('getScrollOffset', 'getScroll', arguments, null, 'offset') +}; +dojo.provide('dojo.uri.Uri'); +dojo.uri = new function () { + this.dojoUri = function (uri) { + return new dojo.uri.Uri(dojo.hostenv.getBaseScriptUri(), uri) + }; + this.moduleUri = function (_432, uri) { + var loc = dojo.hostenv.getModuleSymbols(_432).join('/'); + if (!loc) { + return null + } + if (loc.lastIndexOf('/') != loc.length - 1) { + loc += '/' + } + var _435 = loc.indexOf(':'); + var _436 = loc.indexOf('/'); + if (loc.charAt(0) != '/' && (_435 == -1 || _435 > _436)) { + loc = dojo.hostenv.getBaseScriptUri() + loc + } + return new dojo.uri.Uri(loc, uri) + }; + this.Uri = function () { + var uri = arguments[0]; + for (var i = 1; i < arguments.length; i++) { + if (!arguments[i]) { + continue + } + var _439 = new dojo.uri.Uri(arguments[i].toString()); + var _43a = new dojo.uri.Uri(uri.toString()); + if ((_439.path == '') && (_439.scheme == null) && (_439.authority == null) && (_439.query == null)) { + if (_439.fragment != null) { + _43a.fragment = _439.fragment + } + _439 = _43a + } else { + if (_439.scheme == null) { + _439.scheme = _43a.scheme; + if (_439.authority == null) { + _439.authority = _43a.authority; + if (_439.path.charAt(0) != '/') { + var path = _43a.path.substring(0, _43a.path.lastIndexOf('/') + 1) + _439.path; + var segs = path.split('/'); + for (var j = 0; j < segs.length; j++) { + if (segs[j] == '.') { + if (j == segs.length - 1) { + segs[j] = '' + } else { + segs.splice(j, 1); + j-- + } + } else { + if (j > 0 && !(j == 1 && segs[0] == '') && segs[j] == '..' && segs[j - 1] != '..') { + if (j == segs.length - 1) { + segs.splice(j, 1); + segs[j - 1] = '' + } else { + segs.splice(j - 1, 2); + j -= 2 + } + } + } + } + _439.path = segs.join('/') + } + } + } + } + uri = ''; + if (_439.scheme != null) { + uri += _439.scheme + ':' + } + if (_439.authority != null) { + uri += '//' + _439.authority + } + uri += _439.path; + if (_439.query != null) { + uri += '?' + _439.query + } + if (_439.fragment != null) { + uri += '#' + _439.fragment + } + } + this.uri = uri.toString(); + var _43e = '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$'; + var r = this.uri.match(new RegExp(_43e)); + this.scheme = r[2] || (r[1] ? '' : null); + this.authority = r[4] || (r[3] ? '' : null); + this.path = r[5]; + this.query = r[7] || (r[6] ? '' : null); + this.fragment = r[9] || (r[8] ? '' : null); + if (this.authority != null) { + _43e = '^((([^:]+:)?([^@]+))@)?([^:]*)(:([0-9]+))?$'; + r = this.authority.match(new RegExp(_43e)); + this.user = r[3] || null; + this.password = r[4] || null; + this.host = r[5]; + this.port = r[7] || null + } + this.toString = function () { + return this.uri + } + } +}; +;dojo.provide('dojo.html.style'); +dojo.html.getClass = function (node) { + node = dojo.byId(node); + if (!node) { + return '' + } + var cs = ''; + if (node.className) { + cs = node.className + } else { + if (dojo.html.hasAttribute(node, 'class')) { + cs = dojo.html.getAttribute(node, 'class') + } + } + return cs.replace(/^\s+|\s+$/g, '') +}; +dojo.html.getClasses = function (node) { + var c = dojo.html.getClass(node); + return (c == '') ? [] : c.split(/\s+/g) +}; +dojo.html.hasClass = function (node, _445) { + return (new RegExp('(^|\\s+)' + _445 + '(\\s+|$)')).test(dojo.html.getClass(node)) +}; +dojo.html.prependClass = function (node, _447) { + _447 += ' ' + dojo.html.getClass(node); + return dojo.html.setClass(node, _447) +}; +dojo.html.addClass = function (node, _449) { + if (dojo.html.hasClass(node, _449)) { + return false + } + _449 = (dojo.html.getClass(node) + ' ' + _449).replace(/^\s+|\s+$/g, ''); + return dojo.html.setClass(node, _449) +}; +dojo.html.setClass = function (node, _44b) { + node = dojo.byId(node); + var cs = String(_44b); + try { + if (typeof node.className == 'string') { + node.className = cs + } else { + if (node.setAttribute) { + node.setAttribute('class', _44b); + node.className = cs + } else { + return false + } + } + } catch (e) { + dojo.debug('dojo.html.setClass() failed', e) + } + return true +}; +dojo.html.removeClass = function (node, _44e, _44f) { + try { + if (!_44f) { + var _450 = dojo.html.getClass(node).replace(new RegExp('(^|\\s+)' + _44e + '(\\s+|$)'), '$1$2') + } else { + var _450 = dojo.html.getClass(node).replace(_44e, '') + } + dojo.html.setClass(node, _450) + } catch (e) { + dojo.debug('dojo.html.removeClass() failed', e) + } + return true +}; +dojo.html.replaceClass = function (node, _452, _453) { + dojo.html.removeClass(node, _453); + dojo.html.addClass(node, _452) +}; +dojo.html.classMatchType = {ContainsAll: 0, ContainsAny: 1, IsOnly: 2}; +dojo.html.getElementsByClass = function (_454, _455, _456, _457, _458) { + _458 = false; + var _459 = dojo.doc(); + _455 = dojo.byId(_455) || _459; + var _45a = _454.split(/\s+/g); + var _45b = []; + if (_457 != 1 && _457 != 2) { + _457 = 0 + } + var _45c = new RegExp('(\\s|^)((' + _45a.join(')|(') + '))(\\s|$)'); + var _45d = _45a.join(' ').length; + var _45e = []; + if (!_458 && _459.evaluate) { + var _45f = './/' + (_456 || '*') + '[contains('; + if (_457 != dojo.html.classMatchType.ContainsAny) { + _45f += 'concat(\' \',@class,\' \'), \' ' + + _45a.join(' \') and contains(concat(\' \',@class,\' \'), \' ') + + ' \')'; + if (_457 == 2) { + _45f += ' and string-length(@class)=' + _45d + ']' + } else { + _45f += ']' + } + } else { + _45f += 'concat(\' \',@class,\' \'), \' ' + + _45a.join(' \') or contains(concat(\' \',@class,\' \'), \' ') + + ' \')]' + } + var _460 = _459.evaluate(_45f, _455, null, XPathResult.ANY_TYPE, null); + var _461 = _460.iterateNext(); + while (_461) { + try { + _45e.push(_461); + _461 = _460.iterateNext() + } catch (e) { + break + } + } + return _45e + } else { + if (!_456) { + _456 = '*' + } + _45e = _455.getElementsByTagName(_456); + var node, i = 0; + outer: + while (node = _45e[i++]) { + var _464 = dojo.html.getClasses(node); + if (_464.length == 0) { + continue; + } + var _465 = 0; + for (var j = 0; j < _464.length; j++) { + if (_45c.test(_464[j])) { + if (_457 == dojo.html.classMatchType.ContainsAny) { + _45b.push(node); + continue outer + } else { + _465++ + } + } else { + if (_457 == dojo.html.classMatchType.IsOnly) { + continue outer + } + } + } + if (_465 == _45a.length) { + if ((_457 == dojo.html.classMatchType.IsOnly) && (_465 == _464.length)) { + _45b.push(node) + } else { + if (_457 == dojo.html.classMatchType.ContainsAll) { + _45b.push(node) + } + } + } + } + return _45b + } +}; +dojo.html.getElementsByClassName = dojo.html.getElementsByClass; +dojo.html.toCamelCase = function (_467) { + var arr = _467.split('-'), cc = arr[0]; + for (var i = 1; i < arr.length; i++) { + cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1) + } + return cc +}; +dojo.html.toSelectorCase = function (_46b) { + return _46b.replace(/([A-Z])/g, '-$1').toLowerCase() +}; +if (dojo.render.html.ie) { + dojo.html.getComputedStyle = function (node, _46d, _46e) { + node = dojo.byId(node); + if (!node || !node.currentStyle) { + return _46e + } + return node.currentStyle[dojo.html.toCamelCase(_46d)] + }; + dojo.html.getComputedStyles = function (node) { + return node.currentStyle + } +} else { + dojo.html.getComputedStyle = function (node, _471, _472) { + node = dojo.byId(node); + if (!node || !node.style) { + return _472 + } + var s = document.defaultView.getComputedStyle(node, null); + return (s && s[dojo.html.toCamelCase(_471)]) || '' + }; + dojo.html.getComputedStyles = function (node) { + return document.defaultView.getComputedStyle(node, null) + } +} +dojo.html.getStyleProperty = function (node, _476) { + node = dojo.byId(node); + return (node && node.style ? node.style[dojo.html.toCamelCase(_476)] : undefined) +}; +dojo.html.getStyle = function (node, _478) { + var _479 = dojo.html.getStyleProperty(node, _478); + return (_479 ? _479 : dojo.html.getComputedStyle(node, _478)) +}; +dojo.html.setStyle = function (node, _47b, _47c) { + node = dojo.byId(node); + if (node && node.style) { + var _47d = dojo.html.toCamelCase(_47b); + node.style[_47d] = _47c + } +}; +dojo.html.setStyleText = function (_47e, text) { + try { + _47e.style.cssText = text + } catch (e) { + _47e.setAttribute('style', text) + } +}; +dojo.html.copyStyle = function (_480, _481) { + if (!_481.style.cssText) { + _480.setAttribute('style', _481.getAttribute('style')) + } else { + _480.style.cssText = _481.style.cssText + } + dojo.html.addClass(_480, dojo.html.getClass(_481)) +}; +dojo.html.getUnitValue = function (node, _483, _484) { + var s = dojo.html.getComputedStyle(node, _483); + if ((!s) || ((s == 'auto') && (_484))) { + return {value: 0, units: 'px'} + } + var _486 = s.match(/(\-?[\d.]+)([a-z%]*)/i); + if (!_486) { + return dojo.html.getUnitValue.bad + } + return {value: Number(_486[1]), units: _486[2].toLowerCase()} +}; +dojo.html.getUnitValue.bad = {value: NaN, units: ''}; +if (dojo.render.html.ie) { + dojo.html.toPixelValue = function (_487, _488) { + if (!_488) { + return 0 + } + if (_488.slice(-2) == 'px') { + return parseFloat(_488) + } + var _489 = 0; + with (_487) { + var _48a = style.left; + var _48b = runtimeStyle.left; + runtimeStyle.left = currentStyle.left; + try { + style.left = _488 || 0; + _489 = style.pixelLeft; + style.left = _48a; + runtimeStyle.left = _48b + } catch (e) { + } + } + return _489 + } +} else { + dojo.html.toPixelValue = function (_48c, _48d) { + return (_48d && (_48d.slice(-2) == 'px') ? parseFloat(_48d) : 0) + } +} +dojo.html.getPixelValue = function (node, _48f, _490) { + return dojo.html.toPixelValue(node, dojo.html.getComputedStyle(node, _48f)) +}; +dojo.html.setPositivePixelValue = function (node, _492, _493) { + if (isNaN(_493)) { + return false + } + node.style[_492] = Math.max(0, _493) + 'px'; + return true +}; +dojo.html.styleSheet = null; +dojo.html.insertCssRule = function (_494, _495, _496) { + if (!dojo.html.styleSheet) { + if (document.createStyleSheet) { + dojo.html.styleSheet = document.createStyleSheet() + } else { + if (document.styleSheets[0]) { + dojo.html.styleSheet = document.styleSheets[0] + } else { + return null + } + } + } + if (arguments.length < 3) { + if (dojo.html.styleSheet.cssRules) { + _496 = dojo.html.styleSheet.cssRules.length + } else { + if (dojo.html.styleSheet.rules) { + _496 = dojo.html.styleSheet.rules.length + } else { + return null + } + } + } + if (dojo.html.styleSheet.insertRule) { + var rule = _494 + ' { ' + _495 + ' }'; + return dojo.html.styleSheet.insertRule(rule, _496) + } else { + if (dojo.html.styleSheet.addRule) { + return dojo.html.styleSheet.addRule(_494, _495, _496) + } else { + return null + } + } +}; +dojo.html.removeCssRule = function (_498) { + if (!dojo.html.styleSheet) { + dojo.debug('no stylesheet defined for removing rules'); + return false + } + if (dojo.render.html.ie) { + if (!_498) { + _498 = dojo.html.styleSheet.rules.length; + dojo.html.styleSheet.removeRule(_498) + } + } else { + if (document.styleSheets[0]) { + if (!_498) { + _498 = dojo.html.styleSheet.cssRules.length + } + dojo.html.styleSheet.deleteRule(_498) + } + } + return true +}; +dojo.html._insertedCssFiles = []; +dojo.html.insertCssFile = function (URI, doc, _49b, _49c) { + if (!URI) { + return + } + if (!doc) { + doc = document + } + var _49d = dojo.hostenv.getText(URI, false, _49c); + if (_49d === null) { + return + } + _49d = dojo.html.fixPathsInCssText(_49d, URI); + if (_49b) { + var idx = -1, node, ent = dojo.html._insertedCssFiles; + for (var i = 0; i < ent.length; i++) { + if ((ent[i].doc == doc) && (ent[i].cssText == _49d)) { + idx = i; + node = ent[i].nodeRef; + break + } + } + if (node) { + var _4a2 = doc.getElementsByTagName('style'); + for (var i = 0; i < _4a2.length; i++) { + if (_4a2[i] == node) { + return + } + } + dojo.html._insertedCssFiles.shift(idx, 1) + } + } + var _4a3 = dojo.html.insertCssText(_49d, doc); + dojo.html._insertedCssFiles.push({'doc': doc, 'cssText': _49d, 'nodeRef': _4a3}); + if (_4a3 && djConfig.isDebug) { + _4a3.setAttribute('dbgHref', URI) + } + return _4a3 +}; +dojo.html.insertCssText = function (_4a4, doc, URI) { + if (!_4a4) { + return + } + if (!doc) { + doc = document + } + if (URI) { + _4a4 = dojo.html.fixPathsInCssText(_4a4, URI) + } + var _4a7 = doc.createElement('style'); + _4a7.setAttribute('type', 'text/css'); + var head = doc.getElementsByTagName('head')[0]; + if (!head) { + dojo.debug('No head tag in document, aborting styles'); + return + } else { + head.appendChild(_4a7) + } + if (_4a7.styleSheet) { + var _4a9 = function () { + try { + _4a7.styleSheet.cssText = _4a4 + } catch (e) { + dojo.debug(e) + } + }; + if (_4a7.styleSheet.disabled) { + setTimeout(_4a9, 10) + } else { + _4a9() + } + } else { + var _4aa = doc.createTextNode(_4a4); + _4a7.appendChild(_4aa) + } + return _4a7 +}; +dojo.html.fixPathsInCssText = function (_4ab, URI) { + if (!_4ab || !URI) { + return + } + var _4ad, str = '', url = '', _4b0 = '[\\t\\s\\w\\(\\)\\/\\.\\\\\'"-:#=&?~]+'; + var _4b1 = new RegExp('url\\(\\s*(' + _4b0 + ')\\s*\\)'); + var _4b2 = /(file|https?|ftps?):\/\//; + regexTrim = new RegExp('^[\\s]*([\'"]?)(' + _4b0 + ')\\1[\\s]*?$'); + if (dojo.render.html.ie55 || dojo.render.html.ie60) { + var _4b3 = new RegExp('AlphaImageLoader\\((.*)src=[\'"](' + _4b0 + ')[\'"]'); + while (_4ad = _4b3.exec(_4ab)) { + url = _4ad[2].replace(regexTrim, '$2'); + if (!_4b2.exec(url)) { + url = (new dojo.uri.Uri(URI, url).toString()) + } + str += _4ab.substring(0, _4ad.index) + 'AlphaImageLoader(' + _4ad[1] + 'src=\'' + url + '\''; + _4ab = _4ab.substr(_4ad.index + _4ad[0].length) + } + _4ab = str + _4ab; + str = '' + } + while (_4ad = _4b1.exec(_4ab)) { + url = _4ad[1].replace(regexTrim, '$2'); + if (!_4b2.exec(url)) { + url = (new dojo.uri.Uri(URI, url).toString()) + } + str += _4ab.substring(0, _4ad.index) + 'url(' + url + ')'; + _4ab = _4ab.substr(_4ad.index + _4ad[0].length) + } + return str + _4ab +}; +dojo.html.setActiveStyleSheet = function (_4b4) { + var i = 0, a, els = dojo.doc().getElementsByTagName('link'); + while (a = els[i++]) { + if (a.getAttribute('rel').indexOf('style') != -1 && a.getAttribute('title')) { + a.disabled = true; + if (a.getAttribute('title') == _4b4) { + a.disabled = false + } + } + } +}; +dojo.html.getActiveStyleSheet = function () { + var i = 0, a, els = dojo.doc().getElementsByTagName('link'); + while (a = els[i++]) { + if (a.getAttribute('rel').indexOf('style') != -1 && a.getAttribute('title') && !a.disabled) { + return a.getAttribute('title') + } + } + return null +}; +dojo.html.getPreferredStyleSheet = function () { + var i = 0, a, els = dojo.doc().getElementsByTagName('link'); + while (a = els[i++]) { + if (a.getAttribute('rel').indexOf('style') + != -1 + && a.getAttribute('rel').indexOf('alt') + == -1 + && a.getAttribute('title')) { + return a.getAttribute('title') + } + } + return null +}; +dojo.html.applyBrowserClass = function (node) { + var drh = dojo.render.html; + var _4c0 = { + dj_ie: drh.ie, + dj_ie55: drh.ie55, + dj_ie6: drh.ie60, + dj_ie7: drh.ie70, + dj_iequirks: drh.ie && drh.quirks, + dj_opera: drh.opera, + dj_opera8: drh.opera && (Math.floor(dojo.render.version) == 8), + dj_opera9: drh.opera && (Math.floor(dojo.render.version) == 9), + dj_khtml: drh.khtml, + dj_safari: drh.safari, + dj_gecko: drh.mozilla + }; + for (var p in _4c0) { + if (_4c0[p]) { + dojo.html.addClass(node, p) + } + } +}; +dojo.provide('dojo.html.display'); +dojo.html._toggle = function (node, _4c3, _4c4) { + node = dojo.byId(node); + _4c4(node, !_4c3(node)); + return _4c3(node) +}; +dojo.html.show = function (node) { + node = dojo.byId(node); + if (dojo.html.getStyleProperty(node, 'display') == 'none') { + dojo.html.setStyle(node, 'display', (node.dojoDisplayCache || '')); + node.dojoDisplayCache = undefined + } +}; +dojo.html.hide = function (node) { + node = dojo.byId(node); + if (typeof node['dojoDisplayCache'] == 'undefined') { + var d = dojo.html.getStyleProperty(node, 'display'); + if (d != 'none') { + node.dojoDisplayCache = d + } + } + dojo.html.setStyle(node, 'display', 'none') +}; +dojo.html.setShowing = function (node, _4c9) { + dojo.html[(_4c9 ? 'show' : 'hide')](node) +}; +dojo.html.isShowing = function (node) { + return (dojo.html.getStyleProperty(node, 'display') != 'none') +}; +dojo.html.toggleShowing = function (node) { + return dojo.html._toggle(node, dojo.html.isShowing, dojo.html.setShowing) +}; +dojo.html.displayMap = {tr: '', td: '', th: '', img: 'inline', span: 'inline', input: 'inline', button: 'inline'}; +dojo.html.suggestDisplayByTagName = function (node) { + node = dojo.byId(node); + if (node && node.tagName) { + var tag = node.tagName.toLowerCase(); + return (tag in dojo.html.displayMap ? dojo.html.displayMap[tag] : 'block') + } +}; +dojo.html.setDisplay = function (node, _4cf) { + dojo.html.setStyle(node, 'display', ((_4cf + instanceof String + || typeof _4cf + == 'string') ? _4cf : (_4cf ? dojo.html.suggestDisplayByTagName(node) : 'none'))) +}; +dojo.html.isDisplayed = function (node) { + return (dojo.html.getComputedStyle(node, 'display') != 'none') +}; +dojo.html.toggleDisplay = function (node) { + return dojo.html._toggle(node, dojo.html.isDisplayed, dojo.html.setDisplay) +}; +dojo.html.setVisibility = function (node, _4d3) { + dojo.html.setStyle(node, 'visibility', ((_4d3 + instanceof String + || typeof _4d3 + == 'string') ? _4d3 : (_4d3 ? 'visible' : 'hidden'))) +}; +dojo.html.isVisible = function (node) { + return (dojo.html.getComputedStyle(node, 'visibility') != 'hidden') +}; +dojo.html.toggleVisibility = function (node) { + return dojo.html._toggle(node, dojo.html.isVisible, dojo.html.setVisibility) +}; +dojo.html.setOpacity = function (node, _4d7, _4d8) { + node = dojo.byId(node); + var h = dojo.render.html; + if (!_4d8) { + if (_4d7 >= 1) { + if (h.ie) { + dojo.html.clearOpacity(node); + return + } else { + _4d7 = 0.999999 + } + } else { + if (_4d7 < 0) { + _4d7 = 0 + } + } + } + if (h.ie) { + if (node.nodeName.toLowerCase() == 'tr') { + var tds = node.getElementsByTagName('td'); + for (var x = 0; x < tds.length; x++) { + tds[x].style.filter = 'Alpha(Opacity=' + _4d7 * 100 + ')' + } + } + node.style.filter = 'Alpha(Opacity=' + _4d7 * 100 + ')' + } else { + if (h.moz) { + node.style.opacity = _4d7; + node.style.MozOpacity = _4d7 + } else { + if (h.safari) { + node.style.opacity = _4d7; + node.style.KhtmlOpacity = _4d7 + } else { + node.style.opacity = _4d7 + } + } + } +}; +dojo.html.clearOpacity = function (node) { + node = dojo.byId(node); + var ns = node.style; + var h = dojo.render.html; + if (h.ie) { + try { + if (node.filters && node.filters.alpha) { + ns.filter = '' + } + } catch (e) { + } + } else { + if (h.moz) { + ns.opacity = 1; + ns.MozOpacity = 1 + } else { + if (h.safari) { + ns.opacity = 1; + ns.KhtmlOpacity = 1 + } else { + ns.opacity = 1 + } + } + } +}; +dojo.html.getOpacity = function (node) { + node = dojo.byId(node); + var h = dojo.render.html; + if (h.ie) { + var opac = (node.filters + && node.filters.alpha + && typeof node.filters.alpha.opacity + == 'number' ? node.filters.alpha.opacity : 100) / 100 + } else { + var opac = node.style.opacity || node.style.MozOpacity || node.style.KhtmlOpacity || 1 + } + return opac >= 0.999999 ? 1 : Number(opac) +}; +dojo.provide('dojo.html.color'); +dojo.html.getBackgroundColor = function (node) { + node = dojo.byId(node); + var _4e3; + do { + _4e3 = dojo.html.getStyle(node, 'background-color'); + if (_4e3.toLowerCase() == 'rgba(0, 0, 0, 0)') { + _4e3 = 'transparent' + } + if (node == document.getElementsByTagName('body')[0]) { + node = null; + break + } + node = node.parentNode + } while (node && dojo.lang.inArray(['transparent', ''], _4e3)); + if (_4e3 == 'transparent') { + _4e3 = [255, 255, 255, 0] + } else { + _4e3 = dojo.gfx.color.extractRGB(_4e3) + } + return _4e3 +}; +dojo.provide('dojo.html.layout'); +dojo.html.sumAncestorProperties = function (node, prop) { + node = dojo.byId(node); + if (!node) { + return 0 + } + var _4e6 = 0; + while (node) { + if (dojo.html.getComputedStyle(node, 'position') == 'fixed') { + return 0 + } + var val = node[prop]; + if (val) { + _4e6 += val - 0; + if (node == dojo.body()) { + break + } + } + node = node.parentNode + } + return _4e6 +}; +dojo.html.setStyleAttributes = function (node, _4e9) { + node = dojo.byId(node); + var _4ea = _4e9.replace(/(;)?\s*$/, '').split(';'); + for (var i = 0; i < _4ea.length; i++) { + var _4ec = _4ea[i].split(':'); + var name = _4ec[0].replace(/\s*$/, '').replace(/^\s*/, '').toLowerCase(); + var _4ee = _4ec[1].replace(/\s*$/, '').replace(/^\s*/, ''); + switch (name) { + case 'opacity': + dojo.html.setOpacity(node, _4ee); + break; + case 'content-height': + dojo.html.setContentBox(node, {height: _4ee}); + break; + case 'content-width': + dojo.html.setContentBox(node, {width: _4ee}); + break; + case 'outer-height': + dojo.html.setMarginBox(node, {height: _4ee}); + break; + case 'outer-width': + dojo.html.setMarginBox(node, {width: _4ee}); + break; + default: + node.style[dojo.html.toCamelCase(name)] = _4ee + } + } +}; +dojo.html.boxSizing = { + MARGIN_BOX: 'margin-box', BORDER_BOX: 'border-box', PADDING_BOX: 'padding-box', CONTENT_BOX: 'content-box' +}; +dojo.html.getAbsolutePosition = dojo.html.abs = function (node, _4f0, _4f1) { + node = dojo.byId(node, node.ownerDocument); + var ret = {x: 0, y: 0}; + var bs = dojo.html.boxSizing; + if (!_4f1) { + _4f1 = bs.CONTENT_BOX + } + var _4f4 = 2; + var _4f5; + switch (_4f1) { + case bs.MARGIN_BOX: + _4f5 = 3; + break; + case bs.BORDER_BOX: + _4f5 = 2; + break; + case bs.PADDING_BOX: + default: + _4f5 = 1; + break; + case bs.CONTENT_BOX: + _4f5 = 0; + break + } + var h = dojo.render.html; + var db = document['body'] || document['documentElement']; + if (h.ie) { + with (node.getBoundingClientRect()) { + ret.x = left - 2; + ret.y = top - 2 + } + } else { + if (document.getBoxObjectFor) { + _4f4 = 1; + try { + var bo = document.getBoxObjectFor(node); + ret.x = bo.x - dojo.html.sumAncestorProperties(node, 'scrollLeft'); + ret.y = bo.y - dojo.html.sumAncestorProperties(node, 'scrollTop') + } catch (e) { + } + } else { + if (node['offsetParent']) { + var _4f9; + if ((h.safari) && (node.style.getPropertyValue('position') == 'absolute') && (node.parentNode == db)) { + _4f9 = db + } else { + _4f9 = db.parentNode + } + if (node.parentNode != db) { + var nd = node; + if (dojo.render.html.opera) { + nd = db + } + ret.x -= dojo.html.sumAncestorProperties(nd, 'scrollLeft'); + ret.y -= dojo.html.sumAncestorProperties(nd, 'scrollTop') + } + var _4fb = node; + do { + var n = _4fb['offsetLeft']; + if (!h.opera || n > 0) { + ret.x += isNaN(n) ? 0 : n + } + var m = _4fb['offsetTop']; + ret.y += isNaN(m) ? 0 : m; + _4fb = _4fb.offsetParent + } while ((_4fb != _4f9) && (_4fb != null)) + } else { + if (node['x'] && node['y']) { + ret.x += isNaN(node.x) ? 0 : node.x; + ret.y += isNaN(node.y) ? 0 : node.y + } + } + } + } + if (_4f0) { + var _4fe = dojo.html.getScroll(); + ret.y += _4fe.top; + ret.x += _4fe.left + } + var _4ff = [dojo.html.getPaddingExtent, dojo.html.getBorderExtent, dojo.html.getMarginExtent]; + if (_4f4 > _4f5) { + for (var i = _4f5; i < _4f4; ++i) { + ret.y += _4ff[i](node, 'top'); + ret.x += _4ff[i](node, 'left') + } + } else { + if (_4f4 < _4f5) { + for (var i = _4f5; i > _4f4; --i) { + ret.y -= _4ff[i - 1](node, 'top'); + ret.x -= _4ff[i - 1](node, 'left') + } + } + } + ret.top = ret.y; + ret.left = ret.x; + return ret +}; +dojo.html.isPositionAbsolute = function (node) { + return (dojo.html.getComputedStyle(node, 'position') == 'absolute') +}; +dojo.html._sumPixelValues = function (node, _503, _504) { + var _505 = 0; + for (var x = 0; x < _503.length; x++) { + _505 += dojo.html.getPixelValue(node, _503[x], _504) + } + return _505 +}; +dojo.html.getMargin = function (node) { + return { + width: dojo.html._sumPixelValues(node, ['margin-left', 'margin-right'], (dojo.html.getComputedStyle(node, 'position') + == 'absolute')), + height: dojo.html._sumPixelValues(node, ['margin-top', 'margin-bottom'], (dojo.html.getComputedStyle(node, 'position') + == 'absolute')) + } +}; +dojo.html.getBorder = function (node) { + return { + width: dojo.html.getBorderExtent(node, 'left') + dojo.html.getBorderExtent(node, 'right'), + height: dojo.html.getBorderExtent(node, 'top') + dojo.html.getBorderExtent(node, 'bottom') + } +}; +dojo.html.getBorderExtent = function (node, side) { + return (dojo.html.getStyle(node, 'border-' + side + '-style') == 'none' ? 0 : dojo.html.getPixelValue(node, 'border-' + + side + + '-width')) +}; +dojo.html.getMarginExtent = function (node, side) { + return dojo.html._sumPixelValues(node, ['margin-' + side], dojo.html.isPositionAbsolute(node)) +}; +dojo.html.getPaddingExtent = function (node, side) { + return dojo.html._sumPixelValues(node, ['padding-' + side], true) +}; +dojo.html.getPadding = function (node) { + return { + width: dojo.html._sumPixelValues(node, ['padding-left', 'padding-right'], true), + height: dojo.html._sumPixelValues(node, ['padding-top', 'padding-bottom'], true) + } +}; +dojo.html.getPadBorder = function (node) { + var pad = dojo.html.getPadding(node); + var _512 = dojo.html.getBorder(node); + return {width: pad.width + _512.width, height: pad.height + _512.height} +}; +dojo.html.getBoxSizing = function (node) { + var h = dojo.render.html; + var bs = dojo.html.boxSizing; + if (((h.ie) || (h.opera)) && node.nodeName.toLowerCase() != 'img') { + var cm = document['compatMode']; + if ((cm == 'BackCompat') || (cm == 'QuirksMode')) { + return bs.BORDER_BOX + } else { + return bs.CONTENT_BOX + } + } else { + if (arguments.length == 0) { + node = document.documentElement + } + var _517; + if (!h.ie) { + _517 = dojo.html.getStyle(node, '-moz-box-sizing'); + if (!_517) { + _517 = dojo.html.getStyle(node, 'box-sizing') + } + } + return (_517 ? _517 : bs.CONTENT_BOX) + } +}; +dojo.html.isBorderBox = function (node) { + return (dojo.html.getBoxSizing(node) == dojo.html.boxSizing.BORDER_BOX) +}; +dojo.html.getBorderBox = function (node) { + node = dojo.byId(node); + return {width: node.offsetWidth, height: node.offsetHeight} +}; +dojo.html.getPaddingBox = function (node) { + var box = dojo.html.getBorderBox(node); + var _51c = dojo.html.getBorder(node); + return {width: box.width - _51c.width, height: box.height - _51c.height} +}; +dojo.html.getContentBox = function (node) { + node = dojo.byId(node); + var _51e = dojo.html.getPadBorder(node); + return {width: node.offsetWidth - _51e.width, height: node.offsetHeight - _51e.height} +}; +dojo.html.setContentBox = function (node, args) { + node = dojo.byId(node); + var _521 = 0; + var _522 = 0; + var isbb = dojo.html.isBorderBox(node); + var _524 = (isbb ? dojo.html.getPadBorder(node) : {width: 0, height: 0}); + var ret = {}; + if (typeof args.width != 'undefined') { + _521 = args.width + _524.width; + ret.width = dojo.html.setPositivePixelValue(node, 'width', _521) + } + if (typeof args.height != 'undefined') { + _522 = args.height + _524.height; + ret.height = dojo.html.setPositivePixelValue(node, 'height', _522) + } + return ret +}; +dojo.html.getMarginBox = function (node) { + var _527 = dojo.html.getBorderBox(node); + var _528 = dojo.html.getMargin(node); + return {width: _527.width + _528.width, height: _527.height + _528.height} +}; +dojo.html.setMarginBox = function (node, args) { + node = dojo.byId(node); + var _52b = 0; + var _52c = 0; + var isbb = dojo.html.isBorderBox(node); + var _52e = (!isbb ? dojo.html.getPadBorder(node) : {width: 0, height: 0}); + var _52f = dojo.html.getMargin(node); + var ret = {}; + if (typeof args.width != 'undefined') { + _52b = args.width - _52e.width; + _52b -= _52f.width; + ret.width = dojo.html.setPositivePixelValue(node, 'width', _52b) + } + if (typeof args.height != 'undefined') { + _52c = args.height - _52e.height; + _52c -= _52f.height; + ret.height = dojo.html.setPositivePixelValue(node, 'height', _52c) + } + return ret +}; +dojo.html.getElementBox = function (node, type) { + var bs = dojo.html.boxSizing; + switch (type) { + case bs.MARGIN_BOX: + return dojo.html.getMarginBox(node); + case bs.BORDER_BOX: + return dojo.html.getBorderBox(node); + case bs.PADDING_BOX: + return dojo.html.getPaddingBox(node); + case bs.CONTENT_BOX: + default: + return dojo.html.getContentBox(node) + } +}; +dojo.html.toCoordinateObject = dojo.html.toCoordinateArray = function (_534, _535, _536) { + if (_534 instanceof Array || typeof _534 == 'array') { + dojo.deprecated('dojo.html.toCoordinateArray', 'use dojo.html.toCoordinateObject({left: , top: , width: , height: }) instead', '0.5'); + while (_534.length < 4) { + _534.push(0) + } + while (_534.length > 4) { + _534.pop() + } + var ret = {left: _534[0], top: _534[1], width: _534[2], height: _534[3]} + } else { + if (!_534.nodeType && !(_534 instanceof String || typeof _534 == 'string') && ('width' + in _534 + || 'height' + in _534 + || 'left' + in _534 + || 'x' + in _534 + || 'top' + in _534 + || 'y' + in _534)) { + var ret = { + left: _534.left || _534.x || 0, top: _534.top || _534.y || 0, width: _534.width || 0, height: _534.height || 0 + } + } else { + var node = dojo.byId(_534); + var pos = dojo.html.abs(node, _535, _536); + var _53a = dojo.html.getMarginBox(node); + var ret = {left: pos.left, top: pos.top, width: _53a.width, height: _53a.height} + } + } + ret.x = ret.left; + ret.y = ret.top; + return ret +}; +dojo.html.setMarginBoxWidth = dojo.html.setOuterWidth = function (node, _53c) { + return dojo.html._callDeprecated('setMarginBoxWidth', 'setMarginBox', arguments, 'width') +}; +dojo.html.setMarginBoxHeight = dojo.html.setOuterHeight = function () { + return dojo.html._callDeprecated('setMarginBoxHeight', 'setMarginBox', arguments, 'height') +}; +dojo.html.getMarginBoxWidth = dojo.html.getOuterWidth = function () { + return dojo.html._callDeprecated('getMarginBoxWidth', 'getMarginBox', arguments, null, 'width') +}; +dojo.html.getMarginBoxHeight = dojo.html.getOuterHeight = function () { + return dojo.html._callDeprecated('getMarginBoxHeight', 'getMarginBox', arguments, null, 'height') +}; +dojo.html.getTotalOffset = function (node, type, _53f) { + return dojo.html._callDeprecated('getTotalOffset', 'getAbsolutePosition', arguments, null, type) +}; +dojo.html.getAbsoluteX = function (node, _541) { + return dojo.html._callDeprecated('getAbsoluteX', 'getAbsolutePosition', arguments, null, 'x') +}; +dojo.html.getAbsoluteY = function (node, _543) { + return dojo.html._callDeprecated('getAbsoluteY', 'getAbsolutePosition', arguments, null, 'y') +}; +dojo.html.totalOffsetLeft = function (node, _545) { + return dojo.html._callDeprecated('totalOffsetLeft', 'getAbsolutePosition', arguments, null, 'left') +}; +dojo.html.totalOffsetTop = function (node, _547) { + return dojo.html._callDeprecated('totalOffsetTop', 'getAbsolutePosition', arguments, null, 'top') +}; +dojo.html.getMarginWidth = function (node) { + return dojo.html._callDeprecated('getMarginWidth', 'getMargin', arguments, null, 'width') +}; +dojo.html.getMarginHeight = function (node) { + return dojo.html._callDeprecated('getMarginHeight', 'getMargin', arguments, null, 'height') +}; +dojo.html.getBorderWidth = function (node) { + return dojo.html._callDeprecated('getBorderWidth', 'getBorder', arguments, null, 'width') +}; +dojo.html.getBorderHeight = function (node) { + return dojo.html._callDeprecated('getBorderHeight', 'getBorder', arguments, null, 'height') +}; +dojo.html.getPaddingWidth = function (node) { + return dojo.html._callDeprecated('getPaddingWidth', 'getPadding', arguments, null, 'width') +}; +dojo.html.getPaddingHeight = function (node) { + return dojo.html._callDeprecated('getPaddingHeight', 'getPadding', arguments, null, 'height') +}; +dojo.html.getPadBorderWidth = function (node) { + return dojo.html._callDeprecated('getPadBorderWidth', 'getPadBorder', arguments, null, 'width') +}; +dojo.html.getPadBorderHeight = function (node) { + return dojo.html._callDeprecated('getPadBorderHeight', 'getPadBorder', arguments, null, 'height') +}; +dojo.html.getBorderBoxWidth = dojo.html.getInnerWidth = function () { + return dojo.html._callDeprecated('getBorderBoxWidth', 'getBorderBox', arguments, null, 'width') +}; +dojo.html.getBorderBoxHeight = dojo.html.getInnerHeight = function () { + return dojo.html._callDeprecated('getBorderBoxHeight', 'getBorderBox', arguments, null, 'height') +}; +dojo.html.getContentBoxWidth = dojo.html.getContentWidth = function () { + return dojo.html._callDeprecated('getContentBoxWidth', 'getContentBox', arguments, null, 'width') +}; +dojo.html.getContentBoxHeight = dojo.html.getContentHeight = function () { + return dojo.html._callDeprecated('getContentBoxHeight', 'getContentBox', arguments, null, 'height') +}; +dojo.html.setContentBoxWidth = dojo.html.setContentWidth = function (node, _551) { + return dojo.html._callDeprecated('setContentBoxWidth', 'setContentBox', arguments, 'width') +}; +dojo.html.setContentBoxHeight = dojo.html.setContentHeight = function (node, _553) { + return dojo.html._callDeprecated('setContentBoxHeight', 'setContentBox', arguments, 'height') +}; +dojo.provide('dojo.lfx.html'); +dojo.lfx.html._byId = function (_554) { + if (!_554) { + return [] + } + if (dojo.lang.isArrayLike(_554)) { + if (!_554.alreadyChecked) { + var n = []; + dojo.lang.forEach(_554, function (node) { + n.push(dojo.byId(node)) + }); + n.alreadyChecked = true; + return n + } else { + return _554 + } + } else { + var n = []; + n.push(dojo.byId(_554)); + n.alreadyChecked = true; + return n + } +}; +dojo.lfx.html.propertyAnimation = function (_557, _558, _559, _55a, _55b) { + _557 = dojo.lfx.html._byId(_557); + var _55c = {'propertyMap': _558, 'nodes': _557, 'duration': _559, 'easing': _55a || dojo.lfx.easeDefault}; + var _55d = function (args) { + if (args.nodes.length == 1) { + var pm = args.propertyMap; + if (!dojo.lang.isArray(args.propertyMap)) { + var parr = []; + for (var _561 in pm) { + pm[_561].property = _561; + parr.push(pm[_561]) + } + pm = args.propertyMap = parr + } + dojo.lang.forEach(pm, function (prop) { + if (dj_undef('start', prop)) { + if (prop.property != 'opacity') { + prop.start = parseInt(dojo.html.getComputedStyle(args.nodes[0], prop.property)) + } else { + prop.start = dojo.html.getOpacity(args.nodes[0]) + } + } + }) + } + }; + var _563 = function (_564) { + var _565 = []; + dojo.lang.forEach(_564, function (c) { + _565.push(Math.round(c)) + }); + return _565 + }; + var _567 = function (n, _569) { + n = dojo.byId(n); + if (!n || !n.style) { + return + } + for (var s in _569) { + try { + if (s == 'opacity') { + dojo.html.setOpacity(n, _569[s]) + } else { + n.style[s] = _569[s] + } + } catch (e) { + dojo.debug(e) + } + } + }; + var _56b = function (_56c) { + this._properties = _56c; + this.diffs = new Array(_56c.length); + dojo.lang.forEach(_56c, function (prop, i) { + if (dojo.lang.isFunction(prop.start)) { + prop.start = prop.start(prop, i) + } + if (dojo.lang.isFunction(prop.end)) { + prop.end = prop.end(prop, i) + } + if (dojo.lang.isArray(prop.start)) { + this.diffs[i] = null + } else { + if (prop.start instanceof dojo.gfx.color.Color) { + prop.startRgb = prop.start.toRgb(); + prop.endRgb = prop.end.toRgb() + } else { + this.diffs[i] = prop.end - prop.start + } + } + }, this); + this.getValue = function (n) { + var ret = {}; + dojo.lang.forEach(this._properties, function (prop, i) { + var _573 = null; + if (dojo.lang.isArray(prop.start)) { + } else { + if (prop.start instanceof dojo.gfx.color.Color) { + _573 = (prop.units || 'rgb') + '('; + for (var j = 0; j < prop.startRgb.length; j++) { + _573 += Math.round(((prop.endRgb[j] - prop.startRgb[j]) * n) + prop.startRgb[j]) + (j + < prop.startRgb.length + - 1 ? ',' : '') + } + _573 += ')' + } else { + _573 = ((this.diffs[i]) * n) + prop.start + (prop.property != 'opacity' ? prop.units || 'px' : '') + } + } + ret[dojo.html.toCamelCase(prop.property)] = _573 + }, this); + return ret + } + }; + var anim = new dojo.lfx.Animation({ + beforeBegin: function () { + _55d(_55c); + anim.curve = new _56b(_55c.propertyMap) + }, onAnimate: function (_576) { + dojo.lang.forEach(_55c.nodes, function (node) { + _567(node, _576) + }) + } + }, _55c.duration, null, _55c.easing); + if (_55b) { + for (var x in _55b) { + if (dojo.lang.isFunction(_55b[x])) { + anim.connect(x, anim, _55b[x]) + } + } + } + return anim +}; +dojo.lfx.html._makeFadeable = function (_579) { + var _57a = function (node) { + if (dojo.render.html.ie) { + if ((node.style.zoom.length == 0) && (dojo.html.getStyle(node, 'zoom') == 'normal')) { + node.style.zoom = '1' + } + if ((node.style.width.length == 0) && (dojo.html.getStyle(node, 'width') == 'auto')) { + node.style.width = 'auto' + } + } + }; + if (dojo.lang.isArrayLike(_579)) { + dojo.lang.forEach(_579, _57a) + } else { + _57a(_579) + } +}; +dojo.lfx.html.fade = function (_57c, _57d, _57e, _57f, _580) { + _57c = dojo.lfx.html._byId(_57c); + var _581 = {property: 'opacity'}; + if (!dj_undef('start', _57d)) { + _581.start = _57d.start + } else { + _581.start = function () { + return dojo.html.getOpacity(_57c[0]) + } + } + if (!dj_undef('end', _57d)) { + _581.end = _57d.end + } else { + dojo.raise('dojo.lfx.html.fade needs an end value') + } + var anim = dojo.lfx.propertyAnimation(_57c, [_581], _57e, _57f); + anim.connect('beforeBegin', function () { + dojo.lfx.html._makeFadeable(_57c) + }); + if (_580) { + anim.connect('onEnd', function () { + _580(_57c, anim) + }) + } + return anim +}; +dojo.lfx.html.fadeIn = function (_583, _584, _585, _586) { + return dojo.lfx.html.fade(_583, {end: 1}, _584, _585, _586) +}; +dojo.lfx.html.fadeOut = function (_587, _588, _589, _58a) { + return dojo.lfx.html.fade(_587, {end: 0}, _588, _589, _58a) +}; +dojo.lfx.html.fadeShow = function (_58b, _58c, _58d, _58e) { + _58b = dojo.lfx.html._byId(_58b); + dojo.lang.forEach(_58b, function (node) { + dojo.html.setOpacity(node, 0) + }); + var anim = dojo.lfx.html.fadeIn(_58b, _58c, _58d, _58e); + anim.connect('beforeBegin', function () { + if (dojo.lang.isArrayLike(_58b)) { + dojo.lang.forEach(_58b, dojo.html.show) + } else { + dojo.html.show(_58b) + } + }); + return anim +}; +dojo.lfx.html.fadeHide = function (_591, _592, _593, _594) { + var anim = dojo.lfx.html.fadeOut(_591, _592, _593, function () { + if (dojo.lang.isArrayLike(_591)) { + dojo.lang.forEach(_591, dojo.html.hide) + } else { + dojo.html.hide(_591) + } + if (_594) { + _594(_591, anim) + } + }); + return anim +}; +dojo.lfx.html.wipeIn = function (_596, _597, _598, _599) { + _596 = dojo.lfx.html._byId(_596); + var _59a = []; + dojo.lang.forEach(_596, function (node) { + var _59c = {}; + var _59d, _59e, _59f; + with (node.style) { + _59d = top; + _59e = left; + _59f = position; + top = '-9999px'; + left = '-9999px'; + position = 'absolute'; + display = '' + } + var _5a0 = dojo.html.getBorderBox(node).height; + with (node.style) { + top = _59d; + left = _59e; + position = _59f; + display = 'none' + } + var anim = dojo.lfx.propertyAnimation(node, { + 'height': { + start: 1, end: function () { + return _5a0 + } + } + }, _597, _598); + anim.connect('beforeBegin', function () { + _59c.overflow = node.style.overflow; + _59c.height = node.style.height; + with (node.style) { + overflow = 'hidden'; + height = '1px' + } + dojo.html.show(node) + }); + anim.connect('onEnd', function () { + with (node.style) { + overflow = _59c.overflow; + height = _59c.height + } + if (_599) { + _599(node, anim) + } + }); + _59a.push(anim) + }); + return dojo.lfx.combine(_59a) +}; +dojo.lfx.html.wipeOut = function (_5a2, _5a3, _5a4, _5a5) { + _5a2 = dojo.lfx.html._byId(_5a2); + var _5a6 = []; + dojo.lang.forEach(_5a2, function (node) { + var _5a8 = {}; + var anim = dojo.lfx.propertyAnimation(node, { + 'height': { + start: function () { + return dojo.html.getContentBox(node).height + }, end: 1 + } + }, _5a3, _5a4, { + 'beforeBegin': function () { + _5a8.overflow = node.style.overflow; + _5a8.height = node.style.height; + with (node.style) { + overflow = 'hidden' + } + dojo.html.show(node) + }, 'onEnd': function () { + dojo.html.hide(node); + with (node.style) { + overflow = _5a8.overflow; + height = _5a8.height + } + if (_5a5) { + _5a5(node, anim) + } + } + }); + _5a6.push(anim) + }); + return dojo.lfx.combine(_5a6) +}; +dojo.lfx.html.slideTo = function (_5aa, _5ab, _5ac, _5ad, _5ae) { + _5aa = dojo.lfx.html._byId(_5aa); + var _5af = []; + var _5b0 = dojo.html.getComputedStyle; + if (dojo.lang.isArray(_5ab)) { + dojo.deprecated('dojo.lfx.html.slideTo(node, array)', 'use dojo.lfx.html.slideTo(node, {top: value, left: value});', '0.5'); + _5ab = {top: _5ab[0], left: _5ab[1]} + } + dojo.lang.forEach(_5aa, function (node) { + var top = null; + var left = null; + var init = (function () { + var _5b5 = node; + return function () { + var pos = _5b0(_5b5, 'position'); + top = (pos == 'absolute' ? node.offsetTop : parseInt(_5b0(node, 'top')) || 0); + left = (pos == 'absolute' ? node.offsetLeft : parseInt(_5b0(node, 'left')) || 0); + if (!dojo.lang.inArray(['absolute', 'relative'], pos)) { + var ret = dojo.html.abs(_5b5, true); + dojo.html.setStyleAttributes(_5b5, 'position:absolute;top:' + ret.y + 'px;left:' + ret.x + 'px;'); + top = ret.y; + left = ret.x + } + } + })(); + init(); + var anim = dojo.lfx.propertyAnimation(node, { + 'top': {start: top, end: (_5ab.top || 0)}, 'left': {start: left, end: (_5ab.left || 0)} + }, _5ac, _5ad, {'beforeBegin': init}); + if (_5ae) { + anim.connect('onEnd', function () { + _5ae(_5aa, anim) + }) + } + _5af.push(anim) + }); + return dojo.lfx.combine(_5af) +}; +dojo.lfx.html.slideBy = function (_5b9, _5ba, _5bb, _5bc, _5bd) { + _5b9 = dojo.lfx.html._byId(_5b9); + var _5be = []; + var _5bf = dojo.html.getComputedStyle; + if (dojo.lang.isArray(_5ba)) { + dojo.deprecated('dojo.lfx.html.slideBy(node, array)', 'use dojo.lfx.html.slideBy(node, {top: value, left: value});', '0.5'); + _5ba = {top: _5ba[0], left: _5ba[1]} + } + dojo.lang.forEach(_5b9, function (node) { + var top = null; + var left = null; + var init = (function () { + var _5c4 = node; + return function () { + var pos = _5bf(_5c4, 'position'); + top = (pos == 'absolute' ? node.offsetTop : parseInt(_5bf(node, 'top')) || 0); + left = (pos == 'absolute' ? node.offsetLeft : parseInt(_5bf(node, 'left')) || 0); + if (!dojo.lang.inArray(['absolute', 'relative'], pos)) { + var ret = dojo.html.abs(_5c4, true); + dojo.html.setStyleAttributes(_5c4, 'position:absolute;top:' + ret.y + 'px;left:' + ret.x + 'px;'); + top = ret.y; + left = ret.x + } + } + })(); + init(); + var anim = dojo.lfx.propertyAnimation(node, { + 'top': {start: top, end: top + (_5ba.top || 0)}, 'left': {start: left, end: left + (_5ba.left || 0)} + }, _5bb, _5bc).connect('beforeBegin', init); + if (_5bd) { + anim.connect('onEnd', function () { + _5bd(_5b9, anim) + }) + } + _5be.push(anim) + }); + return dojo.lfx.combine(_5be) +}; +dojo.lfx.html.explode = function (_5c8, _5c9, _5ca, _5cb, _5cc) { + var h = dojo.html; + _5c8 = dojo.byId(_5c8); + _5c9 = dojo.byId(_5c9); + var _5ce = h.toCoordinateObject(_5c8, true); + var _5cf = document.createElement('div'); + h.copyStyle(_5cf, _5c9); + if (_5c9.explodeClassName) { + _5cf.className = _5c9.explodeClassName + } + with (_5cf.style) { + position = 'absolute'; + display = 'none'; + var _5d0 = h.getStyle(_5c8, 'background-color'); + backgroundColor = _5d0 ? _5d0.toLowerCase() : 'transparent'; + backgroundColor = (backgroundColor == 'transparent') ? 'rgb(221, 221, 221)' : backgroundColor + } + dojo.body().appendChild(_5cf); + with (_5c9.style) { + visibility = 'hidden'; + display = 'block' + } + var _5d1 = h.toCoordinateObject(_5c9, true); + with (_5c9.style) { + display = 'none'; + visibility = 'visible' + } + var _5d2 = {opacity: {start: 0.5, end: 1}}; + dojo.lang.forEach(['height', 'width', 'top', 'left'], function (type) { + _5d2[type] = {start: _5ce[type], end: _5d1[type]} + }); + var anim = new dojo.lfx.propertyAnimation(_5cf, _5d2, _5ca, _5cb, { + 'beforeBegin': function () { + h.setDisplay(_5cf, 'block') + }, 'onEnd': function () { + h.setDisplay(_5c9, 'block'); + _5cf.parentNode.removeChild(_5cf) + } + }); + if (_5cc) { + anim.connect('onEnd', function () { + _5cc(_5c9, anim) + }) + } + return anim +}; +dojo.lfx.html.implode = function (_5d5, end, _5d7, _5d8, _5d9) { + var h = dojo.html; + _5d5 = dojo.byId(_5d5); + end = dojo.byId(end); + var _5db = dojo.html.toCoordinateObject(_5d5, true); + var _5dc = dojo.html.toCoordinateObject(end, true); + var _5dd = document.createElement('div'); + dojo.html.copyStyle(_5dd, _5d5); + if (_5d5.explodeClassName) { + _5dd.className = _5d5.explodeClassName + } + dojo.html.setOpacity(_5dd, 0.3); + with (_5dd.style) { + position = 'absolute'; + display = 'none'; + backgroundColor = h.getStyle(_5d5, 'background-color').toLowerCase() + } + dojo.body().appendChild(_5dd); + var _5de = {opacity: {start: 1, end: 0.5}}; + dojo.lang.forEach(['height', 'width', 'top', 'left'], function (type) { + _5de[type] = {start: _5db[type], end: _5dc[type]} + }); + var anim = new dojo.lfx.propertyAnimation(_5dd, _5de, _5d7, _5d8, { + 'beforeBegin': function () { + dojo.html.hide(_5d5); + dojo.html.show(_5dd) + }, 'onEnd': function () { + _5dd.parentNode.removeChild(_5dd) + } + }); + if (_5d9) { + anim.connect('onEnd', function () { + _5d9(_5d5, anim) + }) + } + return anim +}; +dojo.lfx.html.highlight = function (_5e1, _5e2, _5e3, _5e4, _5e5) { + _5e1 = dojo.lfx.html._byId(_5e1); + var _5e6 = []; + dojo.lang.forEach(_5e1, function (node) { + var _5e8 = dojo.html.getBackgroundColor(node); + var bg = dojo.html.getStyle(node, 'background-color').toLowerCase(); + var _5ea = dojo.html.getStyle(node, 'background-image'); + var _5eb = (bg == 'transparent' || bg == 'rgba(0, 0, 0, 0)'); + while (_5e8.length > 3) { + _5e8.pop() + } + var rgb = new dojo.gfx.color.Color(_5e2); + var _5ed = new dojo.gfx.color.Color(_5e8); + var anim = dojo.lfx.propertyAnimation(node, {'background-color': {start: rgb, end: _5ed}}, _5e3, _5e4, { + 'beforeBegin': function () { + if (_5ea) { + node.style.backgroundImage = 'none' + } + node.style.backgroundColor = 'rgb(' + rgb.toRgb().join(',') + ')' + }, 'onEnd': function () { + if (_5ea) { + node.style.backgroundImage = _5ea + } + if (_5eb) { + node.style.backgroundColor = 'transparent' + } + if (_5e5) { + _5e5(node, anim) + } + } + }); + _5e6.push(anim) + }); + return dojo.lfx.combine(_5e6) +}; +dojo.lfx.html.unhighlight = function (_5ef, _5f0, _5f1, _5f2, _5f3) { + _5ef = dojo.lfx.html._byId(_5ef); + var _5f4 = []; + dojo.lang.forEach(_5ef, function (node) { + var _5f6 = new dojo.gfx.color.Color(dojo.html.getBackgroundColor(node)); + var rgb = new dojo.gfx.color.Color(_5f0); + var _5f8 = dojo.html.getStyle(node, 'background-image'); + var anim = dojo.lfx.propertyAnimation(node, {'background-color': {start: _5f6, end: rgb}}, _5f1, _5f2, { + 'beforeBegin': function () { + if (_5f8) { + node.style.backgroundImage = 'none' + } + node.style.backgroundColor = 'rgb(' + _5f6.toRgb().join(',') + ')' + }, 'onEnd': function () { + if (_5f3) { + _5f3(node, anim) + } + } + }); + _5f4.push(anim) + }); + return dojo.lfx.combine(_5f4) +}; +dojo.lang.mixin(dojo.lfx, dojo.lfx.html); +dojo.kwCompoundRequire({browser: ['dojo.lfx.html'], dashboard: ['dojo.lfx.html']}); +dojo.provide('dojo.lfx.*'); + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/accountException.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/accountException.jsp new file mode 100644 index 00000000..308c7052 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/accountException.jsp @@ -0,0 +1,44 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + accountException + + + + +
    + ${ message } +
    + +
    + + + + + + + + + + + + + +
    Account
    Password
     
    +
    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/businessException.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/businessException.jsp new file mode 100644 index 00000000..54abdded --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/businessException.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + businessException + + + + +
    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/dispatcher.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/dispatcher.jsp new file mode 100644 index 00000000..3372bdc7 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/dispatcher.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + ${ pageContext.request.requestURI } + + + +你正在访问 ${ pageContext.request.requestURI }?${ pageContext.request.queryString }. + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/exception.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/exception.jsp new file mode 100644 index 00000000..7e581362 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/exception.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + exception + + + + +
    + ${ message } 返回 +
    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/image.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/image.jsp new file mode 100644 index 00000000..b1608a46 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/image.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + Insert title here + + + + +刷新 +直接访问 +
    + +request.getHeader("referer"): ${ header['referer'] } + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/index.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/index.jsp new file mode 100644 index 00000000..ffc11dfa --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/index.jsp @@ -0,0 +1,52 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<% + String path = request.getContextPath(); + String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; +%> + + + + + javaee-filter 首页 + + + +

    javaee-filter 首页

    +

    <%out.print("Server Ip:" + basePath);%>

    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCacheFilter.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCacheFilter.jsp new file mode 100644 index 00000000..77d55892 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCacheFilter.jsp @@ -0,0 +1,71 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + Insert title here + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCharacterEncodingFilter.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCharacterEncodingFilter.jsp new file mode 100644 index 00000000..f9da90a4 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testCharacterEncodingFilter.jsp @@ -0,0 +1,28 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + Insert title here + + + +
    +您输入了:
    +${ param.text }
    +
    +

    +
    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testExceptionHandlerFilter.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testExceptionHandlerFilter.jsp new file mode 100644 index 00000000..ef1f3304 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testExceptionHandlerFilter.jsp @@ -0,0 +1,29 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ page import="io.github.dunwu.javaee.filter.exception.AccountException" %> +<%@ page import="io.github.dunwu.javaee.filter.exception.BusinessException" %> +<% + String action = request.getParameter("action"); + + if ("businessException".equals(action)) { + throw new BusinessException("业务操作失败. "); + } else if ("accountException".equals(action)) { + throw new AccountException("您需要登陆后再进行此项操作. "); + } else if ("exception".equals(action)) { + Integer.parseInt(""); + } + +%> + + + + + exceptionHandler + + + +test BusinessException
    +test AccountException
    +test Exception
    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testGZipFilter.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testGZipFilter.jsp new file mode 100644 index 00000000..be254535 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testGZipFilter.jsp @@ -0,0 +1,66 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + +<%@page import="java.net.URL" %> +<%@page import="java.net.URLConnection" %> +<%@page import="java.text.NumberFormat" %> + + + + Insert title here + + + +<%! + public void test(JspWriter out, String url) throws Exception { + + // 模拟支持 GZIP 的浏览器 + URLConnection connGzip = new URL(url).openConnection(); + connGzip.setRequestProperty("Accept-Encoding", "gzip"); + int lengthGzip = connGzip.getContentLength(); + + // 模拟不支持 GZIP 的浏览器 + URLConnection connCommon = new URL(url).openConnection(); + int lengthCommon = connCommon.getContentLength(); + + double rate = new Double(lengthGzip) / lengthCommon; + + out.println(""); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + out.println("
    网址: " + url + "
    压缩后:" + lengthGzip + " byte压缩前:" + lengthCommon + " byte比率:" + NumberFormat.getPercentInstance().format(rate) + "
    "); + } +%> +<% + String[] urls = {"http://localhost:9899/views/js/dojo.js", "http://localhost:9899/views/images/image.jsp", + "http://localhost:9899/views/images/winter.jpg", "http://www.baidu.com", "http://www.google.cn",}; + for (String url : urls) { + test(out, url); + } +%> + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testOutputReplaceFilter.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testOutputReplaceFilter.jsp new file mode 100644 index 00000000..7517a03a --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testOutputReplaceFilter.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + Insert title here + + + +Chna
    +
    +色情
    +赌博
    +情色
    +
    +www.baidu.com.cn
    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testUploadFilter.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testUploadFilter.jsp new file mode 100644 index 00000000..d6b602ce --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testUploadFilter.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + +<%@page import="java.io.File" %> + + + + Insert title here + + + + +header['Content-type'] = ${ header['Content-type'] } + +
    + + <%= request.getParameter("text1") %>
    + + <% + File file1 = (File) request.getAttribute("file1"); + if (file1 != null) { + out.println("
    文件: " + file1 + ",
    大小: " + file1.length()); + } + %>

    + + <%= request.getParameter("text2") %>
    + + <% + File file2 = (File) request.getAttribute("file2"); + if (file2 != null) { + out.println("
    文件: " + file2 + ",
    大小: " + file2.length()); + } + %>

    + + + +
    + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testWaterMarkFilter.jsp b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testWaterMarkFilter.jsp new file mode 100644 index 00000000..99c5585c --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/jsp/testWaterMarkFilter.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + 图片过滤器示例 + + + + +刷新 +
    +${ header } + + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xml b/codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xml new file mode 100644 index 00000000..ab4bc9fc --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xml @@ -0,0 +1,6 @@ + + Bruce + Java 编程思想 + 计算机经典书籍系列丛书 + $100.00 + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xsl b/codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xsl new file mode 100644 index 00000000..409e24e3 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/xml/book.xsl @@ -0,0 +1,40 @@ + + + + + + + + + 图书资料: + + + + + + + + + + + + + + + + + +
    作者: + +
    书名: + +
    类别: + +
    定价: + +
    + + +
    +
    diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/xml/demo.xml b/codes/javaee/javaee-filter/src/main/webapp/views/xml/demo.xml new file mode 100644 index 00000000..82020867 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/xml/demo.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + 你会Ajax吗 + + + + + + + + + 我们用的是dojo框架的 + + + + + + + + + response.setHeader("Content-Disposition", + "attachment;filename=" + + URLEncoder.encode(newFile.getName(), + "UTF-8")); + response.setHeader("Connection", "close"); + response.setContentLength((int)newFile.length()); + resp + + + + + + + + + + 先 out.clear() + + + + + + + + + ok + + + + + + + + + + response.setContentLength((int)newFile.length()); + response.setHeader("Content-Type", + "application/octet-stream"); + + + + + + + + + + application/vnd.ms-excel + + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/xml/messageLog.xsl b/codes/javaee/javaee-filter/src/main/webapp/views/xml/messageLog.xsl new file mode 100644 index 0000000000000000000000000000000000000000..715ce717772dd3b5862e1da44648c417f17f484d GIT binary patch literal 9852 zcmeHN&2C#o6do2V(wE>i1UZ#(ofNedp|lZHg`yTA5)fhoj_o)R{)uciKaff+S+d~~ zcpx5vH$W_b@0;V(Gcz9B*GU?cfGpeBbLXD_^PMv@{`;?c?twdYUDt7iJ9I5Ka6`B6 z`mX2Rcgt?w-E?dCe&FuAYwjLq4l#2BpCfmIs}`>I@Y%xeVoaxpv5oOe(%8ejkvqUx z4X-2rx{1$sK)VlqZH%tFcm1p8zH(dc2}ZVYrw%EGZr9K1g3>GrDc?1>1R1ZpDqaPo z>$?VMbfC}okg$m{%00mE9=Hzin=|<&pHtlq@eJqG-Hz9=!0b9K)PhAS?n6-RxM%p? zb01@@4!X43H|`;>N4Tzl;_t0D+V`NvG@2L1a~pC}GV=Vh^~W!l!SfNc?Sm_M{%`W9e)$_YnMd5OZyBfi=YH z?8sUqp0}Z&#Q7GYS8|$mX4dsEQpFXce;-kQf*juR5jTW1J@+0m$mS6@m}eXAuDk8t z@^_gJ$DWGhVH;0v_^jH+D4!S18R1#U)hf6#V`b(DQXF6&HCnX4@oIYywk zizkl3t2xf)+4d=)?H_si)M5b5L;DvNgP$h?3p8(k+rZPr+db`+pAV4ZN8zTlgkwNDY02Z&uV% z>CBD!GxEByEu)>+1%C0Wfw*IBeF6#E_}1!2+p^wDJ#TvMtXdt64ZIAJNit8Wm((KW z7e|?iBg}7knlj4I7!8XtXUYG;I6sv}SoK&dTkuF9wrBlqdD;!|p!}O-I>ee!p&4r# z>wGQYZq<3;)1fVBRnk~NrsXc5(>JZF2F&kx~0 zb~4g^2*OfsL(Ujs=_%2NUY5?P3o6slb{+V$2E3IhFpn(-`WNm?P_o`Gmaz6h#?UI1 zeGkv1-Ux9nwj}RRV)jH9k)%VUY67og8&rHWvjb#DwgD}OAkxQaEE(n(nAL=TEAE3a zHLG2fgz~cc0dZmX4Ktp@PKD3b4kA%})A0P;p7x{+=Z^tW5JZagUoKhw3Utd>ZEnND z$B2epo=oFZ@%G49v*)mA>SNNe8meB7qb9FWDCxSpGeg$AP0k|eze$o?K&R>cyG)zB zI+EP=^*N5|IM&!_8LosF$BH$G&|Hz@e7LPt$T`hgVoSb9Bf8v25AYb+%M9YvF{Z|J z(>lkyxy+NN^piR-E>&nzl|pUAb;|5Yy;5T3n@1$kC~pbXByWdTOG{mAUu`XQb$_+B z~YK*HDU5|x(e|erq;K?;z0ZQR&W06%~xE={@rBW;Y*0Dz5D(?gFQb8aup-4or~Huth?&_*|Ekw2C?0FV~zVb zjJARA^fk)WlKO2HT~s$xu%~DFqfETyJ@Vg;mb~}kd=H~5MKkrU#IK=f*f|RJ>i(zQ z;kcr%j&e+Qfi!|c{wc!99Lj4klFmtYp3?eayyJe{D9ZkBCxdX|3CptYGrK?-?g_PpW=aqqx`1yE9h%V@?HrF3CT zvr@&i1QuHsNx8kUGzR3ic2A*{X;z&j^ByBF4&en>X71K9PfoGooE+u8G`-3h ztSP7N6I`>tpJLyYT^#!|^A@92r55|D?=LrZ#nT1i%T9AO6VtwJdbZ`LFn7vR2qVb$ zal_FNF()JN|NKx4;ZBHQ})MQOP_7~m2v&fpD5;5X=d+9 zPp)RyRqT*>%2D7vhMu*PDD6x_8PARuCfWQ-wld|U*3LunHBNDVQcCq3b(uUNNUQR+ z7@oB0v{O8_-K-93z8!Mw;8b%#B||A{NYo1Zj-1XSVJhDuUfRT}oR&_{K2wQu@`Sh= e##b4e=$bpW#5}H{4W{)o;T-D=?Z0A-qJIDcYpG8F literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/xml/thinkInJava.xml b/codes/javaee/javaee-filter/src/main/webapp/views/xml/thinkInJava.xml new file mode 100644 index 00000000..e3cb21c7 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/xml/thinkInJava.xml @@ -0,0 +1,7 @@ + + + Bruce + Java 编程思想 + 计算机经典书籍系列丛书 + $100.00 + diff --git a/codes/javaee/javaee-filter/src/main/webapp/views/xml/xml.xsl b/codes/javaee/javaee-filter/src/main/webapp/views/xml/xml.xsl new file mode 100644 index 00000000..3dd7c355 --- /dev/null +++ b/codes/javaee/javaee-filter/src/main/webapp/views/xml/xml.xsl @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/FilterDemosBootstrap.java b/codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/FilterDemosBootstrap.java new file mode 100644 index 00000000..fe36788e --- /dev/null +++ b/codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/FilterDemosBootstrap.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.server; + +import org.eclipse.jetty.server.Server; + +/** + * 快速启动 jetty 服务器,方便测试 + * + * @author Zhang Peng + */ +public class FilterDemosBootstrap { + + // private static int STARTUP_TYPE = JettyFactory.IDE_ECLIPSE; + private static int STARTUP_TYPE = JettyFactory.IDE_INTELLIJ; + + public static void main(String[] args) throws Exception { + Server server = JettyFactory.initServer(); + JettyFactory.initWebAppContext(server, STARTUP_TYPE); + + try { + JettyFactory.startServer(server); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + JettyFactory.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + +} diff --git a/codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java b/codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java new file mode 100644 index 00000000..35d18b11 --- /dev/null +++ b/codes/javaee/javaee-filter/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java @@ -0,0 +1,131 @@ +package io.github.dunwu.javaee.server; + +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * JettyFactory 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("all") +public class JettyFactory { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + public static final String ACTIVE_PROFILE = "spring.profiles.active"; + + public static final String DEFAULT_PROFILE = "spring.profiles.default"; + + public static final String DEVELOPMENT = "development"; + + private static final int PORT = 9527; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static Server initServer() { + setProfileAsSystemProperty(DEVELOPMENT); + WebAppContext webAppContext = new WebAppContext(); + Server server = new Server(PORT); + server.setHandler(webAppContext); + return server; + } + + /** + * 在Spring启动前,设置profile的环境变量。 + */ + public static void setProfileAsSystemProperty(String profile) { + System.setProperty(ACTIVE_PROFILE, profile); + } + + public static void initWebAppContext(Server server, int type) throws Exception { + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + + if (IDE_INTELLIJ == type) { + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + } else { + webAppContext.setParentLoaderPriority(true); + } + + System.out.println("[INFO] Application loaded"); + } + + public static String getAbsolutePath() { + String path = null; + String folderPath = JettyFactory.class.getProtectionDomain().getCodeSource().getLocation().getPath() + .substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + public static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + + List list = new ArrayList<>(); + list.add(".*/[^/]*servlet-api-[^/]*\\.jar$"); + list.add(".*/javax.servlet.jsp.jstl-.*\\.jar$"); + list.add(".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + String str = ".*/" + jarName + "-[^/]*\\.jar$"; + list.add(str); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(list, '|')); + } + + public static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + + public static void startServer(Server server) throws Exception { + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + server.start(); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + } + +} diff --git a/codes/javaee/javaee-filter/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-filter/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-filter/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-jsp/pom.xml b/codes/javaee/javaee-jsp/pom.xml new file mode 100644 index 00000000..bed08254 --- /dev/null +++ b/codes/javaee/javaee-jsp/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + javaee-jsp + 1.0.0 + war + javaee-jsp + JavaEE 学习笔记之 JSP + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + org.slf4j + jcl-over-slf4j + + + + + commons-fileupload + commons-fileupload + + + commons-io + commons-io + + + org.apache.commons + commons-lang3 + + + + + javax.servlet + javax.servlet-api + provided + + + org.eclipse.jetty + jetty-webapp + test + + + org.eclipse.jetty + jetty-server + test + + + org.eclipse.jetty + jetty-annotations + test + + + org.eclipse.jetty + apache-jsp + test + + + + + junit + junit + test + + + org.assertj + assertj-core + test + + + + diff --git a/codes/javaee/javaee-jsp/src/main/java/com/sun/products/applet/demo/Graph.java b/codes/javaee/javaee-jsp/src/main/java/com/sun/products/applet/demo/Graph.java new file mode 100644 index 00000000..7536980a --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/java/com/sun/products/applet/demo/Graph.java @@ -0,0 +1,486 @@ +package com.sun.products.applet.demo; +/* + * @(#)Graph.java 1.9 99/08/04 + * + * Copyright (c) 1997, 1998 Sun Microsystems, Inc. All Rights Reserved. + * + * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, + * modify and redistribute this software in source and binary code form, + * provided that i) this copyright notice and license appear on all copies of + * the software; and ii) Licensee does not utilize the software in a manner + * which is disparaging to Sun. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY + * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR + * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE + * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING + * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS + * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, + * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER + * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF + * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + * + * This software is not designed or intended for use in on-line control of + * aircraft, air traffic, aircraft navigation or aircraft communications; or in + * the design, construction, operation or maintenance of any nuclear + * facility. Licensee represents and warrants that it will not use or + * redistribute the Software for such purposes. + */ + +import java.applet.Applet; +import java.awt.*; +import java.awt.event.*; +import java.util.StringTokenizer; + +class Node { + + double x; + + double y; + + double dx; + + double dy; + + boolean fixed; + + String lbl; + +} + +class Edge { + + int from; + + int to; + + double len; + +} + +class GraphPanel extends Panel implements Runnable, MouseListener, MouseMotionListener { + + /** + * + */ + private static final long serialVersionUID = -6414075534397495418L; + + final Color fixedColor = Color.red; + + final Color selectColor = Color.pink; + + final Color edgeColor = Color.black; + + final Color nodeColor = new Color(250, 220, 100); + + final Color stressColor = Color.darkGray; + + final Color arcColor1 = Color.black; + + final Color arcColor2 = Color.pink; + + final Color arcColor3 = Color.red; + + Graph graph; + + int nnodes; + + Node nodes[] = new Node[100]; + + int nedges; + + Edge edges[] = new Edge[200]; + + Thread relaxer; + + boolean stress; + + boolean random; + + Node pick; + + boolean pickfixed; + + Image offscreen; + + Dimension offscreensize; + + Graphics offgraphics; + + GraphPanel(Graph graph) { + this.graph = graph; + addMouseListener(this); + } + + void addEdge(String from, String to, int len) { + Edge e = new Edge(); + e.from = findNode(from); + e.to = findNode(to); + e.len = len; + edges[nedges++] = e; + } + + int findNode(String lbl) { + for (int i = 0; i < nnodes; i++) { + if (nodes[i].lbl.equals(lbl)) { + return i; + } + } + return addNode(lbl); + } + + int addNode(String lbl) { + Node n = new Node(); + n.x = 10 + 380 * Math.random(); + n.y = 10 + 380 * Math.random(); + n.lbl = lbl; + nodes[nnodes] = n; + return nnodes++; + } + + @Override + public void run() { + Thread me = Thread.currentThread(); + while (relaxer == me) { + relax(); + if (random && (Math.random() < 0.03)) { + Node n = nodes[(int) (Math.random() * nnodes)]; + if (!n.fixed) { + n.x += 100 * Math.random() - 50; + n.y += 100 * Math.random() - 50; + } + graph.play(graph.getCodeBase(), "audio/drip.au"); + } + try { + Thread.sleep(100); + } catch (InterruptedException e) { + break; + } + } + } + + synchronized void relax() { + for (int i = 0; i < nedges; i++) { + Edge e = edges[i]; + double vx = nodes[e.to].x - nodes[e.from].x; + double vy = nodes[e.to].y - nodes[e.from].y; + double len = Math.sqrt(vx * vx + vy * vy); + len = (len == 0) ? .0001 : len; + double f = (edges[i].len - len) / (len * 3); + double dx = f * vx; + double dy = f * vy; + + nodes[e.to].dx += dx; + nodes[e.to].dy += dy; + nodes[e.from].dx += -dx; + nodes[e.from].dy += -dy; + } + + for (int i = 0; i < nnodes; i++) { + Node n1 = nodes[i]; + double dx = 0; + double dy = 0; + + for (int j = 0; j < nnodes; j++) { + if (i == j) { + continue; + } + Node n2 = nodes[j]; + double vx = n1.x - n2.x; + double vy = n1.y - n2.y; + double len = vx * vx + vy * vy; + if (len == 0) { + dx += Math.random(); + dy += Math.random(); + } else if (len < 100 * 100) { + dx += vx / len; + dy += vy / len; + } + } + double dlen = dx * dx + dy * dy; + if (dlen > 0) { + dlen = Math.sqrt(dlen) / 2; + n1.dx += dx / dlen; + n1.dy += dy / dlen; + } + } + + Dimension d = getSize(); + for (int i = 0; i < nnodes; i++) { + Node n = nodes[i]; + if (!n.fixed) { + n.x += Math.max(-5, Math.min(5, n.dx)); + n.y += Math.max(-5, Math.min(5, n.dy)); + } + if (n.x < 0) { + n.x = 0; + } else if (n.x > d.width) { + n.x = d.width; + } + if (n.y < 0) { + n.y = 0; + } else if (n.y > d.height) { + n.y = d.height; + } + n.dx /= 2; + n.dy /= 2; + } + repaint(); + } + + @Override + public synchronized void update(Graphics g) { + Dimension d = getSize(); + if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) { + offscreen = createImage(d.width, d.height); + offscreensize = d; + if (offgraphics != null) { + offgraphics.dispose(); + } + offgraphics = offscreen.getGraphics(); + offgraphics.setFont(getFont()); + } + + offgraphics.setColor(getBackground()); + offgraphics.fillRect(0, 0, d.width, d.height); + for (int i = 0; i < nedges; i++) { + Edge e = edges[i]; + int x1 = (int) nodes[e.from].x; + int y1 = (int) nodes[e.from].y; + int x2 = (int) nodes[e.to].x; + int y2 = (int) nodes[e.to].y; + int len = (int) Math.abs(Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) - e.len); + offgraphics.setColor((len < 10) ? arcColor1 : (len < 20 ? arcColor2 : arcColor3)); + offgraphics.drawLine(x1, y1, x2, y2); + if (stress) { + String lbl = String.valueOf(len); + offgraphics.setColor(stressColor); + offgraphics.drawString(lbl, x1 + (x2 - x1) / 2, y1 + (y2 - y1) / 2); + offgraphics.setColor(edgeColor); + } + } + + FontMetrics fm = offgraphics.getFontMetrics(); + for (int i = 0; i < nnodes; i++) { + paintNode(offgraphics, nodes[i], fm); + } + g.drawImage(offscreen, 0, 0, null); + } + + public void paintNode(Graphics g, Node n, FontMetrics fm) { + int x = (int) n.x; + int y = (int) n.y; + g.setColor((n == pick) ? selectColor : (n.fixed ? fixedColor : nodeColor)); + int w = fm.stringWidth(n.lbl) + 10; + int h = fm.getHeight() + 4; + g.fillRect(x - w / 2, y - h / 2, w, h); + g.setColor(Color.black); + g.drawRect(x - w / 2, y - h / 2, w - 1, h - 1); + g.drawString(n.lbl, x - (w - 10) / 2, (y - (h - 4) / 2) + fm.getAscent()); + } + + // 1.1 event handling + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + addMouseMotionListener(this); + double bestdist = Double.MAX_VALUE; + int x = e.getX(); + int y = e.getY(); + for (int i = 0; i < nnodes; i++) { + Node n = nodes[i]; + double dist = (n.x - x) * (n.x - x) + (n.y - y) * (n.y - y); + if (dist < bestdist) { + pick = n; + bestdist = dist; + } + } + pickfixed = pick.fixed; + pick.fixed = true; + pick.x = x; + pick.y = y; + repaint(); + e.consume(); + } + + @Override + public void mouseReleased(MouseEvent e) { + removeMouseMotionListener(this); + if (pick != null) { + pick.x = e.getX(); + pick.y = e.getY(); + pick.fixed = pickfixed; + pick = null; + } + repaint(); + e.consume(); + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public void mouseDragged(MouseEvent e) { + pick.x = e.getX(); + pick.y = e.getY(); + repaint(); + e.consume(); + } + + @Override + public void mouseMoved(MouseEvent e) { + } + + public void start() { + relaxer = new Thread(this); + relaxer.start(); + } + + public void stop() { + relaxer = null; + } + +} + +public class Graph extends Applet implements ActionListener, ItemListener { + + /** + * + */ + private static final long serialVersionUID = 9208137208697128121L; + + GraphPanel panel; + + Panel controlPanel; + + Button scramble = new Button("Scramble"); + + Button shake = new Button("Shake"); + + Checkbox stress = new Checkbox("Stress"); + + Checkbox random = new Checkbox("Random"); + + @Override + public void init() { + setLayout(new BorderLayout()); + + panel = new GraphPanel(this); + add("Center", panel); + controlPanel = new Panel(); + add("South", controlPanel); + + controlPanel.add(scramble); + scramble.addActionListener(this); + controlPanel.add(shake); + shake.addActionListener(this); + controlPanel.add(stress); + stress.addItemListener(this); + controlPanel.add(random); + random.addItemListener(this); + + String edges = getParameter("edges"); + for (StringTokenizer t = new StringTokenizer(edges, ","); t.hasMoreTokens(); ) { + String str = t.nextToken(); + int i = str.indexOf('-'); + if (i > 0) { + int len = 50; + int j = str.indexOf('/'); + if (j > 0) { + len = Integer.valueOf(str.substring(j + 1)).intValue(); + str = str.substring(0, j); + } + panel.addEdge(str.substring(0, i), str.substring(i + 1), len); + } + } + Dimension d = getSize(); + String center = getParameter("center"); + if (center != null) { + Node n = panel.nodes[panel.findNode(center)]; + n.x = d.width / 2; + n.y = d.height / 2; + n.fixed = true; + } + } + + @Override + public void destroy() { + remove(panel); + remove(controlPanel); + } + + @Override + public void start() { + panel.start(); + } + + @Override + public void stop() { + panel.stop(); + } + + @Override + public void actionPerformed(ActionEvent e) { + Object src = e.getSource(); + + if (src == scramble) { + play(getCodeBase(), "audio/computer.au"); + Dimension d = getSize(); + for (int i = 0; i < panel.nnodes; i++) { + Node n = panel.nodes[i]; + if (!n.fixed) { + n.x = 10 + (d.width - 20) * Math.random(); + n.y = 10 + (d.height - 20) * Math.random(); + } + } + return; + } + + if (src == shake) { + play(getCodeBase(), "audio/gong.au"); + // Dimension d = getSize(); + for (int i = 0; i < panel.nnodes; i++) { + Node n = panel.nodes[i]; + if (!n.fixed) { + n.x += 80 * Math.random() - 40; + n.y += 80 * Math.random() - 40; + } + } + } + } + + @Override + public void itemStateChanged(ItemEvent e) { + Object src = e.getSource(); + boolean on = e.getStateChange() == ItemEvent.SELECTED; + if (src == stress) { + panel.stress = on; + } else if (src == random) { + panel.random = on; + } + } + + @Override + public String getAppletInfo() { + return "Title: GraphLayout \nAuthor: "; + } + + @Override + public String[][] getParameterInfo() { + String[][] info = { { "edges", "delimited string", + "A comma-delimited list of all the edges. It takes the form of 'C-N1,C-N2,C-N3,C-NX,N1-N2/M12,N2-N3/M23,N3-NX/M3X,...' where C is the name of center node (see 'center' parameter) and NX is a node attached to the center node. For the edges connecting nodes to eachother (and not to the center node) you may (optionally) specify a length MXY separated from the edge name by a forward slash." }, + { "center", "string", "The name of the center node." } }; + return info; + } + +} diff --git a/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Counter.java b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Counter.java new file mode 100644 index 00000000..2b4108d5 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Counter.java @@ -0,0 +1,15 @@ +package io.github.dunwu.javaee.jsp.bean; + +public class Counter { + + private int count; + + public int getCount() { + return ++count; + } + + public void setCount(int count) { + this.count = count; + } + +} diff --git a/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Message.java b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Message.java new file mode 100644 index 00000000..a15011f0 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Message.java @@ -0,0 +1,15 @@ +package io.github.dunwu.javaee.jsp.bean; + +public class Message { + + private String content; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + +} diff --git a/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Person.java b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Person.java new file mode 100644 index 00000000..a699495f --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/bean/Person.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.jsp.bean; + +public class Person { + + private String name; + + private int age; + + private String sex; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + +} diff --git a/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/IpUtil.java b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/IpUtil.java new file mode 100644 index 00000000..5b3c47f9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/IpUtil.java @@ -0,0 +1,16 @@ +package io.github.dunwu.javaee.jsp.util; + +import io.github.dunwu.javaee.jsp.util.ip.IPSeeker; + +public class IpUtil { + + public static String getIpAddress(String ip) { + try { + return IPSeeker.getInstance().getAddress(ip); + } catch (Exception e) { + e.printStackTrace(); + } + return "δ֪����"; + } + +} diff --git a/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPEntry.java b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPEntry.java new file mode 100644 index 00000000..d662262e --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPEntry.java @@ -0,0 +1,51 @@ +package io.github.dunwu.javaee.jsp.util.ip; + +/* + * LumaQQ - Java QQ Client + * + * Copyright (C) 2004 luma + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + *
    + * һ��IP��Χ��¼�������������Һ�����Ҳ������ʼIP�ͽ���IP
    + * 
    + * + * @author ����� + */ +public class IPEntry { + + public String beginIp; + + public String endIp; + + public String country; + + public String area; + + /** + * ���캯�� + */ + public IPEntry() { + beginIp = endIp = country = area = ""; + } + + public String toString() { + return this.area + " " + this.country + " IP��Χ:" + this.beginIp + "-" + this.endIp; + } + +} diff --git a/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPSeeker.java b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPSeeker.java new file mode 100644 index 00000000..06fee4d4 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/IPSeeker.java @@ -0,0 +1,709 @@ +package io.github.dunwu.javaee.jsp.util.ip; + +/* + * LumaQQ - Java QQ Client + * + * Copyright (C) 2004 luma + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteOrder; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; + +/** + *
    + * ������ȡQQwry.dat�ļ����Ը���ip��ú���λ�ã�QQwry.dat�ĸ�ʽ��
    + * һ. �ļ�ͷ����8�ֽ�
    + * 	   1. ��һ����ʼIP�ľ���ƫ�ƣ� 4�ֽ�
    + *     2. ���һ����ʼIP�ľ���ƫ�ƣ� 4�ֽ�
    + * ��. "������ַ/����/����"��¼��
    + *     ���ֽ�ip��ַ�����ÿһ����¼�ֳ���������
    + *     1. ���Ҽ�¼
    + *     2. ������¼
    + *     ���ǵ�����¼�Dz�һ���еġ����ҹ��Ҽ�¼�͵�����¼����������ʽ
    + *     1. ��0�������ַ���
    + *     2. 4���ֽڣ�һ���ֽڿ���Ϊ0x1��0x2
    + * 		  a. Ϊ0x1ʱ����ʾ�ھ���ƫ�ƺ󻹸���һ������ļ�¼��ע���Ǿ���ƫ��֮�󣬶��������ĸ��ֽ�֮��
    + *        b. Ϊ0x2ʱ����ʾ�ھ���ƫ�ƺ�û�������¼
    + *        ����Ϊ0x1����0x2���������ֽڶ���ʵ�ʹ��������ļ��ھ���ƫ��
    + * 		  ����ǵ�����¼��0x1��0x2�ĺ��岻����������������������ֽڣ�Ҳ�϶��Ǹ���3���ֽ�ƫ�ƣ��������
    + *        ��Ϊ0��β�ַ���
    + * ��. "��ʼ��ַ/������ַƫ��"��¼��
    + *     1. ÿ����¼7�ֽڣ�������ʼ��ַ��С��������
    + *        a. ��ʼIP��ַ��4�ֽ�
    + *        b. ����ip��ַ�ľ���ƫ�ƣ�3�ֽ�
    + *
    + * ע�⣬����ļ����ip��ַ�����е�ƫ����������little-endian��ʽ����java�Dz���
    + * big-endian��ʽ�ģ�Ҫע��ת��
    + * 
    + * + * @author ����� + */ +public class IPSeeker { + + private static final File IP_FILE = new File(IPSeeker.class.getResource("").getFile(), "QQWry.dat"); + + // һЩ�̶������������¼���ȵȵ� + private static final int IP_RECORD_LENGTH = 7; + + private static final byte AREA_FOLLOWED = 0x01; + + private static final byte NO_AREA = 0x2; + + // ��һģʽʵ�� + private static IPSeeker instance = new IPSeeker(); + + // ������Ϊcache����ѯһ��ipʱ���Ȳ鿴cache���Լ��ٲ���Ҫ���ظ����� + private Hashtable ipCache; + + // ����ļ������� + private RandomAccessFile ipFile; + + // �ڴ�ӳ���ļ� + private MappedByteBuffer mbb; + + // ��ʼ�����Ŀ�ʼ�ͽ����ľ���ƫ�� + private long ipBegin, ipEnd; + + // Ϊ���Ч�ʶ����õ���ʱ���� + private IPLocation loc; + + private byte[] buf; + + private byte[] b4; + + private byte[] b3; + + /** + * ˽�й��캯�� + */ + private IPSeeker() { + ipCache = new Hashtable(); + loc = new IPLocation(); + buf = new byte[100]; + b4 = new byte[4]; + b3 = new byte[3]; + try { + ipFile = new RandomAccessFile(IP_FILE, "r"); + } catch (FileNotFoundException e) { + System.out.println(IP_FILE.getAbsolutePath()); + System.out.println(IP_FILE); + System.out.println("IP��ַ��Ϣ�ļ�û���ҵ���IP��ʾ���ܽ��޷�ʹ��"); + ipFile = null; + } + // ������ļ��ɹ�����ȡ�ļ�ͷ��Ϣ + if (ipFile != null) { + try { + ipBegin = readLong4(0); + ipEnd = readLong4(4); + if (ipBegin == -1 || ipEnd == -1) { + ipFile.close(); + ipFile = null; + } + } catch (IOException e) { + System.out.println("IP��ַ��Ϣ�ļ���ʽ�д���IP��ʾ���ܽ��޷�ʹ��"); + ipFile = null; + } + } + } + + /** + * ��offsetλ�ö�ȡ4���ֽ�Ϊһ��long����ΪjavaΪbig-endian��ʽ������û�취 ������ôһ����������ת�� + * + * @param offset + * @return ��ȡ��longֵ������-1��ʾ��ȡ�ļ�ʧ�� + */ + private long readLong4(long offset) { + long ret = 0; + try { + ipFile.seek(offset); + ret |= (ipFile.readByte() & 0xFF); + ret |= ((ipFile.readByte() << 8) & 0xFF00); + ret |= ((ipFile.readByte() << 16) & 0xFF0000); + ret |= ((ipFile.readByte() << 24) & 0xFF000000); + return ret; + } catch (IOException e) { + return -1; + } + } + + /** + * @return ��һʵ�� + */ + public static IPSeeker getInstance() { + return instance; + } + + /** + * ����һ���ص�IJ���ȫ���֣��õ�һϵ�а���s�Ӵ���IP��Χ��¼ + * + * @param s �ص��Ӵ� + * @return ����IPEntry���͵�List + */ + public List getIPEntriesDebug(String s) { + List ret = new ArrayList(); + long endOffset = ipEnd + 4; + for (long offset = ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) { + // ��ȡ����IPƫ�� + long temp = readLong3(offset); + // ���temp������-1����ȡIP�ĵص���Ϣ + if (temp != -1) { + IPLocation loc = getIPLocation(temp); + // �ж��Ƿ�����ص����������s�Ӵ�����������ˣ���������¼��List�У����û�У����� + if (loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) { + IPEntry entry = new IPEntry(); + entry.country = loc.country; + entry.area = loc.area; + // �õ���ʼIP + readIP(offset - 4, b4); + entry.beginIp = Utils.getIpStringFromBytes(b4); + // �õ�����IP + readIP(temp, b4); + entry.endIp = Utils.getIpStringFromBytes(b4); + // ��Ӹü�¼ + ret.add(entry); + } + } + } + return ret; + } + + /** + * ��offsetλ�ö�ȡ3���ֽ�Ϊһ��long����ΪjavaΪbig-endian��ʽ������û�취 ������ôһ����������ת�� + * + * @param offset + * @return ��ȡ��longֵ������-1��ʾ��ȡ�ļ�ʧ�� + */ + private long readLong3(long offset) { + long ret = 0; + try { + ipFile.seek(offset); + ipFile.readFully(b3); + ret |= (b3[0] & 0xFF); + ret |= ((b3[1] << 8) & 0xFF00); + ret |= ((b3[2] << 16) & 0xFF0000); + return ret; + } catch (IOException e) { + return -1; + } + } + + /** + * ����һ��ip���ҵ�����¼��ƫ�ƣ�����һ��IPLocation�ṹ + * + * @param offset + * @return + */ + private IPLocation getIPLocation(long offset) { + try { + // ����4�ֽ�ip + ipFile.seek(offset + 4); + // ��ȡ��һ���ֽ��ж��Ƿ��־�ֽ� + byte b = ipFile.readByte(); + if (b == AREA_FOLLOWED) { + // ��ȡ����ƫ�� + long countryOffset = readLong3(); + // ��ת��ƫ�ƴ� + ipFile.seek(countryOffset); + // �ټ��һ�α�־�ֽڣ���Ϊ���ʱ������ط���Ȼ�����Ǹ��ض��� + b = ipFile.readByte(); + if (b == NO_AREA) { + loc.country = readString(readLong3()); + ipFile.seek(countryOffset + 4); + } else { + loc.country = readString(countryOffset); + } + // ��ȡ������־ + loc.area = readArea(ipFile.getFilePointer()); + } else if (b == NO_AREA) { + loc.country = readString(readLong3()); + loc.area = readArea(offset + 8); + } else { + loc.country = readString(ipFile.getFilePointer() - 1); + loc.area = readArea(ipFile.getFilePointer()); + } + return loc; + } catch (IOException e) { + return null; + } + } + + /** + * ��offsetλ�ö�ȡ�ĸ��ֽڵ�ip��ַ����ip�����У���ȡ���ipΪbig-endian��ʽ������ �ļ�����little-endian��ʽ���������ת�� + * + * @param offset + * @param ip + */ + private void readIP(long offset, byte[] ip) { + try { + ipFile.seek(offset); + ipFile.readFully(ip); + byte temp = ip[0]; + ip[0] = ip[3]; + ip[3] = temp; + temp = ip[1]; + ip[1] = ip[2]; + ip[2] = temp; + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } + + /** + * �ӵ�ǰλ�ö�ȡ3���ֽ�ת����long + * + * @return + */ + private long readLong3() { + long ret = 0; + try { + ipFile.readFully(b3); + ret |= (b3[0] & 0xFF); + ret |= ((b3[1] << 8) & 0xFF00); + ret |= ((b3[2] << 16) & 0xFF0000); + return ret; + } catch (IOException e) { + return -1; + } + } + + /** + * ��offsetƫ�ƴ���ȡһ����0�������ַ��� + * + * @param offset + * @return ��ȡ���ַ����������ؿ��ַ��� + */ + private String readString(long offset) { + try { + ipFile.seek(offset); + int i; + for (i = 0, buf[i] = ipFile.readByte(); buf[i] != 0; buf[++i] = ipFile.readByte()) + ; + if (i != 0) { + return Utils.getString(buf, 0, i, "GBK"); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + return ""; + } + + /** + * ��offsetƫ�ƿ�ʼ����������ֽڣ�����һ�������� + * + * @param offset + * @return �������ַ��� + * @throws IOException + */ + private String readArea(long offset) throws IOException { + ipFile.seek(offset); + byte b = ipFile.readByte(); + if (b == 0x01 || b == 0x02) { + long areaOffset = readLong3(offset + 1); + if (areaOffset == 0) { + return "δ֪����"; + } else { + return readString(areaOffset); + } + } else { + return readString(offset); + } + } + + /** + * ����һ���ص�IJ���ȫ���֣��õ�һϵ�а���s�Ӵ���IP��Χ��¼ + * + * @param s �ص��Ӵ� + * @return ����IPEntry���͵�List + */ + public List getIPEntries(String s) { + List ret = new ArrayList(); + try { + // ӳ��IP��Ϣ�ļ����ڴ��� + if (mbb == null) { + FileChannel fc = ipFile.getChannel(); + mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, ipFile.length()); + mbb.order(ByteOrder.LITTLE_ENDIAN); + } + + int endOffset = (int) ipEnd; + for (int offset = (int) ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) { + int temp = readInt3(offset); + if (temp != -1) { + IPLocation loc = getIPLocation(temp); + // �ж��Ƿ�����ص����������s�Ӵ�����������ˣ���������¼��List�У����û�У����� + if (loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) { + IPEntry entry = new IPEntry(); + entry.country = loc.country; + entry.area = loc.area; + // �õ���ʼIP + readIP(offset - 4, b4); + entry.beginIp = Utils.getIpStringFromBytes(b4); + // �õ�����IP + readIP(temp, b4); + entry.endIp = Utils.getIpStringFromBytes(b4); + // ��Ӹü�¼ + ret.add(entry); + } + } + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + return ret; + } + + /** + * ���ڴ�ӳ���ļ���offsetλ�ÿ�ʼ��3���ֽڶ�ȡһ��int + * + * @param offset + * @return + */ + private int readInt3(int offset) { + mbb.position(offset); + return mbb.getInt() & 0x00FFFFFF; + } + + /** + * @param offset + * @return + */ + private IPLocation getIPLocation(int offset) { + // ����4�ֽ�ip + mbb.position(offset + 4); + // ��ȡ��һ���ֽ��ж��Ƿ��־�ֽ� + byte b = mbb.get(); + if (b == AREA_FOLLOWED) { + // ��ȡ����ƫ�� + int countryOffset = readInt3(); + // ��ת��ƫ�ƴ� + mbb.position(countryOffset); + // �ټ��һ�α�־�ֽڣ���Ϊ���ʱ������ط���Ȼ�����Ǹ��ض��� + b = mbb.get(); + if (b == NO_AREA) { + loc.country = readString(readInt3()); + mbb.position(countryOffset + 4); + } else { + loc.country = readString(countryOffset); + } + // ��ȡ������־ + loc.area = readArea(mbb.position()); + } else if (b == NO_AREA) { + loc.country = readString(readInt3()); + loc.area = readArea(offset + 8); + } else { + loc.country = readString(mbb.position() - 1); + loc.area = readArea(mbb.position()); + } + return loc; + } + + /** + * ��offsetλ�ö�ȡ�ĸ��ֽڵ�ip��ַ����ip�����У���ȡ���ipΪbig-endian��ʽ������ �ļ�����little-endian��ʽ���������ת�� + * + * @param offset + * @param ip + */ + private void readIP(int offset, byte[] ip) { + mbb.position(offset); + mbb.get(ip); + byte temp = ip[0]; + ip[0] = ip[3]; + ip[3] = temp; + temp = ip[1]; + ip[1] = ip[2]; + ip[2] = temp; + } + + /** + * ���ڴ�ӳ���ļ��ĵ�ǰλ�ÿ�ʼ��3���ֽڶ�ȡһ��int + * + * @return + */ + private int readInt3() { + return mbb.getInt() & 0x00FFFFFF; + } + + /** + * ���ڴ�ӳ���ļ���offsetλ�õõ�һ��0��β�ַ��� + * + * @param offset + * @return + */ + private String readString(int offset) { + try { + mbb.position(offset); + int i; + for (i = 0, buf[i] = mbb.get(); buf[i] != 0; buf[++i] = mbb.get()) + ; + if (i != 0) { + return Utils.getString(buf, 0, i, "GBK"); + } + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + return ""; + } + + /** + * @param offset + * @return + */ + private String readArea(int offset) { + mbb.position(offset); + byte b = mbb.get(); + if (b == 0x01 || b == 0x02) { + int areaOffset = readInt3(); + if (areaOffset == 0) { + return "δ֪����"; + } else { + return readString(areaOffset); + } + } else { + return readString(offset); + } + } + + /** + * ����IP�õ������� + * + * @param ip ip���ֽ�������ʽ + * @return �������ַ��� + */ + public String getCountry(byte[] ip) { + // ���ip��ַ�ļ��Ƿ����� + if (ipFile == null) { + return "�����IP���ݿ��ļ�"; + } + // ����ip��ת��ip�ֽ�����Ϊ�ַ�����ʽ + String ipStr = Utils.getIpStringFromBytes(ip); + // �ȼ��cache���Ƿ��Ѿ����������ip�Ľ����û���������ļ� + if (ipCache.containsKey(ipStr)) { + IPLocation loc = (IPLocation) ipCache.get(ipStr); + return loc.country; + } else { + IPLocation loc = getIPLocation(ip); + ipCache.put(ipStr, loc.getCopy()); + return loc.country; + } + } + + /** + * ����ip����ip��Ϣ�ļ����õ�IPLocation�ṹ����������ip���������Աip�еõ� + * + * @param ip Ҫ��ѯ��IP + * @return IPLocation�ṹ + */ + private IPLocation getIPLocation(byte[] ip) { + IPLocation info = null; + long offset = locateIP(ip); + if (offset != -1) { + info = getIPLocation(offset); + } + if (info == null) { + info = new IPLocation(); + info.country = "δ֪����"; + info.area = "δ֪����"; + } + return info; + } + + /** + * �������������ip�����ݣ���λ���������ip���ҵ����ļ�¼��������һ������ƫ�� ����ʹ�ö��ַ����ҡ� + * + * @param ip Ҫ��ѯ��IP + * @return ����ҵ��ˣ����ؽ���IP��ƫ�ƣ����û���ҵ�������-1 + */ + private long locateIP(byte[] ip) { + long m = 0; + int r; + // �Ƚϵ�һ��ip�� + readIP(ipBegin, b4); + r = compareIP(ip, b4); + if (r == 0) { + return ipBegin; + } else if (r < 0) { + return -1; + } + // ��ʼ�������� + for (long i = ipBegin, j = ipEnd; i < j; ) { + m = getMiddleOffset(i, j); + readIP(m, b4); + r = compareIP(ip, b4); + // log.debug(Utils.getIpStringFromBytes(b)); + if (r > 0) { + i = m; + } else if (r < 0) { + if (m == j) { + j -= IP_RECORD_LENGTH; + m = j; + } else { + j = m; + } + } else { + return readLong3(m + 4); + } + } + // ���ѭ�������ˣ���ôi��j�ض�����ȵģ������¼Ϊ����ܵļ�¼�����Dz��� + // �϶����ǣ���Ҫ���һ�£�����ǣ��ͷ��ؽ�����ַ���ľ���ƫ�� + m = readLong3(m + 4); + readIP(m, b4); + r = compareIP(ip, b4); + if (r <= 0) { + return m; + } else { + return -1; + } + } + + /** + * �����Աip��beginIp�Ƚϣ�ע�����beginIp��big-endian�� + * + * @param ip Ҫ��ѯ��IP + * @param beginIp �ͱ���ѯIP��Ƚϵ�IP + * @return ��ȷ���0��ip����beginIp�򷵻�1��С�ڷ���-1�� + */ + private int compareIP(byte[] ip, byte[] beginIp) { + for (int i = 0; i < 4; i++) { + int r = compareByte(ip[i], beginIp[i]); + if (r != 0) { + return r; + } + } + return 0; + } + + /** + * �õ�beginƫ�ƺ�endƫ���м�λ�ü�¼��ƫ�� + * + * @param begin + * @param end + * @return + */ + private long getMiddleOffset(long begin, long end) { + long records = (end - begin) / IP_RECORD_LENGTH; + records >>= 1; + if (records == 0) { + records = 1; + } + return begin + records * IP_RECORD_LENGTH; + } + + /** + * ������byte�����޷��������бȽ� + * + * @param b1 + * @param b2 + * @return ��b1����b2�򷵻�1����ȷ���0��С�ڷ���-1 + */ + private int compareByte(byte b1, byte b2) { + if ((b1 & 0xFF) > (b2 & 0xFF)) // �Ƚ��Ƿ���� + { + return 1; + } else if ((b1 ^ b2) == 0)// �ж��Ƿ���� + { + return 0; + } else { + return -1; + } + } + + /** + * ����IP�õ������� + * + * @param ip ip���ֽ�������ʽ + * @return �������ַ��� + */ + public String getArea(byte[] ip) { + // ���ip��ַ�ļ��Ƿ����� + if (ipFile == null) { + return "�����IP���ݿ��ļ�"; + } + // ����ip��ת��ip�ֽ�����Ϊ�ַ�����ʽ + String ipStr = Utils.getIpStringFromBytes(ip); + // �ȼ��cache���Ƿ��Ѿ����������ip�Ľ����û���������ļ� + if (ipCache.containsKey(ipStr)) { + IPLocation loc = (IPLocation) ipCache.get(ipStr); + return loc.area; + } else { + IPLocation loc = getIPLocation(ip); + ipCache.put(ipStr, loc.getCopy()); + return loc.area; + } + } + + public String getAddress(String ip) { + String country = getCountry(ip).equals(" CZ88.NET") ? "" : getCountry(ip); + String area = getArea(ip).equals(" CZ88.NET") ? "" : getArea(ip); + String address = country + " " + area; + return address.trim(); + } + + /** + * ����IP�õ������� + * + * @param ip IP���ַ�����ʽ + * @return �������ַ��� + */ + public String getCountry(String ip) { + return getCountry(Utils.getIpByteArrayFromString(ip)); + } + + /** + * ����IP�õ������� + * + * @param ip IP���ַ�����ʽ + * @return �������ַ��� + */ + public String getArea(String ip) { + return getArea(Utils.getIpByteArrayFromString(ip)); + } + + /** + *
    +	 * ������װip�����Ϣ��Ŀǰֻ�������ֶΣ�ip���ڵĹ��Һ͵���
    +	 * 
    + * + * @author ����� + */ + private class IPLocation { + + public String country; + + public String area; + + public IPLocation() { + country = area = ""; + } + + public IPLocation getCopy() { + IPLocation ret = new IPLocation(); + ret.country = country; + ret.area = area; + return ret; + } + + } + +} diff --git a/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/QQWry.dat b/codes/javaee/javaee-jsp/src/main/java/io/github/dunwu/javaee/jsp/util/ip/QQWry.dat new file mode 100644 index 0000000000000000000000000000000000000000..a77baf0a25b8f6ad8275ead56d89e1786c94ead6 GIT binary patch literal 824560 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

    )H5(~YrcC`EdC3s+wlp3Q$+q#s<6ARb4a!c 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 %9i{~Q9i|dq?=Vg91_i=#3WSp#rUQQ2 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 + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/META-INF/MANIFEST.MF b/codes/javaee/javaee-jsp/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/META-INF/MANIFEST.MF b/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/resources/jsp/index.jsp b/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/resources/jsp/index.jsp new file mode 100644 index 00000000..473a1315 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/resources/jsp/index.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + My JSP 'index.jsp' starting page + + + + + + + +

    This is my JSP page.

    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/web.xml b/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..a403cc53 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,25 @@ + + + + + HelloServlet + /examples/configuration.jsp + + message + welcome to jsp + + 1 + + + HelloServlet + /config + /config.jsp + + + + + /WEB-INF/views/jsp/index.jsp + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/break.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/break.jsp new file mode 100644 index 00000000..0c39bb74 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/break.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + +<% + for (int i = 0; i < 5; i++) { +%> break 所在的循环, i = <%= i %>。
    +<% + if (i == 2) { + break; + } + } +%> break 循环完毕,
    +<% + for (int i = 0; i < 5; i++) { +%> return 所在的循环, i = <%= i %>。
    +<% + if (i == 2) { + return; + } + } +%> return 循环完毕,
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/for.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/for.jsp new file mode 100644 index 00000000..7f172314 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/for.jsp @@ -0,0 +1,54 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + 02.JSP语法 - for示例 + + + +
    +<% + Object[][] letters = {{true, "恭喜您注册的信息已经生效", "e_inn@163.com", "forbreak@163.com", "2007-8-8"}, + {true, "JavaEE 7.0 release!", "admin@sun.com", "forbreak@163.com", "2007-6-24"}, + {false, "来信已经收到,下周来面谈", "foo@bar.com", "forbreak@163.com", "2007-5-20"}, + {false, "您有新的邮件", "blog@foo.bar.com", "forbreak@163.com", "2007-3-2"},}; + String[] colors = {"#DDDDDD", "#AAAAAA",}; +%> + + + + + + + + + <% + for (int i = 0; i < letters.length; i++) { + Object[] letter = letters[i]; + %> + + + + + + + + <% + } + %> +
     标题 发信人 收信人 时间 
    + <% + if (letter[0] == Boolean.TRUE) { + %> + + <% + } else { + out.println(" "); + } + %> + <%= letter[1] %> + <%= letter[2] %> + <%= letter[3] %> + <%= letter[4] %> +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if.jsp new file mode 100644 index 00000000..5d5d19ff --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if.jsp @@ -0,0 +1,68 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + +02.JSP语法 - if...else示例 + + +<% + String param = request.getParameter("param"); + if ("1".equals(param)) { +%> +《破阵子·为孙同甫赋壮语以寄》
    +【宋】辛弃疾
    +醉里挑灯看剑,梦回吹角连营。
    +八百里分麾下炙,五十弦翻塞外声,沙场秋点兵。
    +马作的卢飞快,弓如霹雳弦惊。
    +了却君王天下事,赢得生前身后名。可怜白发生!
    +<% +} else if ("2".equals(param)) { +%> +《青玉案·元夕》
    +【宋】辛弃疾
    +东风夜放花千树,更吹落,星如雨。
    +宝马雕车香满路,凤箫声动,玉壶光转,一夜鱼龙舞。
    +蛾儿雪柳黄金缕,笑语盈盈暗香去。
    +众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。
    +<% +} else if ("3".equals(param)) { +%> +《丑奴儿》
    +【宋】辛弃疾
    +少年不识愁滋味,爱上层楼,爱上层楼,为赋新词强说愁。
    +而今识得愁滋味,欲说还休,欲说还休,却道天凉好个秋。
    +<% +} else if ("4".equals(param)) { +%> +《永遇乐》
    +【宋】辛弃疾
    +千古江山,英雄无觅,孙仲谋处。
    +舞榭歌台,风流总被、雨打风吹去。
    +斜阳草树,寻常巷陌,人道寄奴曾住。
    +想当年,金戈铁马,气吞万里如虎。
    +元嘉草草,封狼居胥,赢得仓皇北顾。
    +四十三年,望中犹记,烽火扬州路。
    +可堪回首,佛狸祠下,一片神鸦社鼓。
    +凭谁问:廉颇老矣,尚能饭否?
    +<% +} else if ("5".equals(param)) { +%> +《南乡子》
    +【宋】辛弃疾
    +何处望神州,满眼风光北固楼。
    +千古兴亡多少事,悠悠,不尽长江滚滚流。
    +年少万兜鍪,坐断东南战未休。
    +天下英雄谁敌手?曹刘,生子当如孙仲谋。
    +<% +} else { +%> +请使用参数 param=1,2,3,4,5 选择要显示的诗歌
    +
    if.jsp?param=1
    +if.jsp?param=2
    +if.jsp?param=3
    +if.jsp?param=4
    +if.jsp?param=5
    +<% + } +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if2.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if2.jsp new file mode 100644 index 00000000..ac691dfe --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/if2.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%! int day = 1; %> + + + + + 02.JSP语法 - if...else示例 + + +

    if...else示例

    +<% if (day == 1 | day == 7) { %> +

    今天是周末

    +<% } else { %> +

    今天不是周末

    +<% } %> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/scriptlet.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/scriptlet.jsp new file mode 100644 index 00000000..38c13ab0 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/scriptlet.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + +<% + int num = 10; + int result = 1; + for (int i = 1; i <= num; i++) { + result *= i; + } + out.println("
    "); + out.println("数字 " + num + " 的阶乘为:" + result); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/switch.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/switch.jsp new file mode 100644 index 00000000..435c36b9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/switch.jsp @@ -0,0 +1,37 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%! int day = 3; %> + + + + + 02.JSP语法 - switch...case示例 + + +

    Sswitch...case示例

    +<% + switch (day) { + case 0: + out.println("星期天"); + break; + case 1: + out.println("星期一"); + break; + case 2: + out.println("星期二"); + break; + case 3: + out.println("星期三"); + break; + case 4: + out.println("星期四"); + break; + case 5: + out.println("星期五"); + break; + default: + out.println("星期六"); + } +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/while.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/while.jsp new file mode 100644 index 00000000..c35802eb --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/02.grammar/while.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + JSP Scriptlets + + +<% + java.util.List list = new java.util.ArrayList(); + + list.add("青青子衿"); + list.add("悠悠我心"); + list.add("但为君故"); + list.add("沉吟至今"); + + java.util.Iterator it = list.iterator(); + + while (it.hasNext()) { +%> <%= it.next() %>
    +<% + } +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/foot.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/foot.jsp new file mode 100644 index 00000000..62f768cd --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/foot.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + + + + +
    + Copyright 2017 &Zhang Peng +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/head.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/head.jsp new file mode 100644 index 00000000..e356ddf7 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/head.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + JSP 示例 + + + + + + + + + + + + + +
    JSP 示例 +
    首页资源文档
    diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/include.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/include.jsp new file mode 100644 index 00000000..677945d6 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/include.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +<%@ include file="head.jsp" %> + +

    念奴娇·赤壁怀古

    +

    宋·苏轼

    +

    +

    大江东去,浪淘尽,千古风流人物。 +

    故垒西边,人道是、三国周郎赤壁。 +

    乱石穿空,惊涛拍岸,卷起千堆雪。 +

    江山如画,一时多少豪杰。 +

    遥想公瑾当年,小乔初嫁了,雄姿英发。 +

    羽扇纶巾,谈笑间、强虏灰飞烟灭。 +

    故国神游,多情应笑我,早生华发。 +

    人生如梦,一樽还酹江月。 +

    + + <%@ include file="foot.jsp" %> diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/page.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/page.jsp new file mode 100644 index 00000000..4eeebb40 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/03.directive/page.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" %> +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page pageEncoding="UTF-8" %> +<%@ page trimDirectiveWhitespaces="false" %> +<%@ page buffer="10kb" %> +<%@ page info="false" %> + + + + 第一个Jsp程序 + + +<% + out.println("你好!"); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/date.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/date.jsp new file mode 100644 index 00000000..824dce57 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/date.jsp @@ -0,0 +1,4 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +

    + 今天的日期是: <%= (new java.util.Date())%> +

    diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspforward.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspforward.jsp new file mode 100644 index 00000000..968220e6 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspforward.jsp @@ -0,0 +1,23 @@ + + +<% + out.clear(); + if ("1".equals(request.getParameter("param"))) { +%> + + + + +<% + } +%> + + + 闀ㄤ讲鍓ラ弪镡煎禌?/title> + <link rel='stylesheet' type='text/css' href='css/style.css'> + </head> +<body> +i闀ㄥ洷娓规繛锲噭閵娿储鍕鹃柛褉锅挞梹妞ょ箰瀵剟寮?param=1 闀ㄤ礁娼″Λ鍓佹嫚閵夆敛钪妫婚ⅳ顑藉亾? +</body> +</html> + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspinclude.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspinclude.jsp new file mode 100644 index 00000000..765997b9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspinclude.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>jsp:include 示例 + + + +

    jsp:include 示例

    + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspplugin.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspplugin.jsp new file mode 100644 index 00000000..bd6f10db --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspplugin.jsp @@ -0,0 +1,33 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + plugin + + +
    + + + + + +
    + + + + + + + 您的浏览器不支持 Java Applet + + +
    + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean.jsp new file mode 100644 index 00000000..df227703 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean.jsp @@ -0,0 +1,55 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + Java Bean Actions + + +
    + +<%-- 声明 person 类对象 --%> + + +<%-- 设置 person 的所有属性, 属性值从 request 中自动取得,* 表示所有属性 --%> + + +
    +
    +
    + 请填写 person 信息 + + + + + + + + + + + + + + + + + + +
    姓名 + <%-- 获取 person 的 name 属性 --%> + +
    年龄 + <%-- 获取 person 的 age 属性 --%> + +
    性别 + <%-- 获取 person 的 sex 属性 --%> + +
    + +
    +
    +
    +
    + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean2.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean2.jsp new file mode 100644 index 00000000..d8012add --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/jspuseBean2.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + 计数器 + + +
    + +<%-- 定义一个 session 范围内的计数器,记录个人的访问信息 --%> + + +<%-- 定义一个 application 范围内的计数器,记录所有人的访问信息 --%> + + +
    +
    +
    + 计数器 + + + + + + + + + +
    您的访问次数: + <%-- 获取各人的访问次数 --%> + + 次 +
    总共的访问次数: + <%-- 获取所有人的访问次数 --%> + + 次 +
    +
    +
    +
    + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/useBean.html b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/useBean.html new file mode 100644 index 00000000..a83a1cb0 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/04.action/useBean.html @@ -0,0 +1,42 @@ + + + + Java Bean Actions + + +
    + +
    +
    +
    + 请填写 Person 信息 + + + + + + + + + + + + + + + + + + +
    姓名:
    年龄:
    性别: + Male + Female +
    + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/error.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/error.jsp new file mode 100644 index 00000000..5a9640f9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/error.jsp @@ -0,0 +1,11 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" isErrorPage="true" %> + +JSP + + +<% + out.println("程序拋出了一个异常:" + exception); +%> + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/exception.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/exception.jsp new file mode 100644 index 00000000..3edbf87e --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/05.implicit_object/exception.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" errorPage="error.jsp" %> +<% + out.clear(); + String str = null; + // length() 会抛出 NullPointerException + int length = str.length(); +%> + +JSP + + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/readCookie.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/readCookie.jsp new file mode 100644 index 00000000..03e068a6 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/readCookie.jsp @@ -0,0 +1,31 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.net.URLDecoder" %> + + + + + 获取 Cookie + + +<% + Cookie cookie = null; + Cookie[] cookies = null; + // 获取cookies的数据,是一个数组 + cookies = request.getCookies(); + if (cookies != null) { + out.println("

    查找 Cookie 名与值

    "); + for (int i = 0; i < cookies.length; i++) { + cookie = cookies[i]; + + out.print("参数名 : " + cookie.getName()); + out.print("
    "); + out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "
    "); + out.print("------------------------------------
    "); + } + } else { + out.println("

    没有发现 Cookie

    "); + } +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/session.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/session.jsp new file mode 100644 index 00000000..f8adb69e --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/session.jsp @@ -0,0 +1,71 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.util.Date" %> +<% + // 获取session创建时间 + Date createTime = new Date(session.getCreationTime()); + // 获取最后访问页面的时间 + Date lastAccessTime = new Date(session.getLastAccessedTime()); + + String note = "再次访问"; + Integer visitCount = 0; + String visitCountKey = "visitCount"; + String userIDKey = "userID"; + String userID = "ABCD"; + + // 检测网页是否由新的访问用户 + if (session.isNew()) { + note = "第一次访问"; + session.setAttribute(userIDKey, userID); + session.setAttribute(visitCountKey, visitCount); + } else { + visitCount = (Integer) session.getAttribute(visitCountKey); + if (null == visitCount) { + visitCount = 0; + } + visitCount += 1; + userID = (String) session.getAttribute(userIDKey); + if (null == userID) { + userID = "ABCD"; + } + session.setAttribute(visitCountKey, visitCount); + } +%> + + + Session 示例 + + + + +<%--提示语--%> +

    <% out.print(note); %>

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Session 信息
    id<% out.print(session.getId()); %>
    创建时间<% out.print(createTime); %>
    最后访问时间<% out.print(lastAccessTime); %>
    用户 ID<% out.print(userID); %>
    访问次数<% out.print(visitCount); %>
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/writeCookie.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/writeCookie.jsp new file mode 100644 index 00000000..330410be --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/cookie/writeCookie.jsp @@ -0,0 +1,41 @@ +<%-- +访问本页面的形式如:http://127.0.0.1:8080/runoobDemos/writeCookie.jsp?name=张三&url=www.baidu.com +--%> + +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.net.URLEncoder" %> +<% + // 编码,解决中文乱码 + String name = URLEncoder.encode(request.getParameter("name"), "utf-8"); + + // 设置 nameCookie 和 urlCookie cookie + Cookie nameCookie = new Cookie("name", name); + Cookie urlCookie = new Cookie("url", request.getParameter("url")); + + // 设置cookie过期时间为24小时。 + nameCookie.setMaxAge(60 * 60 * 24); + urlCookie.setMaxAge(60 * 60 * 24); + + // 在响应头部添加cookie + response.addCookie(nameCookie); + response.addCookie(urlCookie); +%> + + + 设置 Cookie + + + +

    设置 Cookie

    + +
      +
    • 网站名: + <%= request.getParameter("name")%> +

    • +
    • 网址: + <%= request.getParameter("url")%> +

    • +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language.jsp new file mode 100644 index 00000000..e625db79 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language.jsp @@ -0,0 +1,23 @@ +<%@ page import="java.util.Locale" %> +<% + //获取客户端本地化信息 + Locale locale = request.getLocale(); + String language = locale.getLanguage(); + String country = locale.getCountry(); +%> + + + Detecting Locale + + +
    +

    Detecting Locale

    +
    +

    + <% + out.println("Language : " + language + "
    "); + out.println("Country : " + country + "
    "); + %> +

    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language2.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language2.jsp new file mode 100644 index 00000000..9b93661d --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/language2.jsp @@ -0,0 +1,20 @@ +<% + // Set response content type + response.setContentType("text/html"); + // Set spanish language code. + response.setHeader("Content-Language", "es"); + String title = "En Espa?ol"; + +%> + + + <% out.print(title); %> + + +

    <% out.print(title); %>

    +
    +

    En Espa?ol

    +

    ?Hola Mundo!

    +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeCurrency.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeCurrency.jsp new file mode 100644 index 00000000..b92f0c0e --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeCurrency.jsp @@ -0,0 +1,20 @@ +<%@ page import="java.text.NumberFormat,java.util.Locale" %> + +<% + String title = "Locale Specific Currency"; + //Get the client's Locale + Locale locale = request.getLocale(); + NumberFormat nft = NumberFormat.getCurrencyInstance(locale); + String formattedCurr = nft.format(1000000); +%> + + + <% out.print(title); %> + + +

    <% out.print(title); %>

    +
    +

    Formatted Currency: <% out.print(formattedCurr); %>

    +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeDate.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeDate.jsp new file mode 100644 index 00000000..916debc2 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localeDate.jsp @@ -0,0 +1,20 @@ +<%@ page import="java.text.DateFormat,java.util.Date" %> +<%@ page import="java.util.Locale " %> + +<% + String title = "Locale Specific Dates"; + //Get the client's Locale + Locale locale = request.getLocale(); + String date = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, locale).format(new Date()); +%> + + + <% out.print(title); %> + + +

    <% out.print(title); %>

    +
    +

    Local Date: <% out.print(date); %>

    +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localePercent.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localePercent.jsp new file mode 100644 index 00000000..926d7766 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/locale/localePercent.jsp @@ -0,0 +1,20 @@ +<%@ page import="java.text.NumberFormat,java.util.Locale" %> + +<% + String title = "Locale Specific Percentage"; + //Get the client's Locale + Locale locale = request.getLocale(); + NumberFormat nft = NumberFormat.getPercentInstance(locale); + String formattedPerc = nft.format(0.51); +%> + + + <% out.print(title); %> + + +

    <% out.print(title); %>

    +
    +

    Formatted Percentage: <% out.print(formattedPerc); %>

    +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/date.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/date.jsp new file mode 100644 index 00000000..c0b67962 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/date.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.text.SimpleDateFormat,java.util.Date" %> + + + 显示当前时间与日期 + + + +

    显示当前时间与日期

    + +<% + Date date = new Date(); + out.print("

    " + date.toString() + "

    "); +%> + +

    使用SimpleDateFormat格式化日期

    +<% + Date dNow = new Date(); + SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + out.print("

    " + ft.format(dNow) + "

    "); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.html b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.html new file mode 100644 index 00000000..67be6224 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.html @@ -0,0 +1,17 @@ + + + + + Checkbox + + + +
    + 谷歌 + 百度 + 淘宝 + +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.jsp new file mode 100644 index 00000000..aea6c4a8 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + + + Checkbox + + +

    从复选框中读取数据

    +
      +
    • 谷歌是否选中: + <%= request.getParameter("google")%> +

    • +
    • 百度是否选中: + <%= request.getParameter("baidu")%> +

    • +
    • 淘宝是否选中: + <%= request.getParameter("taobao")%> +

    • +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.html b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.html new file mode 100644 index 00000000..efc913fb --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.html @@ -0,0 +1,17 @@ + + + + + Checkbox + + + +
    + 谷歌 + 百度 + 淘宝 + +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.jsp new file mode 100644 index 00000000..3339a2e7 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/checkbox2.jsp @@ -0,0 +1,29 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.util.Enumeration" %> + + + + + Checkbox2 + + +

    读取所有表单参数

    + + + + + + <% + Enumeration paramNames = request.getParameterNames(); + + while (paramNames.hasMoreElements()) { + String paramName = (String) paramNames.nextElement(); + out.print("\n"); + String paramValue = request.getParameter(paramName); + out.println("\n"); + } + %> +
    参数名参数值
    " + paramName + " " + paramValue + "
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.html b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.html new file mode 100644 index 00000000..4f905ebc --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.html @@ -0,0 +1,17 @@ + + + + + 表单 - Get操作 + + + +
    + 站点名: +
    + 网址: + +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.jsp new file mode 100644 index 00000000..095eb1e0 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formGet.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + + + 表单 - Get操作 + + +

    使用 GET 方法读取数据

    +
      +
    • 站点名: + <%= request.getParameter("name")%> +

    • +
    • 网址: + <%= request.getParameter("url")%> +

    • +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.html b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.html new file mode 100644 index 00000000..3bc877ab --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.html @@ -0,0 +1,17 @@ + + + + + 表单 - Post操作 + + + +
    + 站点名: +
    + 网址: + +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.jsp new file mode 100644 index 00000000..e74174a9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/form/formPost.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + + + 表单 - Post操作 + + +

    使用 POST 方法读取数据

    +
      +
    • 站点名: + <% + // 解决中文乱码的问题 + String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"), "UTF-8"); + %> + <%=name%> +

    • +
    • 网址: + <%= request.getParameter("url")%> +

    • +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/hitCount.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/hitCount.jsp new file mode 100644 index 00000000..945dbb66 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/hitCount.jsp @@ -0,0 +1,27 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + + 访问量统计 + + +<% + Integer hitsCount = (Integer) application.getAttribute("hitCounter"); + if (hitsCount == null || hitsCount == 0) { + /* 第一次访问 */ + out.println("欢迎访问!"); + hitsCount = 1; + } else { + /* 返回访问值 */ + out.println("欢迎再次访问!"); + hitsCount += 1; + } + application.setAttribute("hitCounter", hitsCount); +%> + +

    页面访问量为: <%= hitsCount%> +

    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/mail/sendMail.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/mail/sendMail.jsp new file mode 100644 index 00000000..7261e11d --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/mail/sendMail.jsp @@ -0,0 +1,55 @@ +<%@ page import="java.util.Properties" %> +<% + String result; + // 收件人的电子邮件 + String to = "abcd@gmail.com"; + + // 发件人的电子邮件 + String from = "mcmohd@gmail.com"; + + // 假设你是从本地主机发送电子邮件 + String host = "localhost"; + + // 获取系统属性对象 + Properties properties = System.getProperties(); + + // 设置邮件服务器 + properties.setProperty("mail.smtp.host", host); + + // 获取默认的Session对象。 + Session mailSession = Session.getDefaultInstance(properties); + + try { + // 创建一个默认的MimeMessage对象。 + MimeMessage message = new MimeMessage(mailSession); + // 设置 From: 头部的header字段 + message.setFrom(new InternetAddress(from)); + // 设置 To: 头部的header字段 + message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); + // 设置 Subject: header字段 + message.setSubject("This is the Subject Line!"); + // 现在设置的实际消息 + message.setText("This is actual message"); + // 发送消息 + Transport.send(message); + result = "Sent message successfully...."; + } catch (MessagingException mex) { + mex.printStackTrace(); + result = "Error: unable to send message...."; + } +%> + + + Send Email using JSP + + +
    +

    Send Email using JSP

    +
    +

    + <% + out.println("Result: " + result + "\n"); + %> +

    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/redirect.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/redirect.jsp new file mode 100644 index 00000000..c4e082b1 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/redirect.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + + 页面重定向 + + + +

    页面重定向

    + +<% + // 重定向到新地址 + String site = "http://www.baidu.com"; + response.setStatus(response.SC_MOVED_TEMPORARILY); + response.setHeader("Location", site); +%> + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/refresh.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/refresh.jsp new file mode 100644 index 00000000..85d34aa9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/practice/refresh.jsp @@ -0,0 +1,30 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.util.Calendar,java.util.GregorianCalendar" %> + + + 自动刷新实例 + + + +

    每秒刷新时间

    +<% + // 设置每秒刷新一次 + response.setIntHeader("Refresh", 1); + // 获取当前时间 + Calendar calendar = new GregorianCalendar(); + String am_pm; + int hour = calendar.get(Calendar.HOUR); + int minute = calendar.get(Calendar.MINUTE); + int second = calendar.get(Calendar.SECOND); + if (calendar.get(Calendar.AM_PM) == 0) { + am_pm = "AM"; + } else { + am_pm = "PM"; + } + String CT = hour + ":" + minute + ":" + second + " " + am_pm; + out.println("当前时间为: " + CT + "\n"); +%> + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld.jsp new file mode 100644 index 00000000..bba59c7f --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld.jsp @@ -0,0 +1,10 @@ + + + First Jsp Programe + + +<% + out.println("Hello World!"); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld_zh.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld_zh.jsp new file mode 100644 index 00000000..b02b856b --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/01.helloWorld_zh.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + + 第一个Jsp程序 + + +<% + out.println("你好!"); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/02.life.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/02.life.jsp new file mode 100644 index 00000000..2e29bad8 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/02.life.jsp @@ -0,0 +1,45 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + life.jsp + + + +<%! + private int initVar = 0; + + private int serviceVar = 0; + + private int destroyVar = 0; +%> + +<%! + public void jspInit() { + initVar++; + System.out.println("jspInit(): JSP被初始化了" + initVar + "次"); + } + + public void jspDestroy() { + destroyVar++; + System.out.println("jspDestroy(): JSP被销毁了" + destroyVar + "次"); + } +%> + +<% + serviceVar++; + System.out.println("_jspService(): JSP共响应了" + serviceVar + "次请求"); + + String content1 = "初始化次数 : " + initVar; + String content2 = "响应客户请求次数 : " + serviceVar; + String content3 = "销毁次数 : " + destroyVar; +%> +

    菜鸟教程 JSP 测试实例

    +

    <%=content1 %> +

    +

    <%=content2 %> +

    +

    <%=content3 %> +

    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/03.yourIp.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/03.yourIp.jsp new file mode 100644 index 00000000..354bb2f9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/03.yourIp.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> + + + + + 菜鸟教程(runoob.com) + + +Hello World!
    +<% + out.println("你的 IP 地址 " + request.getRemoteAddr()); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/configuration.jsp b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/configuration.jsp new file mode 100644 index 00000000..68764cca --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/examples/uncheck/configuration.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + JSP config 示例 + + +

    + <% + String message = config.getInitParameter("message"); + out.println(message); + %> +

    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/images/bg-btn-blue.gif b/codes/javaee/javaee-jsp/src/main/webapp/images/bg-btn-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc03f1bd5948a2057abb97707ece2434cea75203 GIT binary patch literal 827 zcmZ?wbhEHbWMnX6_|CwPHuG*k>y@ysYcAF2qxx^ePrhYUcrtm~ZLfxlcBN++M!{$Z w4C@e3{K*3LpALuw}~g^ZMxIH_EzJft91*n zl+L=CIq__H`EskwbOwb~3QWE2#9PWX?-jye?-oSAou9 z#t$Y<#sW3x`T3;v7JmLK!?p0if(xSaSQk86U?L%KZiRB;f_p4sEY9pP8f&gTYuGVW mYRU~q^Mkewf?jh=_p@s;HZ(Rhn)A1{cXVoW_oyl|SOWkQuTW|L literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-jsp/src/main/webapp/images/vertical_line.gif b/codes/javaee/javaee-jsp/src/main/webapp/images/vertical_line.gif new file mode 100644 index 0000000000000000000000000000000000000000..65f8ee7882196570f92051f9c5fc4f48c5bfa066 GIT binary patch literal 301 zcma)1+X=!z5S-0D5-%5X=NS!&f(2NCKYj>7t;ik(!8&Y0L9hiMKX!7SehBf)Sr(R= zVRqMF{S#*0tQrszmZ9JuSU_^l1(!m|jtre9QYNWZDpg7w{ejWl+~i&DT)*$!sIKeL zL gJo)DBuOGJO@6e3GGG;Nyc5_&rX1noz+FbnY1^zZDQUCw| literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/css/style.css b/codes/javaee/javaee-jsp/src/main/webapp/views/css/style.css new file mode 100644 index 00000000..2ae2e7bd --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/css/style.css @@ -0,0 +1,51 @@ +body, div, td, input { + font-size: 12px; + margin: 0px; +} + +select { + height: 20px; + width: 300px; +} + +.title { + font-size: 16px; + padding: 10px; + margin: 10px; + width: 80%; +} + +.text { + height: 20px; + width: 300px; + border: 1px solid #AAAAAA; +} + +.line { + margin: 2px; +} + +.leftDiv { + width: 110px; + float: left; + height: 22px; + line-height: 22px; + font-weight: bold; +} + +.rightDiv { + height: 22px; + line-height: 22px; +} + +.button { + color: #FFFFFF; + font-weight: bold; + font-size: 11px; + text-align: center; + padding: .17em 0 .2em .17em; + border-style: solid; + border-width: 1px; + border-color: #99CCFF #115599 #115599 #99CCFF; + background: #6699CC url(../images/bg-btn-blue.gif) repeat-x; +} diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action.jsp new file mode 100644 index 00000000..e2353464 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action.jsp @@ -0,0 +1,7 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + +这里是正文 + + \ No newline at end of file diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/date.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/date.jsp new file mode 100644 index 00000000..4537afec --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/date.jsp @@ -0,0 +1,4 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +

    + 今天的日期是: <%=(new java.util.Date()).toLocaleString()%> +

    diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/forward.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/forward.jsp new file mode 100644 index 00000000..40b34380 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/forward.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + jsp:forward范例 + + +

    jsp:forward范例

    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/getProperty.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/getProperty.jsp new file mode 100644 index 00000000..78e1c59c --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/getProperty.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + jsp:setProperty和jsp:getProperty使用范例 + + + +

    jsp:setProperty和jsp:getProperty使用范例

    + + + + +

    输出信息....

    + + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/include.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/include.jsp new file mode 100644 index 00000000..cdb036a0 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/include.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + jsp:include范例 + + +

    include 动作实例

    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.html b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.html new file mode 100644 index 00000000..e087b551 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.html @@ -0,0 +1,38 @@ + + + Java Bean Actions + + + + +
    +
    +
    +
    + 请填写 Person 信息 + + + + + + + + + + + + + + + + + +
    姓名:
    年龄:
    性别:Male Female +
    +
    +
    +
    +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.jsp new file mode 100644 index 00000000..7d7d1850 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/action/useBean.jsp @@ -0,0 +1,53 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + Java Bean Actions + + + +
    + +<%-- 声明 Person 类对象 person --%> + + +<%-- 设置 person 的所有属性,所有的属性值从 request 中自动取得 --%> + + +
    +
    +
    + 请填写 Person 信息 + + + + + + + + + + + + + + + + + +
    姓名: + <%-- 获取 person 的 name 属性 --%> + +
    年龄: + <%-- 获取 person 的 age 属性 --%> + +
    性别: + <%-- 获取 person 的 sex 属性 --%> + +
    +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/application.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/application.jsp new file mode 100644 index 00000000..655a26b4 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/application.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> +<% + out.getBufferSize(); + + out.println(request); + + +%> + +JSP Scriptlets + + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/break.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/break.jsp new file mode 100644 index 00000000..72ab9510 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/break.jsp @@ -0,0 +1,27 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + +<% + + for (int i = 0; i < 5; i++) { +%> break 所在的循环, i = <%= i %>.
    +<% + if (i == 2) { + break; + } + } +%> break 循环完毕.
    +<% + for (int i = 0; i < 5; i++) { +%> return 所在的循环, i = <%= i %>.
    +<% + if (i == 2) { + return; + } + } +%> return 循环完毕.
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/comment.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/comment.jsp new file mode 100644 index 00000000..457d8ad9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/comment.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<% + // 这是 Java 行注释 + String path = request.getContextPath(); + + /* + 这是 Java 多行注释 + */ +%> + + + + JSP 注释 + +<%-- + 这是 JSP 注释,可以添加多行注释 +--%> + +This is my JSP page.
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/counter.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/counter.jsp new file mode 100644 index 00000000..0c7095a8 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/counter.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + 计数器 + + +
    + +<%-- 定义一个 session 范围内的计数器 记录个人访问信息 --%> + + +<%-- 定义一个 application 范围内的计数器 记录所有人的访问信息 --%> + + +
    +
    +
    + 计数器 + + + + + + + + + +
    您的访问次数: + <%-- 获取个人的 访问次数 --%> + + 次 +
    总共的访问次数: + <%-- 获取所有人的 访问次数 --%> + + 次 +
    +
    +
    +
    + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive.jsp new file mode 100644 index 00000000..21f32e35 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive.jsp @@ -0,0 +1,4 @@ +<%@page contentType="image/jpeg" %> + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/foot.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/foot.jsp new file mode 100644 index 00000000..a86f2eb7 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/foot.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + + + + +
    + Copyright 2007-2010 ©Helloweenvsfei +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/head.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/head.jsp new file mode 100644 index 00000000..479ac0d7 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/head.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + JSP指令include范例 + + + + + + + + + + + + + + + + + + +
    JSP指令include范例
    首页资源文档下载关于邮件社区
    diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/include.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/include.jsp new file mode 100644 index 00000000..addd936c --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/include/include.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +<%@ include file="head.jsp" %> +

    +

    如今且说林黛玉自在荣府以来,贾母万般怜爱,寝食起居,一如宝玉,迎春,探春, 惜春三个亲孙女倒且靠后, + 便是宝玉和黛玉二人之亲密友爱处,亦自较别个不同,日则同行同坐,夜则同息同止,真是言和意顺,略无参商.不想如今忽然来了一个薛宝钗 ,年岁虽大不多,然品格端方,容貌丰美,人多谓黛玉所不及.而且宝钗行为豁达,随分从时, + 不比黛玉孤高自许,目无下尘,故比黛玉大得下人之心.便是那些小丫头子们, 亦多喜与宝钗去顽. 因此黛玉心中便有些悒郁不忿之意,宝钗却浑然不觉.那宝玉亦在孩提之间, + 况自天性所禀来的一片愚拙偏僻,视姊妹弟兄皆出一意,并无亲疏远近之别.其中因与黛玉同随贾母一处坐卧,故略比别个姊妹熟惯些.既熟惯,则更觉亲密 , + 既亲密,则不免一时有求全之毁,不虞之隙.这日不知为何,他二人言语有些不合起来,黛玉又气的独在房中垂泪,宝玉又自悔言语冒撞,前去俯就,那黛玉方渐渐的回转来. 因东边宁府中花园内梅花盛开,贾珍之妻尤氏乃治酒,请贾母,邢夫人,王夫人等赏花. + 是日先携了贾蓉之妻,二人来面请.贾母等于早饭后过来,就在会芳园游顽,先茶后酒,不过皆是宁荣二府女眷家宴小集,并无别样新文趣事可记. +

    + 一时宝玉倦怠,欲睡中觉,贾母命人好生哄着,歇一回再来.贾蓉之妻秦氏便忙笑回道:"我们这里有给宝叔收拾下的屋子,老祖宗放心,只管交与我就是了."又向宝玉的奶娘丫鬟等道:"嬷嬷,姐姐们,请宝叔随我这里来."贾母素知秦氏是个极妥当的人 , + 生的袅娜纤巧,行事又温柔和平,乃重孙媳中第一个得意之人,见他去安置宝玉,自是安稳的. +

    + <%@ include file="foot.jsp" %> diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/contentType.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/contentType.jsp new file mode 100644 index 00000000..1599e7d1 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/contentType.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + JSP指令page-属性contentType + + + +

    你好啊

    +

    contentType="text/html; charset=UTF-8"

    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/errorPage.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/errorPage.jsp new file mode 100644 index 00000000..a63836ae --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/errorPage.jsp @@ -0,0 +1,13 @@ + +<%@ page language="java" errorPage="isErrorPage.jsp" pageEncoding="UTF-8" %> + + + JSP指令page-属性errorPage + + +<% + //这行代码肯定会出错,因为除数是0,一运行就会抛出异常 + int x = 1 / 0; +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/isErrorPage.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/isErrorPage.jsp new file mode 100644 index 00000000..db80567d --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/directive/page/isErrorPage.jsp @@ -0,0 +1,12 @@ + +<%@ page language="java" pageEncoding="UTF-8" isErrorPage="true" %> + + + JSP + + +<% + out.println("程序抛出了一个异常:" + exception); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/el.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/el.jsp new file mode 100644 index 00000000..d58a74a1 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/el.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + +<%! + String ss1 = "ss String"; +%> +<% +%> + + + My JSP 'el.jsp' starting page + + + + + + + + + + +${not (1==2) } + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/error.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/error.jsp new file mode 100644 index 00000000..ae1fe636 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/error.jsp @@ -0,0 +1,11 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" isErrorPage="true" %> + + + JSP + + +<% + out.println("程序抛出了一个异常:" + exception); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/exception.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/exception.jsp new file mode 100644 index 00000000..4abf68c2 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/exception.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" errorPage="/error.jsp" %> +<% + out.clear(); + String str = null; + // length() 操作会抛出 NullPointerException + int length = str.length(); +%> + +JSP + + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/for.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/for.jsp new file mode 100644 index 00000000..860e0467 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/for.jsp @@ -0,0 +1,53 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + + +
    +<% + Object[][] letters = {{true, "恭喜您注册的信息已经生效", "e_inn@163.com", "helloweenvsfei@gmail.com", "2007-8-8"}, + {true, "Java EE 5.0 release!!", "admin@sun.com", "helloweenvsfei@gmail.com", "2007-6-24"}, + {false, "来信已经收到,下周末见面商谈", "foo@bar.com", "helloweenvsfei@gmail.com", "2007-5-20"}, + {false, "您的博客有新的留言", "blog@foo.bar.com", "helloweenvsfei@gmail.com", "2007-3-2"},}; + String[] colors = {"#DDDDDD", "#AAAAAA",}; +%> + + + + + + + + + <% + for (int i = 0; i < letters.length; i++) { + Object[] letter = letters[i]; + %> + + + + + + + + <% + } + %> +
     标题 发信人 收信人 时间 
    + <% + if (letter[0] == Boolean.TRUE) { + %> + + <% + } else { + out.println(" "); + } + %> + <%= letter[1] %> + <%= letter[2] %> + <%= letter[3] %> + <%= letter[4] %> +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/if.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/if.jsp new file mode 100644 index 00000000..a9f1bfb8 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/if.jsp @@ -0,0 +1,48 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + +<% + String param = request.getParameter("param"); + + if ("1".equals(param)) { +%> +关雎·周南·诗经
    +关关雎鸠,在河之洲。窈窕淑女,君子好逑。
    +参差荇菜,左右流之。窈窕淑女,寤寐求之。
    +求之不得,寤寐思服。悠哉悠哉,辗转反侧。
    +参差荇菜,左右采之。窈窕淑女,琴瑟友之。
    +参差荇菜,左右芼之。窈窕淑女,钟鼓乐之。
    +<% +} else if ("2".equals(param)) { +%> +蒹葭·秦风·诗经
    +蒹葭苍苍,白露为霜。所谓伊人,在水一方。
    +溯洄从之,道阻且长。溯游从之,宛在水中央。
    +蒹葭凄凄,白露未晞。所谓伊人,在水之湄。
    +溯洄从之,道阻且跻。溯游从之,宛在水中坻。
    +蒹葭采采,白露未已。所谓伊人,在水之涘。
    +溯洄从之,道阻且右。溯游从之,宛在水中沚。
    +<% +} else if ("3".equals(param)) { +%> +子衿·国风·郑风
    +青青子衿,悠悠我心。
    +纵我不往,子宁不嗣音?
    +青青子佩,悠悠我思。
    +纵我不往,子宁不来?
    +挑兮达兮,在城阙兮。
    +一日不见,如三月兮。
    +<% +} else { +%> +请使用参数 param=1, 2, 3 选择要显示的诗歌

    +if.jsp?param=1
    +if.jsp?param=2
    +if.jsp?param=3
    +<% + } +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/while.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/while.jsp new file mode 100644 index 00000000..a8a2ce6e --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/grammar/while.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + +<% + java.util.List list = new java.util.ArrayList(); + + list.add("茕茕白兔"); + list.add("东走西顾"); + list.add("衣不如新"); + list.add("人不如故"); + + java.util.Iterator it = list.iterator(); + + while (it.hasNext()) { +%> <%= it.next() %>
    +<% + } + +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/greeting.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/greeting.jsp new file mode 100644 index 00000000..24ea2f01 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/greeting.jsp @@ -0,0 +1,44 @@ +<%@ page language="java" import="java.util.Calendar" contentType="text/html; charset=utf-8" %> +<%@ page import="java.util.Locale" %> +<% + Locale locale = request.getLocale(); + + Calendar calendar = Calendar.getInstance(locale); + + int hour = calendar.get(Calendar.HOUR_OF_DAY); + + String greeting = ""; + + if (hour <= 6) { + greeting = "凌晨好,您该睡觉了。良好的睡眠是美好一天的开始。"; + } else if (hour <= 9) { + greeting = "早上好。早餐应该注意营养。"; + } else if (hour <= 12) { + greeting = "上午好。工作时注意保护眼睛。"; + } else if (hour <= 18) { + greeting = "下午好。小心工作中打瞌睡。"; + } else if (hour <= 24) { + greeting = "晚上好。放松一下自己,好好休息。睡觉不要太晚啊~~"; + } else { + + } +%> + + + + 欢迎页面 + + + + + + + + + + + +
    <%= greeting %> +
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/index.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/index.jsp new file mode 100644 index 00000000..f0dded67 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/index.jsp @@ -0,0 +1,25 @@ +<%@ page language="java" pageEncoding="GB18030" %> +<% + String path = request.getContextPath(); + String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; +%> + + + + + + javaee-jsp ҳ + + + + + + + + + +This is my JSP page.
    + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/life.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/life.jsp new file mode 100644 index 00000000..b80202bf --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/life.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%! + +%> + + + + + + Insert title here + + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/method.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/method.jsp new file mode 100644 index 00000000..bfc8cda9 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/method.jsp @@ -0,0 +1,84 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> +<%@ page import="com.helloweenvsfei.util.ip.IPSeeker" %> +<%! + // 全局变量 + private IPSeeker ipSeeker = IPSeeker.getInstance(); + + // 方法一 + public String getArea(String ip) { + return ipSeeker.getArea(ip); + } + + //方法二 + public String getCountry(String ip) { + return ipSeeker.getCountry(ip); + } + + // 方法三 正则表达式判断是否合法 IP 地址 + public boolean isValidIp(String ip) { + return ip != null && ip.trim().matches("^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$"); + } +%> + + + IP 地址查询 + + +
    +<% + String ip = request.getParameter("ip"); + String area = ""; + String country = ""; + + // 如果是合法的 IP 地址 + if (isValidIp(ip)) { + // 调用方法一 + country = getCountry(ip); + // 调用方法二 + area = getArea(ip); + } + +%> +
    +
    +
    + IP 地址查询 + + <% + if (isValidIp(ip)) { + %> + + + + + + + + + + + + + <% + } + %> + + + + + + + + +
    IP 地址:<%= ip %> +
    国家:<%= country %> +
    地区:<%= area %> +
    请输入要查询的 IP 地址:
    + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/plugin.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/plugin.jsp new file mode 100644 index 00000000..bd6f10db --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/plugin.jsp @@ -0,0 +1,33 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + + + plugin + + +
    + + + + + +
    + + + + + + + 您的浏览器不支持 Java Applet + + +
    + + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/return.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/return.jsp new file mode 100644 index 00000000..e064ddf6 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/return.jsp @@ -0,0 +1,27 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + +<% + String param = request.getParameter("param"); +%> +昔我往矣,
    +杨柳依依。
    +今我来思,
    +雨雪霏霏。
    +<% + if ("return".equals(param)) { + return; + } +%> +青青子衿,
    +悠悠我心,
    +但为君故,
    +沉吟至今!
    + +
    +<%= request.getRequestURI() %>?param=return + + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/scriptlet.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/scriptlet.jsp new file mode 100644 index 00000000..5197d1ce --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/scriptlet.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" %> + +JSP Scriptlets + + +<% + int num = 10; + int result = 1; + for (int i = 1; i <= num; i++) { + result *= i; + out.println("第" + i + "步运算:" + result + "
    "); + } + out.println("
    "); + out.println("数字 " + num + " 的阶乘为: " + result); +%> + + diff --git a/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/taglib.jsp b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/taglib.jsp new file mode 100644 index 00000000..e0560793 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/main/webapp/views/jsp/taglib.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + My JSP 'taglib.jsp' starting page + + + + + + + + diff --git a/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java b/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java new file mode 100644 index 00000000..43d2fe1d --- /dev/null +++ b/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java @@ -0,0 +1,114 @@ +package io.github.dunwu.javaee.server; + +import java.util.ArrayList; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * JettyFactory 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("unused") +public class JettyFactory { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + private static final int PORT = 9798; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "shiro-web", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static Server initServer() { + Profiles.setProfileAsSystemProperty(Profiles.DEVELOPMENT); + WebAppContext webAppContext = new WebAppContext(); + Server server = new Server(PORT); + server.setHandler(webAppContext); + return server; + } + + public static void initWebAppContext(Server server, int type) throws Exception { + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + + if (IDE_INTELLIJ == type) { + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + } else { + webAppContext.setParentLoaderPriority(true); + } + + System.out.println("[INFO] Application loaded"); + } + + public static String getAbsolutePath() { + String path = null; + String folderPath = JettyFactory.class.getProtectionDomain().getCodeSource().getLocation().getPath() + .substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + public static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + ArrayList jarNameExprssions = Lists.newArrayList(".*/[^/]*servlet-api-[^/]*\\.jar$", + ".*/javax.servlet.jsp.jstl-.*\\.jar$", ".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + jarNameExprssions.add(".*/" + jarName + "-[^/]*\\.jar$"); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(jarNameExprssions, '|')); + } + + public static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + + public static void startServer(Server server) throws Exception { + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + server.start(); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + } + +} diff --git a/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/Profiles.java b/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/Profiles.java new file mode 100644 index 00000000..dcfd3e39 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/Profiles.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2005, 2014 springside.github.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + *******************************************************************************/ +package io.github.dunwu.javaee.server; + +/** + * Spring profile 常用方法与profile名称。 + * + * @author calvin + */ +public class Profiles { + + public static final String ACTIVE_PROFILE = "spring.profiles.active"; + + public static final String DEFAULT_PROFILE = "spring.profiles.default"; + + public static final String PRODUCTION = "production"; + + public static final String DEVELOPMENT = "development"; + + public static final String UNIT_TEST = "test"; + + public static final String FUNCTIONAL_TEST = "functional"; + + /** + * 在Spring启动前,设置profile的环境变量。 + */ + public static void setProfileAsSystemProperty(String profile) { + System.setProperty(ACTIVE_PROFILE, profile); + } + +} diff --git a/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java b/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java new file mode 100644 index 00000000..049c8802 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.server; + +import org.eclipse.jetty.server.Server; + +/** + * 快速启动 jetty 服务器,方便测试 + * + * @author Zhang Peng + */ +public class QuickStartServer { + + // private static int STARTUP_TYPE = JettyFactory.IDE_ECLIPSE; + private static int STARTUP_TYPE = JettyFactory.IDE_INTELLIJ; + + public static void main(String[] args) throws Exception { + Server server = JettyFactory.initServer(); + JettyFactory.initWebAppContext(server, STARTUP_TYPE); + + try { + JettyFactory.startServer(server); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + JettyFactory.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + +} diff --git a/codes/javaee/javaee-jsp/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-jsp/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-jsp/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-jsp/src/test/resources/logback.xml b/codes/javaee/javaee-jsp/src/test/resources/logback.xml new file mode 100644 index 00000000..5b969d92 --- /dev/null +++ b/codes/javaee/javaee-jsp/src/test/resources/logback.xml @@ -0,0 +1,46 @@ + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-jstl/pom.xml b/codes/javaee/javaee-jstl/pom.xml new file mode 100644 index 00000000..74cf36a0 --- /dev/null +++ b/codes/javaee/javaee-jstl/pom.xml @@ -0,0 +1,118 @@ + + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + + io.github.dunwu + javaee-jstl + 1.0.0 + war + + + + + javaee-jstl + JavaEE 学习笔记之 jstl + + + + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + org.slf4j + jcl-over-slf4j + + + + + + org.apache.commons + commons-lang3 + + + + + + javax.servlet + javax.servlet-api + provided + + + javax.servlet.jsp + javax.servlet.jsp-api + provided + + + javax.servlet + jstl + 1.2 + + + + + + org.eclipse.jetty + jetty-webapp + test + + + org.eclipse.jetty + jetty-annotations + test + + + org.eclipse.jetty + apache-jsp + test + + + org.eclipse.jetty + apache-jstl + test + + + + + + org.assertj + assertj-core + test + + + + + + + xalan + xalan + 2.7.2 + + + xerces + xercesImpl + 2.11.0 + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/bean/Person.java b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/bean/Person.java new file mode 100644 index 00000000..36943d29 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/bean/Person.java @@ -0,0 +1,107 @@ +package io.github.dunwu.javaee.bean; + +public class Person { + + private int id; + + private String name; + + private String sex; + + private int age; + + private String telephone; + + private String birthday; + + private String mobile; + + private String address; + + private String city; + + private boolean deleted; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + +} + +// end diff --git a/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example.java b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example.java new file mode 100644 index 00000000..70c961ef --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example.java @@ -0,0 +1,14 @@ +package io.github.dunwu.javaee.util; + +import java.util.ListResourceBundle; + +public class Example extends ListResourceBundle { + + static final Object[][] contents = { { "count.one", "一" }, { "count.two", "二" }, { "count.three", "三" }, }; + + @Override + public Object[][] getContents() { + return contents; + } + +} diff --git a/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example_es_ES.java b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example_es_ES.java new file mode 100644 index 00000000..7712df98 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Example_es_ES.java @@ -0,0 +1,13 @@ +package io.github.dunwu.javaee.util; + +import java.util.ListResourceBundle; + +public class Example_es_ES extends ListResourceBundle { + + static final Object[][] contents = { { "count.one", "one" }, { "count.two", "two" }, { "count.three", "three" }, }; + + public Object[][] getContents() { + return contents; + } + +} diff --git a/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Pagination.java b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Pagination.java new file mode 100644 index 00000000..e31e0526 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/java/io/github/dunwu/javaee/util/Pagination.java @@ -0,0 +1,204 @@ +package io.github.dunwu.javaee.util; + +import java.net.URLEncoder; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class Pagination { + + private int pageSize = 20; + + private int pageNum = 1; + + private int recordCount; + + private int pageCount; + + private int firstResult; + + private String pageUrl; + + public Pagination(HttpServletRequest request, HttpServletResponse response) { + try { + pageNum = Integer.parseInt(request.getParameter("pageNum")); + } catch (Exception e) { + } + + for (Cookie cookie : request.getCookies()) { + if ("pageSize".equals(cookie.getName())) { + try { + pageSize = Integer.parseInt(cookie.getValue()); + } catch (Exception e) { + } + } + } + + try { + pageSize = Integer.parseInt(request.getParameter("pageSize")); + } catch (Exception e) { + } + + Cookie cookie = new Cookie("pageSize", Integer.toString(pageSize)); + cookie.setMaxAge(Integer.MAX_VALUE); + + response.addCookie(cookie); + + StringBuffer queryString = new StringBuffer(); + + for (Object parameterName : request.getParameterMap().keySet()) { + String name = (String) parameterName; + + if ("pageNum".equals(name) || "pageSize".equals(name)) { + continue; + } + + for (String value : request.getParameterValues(name)) { + if (queryString.length() > 0) { + queryString.append("&"); + } + + try { + queryString.append(name + "=" + URLEncoder.encode(value, "UTF-8")); + } catch (Exception e) { + queryString.append(name + "=" + value); + } + } + } + + pageUrl = request.getRequestURI() + "?" + queryString.toString(); + } + + /** + * 生成分页信息 包括第一页,上一页,下一页,最后一页等等。 + */ + public String toString() { + calculate(); + + String url = pageUrl.contains("?") ? pageUrl : pageUrl + "?"; + + StringBuffer buffer = new StringBuffer(); + + buffer.append("每页 "); + + buffer.append(" 条记录 "); + + buffer.append(" 总记录数: " + recordCount); + + buffer.append(" 页数/总页数: " + pageNum + "/" + pageCount + " "); + + buffer.append(" "); + + buffer.append(pageCount == 0 || pageNum == 1 ? " 第一页 " : " 第一页 "); + + buffer.append("   "); + + buffer.append(pageCount == 0 || pageNum == 1 ? " 上一页 " + : " 上一页 "); + + buffer.append("   "); + + buffer.append(pageCount == 0 || pageNum == pageCount ? " 下一页 " + : " 下一页 "); + + buffer.append("   "); + + buffer.append(pageCount == 0 || pageNum == pageCount ? " 最后一页 " + : " 最后一页 "); + + buffer.append("   转到第页 "); + + buffer.append(" "); + + buffer.append(""); + + return buffer.toString(); + } + + private void calculate() { + pageCount = (recordCount + pageSize - 1) / pageSize; + + firstResult = (pageNum - 1) * pageSize; + } + + public int getPageSize() { + calculate(); + + return pageSize; + } + + public void setPageSize(int pageSize) { + calculate(); + + this.pageSize = pageSize; + } + + public int getRecordCount() { + calculate(); + + return recordCount; + } + + public void setRecordCount(int recordCount) { + calculate(); + + this.recordCount = recordCount; + } + + public int getFirstResult() { + calculate(); + + return firstResult; + } + + public void setFirstResult(int firstResult) { + calculate(); + + this.firstResult = firstResult; + } + + public String getPageUrl() { + return pageUrl + "&pageNum=" + pageNum; + } + + public void setPageUrl(String pageUrl) { + this.pageUrl = pageUrl; + } + +} + +// end diff --git a/codes/javaee/javaee-jstl/src/main/resources/init.sql b/codes/javaee/javaee-jstl/src/main/resources/init.sql new file mode 100644 index 00000000..562a8d72 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/resources/init.sql @@ -0,0 +1,45 @@ +USE jstl; + +ALTER DATABASE jstl +CHARACTER SET utf8; + +SET NAMES gbk; + +CREATE TABLE tb_corporation ( + id INTEGER AUTO_INCREMENT, + name VARCHAR(255), + description TEXT, + PRIMARY KEY (id) +); + +INSERT INTO tb_corporation (name, description) VALUES ('MicroSoft', '微软'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); +INSERT INTO tb_corporation (name, description) VALUES ('IBM', '国际商用机器'); + diff --git a/codes/javaee/javaee-jstl/src/main/resources/logback.xml b/codes/javaee/javaee-jstl/src/main/resources/logback.xml new file mode 100644 index 00000000..5985be1e --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/resources/logback.xml @@ -0,0 +1,46 @@ + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/resources/messages.properties b/codes/javaee/javaee-jstl/src/main/resources/messages.properties new file mode 100644 index 00000000..8530dcc4 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/resources/messages.properties @@ -0,0 +1,2 @@ +prompt.hello=Hello, "{0}". +prompt.greeting=Nice to meet you. diff --git a/codes/javaee/javaee-jstl/src/main/resources/messages_zh_CN.properties b/codes/javaee/javaee-jstl/src/main/resources/messages_zh_CN.properties new file mode 100644 index 00000000..1cec3305 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/resources/messages_zh_CN.properties @@ -0,0 +1,2 @@ +prompt.hello=\u4f60\u597d, "{0}". +prompt.greeting=\u5f88\u9ad8\u5174\u89c1\u5230\u4f60. diff --git a/codes/javaee/javaee-jstl/src/main/resources/sql/create_employees.sql b/codes/javaee/javaee-jstl/src/main/resources/sql/create_employees.sql new file mode 100644 index 00000000..707cd5cb --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/resources/sql/create_employees.sql @@ -0,0 +1,12 @@ +create table Employees +( + id int not null, + age int not null, + first varchar (255), + last varchar (255) +); + +INSERT INTO Employees VALUES (100, 18, 'Zara', 'Ali'); +INSERT INTO Employees VALUES (101, 25, 'Mahnaz', 'Fatma'); +INSERT INTO Employees VALUES (102, 30, 'Zaid', 'Khan'); +INSERT INTO Employees VALUES (103, 28, 'Sumit', 'Mittal'); \ No newline at end of file diff --git a/codes/javaee/javaee-jstl/src/main/resources/sql/create_students.sql b/codes/javaee/javaee-jstl/src/main/resources/sql/create_students.sql new file mode 100644 index 00000000..a7a434d6 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/resources/sql/create_students.sql @@ -0,0 +1,12 @@ +create table Students +( + id int not null, + first varchar (255), + last varchar (255), + dob date +); + +INSERT INTO Students VALUES (100, 'Zara', 'Ali', '2002/05/16'); +INSERT INTO Students VALUES (101, 'Mahnaz', 'Fatma', '1978/11/28'); +INSERT INTO Students VALUES (102, 'Zaid', 'Khan', '1980/10/10'); +INSERT INTO Students VALUES (103, 'Sumit', 'Mittal', '1971/05/08'); \ No newline at end of file diff --git a/codes/javaee/javaee-jstl/src/main/webapp/WEB-INF/web.xml b/codes/javaee/javaee-jstl/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..a403cc53 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,25 @@ + + + + + HelloServlet + /examples/configuration.jsp + + message + welcome to jsp + + 1 + + + HelloServlet + /config + /config.jsp + + + + + /WEB-INF/views/jsp/index.jsp + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_catch.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_catch.jsp new file mode 100644 index 00000000..87fa389f --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_catch.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:catch 标签实例 + + + + + <% int x = 5 / 0;%> + + + +

    异常为 : ${catchException}
    + 发生了异常: ${catchException.message}

    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_choose.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_choose.jsp new file mode 100644 index 00000000..898147dc --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_choose.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:choose 标签实例 + + + +

    你的工资为 :

    + + + 太惨了。 + + + 不错的薪水,还能生活。 + + + 什么都没有。 + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forEach.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forEach.jsp new file mode 100644 index 00000000..57b8421e --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forEach.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:forEach 标签实例 + + + +Item

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forTokens.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forTokens.jsp new file mode 100644 index 00000000..046f4c49 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_forTokens.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:forTokens 标签实例 + + + +

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_if.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_if.jsp new file mode 100644 index 00000000..4abf6c52 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_if.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:if 标签实例 + + + + +

    我的工资为:

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_import.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_import.jsp new file mode 100644 index 00000000..98562585 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_import.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:import 标签实例 + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_out.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_out.jsp new file mode 100644 index 00000000..ab88b66f --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_out.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + c:out 标签实例 + + + + + <c:out>实例 + + +

    <c:out> 实例

    +
    +
    +使用的表达式结果为null,则输出该默认值
    + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_param.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_param.jsp new file mode 100644 index 00000000..95438a73 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_param.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:forTokens 标签实例 + + +

    <c:param> 实例

    + + + + +<%-- + + + +"> + 使用 <c:param> 为指定URL发送两个参数。--%> + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_redirect.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_redirect.jsp new file mode 100644 index 00000000..fbfbf835 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_redirect.jsp @@ -0,0 +1,11 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:redirect 标签实例 + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_remove.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_remove.jsp new file mode 100644 index 00000000..5d53732b --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_remove.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:remove 标签实例 + + + +

    salary 变量值:

    + +

    删除 salary 变量后的值:

    + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_set.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_set.jsp new file mode 100644 index 00000000..e78c3bca --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_set.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:set 标签实例 + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_url.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_url.jsp new file mode 100644 index 00000000..d0e892cf --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/core/c_url.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + c:url 标签实例 + + +

    <c:url>实例 Demo

    +"> + 这个链接通过 <c:url> 标签生成。 + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_bundle.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_bundle.jsp new file mode 100644 index 00000000..b6e3211d --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_bundle.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + fmt:bundle 标签 + + + + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatDate.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatDate.jsp new file mode 100644 index 00000000..958f062c --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatDate.jsp @@ -0,0 +1,33 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + fmt:dateNumber 标签 + + +

    日期格式化:

    + + +

    日期格式化 (1):

    +

    日期格式化 (2):

    +

    日期格式化 (3):

    +

    日期格式化 (4):

    +

    日期格式化 (5):

    +

    日期格式化 (6):

    +

    日期格式化 (7):

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatNumber.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatNumber.jsp new file mode 100644 index 00000000..529449bb --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_formatNumber.jsp @@ -0,0 +1,33 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + fmt:formatNumber 标签 + + +

    数字格式化:

    + +

    格式化数字 (1):

    +

    格式化数字 (2):

    +

    格式化数字 (3):

    +

    格式化数字 (4):

    +

    格式化数字 (5):

    +

    格式化数字 (6):

    +

    格式化数字 (7):

    +

    格式化数字 (8):

    +

    美元 : + +

    + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_message.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_message.jsp new file mode 100644 index 00000000..cac1b759 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_message.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + fmt:message 标签 + + + + +
    +
    +
    +
    + + + + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseDate.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseDate.jsp new file mode 100644 index 00000000..a6d5241c --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseDate.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + fmt:parseDate 标签 + + +

    日期解析:

    + + + +

    解析后的日期为:

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseNumber.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseNumber.jsp new file mode 100644 index 00000000..4918be0d --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_parseNumber.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + fmt:parseNumber 标签 + + +

    数字解析:

    + + + +

    数字解析 (1) :

    + +

    数字解析 (2) :

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_requestEncoding.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_requestEncoding.jsp new file mode 100644 index 00000000..e81f2b3f --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_requestEncoding.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + fmt:message 标签 + + + + + + + +
    +
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setLocale.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setLocale.jsp new file mode 100644 index 00000000..6941dd40 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setLocale.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + fmt:setLocale 标签 + + + + +
    +
    +
    +
    + + + + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setTimeZone.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setTimeZone.jsp new file mode 100644 index 00000000..e05a7959 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_setTimeZone.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + fmt:setTimeZone 标签 + + + +

    当前时区时间:

    +

    修改为 GMT-8 时区:

    + +

    Date in Changed Zone:

    + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_timeZone.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_timeZone.jsp new file mode 100644 index 00000000..adb6f13b --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/fmt/fmt_timeZone.jsp @@ -0,0 +1,42 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + fmt:timeZone 标签 + + + + + + + + + + + + + + + +
    +

    + + Formatting: + + + +

    +
    + + + + + +
    + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_contains.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_contains.jsp new file mode 100644 index 00000000..9ec50047 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_contains.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + fn:contains 示例 + + + + + + +

    找到 china +

    + + + +

    找到 CHINA +

    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_containsIgnoreCase.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_containsIgnoreCase.jsp new file mode 100644 index 00000000..512104b7 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_containsIgnoreCase.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    找到 china +

    + + + +

    找到 CHINA +

    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_endsWith.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_endsWith.jsp new file mode 100644 index 00000000..8ec96d0e --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_endsWith.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    字符串以 123 结尾 +

    + + + +

    字符串以 china 结尾 +

    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_escapeXml.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_escapeXml.jsp new file mode 100644 index 00000000..d9509b06 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_escapeXml.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + Using JSTL Functions + + + + + + +

    使用 escapeXml() 函数:

    +

    string (1) : ${fn:escapeXml(string1)}

    +

    string (2) : ${fn:escapeXml(string2)}

    + +

    不使用 escapeXml() 函数:

    +

    string (1) : ${string1}

    +

    string (2) : ${string2}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_indexOf.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_indexOf.jsp new file mode 100644 index 00000000..d4896f7a --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_indexOf.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + Using JSTL Functions + + + + + + +

    Index (1) : ${fn:indexOf(string1, "first")}

    +

    Index (2) : ${fn:indexOf(string2, "second")}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_join.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_join.jsp new file mode 100644 index 00000000..aba2d96e --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_join.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + + +

    字符串为 : ${string3}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_length.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_length.jsp new file mode 100644 index 00000000..0361946a --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_length.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    字符串长度 (1) : ${fn:length(string1)}

    +

    字符串长度 (2) : ${fn:length(string2)}

    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_replace.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_replace.jsp new file mode 100644 index 00000000..e5931747 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_replace.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    替换后的字符串 : ${string2}

    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_split.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_split.jsp new file mode 100644 index 00000000..5ea82273 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_split.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + + +

    string3 字符串 : ${string3}

    + + + + +

    string5 字符串: ${string5}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_startsWith.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_startsWith.jsp new file mode 100644 index 00000000..9879a840 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_startsWith.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + +

    字符串以 Google 开头

    +
    +
    + +

    字符串以 China 开头

    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substring.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substring.jsp new file mode 100644 index 00000000..55f74fc4 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substring.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    生成的子字符串为 : ${string2}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringAfter.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringAfter.jsp new file mode 100644 index 00000000..0ec7b3f4 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringAfter.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    生成的子字符串 : ${string2}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringBefore.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringBefore.jsp new file mode 100644 index 00000000..c6967814 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_substringBefore.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    生成的子字符串 : ${string2}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toLowerCase.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toLowerCase.jsp new file mode 100644 index 00000000..804d856d --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toLowerCase.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    字符串为 : ${string2}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toUpperCase.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toUpperCase.jsp new file mode 100644 index 00000000..3ea5988a --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_toUpperCase.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + + + +

    字符串为 : ${string2}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_trim.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_trim.jsp new file mode 100644 index 00000000..1ac0e961 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/function/fn_trim.jsp @@ -0,0 +1,19 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + 使用 JSTL 函数 + + + + +

    string1 长度 : ${fn:length(string1)}

    + + +

    string2 长度 : ${fn:length(string2)}

    +

    字符串为 : ${string2}

    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_dateParam.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_dateParam.jsp new file mode 100644 index 00000000..a24b0770 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_dateParam.jsp @@ -0,0 +1,52 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.util.Date" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> + +<%--执行本例之前,需要先运行 sql/create_students.sql--%> + + + + sql:dataParam 示例 + + + + + +<% + Date DoB = new Date("2001/12/16"); + int studentId = 100; +%> + + + UPDATE Students SET dob = ? WHERE Id = ? + + + + + + SELECT * from Students; + + + + + + + + + + + + + + + + + +
    Emp IDFirst NameLast NameDoB
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_param.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_param.jsp new file mode 100644 index 00000000..4c53b6d6 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_param.jsp @@ -0,0 +1,47 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> + +<%--运行本例之前,先执行sql/create_employees.sql--%> + + + + sql:param 示例 + + + + + + + + + DELETE FROM Employees WHERE Id = ? + + + + + SELECT * from Employees; + + + + + + + + + + + + + + + + + +
    Emp IDFirst NameLast NameAge
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_query.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_query.jsp new file mode 100644 index 00000000..41d515fe --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_query.jsp @@ -0,0 +1,40 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> + +<%--运行本例之前,先执行sql/create_employees.sql--%> + + + + sql:query 示例 + + + + + + + SELECT * from test.Employees; + + + + + + + + + + + + + + + + + +
    Emp IDFirst NameLast NameAge
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_setDataSource.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_setDataSource.jsp new file mode 100644 index 00000000..73986187 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_setDataSource.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> + + + sql:setDataSource 示例 + + + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_transaction.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_transaction.jsp new file mode 100644 index 00000000..f792744a --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_transaction.jsp @@ -0,0 +1,60 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ page import="java.util.Date" %> + +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> + +<%--执行本例之前,需要先运行 sql/create_students.sql--%> + + + + sql:transaction 示例 + + + + + +<% + Date DoB = new Date("2001/12/16"); + int studentId = 100; +%> + + + + UPDATE Students SET last = 'Ali' WHERE Id = 102 + + + UPDATE Students SET last = 'Shah' WHERE Id = 103 + + + INSERT INTO Students + VALUES (104,'Nuha', 'Ali', '2010/05/26'); + + + + + SELECT * from Students; + + + + + + + + + + + + + + + + + +
    Emp IDFirst NameLast NameDoB
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_update.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_update.jsp new file mode 100644 index 00000000..651ae8d4 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/sql/sql_update.jsp @@ -0,0 +1,44 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> + +<%--运行本例之前,先执行sql/create_employees.sql--%> + + + + sql:update 示例 + + + + + + + INSERT INTO Employees VALUES (104, 2, 'Nuha', 'Ali'); + + + + SELECT * from Employees; + + + + + + + + + + + + + + + + + +
    Emp IDFirst NameLast NameAge
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/bundle.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/bundle.jsp new file mode 100644 index 00000000..77cd39f6 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/bundle.jsp @@ -0,0 +1,41 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + + + + + + + +
    + + + +
    + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/catch.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/catch.jsp new file mode 100644 index 00000000..4a502a96 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/catch.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + + + + + + 程序抛出了异常 ${ e.class.name },原因: ${ e.message } + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/choose.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/choose.jsp new file mode 100644 index 00000000..69d457a7 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/choose.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + + when 标签的输出 + + + otherwise 标签的输出 + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/contains.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/contains.jsp new file mode 100644 index 00000000..98e1b491 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/contains.jsp @@ -0,0 +1,35 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + +header['User-Agent'] = "${ header['User-Agent'] }";

    + +您使用 +IE 浏览器 +Firefox 浏览器 +Maxth 浏览器 +MyIE2 浏览器 +Opera 浏览器 +腾讯 Traveler 浏览器 +世界之窗 浏览器 +Kubuntu 浏览器 +, +Windows 操作系统 +Windows 操作系统 +Linux 操作系统 +Linux 操作系统 +Sun 操作系统 +Mac 操作系统 +。 + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/containsIgnoreCase.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/containsIgnoreCase.jsp new file mode 100644 index 00000000..f63fc4c2 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/containsIgnoreCase.jsp @@ -0,0 +1,33 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + +header['User-Agent'] = "${ header['User-Agent'] }";

    + +您使用 +IE 浏览器 +Firefox 浏览器 +Maxth 浏览器 +MyIE2 浏览器 +Opera 浏览器 +腾讯 Traveler 浏览器 +世界之窗 浏览器 +Kubuntu 浏览器 +, +Windows 操作系统 +Linux 操作系统 +Sun 操作系统 +Mac 操作系统 +。 + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/dateParam.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/dateParam.jsp new file mode 100644 index 00000000..71223df1 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/dateParam.jsp @@ -0,0 +1,80 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + + + + + + create table if not exists tb_person + ( id integer auto_increment, + name varchar(255), + birthday timestamp null, + primary key (id) + ) + + + + insert into tb_person ( name, birthday ) values ( ?, ? ) + + + + + + select * from tb_person where birthday > ( ? - 1 ) + + + + + + + + + + + + + + + + + + +
    ${ columnName }
    ${ row[columnName] }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/endsWith.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/endsWith.jsp new file mode 100644 index 00000000..588a50b6 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/endsWith.jsp @@ -0,0 +1,70 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + +<%@page import="java.io.File" %> + + + + Insert title here + + + + +<% + request.setAttribute("files", new File("c:\\").listFiles()); +%> + + + + + + + + + + + + + + +
    File NameType
    ${ file.name } + + + 文件夹 + + JPG 图片 + EXE 应用程序 + GIF 图片 + TXT 文本文件 + WORD 文件 + Excel 文件 + LOG 日志文件 + SQL 数据库脚本文件 + + + +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/escapeXml.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/escapeXml.jsp new file mode 100644 index 00000000..fb35be08 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/escapeXml.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + + +
    +${ fn:escapeXml(source) } +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fmt.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fmt.jsp new file mode 100644 index 00000000..c237093e --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fmt.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fn.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fn.jsp new file mode 100644 index 00000000..cfa2276c --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/fn.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEach.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEach.jsp new file mode 100644 index 00000000..f8eeeb8f --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEach.jsp @@ -0,0 +1,76 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + +
    ${ num }
    +
    + +
    +
    +
    + + + + + + + + + + + + + +
    Header NameHeader Value
    ${ headerName }${ header[headerName] }
    + +
    +
    +
    + + + + + + + + + + + + + +
    Header NameHeader Value
    ${ item.key }${ item.value }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEachWithList.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEachWithList.jsp new file mode 100644 index 00000000..e4e54bce --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forEachWithList.jsp @@ -0,0 +1,196 @@ +<%@ page language="java" import="com.helloweenvsfei.jstl.bean.*, java.util.ArrayList" + contentType="text/html; charset=UTF-8" %> +<%@ page import="java.util.List" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<% + List personList = new ArrayList(); + + int i = 1; + + Person person = new Person(); + person.setId(i++); + person.setName("张三"); + person.setAge(20); + person.setSex("男"); + person.setAddress("北京市海淀区上地软件园"); + person.setBirthday("2008-08-08"); + person.setMobile("13820080808"); + person.setTelephone("69653234"); + person.setCity("北京"); + + personList.add(person); + + Person person2 = new Person(); + person2.setId(i++); + person2.setName("李四"); + person2.setAge(20); + person2.setSex("男"); + person2.setAddress("北京市东皇城根锡拉胡同"); + person2.setBirthday("2008-01-01"); + person2.setMobile("13820080808"); + person2.setTelephone("20054879"); + person2.setCity("北京"); + + personList.add(person2); + + Person person3 = new Person(); + person3.setId(i++); + person3.setName("王五"); + person3.setAge(20); + person3.setSex("男"); + person3.setAddress("北京市东皇城根锡拉胡同"); + person3.setBirthday("2008-01-01"); + person3.setMobile("13820080808"); + person3.setTelephone("20054879"); + person3.setCity("北京"); + + personList.add(person3); + + Person person4 = new Person(); + person4.setId(i++); + person4.setName("王二麻子"); + person4.setAge(20); + person4.setSex("男"); + person4.setAddress("北京市东皇城根锡拉胡同"); + person4.setBirthday("2008-01-01"); + person4.setMobile("13820080808"); + person4.setTelephone("20054879"); + person4.setCity("北京"); + + personList.add(person4); + + Person person5 = new Person(); + person5.setId(i++); + person5.setName("王二麻子"); + person5.setAge(20); + person5.setSex("男"); + person5.setAddress("北京市东皇城根锡拉胡同"); + person5.setBirthday("2008-01-01"); + person5.setMobile("13820080808"); + person5.setTelephone("20054879"); + person5.setCity("北京"); + + personList.add(person5); + + Person person6 = new Person(); + person6.setId(i++); + person6.setName("王二麻子"); + person6.setAge(20); + person6.setSex("男"); + person6.setAddress("北京市东皇城根锡拉胡同"); + person6.setBirthday("2008-01-01"); + person6.setMobile("13820080808"); + person6.setTelephone("20054879"); + person6.setCity("北京"); + + personList.add(person6); + + Person person7 = new Person(); + person7.setId(i++); + person7.setName("王二麻子"); + person7.setAge(20); + person7.setSex("男"); + person7.setAddress("北京市东皇城根锡拉胡同"); + person7.setBirthday("2008-01-01"); + person7.setMobile("13820080808"); + person7.setTelephone("20054879"); + person7.setCity("北京"); + + personList.add(person7); + + request.setAttribute("personList", personList); + +%> + + + + + Insert title here + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    编号姓名年龄性别城市地址生日手机电话
    ${ person.id }${ person.name }${ person.age }${ person.sex }${ person.city }${ person.address }${ person.birthday }${ person.mobile }${ person.telephone }
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    编号姓名年龄性别城市地址生日手机电话
    ${ varStatus.current.id }${ varStatus.current.name }${ varStatus.current.age }${ varStatus.current.sex }${ varStatus.current.city }${ varStatus.current.address }${ varStatus.current.birthday }${ varStatus.current.mobile }${ varStatus.current.telephone }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forTokens.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forTokens.jsp new file mode 100644 index 00000000..f0c9e9cd --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/forTokens.jsp @@ -0,0 +1,39 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + + + + + + + + + + + +
    varStatus.indexname
    ${ varStatus.index }${ item }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatDate.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatDate.jsp new file mode 100644 index 00000000..bf224c8d --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatDate.jsp @@ -0,0 +1,77 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + +<%@page import="java.lang.reflect.Field" %> +<%@page import="java.util.ArrayList" %> +<%@page import="java.util.List" %> +<%@page import="java.util.Locale" %> + + + + Insert title here + + + + +<% + Field[] field = Locale.class.getFields(); + + List localeList = new ArrayList(); + + for (int i = 0; i < field.length; i++) { + if (field[i].getType().equals(Locale.class)) { + localeList.add((Locale) field[i].get(null)); + } + } + + request.setAttribute("localeList", localeList); +%> + + + + + + + + + + + + + + + + + + + + + + +
    LocaleDate and TimeNumbercurrency
    ${ locale }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatNumber.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatNumber.jsp new file mode 100644 index 00000000..55306342 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/formatNumber.jsp @@ -0,0 +1,89 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + +<%@page import="java.lang.reflect.Field" %> +<%@page import="java.util.ArrayList" %> +<%@page import="java.util.List" %> +<%@page import="java.util.Locale" %> + + + + Insert title here + + + + +<% + Field[] field = Locale.class.getFields(); + + List localeList = new ArrayList(); + + for (int i = 0; i < field.length; i++) { + if (field[i].getType().equals(Locale.class)) { + localeList.add((Locale) field[i].get(null)); + } + } + + request.setAttribute("localeList", localeList); + + double[] numbers = {0, 10000, 55.0, -123.2568}; + request.setAttribute("numbers", numbers); +%> + + + +当前格式: + +  + + + ${ locale }  + + + + + + + + + + + + + + + + + + + +
    数字原值数字格式货币格式百分数格式
    ${ number }
    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/if.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/if.jsp new file mode 100644 index 00000000..7e8910e1 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/if.jsp @@ -0,0 +1,56 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + + + + + +
    + + + 添加操作 + + + + + + + + + +
    帐号
    真实姓名
    +
    + + 修改操作 + + + + + + + + + +
    帐号
    真实姓名
    +
    + + + + + +
    + + +
    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/import.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/import.jsp new file mode 100644 index 00000000..d1c07771 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/import.jsp @@ -0,0 +1,25 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + + + +Baidu 的源代码为: + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/index.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/index.jsp new file mode 100644 index 00000000..938d29b0 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/index.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + +index.jsp + +Test + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/indexOf.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/indexOf.jsp new file mode 100644 index 00000000..7d8293ab --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/indexOf.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + +fn:indexOf('filename.txt', '.') = ${ fn:indexOf('filename.txt', '.') } + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/join.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/join.jsp new file mode 100644 index 00000000..29971147 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/join.jsp @@ -0,0 +1,20 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + +<% + request.setAttribute("array", new String[] {"John", "Tom", "Tommi", "Kurt",}); +%> + +${ fn:join(array, '; ') } + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/length.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/length.jsp new file mode 100644 index 00000000..1972e925 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/length.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + +"${ pageContext.request.requestURL }" 的长度:${ fn:length(pageContext.request.requestURI) }
    +Cookie[] 的长度:${ fn:length(pageContext.request.cookies) }
    +Map header 的长度: ${ fn:length(header) }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/out.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/out.jsp new file mode 100644 index 00000000..a72e6d0c --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/out.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + +action 参数为: + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/param.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/param.jsp new file mode 100644 index 00000000..e378bd06 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/param.jsp @@ -0,0 +1,17 @@ +<%@ page language="java" contentType="text/html; charset=GBK" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parse.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parse.jsp new file mode 100644 index 00000000..301b736e --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parse.jsp @@ -0,0 +1,51 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + +
    + +
    + + + +新浪 RSS
    +版本:
    +标题:
    +来源:
    +版权:
    +出版时间:
    +链接地址:
    + + + + Helloween + 20 + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseDate.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseDate.jsp new file mode 100644 index 00000000..56aba204 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseDate.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseNumber.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseNumber.jsp new file mode 100644 index 00000000..8c6bc209 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/parseNumber.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + +
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/query.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/query.jsp new file mode 100644 index 00000000..a1428b47 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/query.jsp @@ -0,0 +1,57 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + + + + + + + + + + + + + + + + + + + + +
    IDNameDescription
    ${ row['id'] }${ row['name'] }${ row['description'] }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryPagination.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryPagination.jsp new file mode 100644 index 00000000..64cde5e5 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryPagination.jsp @@ -0,0 +1,79 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + +<%@page import="com.helloweenvsfei.util.Pagination" %> + + + + Insert title here + + + + +<% + request.setAttribute("pagination", new Pagination(request, response)); +%> + + + + + SELECT count(*) count FROM help_topic + + + + + + + + SELECT * FROM help_topic + + + + + + + + + + + + + + + + + +
    Help_IDNameDescription
    ${ row['help_topic_id'] }${ row['name'] }${ row['description'] }
    +
    +${ pagination } + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryReflect.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryReflect.jsp new file mode 100644 index 00000000..43e26dbe --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/queryReflect.jsp @@ -0,0 +1,75 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + +
    +
    + +
    + + + + + + + ${ param.sql } + + + + + + + + + + + + + + + + + +
    ${ columnName }
    ${ row[columnName] }
    + +
    + + +
    Exception: ${ e.message }
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/redirect.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/redirect.jsp new file mode 100644 index 00000000..8ac64b11 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/redirect.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/remove.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/remove.jsp new file mode 100644 index 00000000..74a5e512 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/remove.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + +<%@page import="java.util.HashMap" %> + + + + Insert title here + + + +<% + request.setAttribute("somemap", new HashMap()); +%> + + + +${ somemap == null ? 'somemap 已经被删除' : 'somemap 没有被删除' } + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/requestEncoding.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/requestEncoding.jsp new file mode 100644 index 00000000..8c62bad5 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/requestEncoding.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + + + + +
    + 关键字: +

    + +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/set.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/set.jsp new file mode 100644 index 00000000..cfe7d922 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/set.jsp @@ -0,0 +1,34 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + +本网站总访问人次:${ totalCount }
    +其中您的访问次数:${ count }
    + + +by body + +
    +
    +
    +
    +<% + request.setAttribute("person", new com.helloweenvsfei.jstl.bean.Person()); + request.setAttribute("map", new java.util.HashMap()); +%> + +${ person.name } + + +${ map.name } + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setBundle.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setBundle.jsp new file mode 100644 index 00000000..a702dd29 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setBundle.jsp @@ -0,0 +1,23 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + + + + + + + Helloween +
    + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setDataSource.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setDataSource.jsp new file mode 100644 index 00000000..bf4fc563 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setDataSource.jsp @@ -0,0 +1,27 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + + + +数据源:${ dataSource.class.name } + +${ serverDataSource } + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setLocale.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setLocale.jsp new file mode 100644 index 00000000..b077fe91 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setLocale.jsp @@ -0,0 +1,68 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + +<%@page import="java.util.Locale" %> + + + + Insert title here + + + + +<% + request.setAttribute("localeList", Locale.getAvailableLocales()); +%> + + + + + + + + + + + + + + + + + + + + + + + + +
    LocaleLanguageDate and TimeNumbercurrency
    ${ locale.displayName }${ locale.displayLanguage }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setTimeZone.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setTimeZone.jsp new file mode 100644 index 00000000..2e3f0dde --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/setTimeZone.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + + + + + + +现在时刻:北京时间 +
    + + +
    + GMT${ i>=12 ? '+' : '' }${ i-12 } : + + + +
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sina.xml b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sina.xml new file mode 100644 index 00000000..772fca53 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sina.xml @@ -0,0 +1,300 @@ + + + + + + + <![CDATA[新闻中心-新闻要闻]]> + + + + <![CDATA[新闻中心]]> + + http://news.sina.com.cn + http://www.sinaimg.cn/dy/sina_news626.gif + + + + + http://news.sina.com.cn/iframe/o/allnews/input/index.htm + zh-cn + WWW.SINA.COM.CN + 5 + + + + Fri, 30 Nov 2007 05:25:01 GMT + + + + + + <![CDATA[视频-联盟杯拜仁紫百合惊险战平 克洛斯笑纳空门]]> + + http://video.sina.com.cn/sports/g/bn/2007-11-30/13236492.shtml + WWW.SINA.COM.CN + http://video.sina.com.cn/sports/g/bn/2007-11-30/13236492.shtml + + + + Fri, 30 Nov 2007 05:23:53 GMT + + + + + + + + <![CDATA[18律师声援遭诱捕浏阳商人]]> + + http://finance.sina.com.cn/column/complain/20071130/13234236791.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/column/complain/20071130/13234236791.shtml + + + + Fri, 30 Nov 2007 05:23:08 GMT + + + + + + + + <![CDATA[视频-马竞必杀定位球降服弱旅 幸运之神眷顾纽伦堡]]> + + http://video.sina.com.cn/sports/g/bn/2007-11-30/13206491.shtml + WWW.SINA.COM.CN + http://video.sina.com.cn/sports/g/bn/2007-11-30/13206491.shtml + + + + Fri, 30 Nov 2007 05:20:23 GMT + + + + + + + + <![CDATA[[泰国橡胶]USS3橡胶现货价格下跌,因基本面疲弱]]> + + http://finance.sina.com.cn/money/future/20071130/13204236790.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/money/future/20071130/13204236790.shtml + + + + Fri, 30 Nov 2007 05:20:17 GMT + + + + + + + + <![CDATA[[马来棕榈油]2007年11月30日午马来西亚棕榈油现货行情]]> + + http://finance.sina.com.cn/money/future/20071130/13204236789.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/money/future/20071130/13204236789.shtml + + + + Fri, 30 Nov 2007 05:20:13 GMT + + + + + + + + <![CDATA[马来西亚BMD毛棕榈油期货午盘下滑,市场等待出口预估数据]]> + + http://finance.sina.com.cn/money/future/20071130/13204236788.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/money/future/20071130/13204236788.shtml + + + + Fri, 30 Nov 2007 05:20:04 GMT + + + + + + + + <![CDATA[[机构看盘]集成利期货:郑糖探低回升中幅收跌,短线压力依旧较大]]> + + http://finance.sina.com.cn/money/future/20071130/13194236787.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/money/future/20071130/13194236787.shtml + + + + Fri, 30 Nov 2007 05:19:56 GMT + + + + + + + + <![CDATA[[现货行情]11月30日广西糖网食糖批发市场收市行情]]> + + http://finance.sina.com.cn/money/future/20071130/13194236786.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/money/future/20071130/13194236786.shtml + + + + Fri, 30 Nov 2007 05:19:52 GMT + + + + + + + + <![CDATA[[现货行情]11月30日昆明商品中心批发市场收市行情]]> + + http://finance.sina.com.cn/money/future/20071130/13194236785.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/money/future/20071130/13194236785.shtml + + + + Fri, 30 Nov 2007 05:19:48 GMT + + + + + + + + <![CDATA[长沙百亿企业添新]]> + + http://finance.sina.com.cn/china/dfjj/20071130/13194236784.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/china/dfjj/20071130/13194236784.shtml + + + + Fri, 30 Nov 2007 05:19:41 GMT + + + + + + + + <![CDATA[新代码启用 垃圾短信难隐形]]> + + http://tech.sina.com.cn/t/2007-11-30/13191884840.shtml + WWW.SINA.COM.CN + http://tech.sina.com.cn/t/2007-11-30/13191884840.shtml + + + + Fri, 30 Nov 2007 05:19:36 GMT + + + + + + + + <![CDATA[至酷腕表型MP3 松下MP130V仅400元甩卖]]> + + http://tech.sina.com.cn/digi/mp3/2007-11-30/13191884839.shtml + WWW.SINA.COM.CN + http://tech.sina.com.cn/digi/mp3/2007-11-30/13191884839.shtml + + + + Fri, 30 Nov 2007 05:19:12 GMT + + + + + + + + <![CDATA[稳定成品油市场供应加强价格监管]]> + + http://finance.sina.com.cn/g/20071130/13184236783.shtml + WWW.SINA.COM.CN + http://finance.sina.com.cn/g/20071130/13184236783.shtml + + + + Fri, 30 Nov 2007 05:18:42 GMT + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/split.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/split.jsp new file mode 100644 index 00000000..a418e32d --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/split.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + +${ header['accept'] } + + +header['accept']:

    + + ${ name }
    +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sql.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sql.jsp new file mode 100644 index 00000000..cad2d4b0 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/sql.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/substring.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/substring.jsp new file mode 100644 index 00000000..d1e5af91 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/substring.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + +liujhua@cn.ibm.com +${ fn:substring(email, 0, fn:indexOf(email, '@') ) } + +${ fn:substringBefore(email, '@') } + +${ fn:substringAfter(email, '@') } + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/timeZone.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/timeZone.jsp new file mode 100644 index 00000000..e3521846 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/timeZone.jsp @@ -0,0 +1,81 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + + Insert title here + + + + +<% + Map hashMap = new HashMap(); + + for (String ID : TimeZone.getAvailableIDs()) { + hashMap.put(ID, TimeZone.getTimeZone(ID)); + } + + request.setAttribute("timeZoneIds", TimeZone.getAvailableIDs()); + request.setAttribute("timeZone", hashMap); +%> + + + + + +现在时刻:<%= TimeZone.getDefault().getDisplayName() %> +
    + + + + + + + + + + + + + + + + + +
    时区ID时区现在时间时差
    ${ ID }${ timeZone[ID].displayName } + + + + ${ timeZone[ID].rawOffset / 60 / 60 / 1000 }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/transaction.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/transaction.jsp new file mode 100644 index 00000000..388df0d8 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/transaction.jsp @@ -0,0 +1,91 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + + + + + + + + + insert into tb_corporation ( name, description ) values ('事务测试', '事务测试') + + + 已插入一条。
    +
    + + + + insert into tb_corporation ( id, name, description ) values (1, '事务测试', '事务测试') + + +
    + +
    + + +
    操作异常,原因:${ e.message }。事务已经回滚。
    +
    + + + select * from tb_corporation + + + + + + + + + + + + + + + + + +
    ${ columnName }
    ${ row[columnName] }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/update.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/update.jsp new file mode 100644 index 00000000..3e03c34e --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/update.jsp @@ -0,0 +1,65 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + + + Insert title here + + + + + + + + drop table if exists tb_corporation + + +DROP TABLE, 影响到的数据条数:${ result }
    + + + create table tb_corporation ( + id integer auto_increment, + name varchar(255), + description text, + primary key(id) + ) + + +CREATE TABLE, 影响到的数据条数:${ result }
    + + + insert into tb_corporation ( name, description ) values ('MicroSoft', '微软') + + +INSERT, 影响到的数据条数:${ result }
    + + + insert into tb_corporation ( name, description ) values ('IBM', '国际商用机器') + + +INSERT, 影响到的数据条数:${ result }
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/url.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/url.jsp new file mode 100644 index 00000000..099f71ff --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/url.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + Insert title here + + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_choose.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_choose.jsp new file mode 100644 index 00000000..f2169bc8 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_choose.jsp @@ -0,0 +1,43 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + +
    + + + + + + 使用了 JNDI 属性。 + + + 没有使用 JNDI 属性。 + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_forEach.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_forEach.jsp new file mode 100644 index 00000000..fdb7ef5d --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_forEach.jsp @@ -0,0 +1,44 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + +
    + +
    + + + + + ${ status.count }. + " target="_blank">  +
    +

    + +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_if.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_if.jsp new file mode 100644 index 00000000..96521079 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_if.jsp @@ -0,0 +1,42 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + +
    + + + + + 属性 Driver Class Name 存在: .
    +
    + + + 属性 Driver Class Name 不存在。 + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_out.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_out.jsp new file mode 100644 index 00000000..6ba9e20a --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_out.jsp @@ -0,0 +1,25 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + Helloween + 20 + + + +content: ${ content }
    + +输出属性 description:
    +输出元素 name:
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_set.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_set.jsp new file mode 100644 index 00000000..5deff358 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_set.jsp @@ -0,0 +1,38 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + +
    + + + + + +Driver Class Name: + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_transform.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_transform.jsp new file mode 100644 index 00000000..ff902f9a --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/x_transform.jsp @@ -0,0 +1,107 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + + + + + 1 + 张三 + zhangsan@host.com + Software Engine + + + 2 + 李四 + lisi@somehost.com + Sales + + + 3 + 王五 + wangwu@someweb.com + Manager + + + + + + + + + + + + + + + + + + + + + + + + +
    编号姓名电子邮件描述
    +
    +
    + +
    + +
    + +
    + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/xml.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/xml.jsp new file mode 100644 index 00000000..db0f4a94 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/uncheck/xml.jsp @@ -0,0 +1,25 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> + + + + + Insert title here + + + + + + Helloween + 20 + + + +Description:
    +Name:
    +age:
    + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_choose.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_choose.jsp new file mode 100644 index 00000000..d4261640 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_choose.jsp @@ -0,0 +1,42 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:choose 标签 + + +

    Books Info:

    + + + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + + + + + + + Book is written by ZARA + + + Book is written by NUHA + + + Unknown author. + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_forEach.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_forEach.jsp new file mode 100644 index 00000000..81dc6762 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_forEach.jsp @@ -0,0 +1,36 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:forEach 标签 + + +

    Books Info:

    + + + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + + + + +
      + +
    • Book Name:
    • +
      +
    + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_if.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_if.jsp new file mode 100644 index 00000000..6222d2f8 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_if.jsp @@ -0,0 +1,40 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:if 标签 + + +

    Books Info:

    + + + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + + + + + + +Document has at least one + element. + +
    + + Book prices are very high + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_out.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_out.jsp new file mode 100644 index 00000000..11924dbd --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_out.jsp @@ -0,0 +1,35 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:out 标签 + + +

    Books Info:

    + + + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + + + + +The title of the first book is: + +
    +The price of the second book: + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_param.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_param.jsp new file mode 100644 index 00000000..e7701603 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_param.jsp @@ -0,0 +1,33 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:param 标签 + + +

    Books Info:

    + + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + + + + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_parse.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_parse.jsp new file mode 100644 index 00000000..22aca6a5 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_parse.jsp @@ -0,0 +1,22 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:parse 标签 + + +

    Books Info:

    + + + +The title of the first book is: + +
    +The price of the second book: + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_set.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_set.jsp new file mode 100644 index 00000000..2c0617df --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_set.jsp @@ -0,0 +1,31 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:set 标签 + + +

    Books Info:

    + + + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + + + + + +The price of the second book: + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_transform.jsp b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_transform.jsp new file mode 100644 index 00000000..c8bc4075 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/examples/xml/x_transform.jsp @@ -0,0 +1,31 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + x:transform 标签 + + +

    Books Info:

    + + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + + + + + + + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/xml/books.xml b/codes/javaee/javaee-jstl/src/main/webapp/xml/books.xml new file mode 100644 index 00000000..1ff9cc88 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/xml/books.xml @@ -0,0 +1,12 @@ + + + Padam History + ZARA + 100 + + + Great Mistry + NUHA + 2000 + + diff --git a/codes/javaee/javaee-jstl/src/main/webapp/xml/style.xsl b/codes/javaee/javaee-jstl/src/main/webapp/xml/style.xsl new file mode 100644 index 00000000..728b223b --- /dev/null +++ b/codes/javaee/javaee-jstl/src/main/webapp/xml/style.xsl @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
    +
    diff --git a/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java b/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java new file mode 100644 index 00000000..f4706199 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java @@ -0,0 +1,114 @@ +package io.github.dunwu.javaee.server; + +import java.util.ArrayList; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * JettyFactory 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("unused") +public class JettyFactory { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + private static final int PORT = 9798; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "shiro-web", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static Server initServer() { + Profiles.setProfileAsSystemProperty(Profiles.DEVELOPMENT); + WebAppContext webAppContext = new WebAppContext(); + Server server = new Server(PORT); + server.setHandler(webAppContext); + return server; + } + + public static void initWebAppContext(Server server, int type) { + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + + if (IDE_INTELLIJ == type) { + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + } else { + webAppContext.setParentLoaderPriority(true); + } + + System.out.println("[INFO] Application loaded"); + } + + public static String getAbsolutePath() { + String path = null; + String folderPath = JettyFactory.class.getProtectionDomain().getCodeSource().getLocation().getPath() + .substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + public static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + ArrayList jarNameExprssions = Lists.newArrayList(".*/[^/]*servlet-api-[^/]*\\.jar$", + ".*/javax.servlet.jsp.jstl-.*\\.jar$", ".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + jarNameExprssions.add(".*/" + jarName + "-[^/]*\\.jar$"); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(jarNameExprssions, '|')); + } + + public static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + + public static void startServer(Server server) throws Exception { + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + server.start(); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + } + +} diff --git a/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/Profiles.java b/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/Profiles.java new file mode 100644 index 00000000..dcfd3e39 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/Profiles.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2005, 2014 springside.github.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + *******************************************************************************/ +package io.github.dunwu.javaee.server; + +/** + * Spring profile 常用方法与profile名称。 + * + * @author calvin + */ +public class Profiles { + + public static final String ACTIVE_PROFILE = "spring.profiles.active"; + + public static final String DEFAULT_PROFILE = "spring.profiles.default"; + + public static final String PRODUCTION = "production"; + + public static final String DEVELOPMENT = "development"; + + public static final String UNIT_TEST = "test"; + + public static final String FUNCTIONAL_TEST = "functional"; + + /** + * 在Spring启动前,设置profile的环境变量。 + */ + public static void setProfileAsSystemProperty(String profile) { + System.setProperty(ACTIVE_PROFILE, profile); + } + +} diff --git a/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java b/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java new file mode 100644 index 00000000..049c8802 --- /dev/null +++ b/codes/javaee/javaee-jstl/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.server; + +import org.eclipse.jetty.server.Server; + +/** + * 快速启动 jetty 服务器,方便测试 + * + * @author Zhang Peng + */ +public class QuickStartServer { + + // private static int STARTUP_TYPE = JettyFactory.IDE_ECLIPSE; + private static int STARTUP_TYPE = JettyFactory.IDE_INTELLIJ; + + public static void main(String[] args) throws Exception { + Server server = JettyFactory.initServer(); + JettyFactory.initWebAppContext(server, STARTUP_TYPE); + + try { + JettyFactory.startServer(server); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + JettyFactory.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + +} diff --git a/codes/javaee/javaee-jstl/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-jstl/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-jstl/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-listener/pom.xml b/codes/javaee/javaee-listener/pom.xml new file mode 100644 index 00000000..5e37b2f9 --- /dev/null +++ b/codes/javaee/javaee-listener/pom.xml @@ -0,0 +1,97 @@ + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + io.github.dunwu + javaee-listener + 1.0.0 + war + javaee-listener + JavaEE 学习笔记之 listener + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + org.slf4j + jcl-over-slf4j + + + + + + commons-fileupload + commons-fileupload + + + commons-io + commons-io + + + org.apache.commons + commons-lang3 + + + + + + javax.servlet + javax.servlet-api + provided + + + javax.servlet.jsp + javax.servlet.jsp-api + provided + + + + + + org.eclipse.jetty + jetty-webapp + test + + + org.eclipse.jetty + jetty-annotations + test + + + org.eclipse.jetty + apache-jsp + test + + + org.eclipse.jetty + apache-jstl + test + + + + + + junit + junit + test + + + + + diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/LoginSessionListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/LoginSessionListener.java new file mode 100644 index 00000000..05906ade --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/LoginSessionListener.java @@ -0,0 +1,89 @@ +package io.github.dunwu.javaee.listener; + +import io.github.dunwu.javaee.listener.bean.PersonInfo; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionAttributeListener; +import javax.servlet.http.HttpSessionBindingEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 单点登录处理类 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class LoginSessionListener implements HttpSessionAttributeListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + Map map = new HashMap(); + + @Override + public void attributeAdded(HttpSessionBindingEvent event) { + String name = event.getName(); + + // 登录 + if (name.equals("personInfo")) { + + PersonInfo personInfo = (PersonInfo) event.getValue(); + + if (map.get(personInfo.getAccount()) != null) { + + // map 中有记录,表明该帐号在其他机器上登录过,将以前的登录失效 + HttpSession session = map.get(personInfo.getAccount()); + PersonInfo oldPersonInfo = (PersonInfo) session.getAttribute("personInfo"); + + logger.debug("帐号" + oldPersonInfo.getAccount() + "在" + oldPersonInfo.getIp() + "已经登录,该登录将被迫下线。"); + + session.removeAttribute("personInfo"); + session.setAttribute("msg", "您的帐号已经在其他机器上登录,您被迫下线。"); + } + + // 将session以用户名为索引,放入map中 + map.put(personInfo.getAccount(), event.getSession()); + logger.debug("帐号" + personInfo.getAccount() + "在" + personInfo.getIp() + "登录。"); + } + } + + @Override + public void attributeRemoved(HttpSessionBindingEvent event) { + String name = event.getName(); + + // 注销 + if (name.equals("personInfo")) { + // 将该session从map中移除 + PersonInfo personInfo = (PersonInfo) event.getValue(); + map.remove(personInfo.getAccount()); + logger.debug("帐号" + personInfo.getAccount() + "注销。"); + } + } + + @Override + public void attributeReplaced(HttpSessionBindingEvent event) { + String name = event.getName(); + + // 没有注销的情况下,用另一个帐号登录 + if (name.equals("personInfo")) { + + // 移除旧的的登录信息 + PersonInfo oldPersonInfo = (PersonInfo) event.getValue(); + map.remove(oldPersonInfo.getAccount()); + + // 新的登录信息 + PersonInfo personInfo = (PersonInfo) event.getSession().getAttribute("personInfo"); + + // 也要检查新登录的帐号是否在别的机器上登录过 + if (map.get(personInfo.getAccount()) != null) { + // map 中有记录,表明该帐号在其他机器上登录过,将以前的登录失效 + HttpSession session = map.get(personInfo.getAccount()); + session.removeAttribute("personInfo"); + session.setAttribute("msg", "您的帐号已经在其他机器上登录,您被迫下线。"); + } + map.put("personInfo", event.getSession()); + } + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionActivationListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionActivationListener.java new file mode 100644 index 00000000..647a568e --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionActivationListener.java @@ -0,0 +1,46 @@ +package io.github.dunwu.javaee.listener; + +import java.io.Serializable; +import javax.servlet.http.HttpSessionActivationListener; +import javax.servlet.http.HttpSessionEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * HttpSessionActivationListener 接口的 JavaBean 对象可以感知自己被序列化或反序列化的事件。 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyHttpSessionActivationListener implements HttpSessionActivationListener, Serializable { + + private static final long serialVersionUID = 1L; + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + private String name; + + public MyHttpSessionActivationListener(String name) { + this.name = name; + } + + @Override + public void sessionWillPassivate(HttpSessionEvent se) { + + logger.debug(name + "和session一起被序列化到硬盘了,session的id是:" + se.getSession().getId()); + } + + @Override + public void sessionDidActivate(HttpSessionEvent se) { + logger.debug(name + "和session一起从硬盘反序列化回到内存了,session的id是:" + se.getSession().getId()); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionAttributeListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionAttributeListener.java new file mode 100644 index 00000000..cc55a3e1 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionAttributeListener.java @@ -0,0 +1,44 @@ +package io.github.dunwu.javaee.listener; + +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionAttributeListener; +import javax.servlet.http.HttpSessionBindingEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * HttpSessionAttributeListener 用于监听 HttpSession 中的属性变化 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + // 添加属性 + @Override + public void attributeAdded(HttpSessionBindingEvent se) { + HttpSession session = se.getSession(); + String name = se.getName(); + logger.info("新建session属性:" + name + ", 值为:" + se.getValue()); + } + + // 删除属性 + @Override + public void attributeRemoved(HttpSessionBindingEvent se) { + HttpSession session = se.getSession(); + String name = se.getName(); + logger.info("删除session属性:" + name + ", 值为:" + se.getValue()); + } + + // 修改属性 + @Override + public void attributeReplaced(HttpSessionBindingEvent se) { + HttpSession session = se.getSession(); + String name = se.getName(); + Object oldValue = se.getValue(); + logger.info("修改session属性:" + name + ", 原值:" + oldValue + ", 新值:" + session.getAttribute(name)); + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionBindingListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionBindingListener.java new file mode 100644 index 00000000..783712c8 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionBindingListener.java @@ -0,0 +1,28 @@ +package io.github.dunwu.javaee.listener; + +import javax.servlet.http.HttpSessionBindingEvent; +import javax.servlet.http.HttpSessionBindingListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * HttpSessionBindingListener 接口的 JavaBean 对象可以感知自己被绑定或解绑定到 Session 中的事件。 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyHttpSessionBindingListener implements HttpSessionBindingListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void valueBound(HttpSessionBindingEvent event) { + logger.debug("HttpSessionBinding valueBound"); + } + + @Override + public void valueUnbound(HttpSessionBindingEvent event) { + logger.debug("HttpSessionBinding valueUnbound"); + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionListener.java new file mode 100644 index 00000000..0fa16180 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyHttpSessionListener.java @@ -0,0 +1,48 @@ +package io.github.dunwu.javaee.listener; + +import io.github.dunwu.javaee.listener.util.ApplicationConstants; +import java.util.Date; +import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * HttpSessionListener 接口用于监听 HttpSession 对象的创建和销毁。 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyHttpSessionListener implements HttpSessionListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void sessionCreated(HttpSessionEvent se) { + HttpSession session = se.getSession(); + + // 将 session 放入 map + ApplicationConstants.SESSION_MAP.put(session.getId(), session); + // 总访问人数++ + ApplicationConstants.TOTAL_HISTORY_COUNT++; + + // 如果当前在线人数超过历史记录,则更新最大在线人数,并记录时间 + if (ApplicationConstants.SESSION_MAP.size() > ApplicationConstants.MAX_ONLINE_COUNT) { + ApplicationConstants.MAX_ONLINE_COUNT = ApplicationConstants.SESSION_MAP.size(); + ApplicationConstants.MAX_ONLINE_COUNT_DATE = new Date(); + } + + logger.debug("创建了一个session: {}", session); + } + + @Override + public void sessionDestroyed(HttpSessionEvent se) { + HttpSession session = se.getSession(); + // 将session从map中移除 + ApplicationConstants.SESSION_MAP.remove(session.getId()); + + logger.debug("销毁了一个session: {}", session); + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextAttributeListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextAttributeListener.java new file mode 100644 index 00000000..e1d2723e --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextAttributeListener.java @@ -0,0 +1,33 @@ +package io.github.dunwu.javaee.listener; + +import javax.servlet.ServletContextAttributeEvent; +import javax.servlet.ServletContextAttributeListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ServletContextAttributeListener 用于监听 ServletContext 中的属性变化 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyServletContextAttributeListener implements ServletContextAttributeListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void attributeAdded(ServletContextAttributeEvent scab) { + logger.debug("ServletContext域对象中添加了属性:{},属性值是:{}", scab.getName(), scab.getValue()); + } + + @Override + public void attributeRemoved(ServletContextAttributeEvent scab) { + logger.debug("ServletContext域对象中删除了属性:{},属性值是:{}", scab.getName(), scab.getValue()); + } + + @Override + public void attributeReplaced(ServletContextAttributeEvent scab) { + logger.debug("ServletContext域对象中替换了属性:{},原值是:{}, 现值是:{}", scab.getName(), scab.getSource(), scab.getValue()); + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextListener.java new file mode 100644 index 00000000..2855c52e --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletContextListener.java @@ -0,0 +1,38 @@ +package io.github.dunwu.javaee.listener; + +import io.github.dunwu.javaee.listener.util.ApplicationConstants; +import java.util.Date; +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyServletContextListener implements ServletContextListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void contextInitialized(ServletContextEvent event) { + // 启动时,记录服务器启动时间 + ApplicationConstants.START_DATE = new Date(); + ServletContext servletContext = event.getServletContext(); + logger.info("即将启动 {}", servletContext.getContextPath()); + } + + @Override + public void contextDestroyed(ServletContextEvent event) { + // 关闭时,将结果清除。也可以将结果保存到硬盘上。 + ApplicationConstants.START_DATE = null; + ApplicationConstants.MAX_ONLINE_COUNT_DATE = null; + ServletContext servletContext = event.getServletContext(); + logger.info("即将关闭 {}", servletContext.getContextPath()); + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestAttributeListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestAttributeListener.java new file mode 100644 index 00000000..1a6fad17 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestAttributeListener.java @@ -0,0 +1,33 @@ +package io.github.dunwu.javaee.listener; + +import javax.servlet.ServletRequestAttributeEvent; +import javax.servlet.ServletRequestAttributeListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ServletContextAttributeListener 用于监听 ServletRequest 中的属性变化 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyServletRequestAttributeListener implements ServletRequestAttributeListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void attributeAdded(ServletRequestAttributeEvent srae) { + logger.debug("ServletRequest域对象中添加了属性:{},属性值是:{}", srae.getName(), srae.getValue()); + } + + @Override + public void attributeRemoved(ServletRequestAttributeEvent srae) { + logger.debug("ServletRequest域对象中删除了属性:{},属性值是:{}", srae.getName(), srae.getValue()); + } + + @Override + public void attributeReplaced(ServletRequestAttributeEvent srae) { + logger.debug("ServletRequest域对象中替换了属性:{},原值是:{}, 现值是:{}", srae.getName(), srae.getSource(), srae.getValue()); + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestListener.java new file mode 100644 index 00000000..832850b6 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/MyServletRequestListener.java @@ -0,0 +1,61 @@ +package io.github.dunwu.javaee.listener; + +import javax.servlet.ServletRequestEvent; +import javax.servlet.ServletRequestListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ServletRequestListener 接口用于监听 ServletRequest 对象的创建和销毁。 + * + * @author Zhang Peng + * @since 2017-04-04 + */ +public class MyServletRequestListener implements ServletRequestListener { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public void requestInitialized(ServletRequestEvent event) { + + HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); + + HttpSession session = request.getSession(true); + + // 记录IP地址 + session.setAttribute("ip", request.getRemoteAddr()); + + // 记录访问次数,只记录访问 .html, .do, .jsp, .action 的累计次数 + String uri = request.getRequestURI(); + uri = request.getQueryString() == null ? uri : (uri + "?" + request.getQueryString()); + request.setAttribute("dateCreated", System.currentTimeMillis()); + String[] suffix = { ".html", ".do", ".jsp", ".action" }; + for (int i = 0; i < suffix.length; i++) { + if (uri.endsWith(suffix[i])) { + break; + } + if (i == suffix.length - 1) { + return; + } + } + + Integer activeTimes = (Integer) session.getAttribute("activeTimes"); + + if (activeTimes == null) { + activeTimes = 0; + } + + session.setAttribute("activeTimes", activeTimes + 1); + logger.debug("IP: {} 请求 {}", request.getRemoteAddr(), uri); + } + + @Override + public void requestDestroyed(ServletRequestEvent event) { + HttpServletRequest request = (HttpServletRequest) event.getServletRequest(); + long time = System.currentTimeMillis() - (Long) request.getAttribute("dateCreated"); + logger.debug("{} 请求处理结束, 用时 {} 毫秒", request.getRemoteAddr(), time); + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/PersonInfoListener.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/PersonInfoListener.java new file mode 100644 index 00000000..75d3b6a1 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/PersonInfoListener.java @@ -0,0 +1,78 @@ +package io.github.dunwu.javaee.listener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.util.Date; +import javax.servlet.http.*; + +/** + * @author Zhang Peng + * @since 2017-04-04 + */ +public class PersonInfoListener implements HttpSessionActivationListener, HttpSessionBindingListener, Serializable { + + private static final long serialVersionUID = -4780592776386225973L; + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + private String name; + + private Date dateCreated; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getDateCreated() { + return dateCreated; + } + + public void setDateCreated(Date dateCreated) { + this.dateCreated = dateCreated; + } + + // 从硬盘加载后 + @Override + public void sessionDidActivate(HttpSessionEvent se) { + HttpSession session = se.getSession(); + logger.info(this + "已经成功从硬盘中加载。sessionId: " + session.getId()); + } + + // 即将被钝化到硬盘时 + @Override + public void sessionWillPassivate(HttpSessionEvent se) { + HttpSession session = se.getSession(); + logger.info(this + "即将保存到硬盘。sessionId: " + session.getId()); + } + + // 被放进session前 + @Override + public void valueBound(HttpSessionBindingEvent event) { + HttpSession session = event.getSession(); + String name = event.getName(); + logger.info(this + "被绑定到session \"" + session.getId() + "\"的" + name + "属性上"); + + // 记录放到session中的时间 + this.setDateCreated(new Date()); + } + + // 从session中移除后 + @Override + public void valueUnbound(HttpSessionBindingEvent event) { + HttpSession session = event.getSession(); + String name = event.getName(); + logger.info(this + "被从session \"" + session.getId() + "\"的" + name + "属性上移除"); + } + + @Override + public String toString() { + return "PersonInfoListener(" + name + ")"; + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/bean/PersonInfo.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/bean/PersonInfo.java new file mode 100644 index 00000000..360c969e --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/bean/PersonInfo.java @@ -0,0 +1,51 @@ +package io.github.dunwu.javaee.listener.bean; + +import java.io.Serializable; +import java.util.Date; + +public class PersonInfo implements Serializable { + + private static final long serialVersionUID = 4063725584941336123L; + + // 帐号 + private String account; + + // 登录IP地址 + private String ip; + + // 登录时间 + private Date loginDate; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Date getLoginDate() { + return loginDate; + } + + public void setLoginDate(Date loginDate) { + this.loginDate = loginDate; + } + + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof PersonInfo)) { + return false; + } + return account.equalsIgnoreCase(((PersonInfo) obj).getAccount()); + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + +} diff --git a/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/util/ApplicationConstants.java b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/util/ApplicationConstants.java new file mode 100644 index 00000000..f91d75c3 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/java/io/github/dunwu/javaee/listener/util/ApplicationConstants.java @@ -0,0 +1,28 @@ +package io.github.dunwu.javaee.listener.util; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.http.HttpSession; + +public class ApplicationConstants { + + // 所有的 Session + public static Map SESSION_MAP = new HashMap(); + + // 当前登录的用户总数 + public static int CURRENT_LOGIN_COUNT = 0; + + // 历史访客总数 + public static int TOTAL_HISTORY_COUNT = 0; + + // 服务器启动时间 + public static Date START_DATE = new Date(); + + // 最高在线时间 + public static Date MAX_ONLINE_COUNT_DATE = new Date(); + + // 最高在线人数 + public static int MAX_ONLINE_COUNT = 0; + +} diff --git a/codes/javaee/javaee-listener/src/main/resources/logback.xml b/codes/javaee/javaee-listener/src/main/resources/logback.xml new file mode 100644 index 00000000..c05e3f34 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/resources/logback.xml @@ -0,0 +1,46 @@ + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/META-INF/MANIFEST.MF b/codes/javaee/javaee-listener/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/codes/javaee/javaee-listener/src/main/webapp/META-INF/context.xml b/codes/javaee/javaee-listener/src/main/webapp/META-INF/context.xml new file mode 100644 index 00000000..9d357dc7 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/META-INF/context.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/WEB-INF/resources/jsp/index.jsp b/codes/javaee/javaee-listener/src/main/webapp/WEB-INF/resources/jsp/index.jsp new file mode 100644 index 00000000..473a1315 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/WEB-INF/resources/jsp/index.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + My JSP 'index.jsp' starting page + + + + + + + +

    This is my JSP page.

    + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/WEB-INF/web.xml b/codes/javaee/javaee-listener/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..b9947a30 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,57 @@ + + + + + contextPath + value. sdf + + + + + io.github.dunwu.javaee.listener.MyHttpSessionListener + + + io.github.dunwu.javaee.listener.MyServletContextListener + + + io.github.dunwu.javaee.listener.MyServletRequestListener + + + + + io.github.dunwu.javaee.listener.MyHttpSessionAttributeListener + + + io.github.dunwu.javaee.listener.MyServletContextAttributeListener + + + io.github.dunwu.javaee.listener.MyServletRequestAttributeListener + + + + + io.github.dunwu.javaee.listener.MyHttpSessionBindingListener + + + io.github.dunwu.javaee.listener.MyHttpSessionActivationListener + + + + + io.github.dunwu.javaee.listener.LoginSessionListener + + + + + + io.github.dunwu.javaee.listener.PersonInfoListener + + + + + + index.jsp + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/a.gif b/codes/javaee/javaee-listener/src/main/webapp/a.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f1cba44b44ed0d36a6f9b217b04d38a26ef3a67 GIT binary patch literal 120 zcmV-;0EhoaNk%w1VHN;B0FeLyaE_*WmaBS}tZsdfsd

    + +

    sadfsdf

    + +
      +
    1. sadf
    2. +
    3. asdfsadf
    4. +
    5. sdf
    6. +
    7. sdfsadfasdf
    8. +
    + + + + + + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/active.jsp b/codes/javaee/javaee-listener/src/main/webapp/active.jsp new file mode 100644 index 00000000..a2bc7909 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/active.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + +<%@ page import="io.github.dunwu.javaee.listener.bean.PersonInfo" %> + + + + Insert title here + + + +<% + PersonInfo personInfo = (PersonInfo) session.getAttribute("personInfo"); + if (personInfo == null) { + personInfo = new PersonInfo(); + personInfo.setAccount("Zhang Peng"); + session.setAttribute("personInfo", personInfo); + out.println("PersonInfo 对象不存在。已经成功新建。sessionId: " + session.getId()); + } else { + out.println("PersonInfo 对象存在。无需新建。sessionId: " + session.getId()); + } +%> + + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/b.gif b/codes/javaee/javaee-listener/src/main/webapp/b.gif new file mode 100644 index 0000000000000000000000000000000000000000..2996ad0ee771a97b8875c3dbee39ff8f60e0f11b GIT binary patch literal 128 zcmZ?wbhEHb6l1Vsn8?7;yL89Y)qAF{-rKu$r{Yf*1`yBz5g>U6robuvD^I`WkDamQ zR`=$6Hoy4W9(hb-x<2*AsckDbkAL#ff7iR+l;g`kejX;aBa1$E_-IW(v+Ofxuh;S` ftAaX2qqg5!_nn)syZ7d%{2ss6*WaWvGFSru(Cs)h literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-listener/src/main/webapp/index.jsp b/codes/javaee/javaee-listener/src/main/webapp/index.jsp new file mode 100644 index 00000000..7f55cd70 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/index.jsp @@ -0,0 +1,22 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<% + String path = request.getContextPath(); + String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; +%> + + + + + + javaee-listener 首页 + + + +This is my JSP page.
    +Listener
    +active
    +登录
    +在线用户统计
    +Listener
    + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/listener.jsp b/codes/javaee/javaee-listener/src/main/webapp/listener.jsp new file mode 100644 index 00000000..c8326ee4 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/listener.jsp @@ -0,0 +1,91 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + +<% + String action = request.getParameter("action"); + String name = request.getParameter("name"); + String value = request.getParameter("value"); + + session.getId(); + + if ("addRequestAttribute".equals(action)) { + request.setAttribute(name, value); + } else if ("removeRequestAttribute".equals(action)) { + request.removeAttribute(name); + } else if ("addSessionAttribute".equals(action)) { + session.setAttribute(name, value); + } else if ("removeSessionAttribute".equals(action)) { + session.removeAttribute(name); + } else if ("logout".equals(action)) { + session.invalidate(); + out.println("返回"); + return; + } +%> + + + + + + +
    +
    +
    +
    删除 Session
    +
    + +
    +
    +
    + +服务器启动时间:<%=DateFormat.getDateTimeInstance().format(ApplicationConstants.START_DATE)%>, +累计共接待过 <%= ApplicationConstants.TOTAL_HISTORY_COUNT %> 访客。
    +同时在线人数最多为 <%= ApplicationConstants.MAX_ONLINE_COUNT %> 人, +发生在 <%=DateFormat.getDateTimeInstance().format(ApplicationConstants.MAX_ONLINE_COUNT_DATE)%>。
    + +目前在线总数:<%= ApplicationConstants.SESSION_MAP.size() %>,登录用户:<%=ApplicationConstants.CURRENT_LOGIN_COUNT%>。
    + + + + + + + + + + + <% + for (String id : ApplicationConstants.SESSION_MAP.keySet()) { + HttpSession sess = ApplicationConstants.SESSION_MAP.get(id); + %> + + + + + + + + + + <% + } + %> +
    jsessionidaccountcreationTimelastAccessedTimenewactiveTimesip
    <%=id%> + <%=sess.getAttribute("account")%> + <%=DateFormat.getDateTimeInstance().format(new Date(sess.getCreationTime()))%> + <%=DateFormat.getDateTimeInstance().format(new Date(sess.getLastAccessedTime()))%> + <%=sess.isNew()%> + <%=sess.getAttribute("activeTimes")%> + <%=sess.getAttribute("ip")%> +
    + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/online.jsp b/codes/javaee/javaee-listener/src/main/webapp/online.jsp new file mode 100644 index 00000000..e9219e1c --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/online.jsp @@ -0,0 +1,55 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> + + + + + + +服务器启动时间:<%=DateFormat.getDateTimeInstance().format(ApplicationConstants.START_DATE)%>, +累计共接待过 <%= ApplicationConstants.TOTAL_HISTORY_COUNT %> 访客。
    +同时在线人数最多为 <%= ApplicationConstants.MAX_ONLINE_COUNT %> 人, +发生在 <%=DateFormat.getDateTimeInstance().format(ApplicationConstants.MAX_ONLINE_COUNT_DATE)%>。
    + +目前在线总数:<%= ApplicationConstants.SESSION_MAP.size() %>,登录用户:<%=ApplicationConstants.CURRENT_LOGIN_COUNT%>。
    + + + + + + + + + + + <% + for (String id : ApplicationConstants.SESSION_MAP.keySet()) { + HttpSession sess = ApplicationConstants.SESSION_MAP.get(id); + PersonInfo personInfo = (PersonInfo) sess.getAttribute("personInfo"); + %> + > + + + + + + + + + <% + } + %> +
    jsessionidaccountcreationTimelastAccessedTimenewactiveTimesip
    <%=id%> + <%=personInfo == null ? " " : personInfo.getAccount()%> + <%=DateFormat.getDateTimeInstance().format(sess.getCreationTime())%> + <%=DateFormat.getDateTimeInstance().format(new Date(sess.getLastAccessedTime()))%> + <%=sess.isNew()%> + <%=sess.getAttribute("activeTimes")%> + <%=sess.getAttribute("ip") %> +
    + + diff --git a/codes/javaee/javaee-listener/src/main/webapp/testLoginSessionListener.jsp b/codes/javaee/javaee-listener/src/main/webapp/testLoginSessionListener.jsp new file mode 100644 index 00000000..7ef99320 --- /dev/null +++ b/codes/javaee/javaee-listener/src/main/webapp/testLoginSessionListener.jsp @@ -0,0 +1,70 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + +<% + String action = request.getParameter("action"); + String account = request.getParameter("account"); + + if ("login".equals(action) && account.trim().length() > 0) { + + // 登录,将personInfo放入session + PersonInfo personInfo = new PersonInfo(); + personInfo.setAccount(account.trim().toLowerCase()); + personInfo.setIp(request.getRemoteAddr()); + personInfo.setLoginDate(new java.util.Date()); + + session.setAttribute("personInfo", personInfo); + + response.sendRedirect(response.encodeRedirectURL(request.getRequestURI())); + return; + } else if ("logout".equals(action)) { + + // 注销,将personInfo从session中移除 + session.removeAttribute("personInfo"); + + response.sendRedirect(response.encodeRedirectURL(request.getRequestURI())); + return; + } +%> + + + + + Insert title here + + + + + + + + + 欢迎您,${ personInfo.account }。
    + 您的登录IP为${ personInfo.ip },
    + 登录时间为。 + 退出 + + + +
    + + + + ${ msg } + +
    + 帐号: + + +
    +
    + +
    + + + diff --git a/codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java b/codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java new file mode 100644 index 00000000..35d18b11 --- /dev/null +++ b/codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java @@ -0,0 +1,131 @@ +package io.github.dunwu.javaee.server; + +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * JettyFactory 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("all") +public class JettyFactory { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + public static final String ACTIVE_PROFILE = "spring.profiles.active"; + + public static final String DEFAULT_PROFILE = "spring.profiles.default"; + + public static final String DEVELOPMENT = "development"; + + private static final int PORT = 9527; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static Server initServer() { + setProfileAsSystemProperty(DEVELOPMENT); + WebAppContext webAppContext = new WebAppContext(); + Server server = new Server(PORT); + server.setHandler(webAppContext); + return server; + } + + /** + * 在Spring启动前,设置profile的环境变量。 + */ + public static void setProfileAsSystemProperty(String profile) { + System.setProperty(ACTIVE_PROFILE, profile); + } + + public static void initWebAppContext(Server server, int type) throws Exception { + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + + if (IDE_INTELLIJ == type) { + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + } else { + webAppContext.setParentLoaderPriority(true); + } + + System.out.println("[INFO] Application loaded"); + } + + public static String getAbsolutePath() { + String path = null; + String folderPath = JettyFactory.class.getProtectionDomain().getCodeSource().getLocation().getPath() + .substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + public static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + + List list = new ArrayList<>(); + list.add(".*/[^/]*servlet-api-[^/]*\\.jar$"); + list.add(".*/javax.servlet.jsp.jstl-.*\\.jar$"); + list.add(".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + String str = ".*/" + jarName + "-[^/]*\\.jar$"; + list.add(str); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(list, '|')); + } + + public static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + + public static void startServer(Server server) throws Exception { + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + server.start(); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + } + +} diff --git a/codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/ListenerDemosBootstrap.java b/codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/ListenerDemosBootstrap.java new file mode 100644 index 00000000..3ec9a1a0 --- /dev/null +++ b/codes/javaee/javaee-listener/src/test/java/io/github/dunwu/javaee/server/ListenerDemosBootstrap.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.server; + +import org.eclipse.jetty.server.Server; + +/** + * 快速启动 jetty 服务器,方便测试 + * + * @author Zhang Peng + */ +public class ListenerDemosBootstrap { + + // private static int STARTUP_TYPE = JettyFactory.IDE_ECLIPSE; + private static int STARTUP_TYPE = JettyFactory.IDE_INTELLIJ; + + public static void main(String[] args) throws Exception { + Server server = JettyFactory.initServer(); + JettyFactory.initWebAppContext(server, STARTUP_TYPE); + + try { + JettyFactory.startServer(server); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + JettyFactory.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + +} diff --git a/codes/javaee/javaee-listener/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-listener/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-listener/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-oss/pom.xml b/codes/javaee/javaee-oss/pom.xml new file mode 100644 index 00000000..0d7aba66 --- /dev/null +++ b/codes/javaee/javaee-oss/pom.xml @@ -0,0 +1,149 @@ + + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + io.github.dunwu + javaee-oss + 1.0.0 + jar + javaee-oss + JavaEE 学习笔记之 OSS(Open Source Software) + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + org.slf4j + jcl-over-slf4j + + + + + + commons-codec + commons-codec + + + org.bouncycastle + bcprov-jdk15on + 1.54 + + + + + + + org.jsoup + jsoup + 1.9.2 + + + + + + com.google.zxing + core + 3.3.0 + + + com.google.zxing + javase + 3.3.0 + + + net.coobird + thumbnailator + + + net.sf.jmimemagic + jmimemagic + 0.1.4 + + + + + + org.apache.activemq + activemq-all + 5.14.1 + + + + + + com.alibaba + fastjson + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + + + + javax.mail + javax.mail-api + + + javax.validation + validation-api + + + + + + org.apache.velocity + velocity + 1.7 + + + + + + junit + junit + test + + + org.assertj + assertj-core + test + + + + + + org.apache.commons + commons-lang3 + + + org.apache.commons + commons-collections4 + + + + + diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/DsaCoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/DsaCoder.java new file mode 100644 index 00000000..9934fdb0 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/DsaCoder.java @@ -0,0 +1,81 @@ +package io.github.dunwu.javaee.oss.encode.digest; + +import org.apache.commons.codec.binary.Base64; + +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +/** + * 数字签名算法(Digital Signature Algorithm, DSA)工具类。 DSA是一种数字签名算法。 DSA仅支持SHA系列算法,而JDK仅支持SHA1withDSA。 + * + * @author Zhang Peng + * @since 2016年7月21日 + */ +public class DsaCoder { + + public static final String KEY_ALGORITHM = "DSA"; + + public static final String SIGN_ALGORITHM = "SHA1withDSA"; + + /** + * DSA密钥长度默认1024位。 密钥长度必须是64的整数倍,范围在512~1024之间 + */ + private static final int KEY_SIZE = 1024; + + private KeyPair keyPair; + + public DsaCoder() throws Exception { + keyPair = initKey(); + } + + private KeyPair initKey() throws Exception { + // 初始化密钥对生成器 + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + // 实例化密钥对生成器 + keyPairGen.initialize(KEY_SIZE); + // 实例化密钥对 + return keyPairGen.genKeyPair(); + } + + public static void main(String[] args) throws Exception { + String msg = "Hello World"; + DsaCoder dsa = new DsaCoder(); + byte[] sign = dsa.signature(msg.getBytes(), dsa.getPrivateKey()); + boolean flag = dsa.verify(msg.getBytes(), dsa.getPublicKey(), sign); + String result = flag ? "数字签名匹配" : "数字签名不匹配"; + System.out.println("数字签名:" + Base64.encodeBase64URLSafeString(sign)); + System.out.println("验证结果:" + result); + } + + public byte[] signature(byte[] data, byte[] privateKey) throws Exception { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey key = keyFactory.generatePrivate(keySpec); + + Signature signature = Signature.getInstance(SIGN_ALGORITHM); + signature.initSign(key); + signature.update(data); + return signature.sign(); + } + + public byte[] getPrivateKey() { + return keyPair.getPrivate().getEncoded(); + } + + public boolean verify(byte[] data, byte[] publicKey, byte[] sign) throws Exception { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey key = keyFactory.generatePublic(keySpec); + + Signature signature = Signature.getInstance(SIGN_ALGORITHM); + signature.initVerify(key); + signature.update(data); + return signature.verify(sign); + } + + public byte[] getPublicKey() { + return keyPair.getPublic().getEncoded(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/HmacCoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/HmacCoder.java new file mode 100644 index 00000000..c0878d00 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/HmacCoder.java @@ -0,0 +1,38 @@ +package io.github.dunwu.javaee.oss.encode.digest; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.codec.binary.Base64; + +/** + * 消息认证码算法(Message Autherntication Code, MAC)是基于密码的消息摘要算法。 它兼容了MD/SHA的特性,并以此为基础加入了密钥。 + * + * @author Zhang Peng + * @since 2016年7月21日 + */ +public class HmacCoder { + + public static void main(String[] args) throws Exception { + String msg = "Hello World!"; + byte[] secretKey = "Secret_Key".getBytes("UTF8"); + byte[] digest = HmacCoder.encode(msg.getBytes(), secretKey, HmacTypeEn.HmacSHA256); + System.out.println("原文: " + msg); + System.out.println("摘要: " + Base64.encodeBase64URLSafeString(digest)); + } + + public static byte[] encode(byte[] plaintext, byte[] secretKey, HmacTypeEn type) throws Exception { + SecretKeySpec keySpec = new SecretKeySpec(secretKey, type.name()); + Mac mac = Mac.getInstance(keySpec.getAlgorithm()); + mac.init(keySpec); + return mac.doFinal(plaintext); + } + + /** + * JDK支持HmacMD5, HmacSHA1, HmacSHA256, HmacSHA384, HmacSHA512 + */ + public enum HmacTypeEn { + + HmacMD5, HmacSHA1, HmacSHA256, HmacSHA384, HmacSHA512; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/MdCoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/MdCoder.java new file mode 100644 index 00000000..b466a25e --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/MdCoder.java @@ -0,0 +1,46 @@ +package io.github.dunwu.javaee.oss.encode.digest; + +import java.security.MessageDigest; +import org.apache.commons.codec.binary.Base64; + +/** + * 消息摘要算法(Message Digest, MD)是消息摘要算法。 + * + * @author Zhang Peng + * @since 2016年7月21日 + */ +public class MdCoder { + + public static void main(String[] args) throws Exception { + String msg = "Hello World!"; + byte[] encodeWithBase64 = MdCoder.encodeWithBase64(msg.getBytes(), MdTypeEn.MD5); + + String result = String.format("%s摘要:%s", MdTypeEn.MD5.name(), new String(encodeWithBase64)); + System.out.println("原文: " + msg); + System.out.println(result); + } + + public static byte[] encodeWithBase64(byte[] input, MdTypeEn type) throws Exception { + return Base64.encodeBase64URLSafe(encode(input, type)); + } + + public static byte[] encode(byte[] input, MdTypeEn type) throws Exception { + // 根据类型,初始化消息摘要对象 + MessageDigest md5Digest = MessageDigest.getInstance(type.name()); + + // 更新要计算的内容 + md5Digest.update(input); + + // 完成哈希计算,返回摘要 + return md5Digest.digest(); + } + + /** + * JDK支持MD2和MD5两种MD算法 + */ + public enum MdTypeEn { + + MD2, MD5 + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/ShaCoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/ShaCoder.java new file mode 100644 index 00000000..f22efaf3 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/digest/ShaCoder.java @@ -0,0 +1,56 @@ +package io.github.dunwu.javaee.oss.encode.digest; + +import java.security.MessageDigest; +import org.apache.commons.codec.binary.Base64; + +/** + * 安全散列算法(Secure Hash Algorithm, SHA)是消息摘要算法 + * + * @author Zhang Peng + * @since 2016年7月21日 + */ +public class ShaCoder { + + public static void main(String[] args) throws Exception { + String msg = "Hello World!"; + byte[] encodeWithBase64 = ShaCoder.encodeWithBase64(msg.getBytes(), ShaTypeEn.SHA384); + + String result = String.format("%s摘要:%s", ShaTypeEn.SHA384.getName(), new String(encodeWithBase64)); + System.out.println("原文: " + msg); + System.out.println(result); + } + + public static byte[] encodeWithBase64(byte[] input, ShaTypeEn type) throws Exception { + return Base64.encodeBase64URLSafe(encode(input, type)); + } + + public static byte[] encode(byte[] input, ShaTypeEn type) throws Exception { + // 根据类型,初始化消息摘要对象 + MessageDigest md5Digest = MessageDigest.getInstance(type.getName()); + + // 更新要计算的内容 + md5Digest.update(input); + + // 完成哈希计算,返回摘要 + return md5Digest.digest(); + } + + /** + * JDK支持SHA1、SHA256、SHA384和SHA512几种SHA算法 + */ + public enum ShaTypeEn { + + SHA1("SHA1"), SHA256("SHA-256"), SHA384("SHA-384"), SHA512("SHA-512"); + + private String name; + + ShaTypeEn(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/AESCoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/AESCoder.java new file mode 100644 index 00000000..5880cdd6 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/AESCoder.java @@ -0,0 +1,129 @@ +package io.github.dunwu.javaee.oss.encode.encrypt; + +import org.bouncycastle.util.encoders.Base64; + +import java.security.*; +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; + +/** + * AES安全编码:对称加密算法。DES的替代方案。 + * + * @author Zhang Peng + * @since 2016年7月14日 + */ +public class AESCoder { + + public static final String KEY_ALGORITHM_AES = "AES"; + + public static final String CIPHER_AES_DEFAULT = "AES"; + + public static final String CIPHER_AES_ECB_PKCS5PADDING = "AES/ECB/PKCS5Padding"; // 算法/模式/补码方式 + + public static final String CIPHER_AES_CBC_PKCS5PADDING = "AES/CBC/PKCS5Padding"; + + public static final String CIPHER_AES_CBC_NOPADDING = "AES/CBC/NoPadding"; + + private static final String SEED = "%%%today is nice***"; // 用于生成随机数的种子 + + private Key key; + + private Cipher cipher; + + private String transformation; + + public AESCoder() throws NoSuchAlgorithmException, NoSuchPaddingException { + this.key = initKey(); + this.cipher = Cipher.getInstance(CIPHER_AES_DEFAULT); + this.transformation = CIPHER_AES_DEFAULT; + } + + /** + * 根据随机数种子生成一个密钥 + * + * @return Key + * @throws NoSuchAlgorithmException + * @author Zhang Peng + * @since 2016年7月14日 + */ + private Key initKey() throws NoSuchAlgorithmException { + // 根据种子生成一个安全的随机数 + SecureRandom secureRandom = null; + secureRandom = new SecureRandom(SEED.getBytes()); + + KeyGenerator keyGen = KeyGenerator.getInstance(KEY_ALGORITHM_AES); + keyGen.init(secureRandom); + return keyGen.generateKey(); + } + + public AESCoder(String transformation) throws NoSuchAlgorithmException, NoSuchPaddingException { + this.key = initKey(); + this.cipher = Cipher.getInstance(transformation); + this.transformation = transformation; + } + + public static void main(String[] args) throws Exception { + AESCoder aes = new AESCoder(CIPHER_AES_CBC_PKCS5PADDING); + + String msg = "Hello World!"; + System.out.println("[AES加密、解密]"); + System.out.println("message: " + msg); + byte[] encoded = aes.encrypt(msg.getBytes("UTF8")); + String encodedBase64 = Base64.toBase64String(encoded); + System.out.println("encoded: " + encodedBase64); + + byte[] decodedBase64 = Base64.decode(encodedBase64); + byte[] decoded = aes.decrypt(decodedBase64); + System.out.println("decoded: " + new String(decoded)); + } + + /** + * 加密 + * + * @param input 明文 + * @return byte[] 密文 + * @throws InvalidKeyException + * @throws IllegalBlockSizeException + * @throws BadPaddingException + * @throws InvalidAlgorithmParameterException + * @author Zhang Peng + * @since 2016年7月20日 + */ + public byte[] encrypt(byte[] input) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, + InvalidAlgorithmParameterException { + if (transformation.equals(CIPHER_AES_CBC_PKCS5PADDING) || transformation.equals(CIPHER_AES_CBC_NOPADDING)) { + cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(getIV())); + } else { + cipher.init(Cipher.ENCRYPT_MODE, key); + } + return cipher.doFinal(input); + } + + /** + * 解密 + * + * @param input 密文 + * @return byte[] 明文 + * @throws InvalidKeyException + * @throws IllegalBlockSizeException + * @throws BadPaddingException + * @throws InvalidAlgorithmParameterException + * @author Zhang Peng + * @since 2016年7月20日 + */ + public byte[] decrypt(byte[] input) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, + InvalidAlgorithmParameterException { + if (transformation.equals(CIPHER_AES_CBC_PKCS5PADDING) || transformation.equals(CIPHER_AES_CBC_NOPADDING)) { + cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(getIV())); + } else { + cipher.init(Cipher.DECRYPT_MODE, key); + } + return cipher.doFinal(input); + } + + private byte[] getIV() { + String iv = "0123456789ABCDEF"; // IV length: must be 16 bytes long + return iv.getBytes(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/Base64Demo.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/Base64Demo.java new file mode 100644 index 00000000..7ebb28a4 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/Base64Demo.java @@ -0,0 +1,25 @@ +package io.github.dunwu.javaee.oss.encode.encrypt; + +import java.io.UnsupportedEncodingException; +import org.apache.commons.codec.binary.Base64; + +/** + * Base64编码、解码范例 + * + * @author Zhang Peng + * @since 2016年7月21日 + */ +public class Base64Demo { + + public static void main(String[] args) throws UnsupportedEncodingException { + String url = + "https://www.baidu.com/s?wd=Base64&rsv_spt=1&rsv_iqid=0xa9188d560005131f&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsp=0&rsv_sug9=es_2_1&rsv_sug4=2153&rsv_sug=9"; + // byte[] encoded = Base64.encodeBase64(url.getBytes("UTF8")); // 标准的Base64编码 + byte[] encoded = Base64.encodeBase64URLSafe(url.getBytes("UTF8")); // URL安全的Base64编码 + byte[] decoded = Base64.decodeBase64(encoded); + System.out.println("url:" + url); + System.out.println("encoded:" + new String(encoded)); + System.out.println("decoded:" + new String(decoded)); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESCoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESCoder.java new file mode 100644 index 00000000..38795c04 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESCoder.java @@ -0,0 +1,130 @@ +package io.github.dunwu.javaee.oss.encode.encrypt; + +import org.bouncycastle.util.encoders.Base64; + +import java.security.*; +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; + +/** + * DES安全编码:是经典的对称加密算法。密钥仅56位,且迭代次数偏少。已被视为并不安全的加密算法。 + * + * @author Zhang Peng + * @since 2016年7月14日 + */ +public class DESCoder { + + public static final String KEY_ALGORITHM_DES = "DES"; + + public static final String CIPHER_DES_DEFAULT = "DES"; + + public static final String CIPHER_DES_ECB_PKCS5PADDING = "DES/ECB/PKCS5Padding"; // 算法/模式/补码方式 + + public static final String CIPHER_DES_CBC_PKCS5PADDING = "DES/CBC/PKCS5Padding"; + + public static final String CIPHER_DES_CBC_NOPADDING = "DES/CBC/NoPadding"; + + private static final String SEED = "%%%today is nice***"; // 用于生成随机数的种子 + + private Key key; + + private Cipher cipher; + + private String transformation; + + public DESCoder() throws NoSuchAlgorithmException, NoSuchPaddingException, NoSuchProviderException { + this.key = initKey(); + this.cipher = Cipher.getInstance(CIPHER_DES_DEFAULT); + this.transformation = CIPHER_DES_DEFAULT; + } + + /** + * 根据随机数种子生成一个密钥 + * + * @return Key + * @throws NoSuchAlgorithmException + * @throws NoSuchProviderException + * @author Zhang Peng + * @since 2016年7月14日 + */ + private Key initKey() throws NoSuchAlgorithmException, NoSuchProviderException { + // 根据种子生成一个安全的随机数 + SecureRandom secureRandom = null; + secureRandom = new SecureRandom(SEED.getBytes()); + + KeyGenerator keyGen = KeyGenerator.getInstance(KEY_ALGORITHM_DES); + keyGen.init(secureRandom); + return keyGen.generateKey(); + } + + public DESCoder(String transformation) + throws NoSuchAlgorithmException, NoSuchPaddingException, NoSuchProviderException { + this.key = initKey(); + this.cipher = Cipher.getInstance(transformation); + this.transformation = transformation; + } + + public static void main(String[] args) throws Exception { + DESCoder aes = new DESCoder(CIPHER_DES_CBC_PKCS5PADDING); + + String msg = "Hello World!"; + System.out.println("原文: " + msg); + byte[] encoded = aes.encrypt(msg.getBytes("UTF8")); + String encodedBase64 = Base64.toBase64String(encoded); + System.out.println("密文: " + encodedBase64); + + byte[] decodedBase64 = Base64.decode(encodedBase64); + byte[] decoded = aes.decrypt(decodedBase64); + System.out.println("明文: " + new String(decoded)); + } + + /** + * 加密 + * + * @param input 明文 + * @return byte[] 密文 + * @throws InvalidKeyException + * @throws IllegalBlockSizeException + * @throws BadPaddingException + * @throws InvalidAlgorithmParameterException + * @author Zhang Peng + * @since 2016年7月20日 + */ + public byte[] encrypt(byte[] input) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, + InvalidAlgorithmParameterException { + if (transformation.equals(CIPHER_DES_CBC_PKCS5PADDING) || transformation.equals(CIPHER_DES_CBC_NOPADDING)) { + cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(getIV())); + } else { + cipher.init(Cipher.ENCRYPT_MODE, key); + } + return cipher.doFinal(input); + } + + /** + * 解密 + * + * @param input 密文 + * @return byte[] 明文 + * @throws InvalidKeyException + * @throws IllegalBlockSizeException + * @throws BadPaddingException + * @throws InvalidAlgorithmParameterException + * @author Zhang Peng + * @since 2016年7月20日 + */ + public byte[] decrypt(byte[] input) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, + InvalidAlgorithmParameterException { + if (transformation.equals(CIPHER_DES_CBC_PKCS5PADDING) || transformation.equals(CIPHER_DES_CBC_NOPADDING)) { + cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(getIV())); + } else { + cipher.init(Cipher.DECRYPT_MODE, key); + } + return cipher.doFinal(input); + } + + private byte[] getIV() { + String iv = "01234567"; // IV length: must be 8 bytes long + return iv.getBytes(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESedeCoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESedeCoder.java new file mode 100644 index 00000000..1af976f8 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/DESedeCoder.java @@ -0,0 +1,73 @@ +package io.github.dunwu.javaee.oss.encode.encrypt; + +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Security; +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import org.apache.commons.codec.binary.Base64; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +/** + * DESede安全编码,DES的升级版,支持更长的密钥,基本算法不变。 + * + * @author Zhang Peng + * @since 2016年7月20日 + */ +public class DESedeCoder { + + /** + * 加密算法 + */ + public static final String KEY_ALGORITHM = "DESede"; + + /** + * 算法名称/加密模式/填充方式 + */ + public static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding"; + + /** + * 密钥 + */ + private Key key; + + public DESedeCoder() throws NoSuchAlgorithmException, NoSuchProviderException { + this.key = initKey(); + } + + private Key initKey() throws NoSuchAlgorithmException, NoSuchProviderException { + // 标准的密钥生成 + // KeyGenerator keyGen = KeyGenerator.getInstance(KEY_ALGORITHM); + // keyGen.init(112); + + // 标准的密钥生成不支持128位。如果要使用,需引入Bouncy Castle的加密算法,方法如下 + Security.addProvider(new BouncyCastleProvider()); + KeyGenerator keyGen = KeyGenerator.getInstance(KEY_ALGORITHM, "BC"); + keyGen.init(128); + return keyGen.generateKey(); + } + + public static void main(String[] args) throws Exception { + DESedeCoder desedeCoder = new DESedeCoder(); + String message = "Hello World!"; + byte[] ciphertext = desedeCoder.encrypt(message.getBytes()); + System.out.println(Base64.encodeBase64String(ciphertext)); + + byte[] plaintext = desedeCoder.decrypt(ciphertext); + System.out.println(new String(plaintext)); + } + + public byte[] encrypt(byte[] plaintext) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, key); + return cipher.doFinal(plaintext); + } + + public byte[] decrypt(byte[] ciphertext) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, key); + return cipher.doFinal(ciphertext); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/PBECoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/PBECoder.java new file mode 100644 index 00000000..c4f22552 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/PBECoder.java @@ -0,0 +1,91 @@ +package io.github.dunwu.javaee.oss.encode.encrypt; + +import java.security.Key; +import java.security.SecureRandom; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; +import org.apache.commons.codec.binary.Base64; + +/** + * 基于口令加密(Password Based Encryption, PBE),是一种对称加密算法。 其特点是:口令由用户自己掌管,采用随机数(这里叫做盐)杂凑多重加密等方法保证数据的安全性。 + * PBE没有密钥概念,密钥在其他对称加密算法中是经过计算得出的,PBE则使用口令替代了密钥。 + * + * @author Zhang Peng + * @since 2016年7月20日 + */ +public class PBECoder { + + public static final String KEY_ALGORITHM = "PBEWITHMD5andDES"; + + public static final int ITERATION_COUNT = 100; + + private Key key; + + private byte[] salt; + + public PBECoder(String password) throws Exception { + this.salt = initSalt(); + this.key = initKey(password); + } + + private byte[] initSalt() throws Exception { + SecureRandom secureRandom = new SecureRandom(); + return secureRandom.generateSeed(8); // 盐长度必须为8字节 + } + + private Key initKey(String password) throws Exception { + PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); + return keyFactory.generateSecret(keySpec); + } + + public static void main(String[] args) throws Exception { + PBECoder encode = new PBECoder("123456"); + String message = "Hello World!"; + byte[] ciphertext = encode.encrypt(message.getBytes()); + byte[] plaintext = encode.decrypt(ciphertext); + + System.out.println("原文:" + message); + System.out.println("密文:" + Base64.encodeBase64String(ciphertext)); + System.out.println("明文:" + new String(plaintext)); + } + + public byte[] encrypt(byte[] plaintext) throws Exception { + PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); + return cipher.doFinal(plaintext); + } + + public byte[] decrypt(byte[] ciphertext) throws Exception { + PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, key, paramSpec); + return cipher.doFinal(ciphertext); + } + + public static void test1() throws Exception { + + // 产生盐 + SecureRandom secureRandom = new SecureRandom(); + byte[] salt = secureRandom.generateSeed(8); // 盐长度必须为8字节 + + // 产生Key + String password = "123456"; + PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); + SecretKey secretKey = keyFactory.generateSecret(keySpec); + + PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATION_COUNT); + Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec); + + byte[] plaintext = "Hello World".getBytes(); + byte[] ciphertext = cipher.doFinal(plaintext); + new String(ciphertext); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/RSACoder.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/RSACoder.java new file mode 100644 index 00000000..085189b0 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/encrypt/RSACoder.java @@ -0,0 +1,142 @@ +package io.github.dunwu.javaee.oss.encode.encrypt; + +import org.apache.commons.codec.binary.Base64; + +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import javax.crypto.Cipher; + +/** + * RSA安全编码:非对称加密算法。它既可以用来加密、解密,也可以用来做数字签名 + * + * @author Zhang Peng + * @since 2016年7月20日 + */ +public class RSACoder { + + public final static String KEY_ALGORITHM = "RSA"; + + public final static String SIGN_ALGORITHM = "MD5WithRSA"; + + private KeyPair keyPair; + + public RSACoder() throws Exception { + this.keyPair = initKeyPair(); + } + + private KeyPair initKeyPair() throws Exception { + // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象 + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + // 初始化密钥对生成器,密钥大小为1024位 + keyPairGen.initialize(1024); + // 生成一个密钥对 + return keyPairGen.genKeyPair(); + } + + public static void main(String[] args) throws Exception { + String msg = "Hello World!"; + RSACoder coder = new RSACoder(); + // 私钥加密,公钥解密 + byte[] ciphertext = coder.encryptByPrivateKey(msg.getBytes("UTF8"), coder.keyPair.getPrivate().getEncoded()); + byte[] plaintext = coder.decryptByPublicKey(ciphertext, coder.keyPair.getPublic().getEncoded()); + + // 公钥加密,私钥解密 + byte[] ciphertext2 = coder.encryptByPublicKey(msg.getBytes(), coder.keyPair.getPublic().getEncoded()); + byte[] plaintext2 = coder.decryptByPrivateKey(ciphertext2, coder.keyPair.getPrivate().getEncoded()); + + byte[] sign = coder.signature(msg.getBytes(), coder.getPrivateKey(), RsaSignTypeEn.SHA1WithRSA); + boolean flag = coder.verify(msg.getBytes(), coder.getPublicKey(), sign, RsaSignTypeEn.SHA1WithRSA); + String result = flag ? "数字签名匹配" : "数字签名不匹配"; + + System.out.println("原文:" + msg); + System.out.println("公钥:" + Base64.encodeBase64URLSafeString(coder.keyPair.getPublic().getEncoded())); + System.out.println("私钥:" + Base64.encodeBase64URLSafeString(coder.keyPair.getPrivate().getEncoded())); + + System.out.println("============== 私钥加密,公钥解密 =============="); + System.out.println("密文:" + Base64.encodeBase64URLSafeString(ciphertext)); + System.out.println("明文:" + new String(plaintext)); + + System.out.println("============== 公钥加密,私钥解密 =============="); + System.out.println("密文:" + Base64.encodeBase64URLSafeString(ciphertext2)); + System.out.println("明文:" + new String(plaintext2)); + + System.out.println("============== 数字签名 =============="); + System.out.println("数字签名:" + Base64.encodeBase64URLSafeString(sign)); + System.out.println("验证结果:" + result); + } + + public byte[] encryptByPrivateKey(byte[] plaintext, byte[] key) throws Exception { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + return cipher.doFinal(plaintext); + } + + public byte[] decryptByPublicKey(byte[] ciphertext, byte[] key) throws Exception { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey publicKey = keyFactory.generatePublic(keySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + return cipher.doFinal(ciphertext); + } + + public byte[] encryptByPublicKey(byte[] plaintext, byte[] key) throws Exception { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey publicKey = keyFactory.generatePublic(keySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + return cipher.doFinal(plaintext); + } + + public byte[] decryptByPrivateKey(byte[] ciphertext, byte[] key) throws Exception { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + return cipher.doFinal(ciphertext); + } + + public byte[] signature(byte[] data, byte[] privateKey, RsaSignTypeEn type) throws Exception { + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PrivateKey key = keyFactory.generatePrivate(keySpec); + + Signature signature = Signature.getInstance(type.name()); + signature.initSign(key); + signature.update(data); + return signature.sign(); + } + + public byte[] getPrivateKey() { + return keyPair.getPrivate().getEncoded(); + } + + public boolean verify(byte[] data, byte[] publicKey, byte[] sign, RsaSignTypeEn type) throws Exception { + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + PublicKey key = keyFactory.generatePublic(keySpec); + + Signature signature = Signature.getInstance(type.name()); + signature.initVerify(key); + signature.update(data); + return signature.verify(sign); + } + + public byte[] getPublicKey() { + return keyPair.getPublic().getEncoded(); + } + + public enum RsaSignTypeEn { + + MD2WithRSA, + MD5WithRSA, + SHA1WithRSA + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/DownloadPolicy.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/DownloadPolicy.java new file mode 100644 index 00000000..d5720446 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/DownloadPolicy.java @@ -0,0 +1,111 @@ +package io.github.dunwu.javaee.oss.encode.sample; + +import java.io.Serializable; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by Zhang Peng on 2016/7/22. + */ +public class DownloadPolicy implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1159078308838844309L; + + /** + * 操作类型 + */ + private final String operate = UploadConstant.TOKEN_DOWNLOAD; + + /** + * 文件ID + */ + private Long fileId; + + /** + * 下载文件所属空间 + */ + private String namespace; + + /** + * 令牌有效的截止时间。用Unix时间表示。单位秒 + */ + private Long deadline; + + /** + * 允许下载文件类型 + */ + private String fType = UploadConstant.SUPPORT_FILE_TYPE; + + /** + * 判断数据是否有效 + * + * @param policy + * @return boolean + * @author Zhang Peng + * @since 2016年7月22日 + */ + public static boolean isValid(DownloadPolicy policy) { + // 检查必要项是否为空 + if (StringUtils.isBlank(policy.namespace) || null == policy.deadline) { + return false; + } + + // 令牌截止时间不能是已过期时间 + long life = policy.deadline - System.currentTimeMillis() / 1000; + if (life <= 0) { + return false; + } + + // 检查文件类型 + if (StringUtils.isBlank(policy.fType)) { + return false; + } + String[] requestTypes = policy.fType.split("\\|"); + for (String item : requestTypes) { + if (!UploadConstant.SUPPORT_FILE_TYPE_SET.contains(item)) { + return false; + } + } + + return true; + } + + public Long getFileId() { + return fileId; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public Long getDeadline() { + return deadline; + } + + public void setDeadline(Long e) { + this.deadline = e; + } + + public String getfType() { + return fType; + } + + public void setfType(String fType) { + this.fType = fType; + } + + public String getOperate() { + return operate; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/ModifyPolicy.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/ModifyPolicy.java new file mode 100644 index 00000000..0ed0a444 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/ModifyPolicy.java @@ -0,0 +1,95 @@ +package io.github.dunwu.javaee.oss.encode.sample; + +import java.io.Serializable; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by Zhang Peng on 2016/7/22. + */ +public class ModifyPolicy implements Serializable { + + private static final long serialVersionUID = -547821705196510884L; + + /** + * 操作类型 + */ + private final String operate = UploadConstant.TOKEN_MODIFY; + + /** + * 下载文件所属空间 + */ + private String namespace; + + /** + * 令牌有效的截止时间。用Unix时间表示。单位秒 + */ + private Long deadline; + + /** + * 允许下载文件类型 + */ + private String fType = UploadConstant.SUPPORT_FILE_TYPE; + + /** + * 判断数据是否有效 + * + * @param policy + * @return boolean + * @author Zhang Peng + * @since 2016年7月22日 + */ + public static boolean isValid(ModifyPolicy policy) { + // 检查必要项是否为空 + if (StringUtils.isBlank(policy.namespace) || null == policy.deadline) { + return false; + } + + // 令牌截止时间不能是已过期时间 + long life = policy.deadline - System.currentTimeMillis() / 1000; + if (life <= 0) { + return false; + } + + // 检查文件类型 + if (StringUtils.isBlank(policy.fType)) { + return false; + } + String[] requestTypes = policy.fType.split("\\|"); + for (String item : requestTypes) { + if (!UploadConstant.SUPPORT_FILE_TYPE_SET.contains(item)) { + return false; + } + } + + return true; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public Long getDeadline() { + return deadline; + } + + public void setDeadline(Long deadline) { + this.deadline = deadline; + } + + public String getfType() { + return fType; + } + + public void setfType(String fType) { + this.fType = fType; + } + + public String getOperate() { + return operate; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/TokenUtil.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/TokenUtil.java new file mode 100644 index 00000000..35b5f1ab --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/TokenUtil.java @@ -0,0 +1,158 @@ +package io.github.dunwu.javaee.oss.encode.sample; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.github.dunwu.javaee.oss.encode.digest.HmacCoder; +import org.apache.commons.codec.binary.Base64; + +/** + * 令牌工具类 token = accessKey + digest + policy digest = HmacSHA256(policy, secretKey) + */ +public final class TokenUtil { + + private static final String SEPARATOR = "|||"; + + private static final String ACCESS_KEY = "ACCESS_KEY"; + + private static final String SECRET_KEY = "SECRET_KEY"; + + public static Object testGetPolicy(String token, String tokenType) throws Exception { + String[] params = token.split(SEPARATOR); + // byte[] accessKey = Base64.decodeBase64(params[0]); + String digestBase64 = params[1]; + String policyBase64 = params[2]; + + if (TokenTypeEN.UPLOAD.name().equals(tokenType)) { + UploadPolicy policy = (UploadPolicy) getPolicy(policyBase64, digestBase64, SECRET_KEY.getBytes(), + tokenType); + return policy; + } else if (TokenTypeEN.DOWNLOAD.name().equals(tokenType)) { + DownloadPolicy policy = (DownloadPolicy) getPolicy(policyBase64, digestBase64, SECRET_KEY.getBytes(), + tokenType); + return policy; + } else if (TokenTypeEN.MODIFY.name().equals(tokenType)) { + ModifyPolicy policy = (ModifyPolicy) getPolicy(policyBase64, digestBase64, SECRET_KEY.getBytes(), + tokenType); + return policy; + } else { + return null; + } + } + + public static Object getPolicy(String policyBase64, String digestBase64, byte[] secretKey, String tokenType) + throws Exception { + String policy = new String(Base64.decodeBase64(policyBase64)); + + // 根据secretKey和policy验证摘要是否被篡改 + byte[] checkDigest = HmacCoder.encode(policy.getBytes(), secretKey, HmacCoder.HmacTypeEn.HmacSHA512); + String checkDigestBase64 = Base64.encodeBase64URLSafeString(checkDigest); + if (!checkDigestBase64.equals(digestBase64)) { + throw new SecurityException("The policy is not match to the digest."); + } + + JSONObject json = JSONObject.parseObject(policy); + if (TokenTypeEN.UPLOAD.name().equalsIgnoreCase(tokenType)) { + return JSONObject.toJavaObject(json, UploadPolicy.class); + } else if (TokenTypeEN.DOWNLOAD.name().equalsIgnoreCase(tokenType)) { + return JSONObject.toJavaObject(json, DownloadPolicy.class); + } else if (TokenTypeEN.MODIFY.name().equalsIgnoreCase(tokenType)) { + return JSONObject.toJavaObject(json, ModifyPolicy.class); + } + + return null; + } + + public static void main(String[] args) throws Exception { + testGetToken(TokenTypeEN.DOWNLOAD.name()); + } + + public static String testGetToken(String tokenType) throws Exception { + String policy = null; + if (TokenTypeEN.UPLOAD.name().equals(tokenType)) { + policy = initUploadPolicy(); + } else if (TokenTypeEN.DOWNLOAD.name().equals(tokenType)) { + policy = initDownladPolicy(); + } else if (TokenTypeEN.MODIFY.name().equals(tokenType)) { + policy = initModifyPolicy(); + } + String policyBase64 = Base64.encodeBase64URLSafeString(policy.getBytes()); + String accessKeyBase64 = Base64.encodeBase64URLSafeString(ACCESS_KEY.getBytes()); + + System.out.println(String.format("============== %s ==============", tokenType)); + System.out.println("policy:" + policy); + System.out.println("policyBase64:" + policyBase64); + System.out.println("accessKeyBase64:" + accessKeyBase64); + + String token = getToken(policy.getBytes(), ACCESS_KEY.getBytes(), SECRET_KEY.getBytes(), tokenType); + System.out.println("Token:" + token); + return token; + } + + private static String initUploadPolicy() { + long deadline = System.currentTimeMillis() / 1000 + 3600 * 7; + UploadPolicy policy = new UploadPolicy(); + policy.setNamespace("namespace"); + policy.setDeadline(deadline); + policy.setfType("pdf"); + return JSON.toJSONString(policy); + } + + private static String initDownladPolicy() { + long deadline = System.currentTimeMillis() / 1000 + 3600 * 7; + DownloadPolicy policy = new DownloadPolicy(); + policy.setFileId(5748527L); + policy.setNamespace("namespace"); + policy.setDeadline(deadline); + policy.setfType("pdf"); + return JSON.toJSONString(policy); + } + + private static String initModifyPolicy() { + long deadline = System.currentTimeMillis() / 1000 + 3600 * 7; + ModifyPolicy policy = new ModifyPolicy(); + policy.setNamespace("namespace"); + policy.setDeadline(deadline); + policy.setfType("png"); + return JSON.toJSONString(policy); + } + + public static String getToken(byte[] policy, byte[] accessKey, byte[] secretKey, String tokenType) + throws Exception { + JSONObject policyJson = JSONObject.parseObject(new String(policy)); + + // 检查令牌是否符合系统规格 + if (TokenTypeEN.UPLOAD.name().equalsIgnoreCase(tokenType)) { + UploadPolicy uploadPolicy = JSONObject.toJavaObject(policyJson, UploadPolicy.class); + if (!UploadPolicy.isValid(uploadPolicy)) { + throw new Exception("The policy is not conform to the specifications of the system."); + } + } else if (TokenTypeEN.DOWNLOAD.name().equalsIgnoreCase(tokenType)) { + DownloadPolicy downloadPolicy = JSONObject.toJavaObject(policyJson, DownloadPolicy.class); + if (!DownloadPolicy.isValid(downloadPolicy)) { + throw new Exception("The policy is not conform to the specifications of the system."); + } + } else if (TokenTypeEN.MODIFY.name().equalsIgnoreCase(tokenType)) { + ModifyPolicy modifyPolicy = JSONObject.toJavaObject(policyJson, ModifyPolicy.class); + if (!ModifyPolicy.isValid(modifyPolicy)) { + throw new Exception("The policy is not conform to the specifications of the system."); + } + } else { + throw new Exception("Required token is not supported."); + } + + // 根据secretKey和policy生成消息摘要(使用基于口令编码的HmacSHA256算法) + byte[] digest = HmacCoder.encode(policy, secretKey, HmacCoder.HmacTypeEn.HmacSHA512); + + // Token = AccessKey::Digest::Policy。数据拼接之前都要做URL安全的Base64编码 + String token = Base64.encodeBase64URLSafeString(accessKey) + SEPARATOR + + Base64.encodeBase64URLSafeString(digest) + SEPARATOR + Base64.encodeBase64URLSafeString(policy); + + return token; + } + + public enum TokenTypeEN { + + UPLOAD, DOWNLOAD, MODIFY + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadConstant.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadConstant.java new file mode 100644 index 00000000..8c6affbf --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadConstant.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.oss.encode.sample; + +import java.util.HashSet; +import java.util.Set; +import org.apache.commons.collections.CollectionUtils; + +/** + * Created by Zhang Peng on 2016/7/26. + */ +public class UploadConstant { + + public static final long FSIZE_MIN = 1024L; // 1KB + + public static final long FSIZE_MAX = 5 * 1024 * 1024L; // 5MB + + public static final long FSIZE_MIN_DEFAULT = 1024L; // 1KB + + public static final long FSIZE_MAX_DEFAULT = 2 * 1024 * 1024L; // 2MB + + public static final String TOKEN_UPLOAD = "UPLOAD"; + + public static final String TOKEN_DOWNLOAD = "DOWNLOAD"; + + public static final String TOKEN_MODIFY = "MODIFY"; + + public static final String SUPPORT_FILE_TYPE = "pdf|doc|docx|png|jpg|jpeg|gif"; + + public static final Set SUPPORT_FILE_TYPE_SET; + + static { + SUPPORT_FILE_TYPE_SET = new HashSet(); + String[] supportedTypes = UploadConstant.SUPPORT_FILE_TYPE.split("\\|"); + CollectionUtils.addAll(SUPPORT_FILE_TYPE_SET, supportedTypes); + } +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadPolicy.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadPolicy.java new file mode 100644 index 00000000..2afad08a --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/encode/sample/UploadPolicy.java @@ -0,0 +1,153 @@ +package io.github.dunwu.javaee.oss.encode.sample; + +import java.io.Serializable; +import org.apache.commons.lang3.StringUtils; + +/** + * Created by Zhang Peng on 2016/7/22. + */ +public class UploadPolicy implements Serializable { + + private static final long serialVersionUID = 8289239747395166646L; + + /** + * 操作类型 + */ + private final String operate = UploadConstant.TOKEN_UPLOAD; + + /** + * 上传文件所属空间 + */ + private String namespace; + + /** + * 令牌有效的截止时间。用Unix时间表示。单位秒 + */ + private Long deadline; + + /** + * 文件上传后保留时间。单位天。默认值-1,表示永久保留 + */ + private Integer deleteAfterDays = -1; + + /** + * 上传文件大小上限。单位Byte。 + */ + private Long fsizeMin = UploadConstant.FSIZE_MIN_DEFAULT; + + /** + * 上传文件大小上限。单位Byte。 + */ + private Long fsizeMax = UploadConstant.FSIZE_MAX_DEFAULT; + + /** + * 允许上传文件类型 + */ + private String fType = UploadConstant.SUPPORT_FILE_TYPE; + + /** + * 是否认证令牌。0表示认证,1表示不认证。默认为0 + */ + private Integer verifyToken = 0; + + /** + * 判断数据是否有效 + * + * @param policy + * @return boolean + * @author Zhang Peng + * @since 2016年7月22日 + */ + public static boolean isValid(UploadPolicy policy) { + // 检查必要项是否为空 + if (StringUtils.isBlank(policy.namespace) || null == policy.deadline) { + return false; + } + + // 令牌截止时间不能是已过期时间 + long life = policy.deadline - System.currentTimeMillis() / 1000; + if (life <= 0) { + return false; + } + + // 判断文件大小的上限、下限是否符合系统规格 + if (policy.fsizeMin > policy.fsizeMax || policy.fsizeMin < UploadConstant.FSIZE_MIN + || policy.fsizeMax > UploadConstant.FSIZE_MAX) { + return false; + } + + // 检查文件类型 + if (StringUtils.isBlank(policy.fType)) { + return false; + } + String[] requestTypes = policy.fType.split("\\|"); + for (String item : requestTypes) { + if (!UploadConstant.SUPPORT_FILE_TYPE_SET.contains(item)) { + return false; + } + } + + return true; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public Long getDeadline() { + return deadline; + } + + public void setDeadline(Long deadline) { + this.deadline = deadline; + } + + public Integer getDeleteAfterDays() { + return deleteAfterDays; + } + + public void setDeleteAfterDays(Integer deleteAfterDays) { + this.deleteAfterDays = deleteAfterDays; + } + + public Long getFsizeMin() { + return fsizeMin; + } + + public void setFsizeMin(Long fsizeMin) { + this.fsizeMin = fsizeMin; + } + + public Long getFsizeMax() { + return fsizeMax; + } + + public void setFsizeMax(Long fsizeMax) { + this.fsizeMax = fsizeMax; + } + + public String getfType() { + return fType; + } + + public void setfType(String fType) { + this.fType = fType; + } + + public Integer getVerifyToken() { + return verifyToken; + } + + public void setVerifyToken(Integer verifyToken) { + this.verifyToken = verifyToken; + } + + public String getOperate() { + return operate; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/CnblogParser.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/CnblogParser.java new file mode 100644 index 00000000..c8027e39 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/CnblogParser.java @@ -0,0 +1,52 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.html; + +import java.io.IOException; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +/** + * 博客园博文抓取工具 + * + * @author Victor Zhang + * @since 2016/11/8. + */ +public class CnblogParser { + + private static final String BLOG_URL = "http://www.cnblogs.com/jingmoxukong/"; + + public static void main(String[] args) throws Exception { + int total = 0; + for (int page = 0; page <= 16; page++) { + total += printAllTitleInPage(BLOG_URL, page); + } + System.out.println("总文章数:" + total); + } + + /** + * 获取指定页HTML 文档指定的body + * + * @throws IOException + */ + private static int printAllTitleInPage(String blogUrl, int page) throws IOException { + int count = 0; + Document doc = Jsoup.connect(blogUrl + "default.html?page=" + page).get(); + Elements postTitles = doc.body().getElementsByClass("postTitle"); + for (Element postTitle : postTitles) { + Elements links = postTitle.getElementsByTag("a"); + for (Element link : links) { + if (link.hasText()) { + System.out.println(link.text()); + System.out.println(link.attr("href")); + count++; + } + } + } + return count; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/XiamiParser.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/XiamiParser.java new file mode 100644 index 00000000..e5708593 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/html/XiamiParser.java @@ -0,0 +1,109 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.html; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; +import org.apache.commons.collections.CollectionUtils; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +/** + * 获取虾米网我的音乐中所有曲目 + * + * @author Victor Zhang + * @since 2016/11/8. + */ +public class XiamiParser { + + private static final String BLOG_URL = "http://www.xiami.com/space/lib-song/u/5524914/page"; + + public static void main(String[] args) throws Exception { + XiamiParser parser = new XiamiParser(); + Set allSongInfos = new HashSet<>(); + for (int page = 0; page <= 65; page++) { + Set curPageSongs = parser.getSongInfoSet(BLOG_URL, page); + CollectionUtils.addAll(allSongInfos, curPageSongs.iterator()); + } + System.out.println("总歌曲数目:" + allSongInfos.size()); + parser.printAllSongInfo(allSongInfos); + } + + /** + * 获取指定页HTML 文档指定的body + * + * @throws IOException + */ + private Set getSongInfoSet(String blogUrl, int page) throws IOException { + Set songList = new HashSet(); + Document doc = Jsoup.connect(blogUrl + "/" + page).get(); + Elements postTitles = doc.body().getElementsByClass("track_list"); + for (Element postTitle : postTitles) { + Elements songs = postTitle.getElementsByTag("tr"); + for (Element song : songs) { + Elements name = song.getElementsByClass("song_name"); + for (Element link : name) { + SongInfo songinfo = new SongInfo(); + songinfo.setName(link.child(0).text()); + Elements artistName = link.getElementsByClass("artist_name"); + songinfo.setArtist(artistName.get(0).text()); + songList.add(songinfo); + } + } + } + return songList; + } + + private void printAllSongInfo(Set songs) { + for (SongInfo song : songs) { + System.out.println(song.getName() + "\t" + song.getArtist()); + } + } + + public class SongInfo { + + private String name; + + private String artist; + + @Override + public boolean equals(Object obj) { + if (obj.getClass() != SongInfo.class) { + return false; + } + SongInfo external = (SongInfo) obj; + if (external.getName().equals(this.getName()) && external.getArtist().equals(this.getArtist())) { + return true; + } else { + return false; + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getArtist() { + return artist; + } + + public void setArtist(String artist) { + this.artist = artist; + } + + @Override + public int hashCode() { + return 1; + } + + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/ImageUtil.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/ImageUtil.java new file mode 100644 index 00000000..2db945e5 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/ImageUtil.java @@ -0,0 +1,142 @@ +package io.github.dunwu.javaee.oss.image; + +import io.github.dunwu.javaee.oss.image.dto.ImageParamDTO; +import net.coobird.thumbnailator.Thumbnails; +import net.coobird.thumbnailator.geometry.Positions; +import net.sf.jmimemagic.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.awt.image.BufferedImage; +import java.io.*; +import javax.imageio.ImageIO; + +/** + * 图片工具类 + * + * @author Victor Zhang + * @since 2017/1/16. + */ +public class ImageUtil { + + private static final Logger logger = LoggerFactory.getLogger(ImageUtil.class); + + public static void toFile(String oldFile, String newFile, ImageParamDTO params) throws IOException { + if (StringUtils.isBlank(oldFile) || StringUtils.isBlank(newFile)) { + logger.error("原文件名或目标文件名为空"); + return; + } + Thumbnails.Builder builder = Thumbnails.of(oldFile); + fillBuilderWithParams(builder, params); + if (null == builder) { + return; + } + builder.toFile(newFile); + } + + private static void fillBuilderWithParams(Thumbnails.Builder builder, ImageParamDTO params) throws IOException { + if (null == params) { + throw new IOException("图片格式化参数为空"); + } + + // 按照一定规则改变原图尺寸 + if (null != params.getWidth() && null != params.getHeight()) { + builder.size(params.getWidth(), params.getHeight()); + } else if (null != params.getXscale() && null != params.getYscale()) { + builder.scale(params.getXscale(), params.getYscale()); + } else if (null != params.getScale()) { + builder.scale(params.getScale(), params.getScale()); + } else { + builder.scale(1.0); // 如果没有设置尺寸参数,默认大小为原图大小 + } + + // 设置图片旋转角度 + if (null != params.getRotate()) { + builder.rotate(params.getRotate()); + } + + // 设置图片压缩质量 + if (null != params.getQuality()) { + builder.outputQuality(params.getQuality()); + } + + // 设置图片格式 + if (StringUtils.isNotBlank(params.getFormat())) { + builder.outputFormat(params.getFormat()); + } + + // 设置水印 + ImageParamDTO.WaterMark waterMark = params.getWaterMark(); + if (null != waterMark) { + Positions pos = ImageParamDTO.getPostionsByCode(waterMark.getPosition()); + if (null == pos) { + throw new IOException("请检查水印图片的位置类型,有效范围在[1,9]"); + } + BufferedImage bufferedImage = ImageIO.read(new FileInputStream(waterMark.getImage())); + builder.watermark(pos, bufferedImage, waterMark.getOpacity()); + } + } + + public static BufferedImage toBufferedImage(String oldFile, ImageParamDTO params) throws IOException { + if (StringUtils.isBlank(oldFile)) { + logger.error("原文件名或目标文件名为空"); + return null; + } + Thumbnails.Builder builder = Thumbnails.of(oldFile); + fillBuilderWithParams(builder, params); + if (null == builder) { + return null; + } + return builder.asBufferedImage(); + } + + public static OutputStream toOutputStream(InputStream input, OutputStream output, ImageParamDTO params) + throws IOException { + Thumbnails.Builder builder = Thumbnails.of(input); + if (null == builder) { + return null; + } + + try { + fillBuilderWithParams(builder, params); + builder.toOutputStream(output); + } catch (IOException e) { + logger.error("图片处理失败\n" + e.getMessage()); + throw e; + } + + return output; + } + + /** + * 获取文件的 ContentType + * + * @param content + * @return + * @throws MagicParseException + * @throws MagicException + * @throws MagicMatchNotFoundException + */ + public static String getContentType(byte[] content) + throws MagicParseException, MagicException, MagicMatchNotFoundException { + MagicMatch match = Magic.getMagicMatch(content); + return match.getMimeType(); + } + + public static final InputStream bytes2InputStream(byte[] buf) { + return new ByteArrayInputStream(buf); + } + + public static final byte[] inputStream2bytes(InputStream inStream) throws IOException { + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); + byte[] buff = new byte[100]; + int rc = 0; + while ((rc = inStream.read(buff, 0, 100)) > 0) { + swapStream.write(buff, 0, rc); + } + byte[] in2b = swapStream.toByteArray(); + return in2b; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/QRCodeUtil.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/QRCodeUtil.java new file mode 100644 index 00000000..376407f4 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/QRCodeUtil.java @@ -0,0 +1,60 @@ +package io.github.dunwu.javaee.oss.image; + +import com.google.zxing.*; +import com.google.zxing.client.j2se.BufferedImageLuminanceSource; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.common.HybridBinarizer; +import io.github.dunwu.javaee.oss.image.dto.BarcodeParamDTO; +import java.awt.image.BufferedImage; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import javax.imageio.ImageIO; + +/** + * 二维码工具类 + * + * @author Victor Zhang + * @since 2017/1/16. + */ +public class QRCodeUtil { + + /** + * 创建一个qrcode图片 + * + * @param content 加密信息,建议使用json格式 + * @param paramDTO qrcode 参数 + * @throws WriterException + * @throws IOException + */ + public static void encode(String content, BarcodeParamDTO paramDTO) throws WriterException, IOException { + // 生成矩阵 + BitMatrix bitMatrix = new MultiFormatWriter().encode(content, paramDTO.getBarcodeFormat(), paramDTO.getWidth(), + paramDTO.getHeight(), paramDTO.getEncodeHints()); + Path path = FileSystems.getDefault().getPath(paramDTO.getFilepath()); + MatrixToImageWriter.writeToPath(bitMatrix, paramDTO.getImageFormat(), path);// 输出图像 + } + + /** + * 解析 qrcode 图片 + * + * @param paramDTO qrcode 参数 + * @return + */ + public static String decode(BarcodeParamDTO paramDTO) { + try { + BufferedImage bufferedImage = ImageIO.read(new FileInputStream(paramDTO.getFilepath())); + LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage); + Binarizer binarizer = new HybridBinarizer(source); + BinaryBitmap bitmap = new BinaryBitmap(binarizer); + Result result = new MultiFormatReader().decode(bitmap, paramDTO.getDecodeHints()); + return result.getText(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/BarcodeParamDTO.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/BarcodeParamDTO.java new file mode 100644 index 00000000..49c97e41 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/BarcodeParamDTO.java @@ -0,0 +1,87 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.image.dto; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.DecodeHintType; +import com.google.zxing.EncodeHintType; +import java.util.Map; + +/** + * @author Victor Zhang + * @since 2017/1/17. + */ +public class BarcodeParamDTO { + + private Integer width; // 图像宽度 + + private Integer height; // 图像高度 + + private String filepath; // 图片路径 + + private String imageFormat; // 图片文件格式 + + private BarcodeFormat barcodeFormat; // 二维码形式 + + private Map encodeHints; // 二维码的编码参数 + + private Map decodeHints; // 二维码的解码参数 + + public Integer getWidth() { + return width; + } + + public void setWidth(Integer width) { + this.width = width; + } + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + + public String getFilepath() { + return filepath; + } + + public void setFilepath(String filepath) { + this.filepath = filepath; + } + + public String getImageFormat() { + return imageFormat; + } + + public void setImageFormat(String imageFormat) { + this.imageFormat = imageFormat; + } + + public BarcodeFormat getBarcodeFormat() { + return barcodeFormat; + } + + public void setBarcodeFormat(BarcodeFormat barcodeFormat) { + this.barcodeFormat = barcodeFormat; + } + + public Map getEncodeHints() { + return encodeHints; + } + + public void setEncodeHints(Map encodeHints) { + this.encodeHints = encodeHints; + } + + public Map getDecodeHints() { + return decodeHints; + } + + public void setDecodeHints(Map decodeHints) { + this.decodeHints = decodeHints; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/ImageParamDTO.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/ImageParamDTO.java new file mode 100644 index 00000000..3e886501 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/image/dto/ImageParamDTO.java @@ -0,0 +1,181 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.image.dto; + +import java.io.Serializable; +import net.coobird.thumbnailator.geometry.Positions; + +/** + * @author Victor Zhang + * @since 2017/1/16. + */ +public class ImageParamDTO implements Serializable { + + public static String[] IMAGE_TYPES = { "png", "jpg", "jpeg", "bmp", "gif" }; + + private Integer width; // 宽度 + + private Integer height; // 高度 + + private Double xscale; // 宽度比例 + + private Double yscale; // 高度比例 + + private Double scale; // 总比例,相当于将xscale和yscale都设为同比例 + + private Double rotate; // 旋转角度,范围为[0.0, 360.0] + + private Double quality; // 压缩质量,范围为[0.0, 1.0] + + private String format; // 图片格式,支持jpg,jpeg,png,bmp,gif + + private WaterMark waterMark; // 水印信息 + + /** + * 将位置类型码转换为 thumbnailator 可以识别的位置类型 + * + * @param code + * @return + */ + public static Positions getPostionsByCode(Integer code) { + switch (code) { + case 1: + return Positions.TOP_LEFT; + case 2: + return Positions.TOP_CENTER; + case 3: + return Positions.TOP_RIGHT; + case 4: + return Positions.CENTER_LEFT; + case 5: + return Positions.CENTER; + case 6: + return Positions.CENTER_RIGHT; + case 7: + return Positions.BOTTOM_LEFT; + case 8: + return Positions.BOTTOM_CENTER; + case 9: + return Positions.BOTTOM_RIGHT; + default: + return null; + } + } + + public Integer getWidth() { + return width; + } + + public void setWidth(Integer width) { + this.width = width; + } + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + + public Double getXscale() { + return xscale; + } + + public void setXscale(Double xscale) { + this.xscale = xscale; + } + + public Double getYscale() { + return yscale; + } + + public void setYscale(Double yscale) { + this.yscale = yscale; + } + + public Double getScale() { + return scale; + } + + public void setScale(Double scale) { + this.scale = scale; + } + + public Double getRotate() { + return rotate; + } + + public void setRotate(Double rotate) { + this.rotate = rotate; + } + + public Double getQuality() { + return quality; + } + + public void setQuality(Double quality) { + this.quality = quality; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public WaterMark getWaterMark() { + return waterMark; + } + + public void setWaterMark(WaterMark waterMark) { + this.waterMark = waterMark; + } + + public static class WaterMark { + + private Integer position; + + private String image; + + private Float opacity; + + public WaterMark() { + } + + public WaterMark(Integer position, String image, Float opacity) { + this.position = position; + this.image = image; + this.opacity = opacity; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public Float getOpacity() { + return opacity; + } + + public void setOpacity(Float opacity) { + this.opacity = opacity; + } + + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSHelloWorld.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSHelloWorld.java new file mode 100644 index 00000000..7808119c --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSHelloWorld.java @@ -0,0 +1,140 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.jms; + +import javax.jms.*; +import org.apache.activemq.ActiveMQConnectionFactory; + +/** + * @author Victor Zhang + * @since 2016/11/29. + */ +public class JMSHelloWorld { + + public static void main(String[] args) throws Exception { + thread(new HelloWorldProducer(), false); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldConsumer(), false); + Thread.sleep(1000); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + Thread.sleep(1000); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldProducer(), false); + Thread.sleep(1000); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldConsumer(), false); + thread(new HelloWorldProducer(), false); + } + + public static void thread(Runnable runnable, boolean daemon) { + Thread brokerThread = new Thread(runnable); + brokerThread.setDaemon(daemon); + brokerThread.start(); + } + + public static class HelloWorldProducer implements Runnable { + + public void run() { + try { + // Create a ConnectionFactory + ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); + + // Create a Connection + Connection connection = connectionFactory.createConnection(); + connection.start(); + + // Create a Session + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + + // Create the destination (Topic or Queue) + Destination destination = session.createQueue("TEST.FOO"); + + // Create a MessageProducer from the Session to the Topic or Queue + MessageProducer producer = session.createProducer(destination); + producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); + + // Create a messages + String text = "Hello world! From: " + Thread.currentThread().getName() + " : " + this.hashCode(); + TextMessage message = session.createTextMessage(text); + + // Tell the producer to send the message + System.out.println("Sent message: " + message.hashCode() + " : " + Thread.currentThread().getName()); + producer.send(message); + + // Clean up + session.close(); + connection.close(); + } catch (Exception e) { + System.out.println("Caught: " + e); + e.printStackTrace(); + } + } + + } + + public static class HelloWorldConsumer implements Runnable, ExceptionListener { + + public void run() { + try { + + // Create a ConnectionFactory + ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); + + // Create a Connection + Connection connection = connectionFactory.createConnection(); + connection.start(); + + connection.setExceptionListener(this); + + // Create a Session + Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); + + // Create the destination (Topic or Queue) + Destination destination = session.createQueue("TEST.FOO"); + + // Create a MessageConsumer from the Session to the Topic or Queue + MessageConsumer consumer = session.createConsumer(destination); + + // Wait for a message + Message message = consumer.receive(1000); + + if (message instanceof TextMessage) { + TextMessage textMessage = (TextMessage) message; + String text = textMessage.getText(); + System.out.println("Received: " + text); + } else { + System.out.println("Received: " + message); + } + + consumer.close(); + session.close(); + connection.close(); + } catch (Exception e) { + System.out.println("Caught: " + e); + e.printStackTrace(); + } + } + + public synchronized void onException(JMSException ex) { + System.out.println("JMS Exception occured. Shutting down client."); + } + + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSReceiver.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSReceiver.java new file mode 100644 index 00000000..604ccbb8 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSReceiver.java @@ -0,0 +1,62 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.jms; + +import javax.jms.*; +import org.apache.activemq.ActiveMQConnection; +import org.apache.activemq.ActiveMQConnectionFactory; + +/** + * 消息的消费者 + * + * @author Victor Zhang + * @since 2016/11/28. + */ +public class JMSReceiver { + + public static void main(String[] args) { + // ConnectionFactory :连接工厂,JMS 用它创建连接 + ConnectionFactory connectionFactory; + // Connection :JMS 客户端到JMS Provider 的连接 + Connection connection = null; + // Session: 一个发送或接收消息的线程 + Session session; + // Destination :消息的目的地;消息发送给谁. + Destination destination; + // 消费者,消息接收者 + MessageConsumer consumer; + connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, + ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL); + try { + // 构造从工厂得到连接对象 + connection = connectionFactory.createConnection(); + // 启动 + connection.start(); + // 获取操作连接 + session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); + // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 + destination = session.createQueue("FirstQueue"); + consumer = session.createConsumer(destination); + while (true) { + // 设置接收者接收消息的时间,为了便于测试,这里谁定为100s + TextMessage message = (TextMessage) consumer.receive(100000); + if (null != message) { + System.out.println("收到消息" + message.getText()); + } else { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (null != connection) { + connection.close(); + } + } catch (Throwable ignore) { + } + } + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSSender.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSSender.java new file mode 100644 index 00000000..0f11282d --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/jms/JMSSender.java @@ -0,0 +1,77 @@ +package io.github.dunwu.javaee.oss.jms; + +import javax.jms.*; +import org.apache.activemq.ActiveMQConnection; +import org.apache.activemq.ActiveMQConnectionFactory; + +/** + * 消息的生产者 + * + * @author Victor Zhang + * @since 2016/11/28. + */ +public class JMSSender { + + private static final int SEND_NUMBER = 4; + + public static void main(String[] args) { + // ConnectionFactory :连接工厂,JMS 用它创建连接 + ConnectionFactory connectionFactory; + // Connection :JMS 客户端到JMS Provider 的连接 + Connection connection = null; + // Session: 一个发送或接收消息的线程 + Session session; + // Destination :消息的目的地 + Destination destination; + // MessageProducer:消息发送者 + MessageProducer producer; + // TextMessage message; + // 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar + connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, + ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL); + try { + // 构造从工厂得到连接对象 + connection = connectionFactory.createConnection(); + // 启动 + connection.start(); + // 获取操作连接 + session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); + // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置 + destination = session.createQueue("FirstQueue"); + // 得到消息生成者【发送者】 + producer = session.createProducer(destination); + // 设置不持久化,此处学习,实际根据项目决定 + producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); + // 构造消息,此处写死,项目就是参数,或者方法获取 + sendMessage(session, producer); + session.commit(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (null != connection) { + connection.close(); + } + } catch (Throwable ignore) { + } + } + } + + /** + * 发送消息 + * + * @param session + * @param messageProducer 消息生产者 + * @throws Exception + */ + public static void sendMessage(Session session, MessageProducer messageProducer) throws Exception { + for (int i = 0; i < SEND_NUMBER; i++) { + // 创建一条文本消息 + TextMessage message = session.createTextMessage("ActiveMQ 发送消息" + i); + System.out.println("发送消息:Activemq 发送消息" + i); + // 通过消息生产者发出消息 + messageProducer.send(message); + } + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/JclDemo.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/JclDemo.java new file mode 100644 index 00000000..fa75b912 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/JclDemo.java @@ -0,0 +1,29 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.logging; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * 测试 common-logging + log4j 输出日志 + * + * @author Victor Zhang + * @since 2016/11/18. + */ +public class JclDemo { + + private static final Log log = LogFactory.getLog(JclDemo.class); + + public static void main(String[] args) { + String msg = "print logging, current level: "; + log.trace(msg + "trace"); + log.debug(msg + "debug"); + log.info(msg + "info"); + log.warn(msg + "warn"); + log.error(msg + "error"); + log.fatal(msg + "fatal"); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/Slf4jDemo.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/Slf4jDemo.java new file mode 100644 index 00000000..6f9ce216 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/logging/Slf4jDemo.java @@ -0,0 +1,28 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.logging; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 测试 slf4j + logback 输出日志 + * + * @author Victor Zhang + * @since 2016/11/18. + */ +public class Slf4jDemo { + + private static final Logger log = LoggerFactory.getLogger(Slf4jDemo.class); + + public static void main(String[] args) { + String msg = "print log, current level: {}"; + log.trace(msg, "trace"); + log.debug(msg, "debug"); + log.info(msg, "info"); + log.warn(msg, "warn"); + log.error(msg, "error"); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/ForwardMail.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/ForwardMail.java new file mode 100644 index 00000000..b4a013be --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/ForwardMail.java @@ -0,0 +1,110 @@ +package io.github.dunwu.javaee.oss.mail; /** + * The Apache License 2.0 Copyright (c) 2016 Zhang Peng + */ + +import java.util.Date; +import java.util.Properties; +import javax.mail.*; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +/** + * @author Zhang Peng + * @since 2017/4/5. + */ +public class ForwardMail { + + private static final String MAIL_SERVER_SMTP = "smtp.163.com"; + + private static final String MAIL_SERVER_POP3 = "pop3.163.com"; + + private static final String USER = "xxxxxx"; + + private static final String PASSWORD = "******"; + + private static final String MAIL_FROM = "xxxxxx@163.com"; + + private static final String MAIL_TO = "xxxxxx@163.com"; + + private static final String MAIL_CC = "xxxxxx@163.com"; + + private static final String MAIL_BCC = "xxxxxx@163.com"; + + public static void main(String[] args) throws Exception { + Properties prop = new Properties(); + prop.put("mail.store.protocol", "pop3"); + prop.put("mail.pop3.host", MAIL_SERVER_POP3); + prop.put("mail.pop3.starttls.enable", "true"); + prop.put("mail.smtp.auth", "true"); + prop.put("mail.smtp.host", MAIL_SERVER_SMTP); + + // 1、创建session + Session session = Session.getDefaultInstance(prop); + + // 2、读取邮件夹 + Store store = session.getStore("pop3"); + store.connect(MAIL_SERVER_POP3, USER, PASSWORD); + Folder folder = store.getFolder("inbox"); + folder.open(Folder.READ_ONLY); + + // 获取邮件夹中第1封邮件信息 + Message[] messages = folder.getMessages(); + if (messages.length <= 0) { + return; + } + Message message = messages[0]; + + // 打印邮件关键信息 + String from = InternetAddress.toString(message.getFrom()); + if (from != null) { + System.out.println("From: " + from); + } + + String replyTo = InternetAddress.toString(message.getReplyTo()); + if (replyTo != null) { + System.out.println("Reply-to: " + replyTo); + } + + String to = InternetAddress.toString(message.getRecipients(Message.RecipientType.TO)); + if (to != null) { + System.out.println("To: " + to); + } + + String subject = message.getSubject(); + if (subject != null) { + System.out.println("Subject: " + subject); + } + + Date sent = message.getSentDate(); + if (sent != null) { + System.out.println("Sent: " + sent); + } + + // 设置转发邮件信息头 + Message forward = new MimeMessage(session); + forward.setFrom(new InternetAddress(MAIL_FROM)); + forward.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); + forward.setSubject("Fwd: " + message.getSubject()); + + // 设置转发邮件内容 + MimeBodyPart bodyPart = new MimeBodyPart(); + bodyPart.setContent(message, "message/rfc822"); + + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(bodyPart); + forward.setContent(multipart); + forward.saveChanges(); + + Transport ts = session.getTransport("smtp"); + ts.connect(USER, PASSWORD); + ts.sendMessage(forward, forward.getAllRecipients()); + + folder.close(false); + store.close(); + ts.close(); + System.out.println("message forwarded successfully...."); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailConfigDTO.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailConfigDTO.java new file mode 100644 index 00000000..6f001ef6 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailConfigDTO.java @@ -0,0 +1,72 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.mail; + +/** + * @author Victor Zhang + * @since 2016/12/23. + */ +public class MailConfigDTO { + + private String smtpHost; + + private String pop3Host; + + private String mailDomain; + + private String mailAccount; + + private String mailPassword; + + private String mailFromHost; + + public String getSmtpHost() { + return smtpHost; + } + + public void setSmtpHost(String smtpHost) { + this.smtpHost = smtpHost; + } + + public String getPop3Host() { + return pop3Host; + } + + public void setPop3Host(String pop3Host) { + this.pop3Host = pop3Host; + } + + public String getMailDomain() { + return mailDomain; + } + + public void setMailDomain(String mailDomain) { + this.mailDomain = mailDomain; + } + + public String getMailAccount() { + return mailAccount; + } + + public void setMailAccount(String mailAccount) { + this.mailAccount = mailAccount; + } + + public String getMailPassword() { + return mailPassword; + } + + public void setMailPassword(String mailPassword) { + this.mailPassword = mailPassword; + } + + public String getMailFromHost() { + return mailFromHost; + } + + public void setMailFromHost(String mailFromHost) { + this.mailFromHost = mailFromHost; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailDTO.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailDTO.java new file mode 100644 index 00000000..a032cb45 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailDTO.java @@ -0,0 +1,104 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.mail; + +import javax.mail.internet.MimeMultipart; + +/** + * @author Victor Zhang + * @since 2016/12/22. + */ +public class MailDTO { + + private String from; + + private String to; // 邮件的收件人 + + private String cc; // 邮件的抄送人 + + private String bcc; // 邮件的密送人 + + private String subject; // 邮件主题 + + private String type; // text或html两种类型 + + private String text; // 邮件文本内容 + + private String charset; // 邮件编码类型(如UTF-8、GBK等) + + private MimeMultipart content; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + public String getCc() { + return cc; + } + + public void setCc(String cc) { + this.cc = cc; + } + + public String getBcc() { + return bcc; + } + + public void setBcc(String bcc) { + this.bcc = bcc; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getCharset() { + return charset; + } + + public void setCharset(String charset) { + this.charset = charset; + } + + public MimeMultipart getContent() { + return content; + } + + public void setContent(MimeMultipart content) { + this.content = content; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailUtil.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailUtil.java new file mode 100644 index 00000000..3d4664f8 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/MailUtil.java @@ -0,0 +1,202 @@ +package io.github.dunwu.javaee.oss.mail; + +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import javax.mail.*; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeUtility; + +/** + * @author Victor Zhang + * @since 2016/12/22. + */ +public class MailUtil { + + private static final String TYPE_TEXT = "text"; + + private static final String TYPE_HTML = "html"; + + private MailConfigDTO configDTO; + + /** + * 以默认配置初始化邮件收发工具 + */ + public MailUtil() { + this.configDTO = initEmailConfig(); + } + + private MailConfigDTO initEmailConfig() { + MailConfigDTO configDTO = new MailConfigDTO(); + Properties p = new Properties(); + try { + p.load(MailUtil.class.getResourceAsStream("/mail/mail.properties")); + } catch (IOException e) { + e.printStackTrace(); + } + + configDTO.setSmtpHost(p.getProperty("smtp.host")); + configDTO.setPop3Host(p.getProperty("pop3.host")); + configDTO.setMailDomain(p.getProperty("mail.host")); + configDTO.setMailAccount(p.getProperty("mail.account")); + configDTO.setMailPassword(p.getProperty("mail.password")); + configDTO.setMailFromHost(configDTO.getMailAccount() + configDTO.getMailDomain()); + return configDTO; + } + + /** + * 以自定义配置初始化邮件收发工具 + */ + public MailUtil(MailConfigDTO configDTO) { + this.configDTO = configDTO; + } + + /** + * 发送邮件 + * + * @param info + * @throws MessagingException + */ + public void sendEmail(MailDTO info) throws MessagingException { + Properties props = new Properties(); + props.setProperty("mail.debug", "true"); + props.setProperty("mail.transport.protocol", "smtp"); + props.setProperty("mail.host", configDTO.getSmtpHost()); + props.setProperty("mail.smtp.auth", "true"); + + // 1、创建session + Session session = Session.getInstance(props); + + // 2、通过session得到transport对象 + Transport ts = session.getTransport(); + + // 3、连上邮件服务器 + ts.connect(configDTO.getSmtpHost(), configDTO.getMailAccount(), configDTO.getMailPassword()); + + // 4、创建邮件 + MimeMessage message = new MimeMessage(session); + if (!fillEmail(message, info)) { + return; + } + + // 5、发送邮件 + ts.sendMessage(message, message.getAllRecipients()); + ts.close(); + } + + private boolean fillEmail(MimeMessage message, MailDTO info) throws MessagingException { + return fillEmailHeader(message, info) && fillEmailBody(message, info); + } + + /** + * 填充邮件头 + */ + private boolean fillEmailHeader(MimeMessage message, MailDTO info) throws MessagingException { + // 邮件的发件人 + if (StringUtils.isNotBlank(configDTO.getMailFromHost())) { + message.setFrom(new InternetAddress(configDTO.getMailFromHost())); + } else { + System.out.println("发件人不能为空"); + return false; + } + + // 邮件的收件人 + if (StringUtils.isNotBlank(info.getTo())) { + message.setRecipient(Message.RecipientType.TO, new InternetAddress(info.getTo())); + } else { + System.out.println("收件人不能为空"); + return false; + } + + // 邮件的抄送人 + if (StringUtils.isNotBlank(info.getCc())) { + message.setRecipient(Message.RecipientType.CC, new InternetAddress(info.getCc())); + } + + // 邮件的密送人 + if (StringUtils.isNotBlank(info.getBcc())) { + message.setRecipient(Message.RecipientType.BCC, new InternetAddress(info.getBcc())); + } + + // 邮件的标题 + if (StringUtils.isNotBlank(info.getCharset())) { + message.setSubject(info.getSubject(), info.getCharset()); + } else { + message.setSubject(info.getSubject()); + } + + return true; + } + + /** + * 填充邮件内容 + */ + private boolean fillEmailBody(MimeMessage message, MailDTO info) throws MessagingException { + if (StringUtils.isBlank(info.getType()) || StringUtils.isBlank(info.getText())) { + return false; + } + + if (StringUtils.equals(info.getType(), TYPE_TEXT)) { + if (StringUtils.isNotBlank(info.getCharset())) { + message.setText(info.getText(), info.getCharset()); + } else { + message.setText(info.getText()); + } + } else if (StringUtils.equals(info.getType(), TYPE_HTML)) { + String type = "text/html"; + if (StringUtils.isNotBlank(info.getCharset())) { + type += ";charset=" + info.getCharset(); + } + message.setContent(info.getText(), type); + } + + return true; + } + + public List receiveEmail() throws MessagingException, IOException { + // 创建一个有具体连接信息的Properties对象 + Properties prop = new Properties(); + prop.setProperty("mail.debug", "false"); + prop.setProperty("mail.store.protocol", "pop3"); + prop.setProperty("mail.pop3.host", configDTO.getPop3Host()); + + // 1、创建session + Session session = Session.getInstance(prop); + + // 2、通过session得到Store对象 + Store store = session.getStore(); + + // 3、连上邮件服务器 + store.connect(configDTO.getPop3Host(), configDTO.getMailAccount(), configDTO.getMailPassword()); + + // 4、获得邮箱内的邮件夹 + Folder folder = store.getFolder("inbox"); + folder.open(Folder.READ_ONLY); + + // 获得邮件夹Folder内的所有邮件Message对象 + Message[] messages = folder.getMessages(); + + List results = new ArrayList(); + for (int i = 0; i < messages.length; i++) { + MailDTO dto = new MailDTO(); + dto.setFrom(MimeUtility.decodeText(messages[i].getFrom()[0].toString())); + dto.setSubject(messages[i].getSubject()); + dto.setText(messages[i].getContent().toString()); + results.add(dto); + System.out.println("第 " + (i + 1) + "封邮件的主题:" + dto.getSubject()); + System.out.println("第 " + (i + 1) + "封邮件的发件人地址:" + dto.getFrom()); + // System.out.println("第 " + (i + 1) + "封邮件的内容:\n" + + // messages[i].getContent().toString()); + } + + // 5、关闭 + folder.close(false); + store.close(); + return results; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendAttachmentMail.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendAttachmentMail.java new file mode 100644 index 00000000..9dadc189 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendAttachmentMail.java @@ -0,0 +1,84 @@ +package io.github.dunwu.javaee.oss.mail; /** + * The Apache License 2.0 Copyright (c) 2016 Zhang Peng + */ + +import java.util.Properties; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +/** + * @author Zhang Peng + * @since 2017/4/5. + */ +public class SendAttachmentMail { + + private static final String MAIL_SERVER_HOST = "smtp.163.com"; + + private static final String USER = "xxxxxx"; + + private static final String PASSWORD = "******"; + + private static final String MAIL_FROM = "xxxxxx@163.com"; + + private static final String MAIL_TO = "xxxxxx@163.com"; + + private static final String MAIL_CC = "xxxxxx@163.com"; + + private static final String MAIL_BCC = "xxxxxx@163.com"; + + public static void main(String[] args) throws Exception { + Properties prop = new Properties(); + prop.setProperty("mail.debug", "true"); + prop.setProperty("mail.host", MAIL_SERVER_HOST); + prop.setProperty("mail.transport.protocol", "smtp"); + prop.setProperty("mail.smtp.auth", "true"); + + // 1、创建session + Session session = Session.getInstance(prop); + + // 2、通过session得到transport对象 + Transport ts = session.getTransport(); + + // 3、连上邮件服务器 + ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); + + // 4、创建邮件 + MimeMessage message = new MimeMessage(session); + + // 邮件消息头 + message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人 + message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人 + message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人 + message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人 + message.setSubject("测试带附件邮件"); // 邮件的标题 + + MimeBodyPart text = new MimeBodyPart(); + text.setContent("邮件中有两个附件。", "text/html;charset=UTF-8"); + + // 描述数据关系 + MimeMultipart mm = new MimeMultipart(); + mm.setSubType("related"); + mm.addBodyPart(text); + String[] files = { "D:\\00_Temp\\temp\\1.jpg", "D:\\00_Temp\\temp\\2.png" }; + + // 添加邮件附件 + for (String filename : files) { + MimeBodyPart attachPart = new MimeBodyPart(); + attachPart.attachFile(filename); + mm.addBodyPart(attachPart); + } + + message.setContent(mm); + message.saveChanges(); + + // 5、发送邮件 + ts.sendMessage(message, message.getAllRecipients()); + ts.close(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTemplateMail.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTemplateMail.java new file mode 100644 index 00000000..7e89e9ac --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTemplateMail.java @@ -0,0 +1,81 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.mail; + +import io.github.dunwu.javaee.oss.template.VelocityUtil; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import javax.mail.MessagingException; +import org.apache.velocity.VelocityContext; + +/** + * @author Victor Zhang + * @see org.zp.javaee.tools.mail.MailUtil 注意:如果想要成功发送邮件,需要修改JavaParty项目 src\javaee\tools\src\main\resources\mail\mail.properties + * 中的 参数,请根据实际邮箱来配置。 + * @since 2016/12/23. + */ +public class SendTemplateMail { + + private static final String DEFAULT_TO = "xxxxxx@163.com"; + + public static void main(String[] args) throws MessagingException { + VelocityContext context = new VelocityContext(); + context.put("name", "Victor Zhang"); + context.put("hint", "欢迎使用Velocity邮件模板:"); + + // 直接传入一个对象 + context.put("date", new Date()); + + // 传入一个Vector + Hyperlink item1 = new Hyperlink("百度首页", "https://www.baidu.com"); + Hyperlink item2 = new Hyperlink("网易首页", "http://www.163.com/"); + List list = new ArrayList<>(); + list.add(item1); + list.add(item2); + context.put("links", list); + context.put("logo", + "http://images.cnblogs.com/cnblogs_com/jingmoxukong/709053/o_%e6%94%bb%e5%9f%8e%e7%8b%ae2.png"); + + MailDTO info = new MailDTO(); + info.setTo(DEFAULT_TO); // 收件人邮箱 + info.setSubject("测试html邮件"); // 邮件主题 + info.setType("html"); + info.setCharset("utf-8"); + + info.setText(VelocityUtil.getMergeOutput(context, "template/mail.vm")); + MailUtil mailUtil = new MailUtil(); + mailUtil.sendEmail(info); + } + + public static class Hyperlink { + + private String link; + + private String name; + + Hyperlink(String name, String link) { + this.name = name; + this.link = link; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTextMail.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTextMail.java new file mode 100644 index 00000000..fe4833a4 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/SendTextMail.java @@ -0,0 +1,67 @@ +package io.github.dunwu.javaee.oss.mail; /** + * The Apache License 2.0 Copyright (c) 2016 Zhang Peng + */ + +import java.util.Properties; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +/** + * @author Zhang Peng + * @since 2017/4/5. + */ +public class SendTextMail { + + private static final String MAIL_SERVER_HOST = "smtp.163.com"; + + private static final String USER = "xxxxxx"; + + private static final String PASSWORD = "******"; + + private static final String MAIL_FROM = "xxxxxx@163.com"; + + private static final String MAIL_TO = "xxxxxx@163.com"; + + private static final String MAIL_CC = "xxxxxx@163.com"; + + private static final String MAIL_BCC = "xxxxxx@163.com"; + + public static void main(String[] args) throws Exception { + Properties prop = new Properties(); + prop.setProperty("mail.debug", "true"); + prop.setProperty("mail.host", MAIL_SERVER_HOST); + prop.setProperty("mail.transport.protocol", "smtp"); + prop.setProperty("mail.smtp.auth", "true"); + + // 1、创建session + Session session = Session.getInstance(prop); + Transport ts = null; + + // 2、通过session得到transport对象 + ts = session.getTransport(); + + // 3、连上邮件服务器 + ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); + + // 4、创建邮件 + MimeMessage message = new MimeMessage(session); + + // 邮件消息头 + message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人 + message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人 + message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人 + message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人 + message.setSubject("测试文本邮件"); // 邮件的标题 + + // 邮件消息体 + message.setText("天下无双。"); + + // 5、发送邮件 + ts.sendMessage(message, message.getAllRecipients()); + ts.close(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/StoreMail.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/StoreMail.java new file mode 100644 index 00000000..32df1236 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/StoreMail.java @@ -0,0 +1,66 @@ +package io.github.dunwu.javaee.oss.mail; /** + * The Apache License 2.0 Copyright (c) 2016 Zhang Peng + */ + +import java.util.Properties; +import javax.mail.Folder; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Store; + +/** + * @author Zhang Peng + * @since 2017/4/5. + */ +public class StoreMail { + + private static final String MAIL_SERVER_HOST = "pop3.163.com"; + + private static final String USER = "xxxxxx"; + + private static final String PASSWORD = "******"; + + private static final String MAIL_FROM = "xxxxxx@163.com"; + + private static final String MAIL_TO = "xxxxxx@163.com"; + + private static final String MAIL_CC = "xxxxxx@163.com"; + + private static final String MAIL_BCC = "xxxxxx@163.com"; + + public static void main(String[] args) throws Exception { + + // 创建一个有具体连接信息的Properties对象 + Properties prop = new Properties(); + prop.setProperty("mail.debug", "true"); + prop.setProperty("mail.store.protocol", "pop3"); + prop.setProperty("mail.pop3.host", MAIL_SERVER_HOST); + + // 1、创建session + Session session = Session.getInstance(prop); + + // 2、通过session得到Store对象 + Store store = session.getStore(); + + // 3、连上邮件服务器 + store.connect(MAIL_SERVER_HOST, USER, PASSWORD); + + // 4、获得邮箱内的邮件夹 + Folder folder = store.getFolder("inbox"); + folder.open(Folder.READ_ONLY); + + // 获得邮件夹Folder内的所有邮件Message对象 + Message[] messages = folder.getMessages(); + for (int i = 0; i < messages.length; i++) { + String subject = messages[i].getSubject(); + String from = (messages[i].getFrom()[0]).toString(); + System.out.println("第 " + (i + 1) + "封邮件的主题:" + subject); + System.out.println("第 " + (i + 1) + "封邮件的发件人地址:" + from); + } + + // 5、关闭 + folder.close(false); + store.close(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/sendHtmlMail.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/sendHtmlMail.java new file mode 100644 index 00000000..bdceb7a1 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/mail/sendHtmlMail.java @@ -0,0 +1,84 @@ +package io.github.dunwu.javaee.oss.mail; /** + * The Apache License 2.0 Copyright (c) 2016 Zhang Peng + */ + +import java.util.Properties; +import javax.activation.DataHandler; +import javax.activation.FileDataSource; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +/** + * @author Zhang Peng + * @since 2017/4/5. + */ +public class sendHtmlMail { + + private static final String MAIL_SERVER_HOST = "smtp.163.com"; + + private static final String USER = "xxxxxx"; + + private static final String PASSWORD = "******"; + + private static final String MAIL_FROM = "xxxxxx@163.com"; + + private static final String MAIL_TO = "xxxxxx@163.com"; + + private static final String MAIL_CC = "xxxxxx@163.com"; + + private static final String MAIL_BCC = "xxxxxx@163.com"; + + public static void main(String[] args) throws Exception { + Properties prop = new Properties(); + prop.setProperty("mail.debug", "true"); + prop.setProperty("mail.host", MAIL_SERVER_HOST); + prop.setProperty("mail.transport.protocol", "smtp"); + prop.setProperty("mail.smtp.auth", "true"); + + // 1、创建session + Session session = Session.getInstance(prop); + Transport ts = null; + + // 2、通过session得到transport对象 + ts = session.getTransport(); + + // 3、连上邮件服务器 + ts.connect(MAIL_SERVER_HOST, USER, PASSWORD); + + // 4、创建邮件 + MimeMessage message = new MimeMessage(session); + + // 邮件消息头 + message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人 + message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人 + message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人 + message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人 + message.setSubject("测试HTML邮件"); // 邮件的标题 + + String htmlContent = "

    Hello

    " + "

    显示图片1.jpg

    "; + MimeBodyPart text = new MimeBodyPart(); + text.setContent(htmlContent, "text/html;charset=UTF-8"); + MimeBodyPart image = new MimeBodyPart(); + DataHandler dh = new DataHandler(new FileDataSource("D:\\05_Datas\\图库\\吉他少年背影.png")); + image.setDataHandler(dh); + image.setContentID("abc.jpg"); + + // 描述数据关系 + MimeMultipart mm = new MimeMultipart(); + mm.addBodyPart(text); + mm.addBodyPart(image); + mm.setSubType("related"); + message.setContent(mm); + message.saveChanges(); + + // 5、发送邮件 + ts.sendMessage(message, message.getAllRecipients()); + ts.close(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/LoadVelocityDemo.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/LoadVelocityDemo.java new file mode 100644 index 00000000..4d21f306 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/LoadVelocityDemo.java @@ -0,0 +1,94 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.template; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Properties; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; + +/** + * @author Victor Zhang + * @since 2016/12/22. + */ +public class LoadVelocityDemo { + + public static void main(String[] args) throws IOException { + loadByClasspath(); + loadByFilepath(); + loadByConfig(); + } + + /** + * 加载classpath目录下的vm文件 + */ + public static void loadByClasspath() { + System.out.println("========== loadByClasspath =========="); + + Properties p = new Properties(); + p.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + VelocityEngine ve = new VelocityEngine(); + ve.init(p); + Template t = ve.getTemplate("template/hello.vm"); + + System.out.println(fillTemplate(t)); + } + + /** + * 根据绝对路径加载,vm文件置于硬盘某分区中 + */ + public static void loadByFilepath() { + System.out.println("========== loadByFilepath =========="); + + Properties p = new Properties(); + p.put(VelocityEngine.FILE_RESOURCE_LOADER_PATH, + "D:\\01_Workspace\\Project\\zp\\javaparty\\src\\toolbox\\template\\src\\main\\resources"); + VelocityEngine ve = new VelocityEngine(); + ve.init(p); + Template t = ve.getTemplate("hello.vm"); + + System.out.println(fillTemplate(t)); + } + + /** + * 根据资源路径加载 + */ + public static void loadByConfig() throws IOException { + System.out.println("========== loadByConfig =========="); + + Properties p = new Properties(); + p.load(LoadVelocityDemo.class.getResourceAsStream("/template/velocity.properties")); + VelocityEngine ve = new VelocityEngine(); + ve.init(p); + Template t = ve.getTemplate("template/hello.vm"); + + System.out.println(fillTemplate(t)); + } + + /** + * 使用文本文件,使用文本文件,如:velocity.properties + */ + private static String fillTemplate(Template t) { + // 初始化VelocityContext + VelocityContext ctx = new VelocityContext(); + ctx.put("name", "victor"); + ctx.put("date", (new Date()).toString()); + List temp = new ArrayList(); + temp.add("1"); + temp.add("2"); + ctx.put("list", temp); + + // 初始化Writer + StringWriter sw = new StringWriter(); + + t.merge(ctx, sw); + return sw.toString(); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld.java new file mode 100644 index 00000000..c5d9b3ee --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld.java @@ -0,0 +1,42 @@ +package io.github.dunwu.javaee.oss.template; /** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ + +import java.io.StringWriter; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; + +/** + * Velocity 的 HelloWorld 示例 + * + * @author Victor Zhang + * @since 2016/12/22. + */ +public class VelocityHelloWorld { + + public static void main(String args[]) { + /* 1.初始化 Velocity */ + VelocityEngine velocityEngine = new VelocityEngine(); + velocityEngine.setProperty(VelocityEngine.RESOURCE_LOADER, "file"); + velocityEngine.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, + "D:/01_Workspace/Project/zp/javaparty/src/toolbox/template/src/main/resources"); + velocityEngine.init(); + + /* 2.创建一个上下文对象 */ + VelocityContext context = new VelocityContext(); + + /* 3.添加你的数据对象到上下文 */ + context.put("name", "Victor Zhang"); + context.put("project", "Velocity"); + + /* 4.选择一个模板 */ + Template template = velocityEngine.getTemplate("template/hello.vm"); + + /* 5.将你的数据与模板合并,产生输出内容 */ + StringWriter sw = new StringWriter(); + template.merge(context, sw); + System.out.println("final output:\n" + sw); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld2.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld2.java new file mode 100644 index 00000000..19398dfb --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityHelloWorld2.java @@ -0,0 +1,47 @@ +package io.github.dunwu.javaee.oss.template; /** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Properties; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; + +/** + * Velocity 的 HelloWorld 示例 + * + * @author Victor Zhang + * @since 2016/12/22. + */ +public class VelocityHelloWorld2 { + + public static void main(String args[]) { + /* 1.初始化 Velocity */ + Properties p = new Properties(); + try { + p.load(VelocityUtil.class.getResourceAsStream("/template/velocity.properties")); + } catch (IOException e) { + e.printStackTrace(); + } + VelocityEngine velocityEngine = new VelocityEngine(); + velocityEngine.init(p); + + /* 2.创建一个上下文对象 */ + VelocityContext context = new VelocityContext(); + + /* 3.添加你的数据对象到上下文 */ + context.put("name", "Victor Zhang"); + context.put("project", "Velocity"); + + /* 4.选择一个模板 */ + Template template = velocityEngine.getTemplate("template/hello.vm"); + + /* 5.将你的数据与模板合并,产生输出内容 */ + StringWriter sw = new StringWriter(); + template.merge(context, sw); + System.out.println("final output:\n" + sw); + } + +} diff --git a/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityUtil.java b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityUtil.java new file mode 100644 index 00000000..77945c52 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/java/io/github/dunwu/javaee/oss/template/VelocityUtil.java @@ -0,0 +1,46 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.template; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Properties; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; + +/** + * @author Victor Zhang + * @since 2016/12/23. + */ +public class VelocityUtil { + + private static VelocityEngine velocityEngine; + + static { + Properties props = new Properties(); + try { + props.load(VelocityUtil.class.getResourceAsStream("/template/velocity.properties")); + } catch (IOException e) { + e.printStackTrace(); + } + velocityEngine = new VelocityEngine(); + velocityEngine.init(props); + } + + public static String getMergeOutput(VelocityContext context, String templateName) { + Template template = velocityEngine.getTemplate(templateName); + + StringWriter sw = new StringWriter(); + template.merge(context, sw); + String output = sw.toString(); + try { + sw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + return output; + } + +} diff --git a/codes/javaee/javaee-oss/src/main/resources/html/example.html b/codes/javaee/javaee-oss/src/main/resources/html/example.html new file mode 100644 index 00000000..32c7cf6a --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/html/example.html @@ -0,0 +1,8 @@ + + + 测试html页面 + + +

    牛刀小试

    + + diff --git a/codes/javaee/javaee-oss/src/main/resources/images/lion.jpg b/codes/javaee/javaee-oss/src/main/resources/images/lion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d10bd212f4d4b70edfc239b0a2e78a7815914798 GIT binary patch literal 16791 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 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-oss/src/main/resources/images/lion2.jpg b/codes/javaee/javaee-oss/src/main/resources/images/lion2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6794cb3483aa2cc8fc06aca4459dfa49aa516569 GIT binary patch literal 31726 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 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-oss/src/main/resources/log4j.xml b/codes/javaee/javaee-oss/src/main/resources/log4j.xml new file mode 100644 index 00000000..6e67642f --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/log4j.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-oss/src/main/resources/logback.xml b/codes/javaee/javaee-oss/src/main/resources/logback.xml new file mode 100644 index 00000000..f4b2c110 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/logback.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + ${user.dir}/logs/${DIR_NAME}/all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + ${user.dir}/logs/${DIR_NAME}/error.%d{yyyy-MM-dd}.log + 30 + + + + + 10MB + + + + ERROR + ACCEPT + DENY + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + ${user.dir}/logs/${DIR_NAME}/warn.%d{yyyy-MM-dd}.log + 30 + + + + + 10MB + + + + WARN + ACCEPT + DENY + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + ${user.dir}/logs/${DIR_NAME}/info.%d{yyyy-MM-dd}.log + 30 + + + + + 10MB + + + + INFO + ACCEPT + DENY + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + ${user.dir}/logs/${DIR_NAME}/debug.%d{yyyy-MM-dd}.log + 30 + + + + + 10MB + + + + DEBUG + ACCEPT + DENY + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + ${user.dir}/logs/${DIR_NAME}/trace.%d{yyyy-MM-dd}.log + 30 + + + + + 10MB + + + + TRACE + ACCEPT + DENY + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + ${user.dir}/logs/${DIR_NAME}/springframework.%d{yyyy-MM-dd}.log + + 30 + + + + + 10MB + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-oss/src/main/resources/mail/mail.properties b/codes/javaee/javaee-oss/src/main/resources/mail/mail.properties new file mode 100644 index 00000000..2c6aebd2 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/mail/mail.properties @@ -0,0 +1,5 @@ +smtp.host=smtp.163.com +pop3.host=pop3.163.com +mail.host=@163.com +mail.account=xxxxxx +mail.password=xxxxxx diff --git a/codes/javaee/javaee-oss/src/main/resources/template/footer.vm b/codes/javaee/javaee-oss/src/main/resources/template/footer.vm new file mode 100644 index 00000000..967693d7 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/template/footer.vm @@ -0,0 +1,16 @@ +#set ($company = "Apache") +#set ($year = "2016") + + + + + + + + +
    + Copyright $company $year. 保留所有权利。 +
    + + diff --git a/codes/javaee/javaee-oss/src/main/resources/template/header.vm b/codes/javaee/javaee-oss/src/main/resources/template/header.vm new file mode 100644 index 00000000..877d1e5d --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/template/header.vm @@ -0,0 +1,6 @@ + + + Velocity 邮件模板 + + diff --git a/codes/javaee/javaee-oss/src/main/resources/template/hello.vm b/codes/javaee/javaee-oss/src/main/resources/template/hello.vm new file mode 100644 index 00000000..b43003ab --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/template/hello.vm @@ -0,0 +1,3 @@ +Hello World! The first velocity demo. +Name is $name. +Project is $project \ No newline at end of file diff --git a/codes/javaee/javaee-oss/src/main/resources/template/mail.vm b/codes/javaee/javaee-oss/src/main/resources/template/mail.vm new file mode 100644 index 00000000..9f439023 --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/template/mail.vm @@ -0,0 +1,140 @@ + + + + + + + + + + + + + ## 页首 + #parse("template/header.vm") + + + + + + ## 页脚 + #parse("template/footer.vm") + +
    + + + + ## 收件人名 + + + + + ## 提示 + + + + + ## 邮件正文 + + + + + ## 日期 + + + + + ## 系统提示 + + + + + +
    + + 亲爱的 $name: +
    +
    + +

    $hint

    +
    +
    +

    将超链接、超链接名存入对象,将多个这样的对象放入列表:

    + #foreach( $item in $links ) + $item.name
    + #end +

    传图片url,显示logo

    + logo +
    +
    + $date +
    +
    +
    + 提示:此邮件由系统自动发送,请勿直接回复 +
    +
    +
    + + + + + diff --git a/codes/javaee/javaee-oss/src/main/resources/template/velocity.properties b/codes/javaee/javaee-oss/src/main/resources/template/velocity.properties new file mode 100644 index 00000000..c299635c --- /dev/null +++ b/codes/javaee/javaee-oss/src/main/resources/template/velocity.properties @@ -0,0 +1,4 @@ +resource.loader=file +file.resource.loader.path=D:/01_Workspace/Project/zp/java/javaee-tutorial/codes/oss/src/main/resources +input.encoding=utf-8 +output.encoding=utf-8 diff --git a/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/html/JsoupTest.java b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/html/JsoupTest.java new file mode 100644 index 00000000..23503c78 --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/html/JsoupTest.java @@ -0,0 +1,105 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.html; + +import java.io.File; +import java.io.IOException; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Victor Zhang + * @since 2016/11/24. + */ +public class JsoupTest { + + final String filePath = System.getProperty("user.dir") + "\\src\\test\\resources\\html\\jsoup-cookbook.html"; + + private Document docFromStr; + + private Document docFromUrl; + + private Document docFromFile; + + /** + * Jsoup 有三种方式加载文档(Document): HTML字符串、URL地址、html文件 + * + * @throws IOException + */ + @Before + public void before() throws IOException { + // 从一个html字符串加载Document对象 + final String html = "First parse" + + "

    Parsed HTML into a doc.

    "; + docFromStr = Jsoup.parse(html); + + // 从一个URL加载Document对象 + docFromUrl = Jsoup.connect("https://www.baidu.com/").get(); + + // 从一个文件加载Document对象 + File input = new File(filePath); + docFromFile = Jsoup.parse(input, "UTF-8"); + + String htmlFragment = "

    Lorem ipsum.

    "; + Document doc = Jsoup.parse(htmlFragment); + } + + /** + * 获取html的title、head、body + */ + @Test + public void testGetHeadAndBody() { + System.out.println("title内容:\n" + docFromStr.title()); + System.out.println("head内容:\n" + docFromStr.head()); + System.out.println("body内容:\n" + docFromStr.body()); + } + + /** + * 使用DOM方法来遍历一个文档 + */ + @Test + public void test01() { + // 遍历一个Document对象中所有的链接 + Element content = docFromFile.body(); + Elements links = content.getElementsByTag("a"); + for (Element link : links) { + System.out.println("linkHref: " + link.attr("href")); + System.out.println("linkText: " + link.text()); + } + } + + /** + * 使用选择器语法来查找元素 + */ + @Test + public void testSelect() { + // 带有href属性的a元素 + Elements hrefs = docFromUrl.select("a[href]"); + System.out.println("[hrefs]\n" + hrefs.toString()); + // 扩展名为.png的图片 + Elements pngs = docFromUrl.select("img[src$=.png]"); + System.out.println("[pngs]\n" + pngs.toString()); + // class等于masthead的div标签 + Element head_wrappers = docFromUrl.select("div.head_wrapper").first(); + System.out.println("[head_wrapper:]\n" + head_wrappers.toString()); + // 在h3元素之后的a元素 + Elements resultLinks = docFromUrl.select("div.head_wrapper > a"); + System.out.println("[resultLinks]\n" + resultLinks.toString()); + } + + @Test + public void test() { + // 从元素集合抽取属性、文本和html内容 + Element link = docFromUrl.select("a").first();// 查找第一个a元素 + System.out.println("outerHtml: " + link.outerHtml()); + System.out.println("html: " + link.html()); // 取得链接内的html内容 + System.out.println("href: " + link.attr("href")); // 取得字符串中的文本 + System.out.println("text: " + link.text()); // 取得链接地址中的文本 + } + +} diff --git a/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ImageUtilTest.java b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ImageUtilTest.java new file mode 100644 index 00000000..29bb1547 --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ImageUtilTest.java @@ -0,0 +1,66 @@ +package io.github.dunwu.javaee.oss.image; + +import io.github.dunwu.javaee.oss.image.dto.ImageParamDTO; +import net.sf.jmimemagic.MagicException; +import net.sf.jmimemagic.MagicMatchNotFoundException; +import net.sf.jmimemagic.MagicParseException; +import org.junit.Assert; +import org.junit.Test; + +import java.awt.image.BufferedImage; +import java.io.*; + +/** + * @author Victor Zhang + * @since 2017/1/16. + */ +public class ImageUtilTest { + + @Test + public void testToFile() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + final String newFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2_watermark"; + final String warterFile = System.getProperty("user.dir") + "/src/test/resources/images/wartermark.png"; + + ImageParamDTO params = new ImageParamDTO(); + params.setFormat("png"); + params.setWaterMark(new ImageParamDTO.WaterMark(9, warterFile, 0.6f)); + ImageUtil.toFile(oldFile, newFile, params); + } + + @Test + public void testToBufferedImage() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + + ImageParamDTO params = new ImageParamDTO(); + params.setWidth(64); + params.setHeight(64); + + BufferedImage bufferedImage = ImageUtil.toBufferedImage(oldFile, params); + Assert.assertNotNull(bufferedImage); + } + + @Test + public void testGetContentType() + throws MagicParseException, MagicException, MagicMatchNotFoundException, IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + byte[] bytes = toBytes(new File(oldFile)); + String type = ImageUtil.getContentType(bytes); + Assert.assertEquals("image/jpeg", type); + } + + private static byte[] toBytes(File file) throws IOException { + InputStream input = new FileInputStream(file); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length = 0; + while ((length = input.read(buffer)) != -1) { + output.write(buffer, 0, length); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + +} diff --git a/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/QRCodeUtilTest.java b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/QRCodeUtilTest.java new file mode 100644 index 00000000..7de69c35 --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/QRCodeUtilTest.java @@ -0,0 +1,99 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.image; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.DecodeHintType; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import io.github.dunwu.javaee.oss.image.dto.BarcodeParamDTO; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.junit.Assert; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +/** + * 测试qrcode工具类 + * + * @author Victor Zhang + * @since 2017/1/16. + */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class QRCodeUtilTest { + + private static final String qrcodeFile = "d:\\qrcode.png"; + + private String jsonContent = null; + + private BarcodeParamDTO paramDTO = null; + + @Before + public void before() throws JsonProcessingException { + jsonContent = initTestJson(); + paramDTO = initBarcodeParam(); + } + + private String initTestJson() throws JsonProcessingException { + Map userData = new HashMap(); + Map fullname = new HashMap(); + fullname.put("first", "Peng"); + fullname.put("last", "Zhang"); + userData.put("name", fullname); + userData.put("gender", "MALE"); + userData.put("email", "aaa@163.com"); + + ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally + return mapper.writeValueAsString(userData); + } + + private BarcodeParamDTO initBarcodeParam() { + BarcodeParamDTO paramDTO = new BarcodeParamDTO(); + paramDTO.setWidth(200); + paramDTO.setHeight(200); + paramDTO.setFilepath(qrcodeFile); + paramDTO.setImageFormat("png"); + paramDTO.setBarcodeFormat(BarcodeFormat.QR_CODE); + + // 编码参数 + Map encodeHints = new HashMap(); + encodeHints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); + paramDTO.setEncodeHints(encodeHints); + + // 解码参数 + HashMap decodeHints = new HashMap(); + decodeHints.put(DecodeHintType.CHARACTER_SET, "UTF-8"); + paramDTO.setDecodeHints(decodeHints); + + return paramDTO; + } + + /** + * 测试创建qrcode图片 + */ + @Test + public void test01() throws IOException, WriterException { + QRCodeUtil.encode(jsonContent, paramDTO); + File f = new File(qrcodeFile); + Assert.assertTrue(f.exists()); + } + + /** + * 测试解析qrcode图片 + */ + @Test + public void test02() { + String expect = + "{\"gender\":\"MALE\",\"name\":{\"last\":\"Zhang\",\"first\":\"Peng\"},\"email\":\"aaa@163.com\"}"; + String content = QRCodeUtil.decode(paramDTO); + Assert.assertEquals(expect, content); + } + +} diff --git a/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ThumbnailatorTest.java b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ThumbnailatorTest.java new file mode 100644 index 00000000..727517d8 --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/image/ThumbnailatorTest.java @@ -0,0 +1,141 @@ +package io.github.dunwu.javaee.oss.image; + +import net.coobird.thumbnailator.Thumbnails; +import net.coobird.thumbnailator.geometry.Positions; +import net.coobird.thumbnailator.name.Rename; +import org.junit.Assert; +import org.junit.Test; + +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.imageio.ImageIO; +import javax.imageio.stream.FileImageOutputStream; + +/** + * @author Victor Zhang + * @since 2017/1/17. + */ +public class ThumbnailatorTest { + + /** + * 测试输入单个对象 执行后会在D:\下生成几张不同尺寸的图片 + */ + @Test + public void testInput01() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion.jpg"; + + // 输入形式:文件名 + Thumbnails.of(oldFile).size(16, 16).toFile("d:\\test_input_16_16.png"); + Assert.assertTrue(new File("d:\\test_input_16_16.png").exists()); + + // 输入形式:File 对象 + Thumbnails.of(new File(oldFile)).size(32, 32).toFile(new File("d:\\test_input_32_32.png")); + Assert.assertTrue(new File("d:\\test_input_32_32.png").exists()); + + // 输入形式:URL 对象 + URL url = new URL( + "https://raw.githubusercontent.com/dunwu/JavaParty/master/toolbox/image/src/test/resources/images/lion.jpg"); + Thumbnails.of(url).size(64, 64).toFile(new File("d:\\test_input_64_64.png")); + Assert.assertTrue(new File("d:\\test_input_64_64.png").exists()); + + // 输入形式:BufferedImage 对象 + BufferedImage originalImage = ImageIO.read(new File(oldFile)); + Thumbnails.of(originalImage).size(80, 80).toFile(new File("d:\\test_input_80_80.png")); + Assert.assertTrue(new File("d:\\test_input_80_80.png").exists()); + + // 输入形式:InputStream 对象 + InputStream fis = new FileInputStream(oldFile); + Thumbnails.of(fis).size(96, 96).toFile(new File("d:\\test_input_96_96.png")); + Assert.assertTrue(new File("d:\\test_input_96_96.png").exists()); + } + + /** + * 测试输入多个对象 执行后会在D:\下生成几个含有图片的文件夹 注:如果输入是多个对象,则输出也必须选用输出多个对象的方式 + * + * @throws IOException + */ + @Test + public void testInput02() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion.jpg"; + final String oldFile2 = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + + createFolderIfNotExist("D:\\fromFilenames"); + Set filenames = new HashSet(); + filenames.add(oldFile); + filenames.add(oldFile2); + Thumbnails.fromFilenames(filenames).size(50, 50).toFiles(new File("D:\\fromFilenames"), + Rename.PREFIX_DOT_THUMBNAIL); + + createFolderIfNotExist("D:\\fromFiles"); + List files = new ArrayList(); + files.add(new File(oldFile)); + files.add(new File(oldFile2)); + Thumbnails.fromFiles(files).size(50, 50).toFiles(new File("D:\\fromFiles"), Rename.PREFIX_HYPHEN_THUMBNAIL); + } + + private void createFolderIfNotExist(String folderPath) throws IOException { + File f = new File(folderPath); + if (!(f.exists() && f.isDirectory())) { + f.mkdirs(); + } + } + + @Test + public void testOutput() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + File file = new File(oldFile); + BufferedImage bufferedImage = ImageIO.read(file); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + // 输入形式:文件名 + Thumbnails.of(bufferedImage).scale(1.0).outputFormat("png").toOutputStream(outputStream); + byte[] bytes = outputStream.toByteArray(); + FileImageOutputStream imageOutput = new FileImageOutputStream(new File("d:\\lion_output.png")); + imageOutput.write(bytes, 0, bytes.length); + imageOutput.close(); + } + + @Test + public void testResize() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + Thumbnails.of(oldFile).size(16, 16).toFile("d:\\lion_16_16.png"); + + Thumbnails.of(oldFile).scale(2.0).toFile("d:\\lion_scale_2.0.png"); + + Thumbnails.of(oldFile).scale(1.0, 0.5).toFile("d:\\lion_scale_1.0_0.5.png"); + } + + @Test + public void testRotate() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + Thumbnails.of(oldFile).scale(0.8).rotate(90).toFile("d:\\lion2_rotate_90.png"); + + Thumbnails.of(oldFile).scale(0.8).rotate(180).toFile("d:\\lion2_rotate_180.png"); + } + + @Test + public void testWatermark() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + final String wartermarkFile = System.getProperty("user.dir") + "/src/test/resources/images/wartermark.png"; + BufferedImage watermarkImage = ImageIO.read(new File(wartermarkFile)); + Thumbnails.of(oldFile).scale(0.8).watermark(Positions.BOTTOM_LEFT, watermarkImage, 0.5f) + .toFile("d:\\lion2_watermark.png"); + } + + @Test + public void testBatchChange() throws IOException { + final String oldFile = System.getProperty("user.dir") + "/src/test/resources/images/lion.jpg"; + final String oldFile2 = System.getProperty("user.dir") + "/src/test/resources/images/lion2.jpg"; + final String wartermarkFile = System.getProperty("user.dir") + "/src/test/resources/images/wartermark.png"; + BufferedImage watermarkImage = ImageIO.read(new File(wartermarkFile)); + createFolderIfNotExist("D:\\watermark"); + + Thumbnails.of(oldFile, oldFile2).scale(0.8).watermark(Positions.BOTTOM_LEFT, watermarkImage, 0.5f) + .toFiles(new File("D:\\watermark"), Rename.PREFIX_DOT_THUMBNAIL); + } + +} diff --git a/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/template/VelocityUtilTest.java b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/template/VelocityUtilTest.java new file mode 100644 index 00000000..8bae0bc6 --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/template/VelocityUtilTest.java @@ -0,0 +1,23 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Victor Zhang + */ +package io.github.dunwu.javaee.oss.template; + +import org.apache.velocity.VelocityContext; +import org.junit.Test; + +/** + * @author Victor Zhang + * @since 2016/12/23. + */ +public class VelocityUtilTest { + + @Test + public void test() { + VelocityContext context = new VelocityContext(); + context.put("name", "Victor Zhang"); + context.put("project", "Velocity"); + System.out.println(VelocityUtil.getMergeOutput(context, "template/hello.vm")); + } + +} diff --git a/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/test/JUnitExecTest.java b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/test/JUnitExecTest.java new file mode 100644 index 00000000..dfbc7830 --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/java/io/github/dunwu/javaee/oss/test/JUnitExecTest.java @@ -0,0 +1,85 @@ +package io.github.dunwu.javaee.oss.test; + +import org.junit.*; + +/** + * JUnit4开始支持注解,本例展示一个单元测试执行过程中,各个注解的调用顺序 + * + * @author Victor Zhang + * @since 2016/11/18. + */ +public class JUnitExecTest { + + @BeforeClass + public static void beforeClass1() { + System.out.println("@beforeClass1"); + } + + @BeforeClass + public static void beforeClass2() { + System.out.println("@beforeClass2"); + } + + @AfterClass + public static void afterClass1() { + System.out.println("@afterClass1"); + } + + @AfterClass + public static void afterClass2() { + System.out.println("@afterClass2"); + } + + @Before + public void before1() { + System.out.println("@before1"); + } + + @Before + public void before2() { + System.out.println("@before2"); + } + + @Test + public void testAdd() { + System.out.println(1); + } + + @Test + public void testSubstract() { + System.out.println(2); + } + + @Ignore("Multiply() Not yet implemented") + @Test + public void testMultiply() { + System.out.println(3); + Assert.fail("Not yet implemented"); + } + + @Test + public void testDivide() { + System.out.println(4); + } + + @Test(timeout = 1000) + public void testSquareRoot() { + System.out.println(5); + } + + @Test + public void divideByZero() { + System.out.println(6); + } + + @After + public void after1() { + System.out.println("@after1"); + } + + @After + public void after2() { + System.out.println("@after2"); + } + +} diff --git a/codes/javaee/javaee-oss/src/test/resources/html/jsoup-cookbook.html b/codes/javaee/javaee-oss/src/test/resources/html/jsoup-cookbook.html new file mode 100644 index 00000000..e1beb7a3 --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/resources/html/jsoup-cookbook.html @@ -0,0 +1,107 @@ + + + + + + Cookbook: jsoup Java HTML parser + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-oss/src/test/resources/images/lion.jpg b/codes/javaee/javaee-oss/src/test/resources/images/lion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d10bd212f4d4b70edfc239b0a2e78a7815914798 GIT binary patch literal 16791 zcmbWeWmFtNw=O(Df(L>-Bxr&LcL*VPfS`lBWEk9?ganrfG7vntJA=EsOK=8v1|R(6 zJ?DJ#006)QprCLAP@kXh zo-fMh3*h15!D(j+a&_Z0cd!FIEdrzgXsD?Fsn6xbbA5^V^5u&cFR?K&&@pkbadC05 zad2MY5x#zfM}UWe^P2QE0TD3?2?;Jf896C2IUz9#@qa#og7!S-#Y?Q0FR_SU;k+XL z-!4z>00K-v51<n4Yg^lz40_-&a z6$K3q^#$60X8qjj_uLP7LGY6BEw>apk(wz6y%RCdkC;qMhEJ6pB&&{zV|G&7Ne*y~Xix+4wF#dxJ1=Zs}zzJTw ze9MhaD5ZvB>O@4(^8=IkQ%q)M2NnabI)cQ^c>TMpJ{nU@6^$i}GLm&UzyUHQHuRt3>r}=$*CakYYnPh;!li zP5Yl6+`+E#Yhw0w4^gJh8u1jcOYUjkQAWvu|EubsimCr>;us@b5!|w&$5e_HJ9#!+ zsmjHSUPAVi{&TDU5JPkjIs)5E{2B-a@~5epz);}`t4TnWK3%TU696=;Dmzw?h`Y8$ z6SLn+`cT~rvN98#`*i%agD?-P&&YeuO>6M2k0p@K;=CN?eZ){el#?fUC{xrU#zohtpb=pDpm#%)XbX6sPa0r5`IOQ#t z24GBGhsrr+y>a&a53j0`5r~j0wQCpZ|?f&Y9zz_-x@1lEe@>Ug_rr(pgkKy%w2|G9& zb&*)tO2fX^_|CQm-`kpSVg@swivf}W%E*<&0@waovlrl+Gq9y$_@Vdi)me6SFDgWF zRBOR>boeffUT8YS&Acv>A4Dz9p$r{`et@`ShSEtHa(64lZ@HZiFC6dBsu%M1K8twh zvn}OeeyG#*P8zPb8;D`npWJ`Cl?~}0^O1A)Yo&HaT|Ki5+C%CY+kEz)K^j$Puj4jt zlRZzhIHadG169&)M3`?Z)Ss#rc1jkrsRvf8sGH^(okztiBep228C`!b_*sA3!WKCG zb@;9NKt}3@bMik0QMT-J-mAtZK%nQn)B`kO!%&-+2kD++t+t**uFb`);M~N?ao^|Z z?^Gk9$J_e0S@gzyR+-<`Q=g7)>OW-iKQiY4i6~#S70rW^Eup>Hg+{{(v$gIqeATLK z6`D~5QtZRsfWL$afUg*P_=i1DfEOXgB%btBJpq)LNBW&CUw`D(B6{Ovy8P^OGQ*XU zEP2Oisv@7T8$Z5y{X?irxSvMQ~pw| z;p7i`tuD=Fyk~XL2q!5Lrb^KMx)LGyEkVkZ@=F?AWNY-;hMs?P`g=u-4~ULy-v)VIyda9D&jUY9%QaYEchW%JiU|* zTVKpmqc*R#yAirRfeD*On&vvN)zqbswg$UOu8}aw54^~nz?|1o9pzx0v?9eB3godR zRL^coTH?)PuW@xiFAcw~!z0xmEp=lwR#sgbq8m*yffV}joEv=_`nw29#2B7Kmx$Yb zci}QD4zwCeO~)=FIrOEtQwr#K+iZ#0kWcBB#D;+$nfAc^-ErS~=if}19BC=_0{Nt{)tmqf5lGfU%LP zo~LuYV8%w*##Ueo!!_n&xIYQ<$~<|lN2}4B&M9y(TiItw<3~Mmf@+0Czyq(yX@}_h zOD}^upk4KT0y=fRmc8pL^)8Q;6XCMXXcI1@HAsA4%Zp|3O1LFCn*%@XlIths3?#yG z(w04Wf5L*7sWT(~vrZ(@MY<lZ?HOrc>oF4{^D!02B*N47GZF&*}^gVMf0I)<_vk z-sD=d>>|+vx?d91Fqx6>2~zjYsc}YT1?wdcdaoeG=pAKq_#&GGJuHeC4*l$q5tKyBZI;QiS6y$?)Km64Xm`vp)u^Mk05-+are>fnTWLhM$SK- zH*q}CS8OwAjOkCrcUzO(+GH~!l|K+_mt$o3;13 z6TcG9aZ;RR&GG!zF3L*>c^k%)^I2Sd^Gp--OVrK;?@6ex1Sjr6i1}82Ux^962VUUB zuR00FnkjZ&%NdgdEvqKe*9(?G$-0a&@uX49>0dq-1(;+S35B|JBa=G6`c_FYfOEb- z^XC6DVP4ps7Dm{pWjdmKF}Wf^UQ=il9uaHz&2Op@Tqm8cMqDb3b_LnlmX>bLSlpz8 z=$G2vw_Abn4}^&vz|m+*w*+@DOIGIJo3CZ@;d%nGqPdJvhz1e}ACX-U&Vwf7fPh;O zZL{?@HZ>9fM2u5%g&kIzKui*-`%c3)l!?)cz*)Y57>C$Y^OyMPh`Ug&%glB{c5`O5 z*FCGS-gqxQR7VSf5gqS*$@M2D8e@faI?YJ=^Wrzx*pe3v^?33qE_3|zx{7>Ind#o) zSY}4M#aJE@Z}*Z4s9z3MOiKOkri9gGJ#9L4jzU(tiTwo-0Lj(c;&rYdC$=yb(<;d8 zN=f;I@$37~7btt5vtqK8Ns`BWcuAO2$^bpi3jZcFV|lqQyaG=`58sdg@X&qcaLYE` zzn0vTjHNXLGxtT9D}|;*<9vgH#y)n5VK2P9y(RjU70TCQv?2S4yG|+e&sJ8Fhl%$# zERA1?Ph=K0v9Cul1!I#hKYY!S)FA_SDSohJEG{zG2T^xQ2BpK`PXO%sdv&D7`YMJ^ zogg=;aXZ5$$57$hV6`0aDWA&MstR0^ffs?ikv}KfJmJZ4X*kLmY1=i^th-;^ZN+CxW@c?s(`dDKzL|u7uu1>H z&D6gFEj#gY;>{bb;(S4pgc1xk2`b1CC!aSWP#TScz60ZUCz9gn9Yg%dvnA|oDb~=f zM<%@?yY+X+dow6?0NJv9fG0+Yh2=oKt>Q%W|sg=_IeHi3Dr3 z_)yxEBnc*(`BI;;=?orjB~*>Of@kEnYkuEYXtd0{nKA*TYwAq7*jw#lXdD^X$M3i5 zP)_ADk43ROl-v3m-svL2U3zYNwB#_|(qt`3_UloBV(Ug+T%Wl;7|*{afVGS=*j%?m zW?_L&@nDrgOmr=Pd{=^e4)%G9>oOjC$jN9|kr?@-GVEBPJh{tqQq!_OT0urUdeTsa zp!>9uSkecKPSNWrndaM^rpW6UJ3XWB&b7CYZ1g$u7xgXBP%1vClh zZYRjz1x!{!p(ZPPs<-ZWlGeL6srq7Z2Jdx(*XijA7t8!xZk+TL7dWPD4^ z7+xyceQTRA>5LSmY5P%Vm_44US7THx-OitZzq||N06Xh8wEvE#@hg;tr9q0b)%h7f zv~g?ty!gS{a;Pux6l3P5fia?krDNDt5EzIjAds%+g?1Yem#?Jj8c2`_b1nYz{NoOy zd=}|LTqq-zPV4kNKJ$p)-|Pv{p%7r{6<~D&A@fd11UcBPNs=o|Fa7OS>Zpx&y{jmFCs^gtt8oV`{n@g)zv{MS84k>^g2o?!5Wl5y>UUeBS3UsTv!OQ;T`P?B<8BAaMl5XXMC?5Q&40H- zF3QK80$L>1JuP)z7R?X9?=CXJ{HZIaH|X`fW~?Hk>mQl!+2Gv#OtRU5VtO;nEd9|% zD>HU>lR{Y!{p6Z`BXzUQcMU@tqmK;JHz`*kNZ2U`+#&L_h-{(VLy{L}!ar3|J%$lE zH`)?#dFzjjn|jcZOQVqInW4Sc!Q*TjO$`J`dR>1kWT3>;S^L|1>(m+t6|otXrkh3U@=u}3$k5oy&m1;Ow)Sh46U zu19Q-%oW)zJ60L{eMtZP!PpZ(yI4kVA$hWUJhe^`G$EIbl>oc&!rBRlISsNI3}SE671e{$RObp0(eQ1UHM{S5BE;mMcaZ;?ktn z2_<%uwDl1#!pB)j>WhCSB7K3SVoY`g zUE3W@H%t4eCP$+R2iMT@GS{}F2U zbvh2R=#Q6cb6w`Slnx0j)j|ck9!77+ImF~p<=j&OU+-%aGQfOKYHWba{K6_M8~6~8 zRvM(*n_opst6cM?8^^peZFm_`-haIPXOiIscY1XamX$M%HPh;6!j$j1+eVH{@Qr(0 zhtOMs^V_02^A-E1B`KOQ$c`rNsKL)B9Ax-3A(l*ilDHLX`i<Hhmy_hu#;Ggt*LXBwz6-YVcZxzXp(H_cCG8Dru2DX!h% zvOKU)>uM52S8GwPGtqUXvn}>&?XH~KGmnN7t!bN!dlc}??__*#*ew4LI=?^DEr**X zZ10x~U&ik1yyZ_%GPSz`>+5to{k^y>k1kaw$shGy+M*EHv^o9$;GXJQE>PEaLX=c& z0}({dAV%rJ^yv3!O={b;nHS)YW%K?Qw?sy>#-W8+Y@#ICu@Q6TyjR?(aY(#tL!|yX zOvFEn^UGC~OHi=o?nIgYm5Pe^h~E;oPLk|t%sEAgc+Jwf`zp+%y$!`i67ycEgbuJr znNaLtGx>?3RwtD@+W997MR{reDG95lVhv=hvZ#gWI3uYI%^&Mt6q&Lv%7wS@-k4Sw zdd%+_1wz+ms@mQ0S|gEw-QroZ3V9ox%0YvA%!m)?uen0n*5U(j?!`AsCACG$$_w{C z#PNQ+{h>i!FNV4=;?d`QKk4vexk{Ivc*7x<)7EDT%ki> z-LilVR)1=wM*AcEEYqCZa==#@EMa|te3?PkB&VoiF+&A4qsEG69z<#m(dB(Selh&Tc+b! zI+J+1-C{tZ_0r0l+@^J4IfLQdH|F#eOAF8F`Iv`*2e(Vt{kzX4e##;T1hg8fPXG%@ zXh>(eNc7;k)0MJRCGOk&^eRZbm_sMhI7 ze3=m$_l&fZr_B658OS8PMZbhcZHJn^#~5dtYmuaD0I}B{F#vkKx2kcrvFi{-NdjqC zMY4=_mC|=Ad2#v5`Z;v3E}!sIH1yhUFA(X z_e_O-1p`+RdG1WjU2zv9zMn55V(y@nPFZDj60r{{Vzhi|s2h6q5k$tn8MvlDi$KQs zPj!R5M$TFwX?=ovzLVmmuR}fPT9$x=XJ^%esT$ubd#2qh?45$Cf1CgZa~r-YGbAK{ zm>a>tX0mHt;-UQW%4cO73VCZ24!yLri1Kdmw>J3ODJ8>BG^qfT_k3R@!*pEvPvDi& zsb2P8(SbgYDg1CgWiikdEq}u_-#l?9#Gp#Q&rudNac#Y&h#`v9TBwPP}OLmHV;8!^&_1L98qrhB;)wiVv( zzM%Pw_8ZS}8SA=mmavM?hW$qWDh%-*aUIFfR;$Xnsvg|I zEIBYZXV<9xN$NOwX`}}(-q7iZr+t_PDTlmx-PY+en=3met)84p(f+!ovbPCe4ELx!ty=>+ z_P0}8)g>Z*a(#ry>CNFFcla60@vcuyykf~1b^FmucEXtV`Q|0RRZG3V+TgDm!b_Uj zLd8DD5yB-4nm!uVCD#UyyZpq*@kd(9zVA6{8m_Y%Y}w{Wtc8uUat$JgYDfk5D~;;zu?+NjU2ru11kk&^ zC($g(J}Vh|@mS5=nEv)o6TD-9Oez$m?v5p)3gFr^_;a&TmOqO)B2j&HVm~H~w9Jty zx|bhcdqYCx^+)_F@(G}L6WMdtQR`>u^{%&XfqUdffBVIl;{Dc8x?T2GPB~lB?Zfeq z<09lyIrSy`V{=`7{^6{5y-vMwooZd795?r8XY6=vJDCB7gLky9!I{l;Z66q3 zN)4#fcz7(nDF53r5mnCHSFF{)+LS)`r6zX$YM)Ktv-djL12bHFK&ZSdJIEz!k1gHY zuDVam?#{-S0qJQOece;BY9M$0cT!{Qw-3?O8UGO+L1IlcD3Ub7+ao6Z1bC^1FpP}l z{0ZkU)_6RuW0Yz-m~9cVEL+GXg$WsIJYsj1wcUFnu_ve9mp!(v56&@u{>?d1l!!8+?~1KB7FZT0>xiEiN7`iJ}2YT2TEu1?35H&a06 zX0^HpT6^F^s~pKEr?~OUcXM%aECqV4a|vX$MvgL`>esqQQ*p6$S#k73Xx6jP)LKrp z@oA|mTZ_#rl7Gwa!8+b}*AMqDR&$TIvqyo)*02~&?^vPSM1`W-n2Dd0^2qQN_#xN& zZvh2Sj5T@wTWKVr+{~;hRA5uya&+wHM5MDV#T=WMFVGtNnNTJ#aV< zvEH}`W=!hP7U7*ZI;Ia|_`3S8k52CvsR5xE^WvbA{Lr?RX-w8ERqkuvjPSN`Uhwo# zuKR2!g7L4K7d61^VgG@bzDw4%%u(SigI)@|hx}_!%>A3!C|4tXT$NWIVG$YJB5%he z6La-`q{QwD&ynOa2S(pU%{L{F{hri*74J-471i^;hx*r9vIN-#hueeu%HY|JE0Xa* z^nzHgH}vXG@_RaQEc-(%=yX!^&#Rrq$wWcv&xekZgkor!$XB+<7cHRR9LD}IM(y7L z?S0Y)@fDAgDw~7WD^CD~azZZUi%x5QMQj_kqt*|9RW;b#)*@`dr zw?JE)FQ3+Yztm}cny)yt9Z=+d^gs>lG%Ip3xO^{@pV^@=Z(njPU++s|da}|gQd=dy zuk@+3NIW{9z7if!pr;OvY0hXemsQ|-0Ap)h&vU`09j=D*mU@>r%x@`IaU`#P*#%Ez zU@pfitiHkL1ok~#fG-Lp-RKPYj~PD7T~#nyF*ssCa$S3N33v68QKna1#5M$ho(ZZC zxN|BD%g%B!KYcGuM)1FPL&6)uqRt*0k2m~V8<$;_>)JbW@_KE;(TQT{Fm70ixlgg4 zY@ZlW_*ehEIlAwwb=a8w##&?^7p1=Xk?tSzOk)b z)33MEEc?9gNF=OX`n85|Ho~3&(aZP^r9>Rs4et0dTtoOZZF~eK;tCeWA5@=dLl+^I?g)yNL=h;&0v!J27O~{h+2Uf5*{lXNB<{-Ft3_WXIhHOE*Yt7<*7WE>N8DX5InL(DbJ?XJlNCNO1d= zL$L7?<|1C%1R`hE+srABH|`1Gm;AuWwItCRfXZ)2MY=2g(oO0vXY^KQ*Prj7lI4b> zA`3aQ6{Gn>wqbqujI5`y?NY^Q<*2XVEYW9VQ1*(bon}43=0(?i_RSp4x87VF`Kx^L z>7e;5=lYd@=0PTH#<~9HMi=|_91v*1ktjh+LF|?A*kJz$;mjVn&#ra3QH)wrKdy_| zUFzAEvZip1iF8zCh5uph{nVfGKTVVKOUJ-i*od zS!`Abr_mqYgyjg|Vhh7xg5;OguEKW@F1Y5O0Db<9ZjXZq_c~Xs_Lw6|Cdml1hOIyF zJxOnQV~xUwL!(#E%H(=)a4No};FsM2A9~MycQ6m_rx|_yylI*-;$#r&lBpwekzdPY zakB9RNlpHg1jB0D zA8jj^NE2$amZi~@C|Tb!X?5N%=j;x9poPB;O_i)#$HDpg{&Iri&i-3L*9O%BUxHIv zNn(%@e!Z@i_K{Ux{mWL1Bw`b~Qr}<}%%vL$eG7U9_ujrB!MVq%%WQLUr4ux%zifh= zkroe6WLBGqmp|+CYel)?Xgs-GwzGY64#=meV}{1cXg4!;nf}}G%WtabWMbaWNmI;$ z0+w9t8O`>1lftx6Ji_f}h197Z?_U@9#>$7qbRGkq08#E8?}|tEP0>>oIh^uVmzF^g zVh^&{J=Adptijx9DQIHFGEZfAD5&L^-^*6c@ZMiM>bm-gTXk>swKGdIKwu z$ec3u9T`QLb!L2QLL^e@>fj-aZ#DRq4Y|>-J;e-ZuFcI`%czn|WiM#?A!c&X;~y2b zqeR4nB~G!vzFVJf4p$Oq^;0|^9Gw(M-}b;F{>Eb%)>&{VELrN;0+Q<7OP8RH&;9zK z@sJ^DX8gjJ3kfC*_kZ&ZfsE)r?R2mTbkr05n9YQGZR=J(QaN9pt2_0p1ddx=Ya>S5xnCJNj+tFPF8}(6)a>FV-vArMk8Z`Gy|FMu%tcMITQQm8g3k|-)Hkao+-L>KO!zlY`*Meq@I4_&4lw9|f zKLITYgg+M-*{JQ+@){1s5Odd*bX65FW=z&?#y?Eksl2Lzq)YHT8|c>UA~K=S&$ror zrBLDSk7>Vdty)vwciahjG3+|l+Z)aUW9dB`BqFJ;a^nGYbV1C9MvEFU=oHz2R1b`d9iuC- z(n`Z=DwomZrUXAUGTmec7nA(NnD_8<`hi|sgCc7mNJ%}L$SqpDxLi7zMHi#%J;zC( zYL}@KD*IJp8L@ae5u&b&!m-HSl7k`>?)#IN~81Z+>7<#Hs&!?V503 zpdncPYKN`kx)5YLoH@81ACZnSo32CKt5&m!KsnIQ``a>=NE8y05TXjQyAnF3qA62Y zP~Fj;D&}Xa9)mK0324Z^Ov8K(^{IAhmVP9B`56-}zj?2_(E^r6Mr7^I z8d3SFOrD|{tjPZP_8`xIC{~lN&9obxGMKh?jlw&-de{&k?Vsam4ks_dQ^7Z5jaBz8 zrQWBWtZ@@o#X(MWw$b>$EgZ;KlR00v($yZ8VAsiO5k7U_5qqrum^(rdloMmHv82|w0uBGuK548IBbM1# zywkiNr)+YuchZd^U#p$XT%v!u;o%GSirmh%&*h5DP;ZYZH%$4K;*=vH3P`)Gl4rM7 zEEPTcC9Dd-<1?$CKXes=gb8x6PzF`iv+)tiHIS-BdN{C5K&f%}k>N$49-=nS| zPH`|E9?q^H%qZ}|+YcO8+=5d~#^Uk;c|u9u$O2Urwg#uq7`jZ-+VXY!osQ zwmoMq6Ur+$+N#)6&*3ug(mujw`qXYSIT~i}`+`T0UaHD1O`D-XgZY{(G&=WH- zw&I}rA$Lq=XLJ(@F%8qpkT|HV`ZplvG zqtxw0x!1K!e~h@o{A4ISt|QYFSSC;GE^+wY^t#aBPX5!PPg>oh%<(S$Q~%QeZ5z@i z4*p!`1tW=Qw5uU~`-}TV>FrRgm$^RkM&`(I?7sTa0;rBq3adVe%=PQ>f?*T(g!1oc zUD*k$Zd$4{n9s|)*ez^>g$>6Sr!@~?PgN~v&ceI?T)6Q|qzgPRgg-A4j2@QT(|83k ztO|QL8d)T1W@497wTiSB)|x(7Cc658v_7rtUYPs-rVZ7d&MI7~e7VP;J7XzBYH`nK z^NjlQ+arcdn1namp9{L+Cjbr~*RMwLmBdV0M2A=~Xu*9rwwC+H4G_Yr#dWt+py)f6 z(h#83^0Svz=8}eS(M&taCrME^I(*X)3xNp_D%c@KT=`VXjSzM)x zI>ay2dTPid%^QB3iN^230_`}IiGduW4&9VND?#wkqhtrz%D`jvoO16*ZI;UJUYADX zrpY(=tl2rvCg$I`k#o2k(-*n4au&ubgda*AI~%wPrmSq|WUS1awg7R5qH~5q!ZlGF zN(-WNtiG0~zW)5ru~1Oh6#GE<8`YId$uvJB^pqc$o_f^3g?HU+a3IGh#-Fb^^+ajN zem08=hQfUGh4hnhaGn4Vln0R7bzYX&4OC}5Yui7^ldOvXY2B%3l}v`dLZaPq5)Hnv z-Nz$#d)j(iH0=C6szQ=T;(mg9!y}JrWsTT7DWPE%t2AOSO(o~~m;Lea z_Z8*+B-PM`vFMgq3d%Ece_T~=iwVoB=+Q?#0ghx4iOOMlDeLI5hAIGAbBIZ%C;tp} zmHM+MS)%XNI@e+oy!Ou+I5RJIJ))VW&7@XB|HHL;ldnua)^$ybgUF8CVTWw74;`?%1sI?#G?^;B3dyJmYc{7;t`)g^#Cibd@BJRh zLDsG>>eZ>eZSstCJUNPVZoYLZ*RJ)!w?14Chw3Qk9Nr6`Zmjop^uHZ{r1xaq=n*ks z3%!@lZQc89p1F80cUDdV-!+@7c@Cbk<$Jh#B$FLwBNFvA1sh9OgY9{{^-to0Zgurj{vm?4y^`E|Z?e9U+`-EFaEE+9io>c~AOd@ZElF(3(dA*o z2zRS+?&tQlEbg3Ip8oOiPV%5$_O7MMZM@!I8F`8Mu>C-)Kg&X8KAsnLnz$+fa^e(Z z_cxh<(k}qY38SB*7V^EBVTKNmA?v61X1e z5-A=lLI2PwX@5e6Jim%M#Y8%sqIJ_!BaFhLD7zjBMr?d^xb71i1P*VA{%o$YDOAby z?rKwimnv^o9PGc3N6snCl-In{9@3cNvgbQe9JFYFHP=A1lCji&GKTI;X=?+5U%dWE z|A(%wt0#f37I;_(FAr<9a33n83aC18Pgs{CHlVFJg_h;@6{#Q8+?#tJkM@iO z^)VyF zoJ?| zfzAAgy34bp%70ev-zRGHdUwlD&ZC*C#*@tp@%G+A?`0GZ*Dn2RR=-q&m$l)xZ|+uG z;ETJWbByms2FJ|z-lWNGdIG!YqBOuUtts#eFxVU#d%9>FDPFvbK(c}iOI6JhD6wq4 zy4`oP6Rfp&TrAF4TI!|aK1cuQ6|6}7RiVk^DE<=cL!CZZVm(+Zl7WeI-_U8TgTX>a z_g!x`+oS`f@b;tmoRXDS2AXJK^*< z)HfPdF-B~5tIQL*59HMKcLA5yK0NkPW+R4&D8vk{-}9alwrKQY18%z>vAXWQ)*YUn z4z9}2+S~m_U_@?(D9uF;%95fAmcqu84+ELP6(E0l!f#aHvkn(%ThdxgsM&Mw-bGyH zA{pG)R*9C3^*Z}h8bqg~flI)i4MZ7Hv+5iV`)ulNk&AbR_=_9N(Q%PLVLH8=?F{bA zi(=+KMS$g43e`Hjsl2@A0qDxSuFjjz^x}KwhGi0FCY%;!Ni5GNfDyuPA%ZOrEF&r2 z+~+J=2XmS2l$B8lmn++Aqr1@m6~>iSKUu!v3Z;7)BY%Bl2$B0K+W~UNZ)i)&zjvyV(a*4qMXkpH(MO< zI}*(RMmHeXeQEp-!zDd0B8OSvQ?vbMI5jkiv@_^c!a)0T-bw@I^gt74H!o| zGVMss7aK*+-H}t~hI~(H#fE8E#J`e5lNU{*<{o+C;4CPHo$4oSt>st=#pewEBZ1`6 zx&ni53ASPt47H6JY3cQ}m-CnA`yU#7ob+f#iw|z|!%or<)SD7c2l}I>&+^CJ%Nlib z77lOqG_{z_h-(0-T`n0d>Cd5%lSl><^GaO~EZp|M5}{rIS}y5l+hZk5hi#kJubVM|3VcnPq_(Va zK`+wVlW&`waE2R_Zle8??-YE5c+ZrsS|4&?k_#Cd{^c8Nm75@LYnAbmk;YF~3%1Vk z9vr0TKvcW%UAerT?uA51hNUsKOR8pNA z42)bC7AqfuSSj0>CG`GwmQvfpYwGP#PS=Sy7N6RoZyPW!N|M8d*HifJUu}qcz}*|r z^RtFI44l}x;)vVba9baQB(WvGwPD{&2fb~qS0>VXt5tHGgF@4` zmn1HCVC1HVcP-bq{z1#MoMYmUjrE356!(bgJHrXe-hn}s=sc~oLAiQq+GT68S)F@q zPQqqPz1s^n@*~~)0o3U@b6iJRSy^z}ImzHWL1eXat|v{wb%|kV{axYPsf{0HcoTeq zj4%AQ-~5)8zR|weQ53Of21bTzyBX=B(~gazUEu-n1e{TP)FY zK_cA)+j8t+dIea!BX=mufS-nMlIP9h8)8M- zAPYFEh_Q&jr}!cMQ?H;m7(m3uUJ%C38%ui(T zYlt@Nj-&e%+(;pW;^@(jEnO3zG#7hff`O_#fZ7*l?ZTt&lqo(DU{9dmmc-xvrS$rmx5#586y0oOuv-dn^3< zhHn26b_B18D=HsHrp^iHe?sJp3SQkmwAuP&?+LEHe8e?oq-6}#n=(9Q`e}a0R=ub% z^aMyO%iN^f_tJVe{vxR#^0z<^N|y*MXFYd`x#2RD6Z(qs-={!OKGOLIbcjgW(cvNK zq*K-)Jqp_RFZSmgIAh9}M|(Nw*T0|#e;uh6wKi=Q2_on}%3iEVXTl3dEUz5&VbQN9=arDlJ zR#<4UmLEa%5V=&Y5(oHUS|n5SK2kKB_8G3T95f?KN&mXi*V3UW5cSuaF|s(Z&O%ou z4M&;z!s_JoAPbY7a>d0Y{!Ai8`DE8uv>5!*Xg38nUdBoomZSw6k(^v;N-ojONE#|YBQ#H7R^rAPbT|z&;G{bXwazt z(YK>BkkYztxFEZtPC~1&^#JNJ9Hx%W?@Y&OJ?Hbm>i=P0U0B<)e9BT#5~tU=7e^plenCr!s@0$aE!? z>A5y(_89?xaO65R6v(a`B5C^sK(bP&b5EKeSlWHkfSpFvb-yE4iFz6bZ?A`bhfYox zI|QPV7*sB@9b;Hsh!K;AC`XkAD%${AG*kwv>Zde;ir?Dl>a#YObK)$;%1IhR2&A?H)UV^>|Eh|NN=;% zhm(C5GquY{R;@1x2f%5j8Nh5~+}R)sQb81J&skx?Ka?_t4IDLv5)uq36bCe8nH|<7 zjw8$$LaL#3)q>%^BfU{P7R>(w|Cz5<3Ya`AeWPK4)3& z&n9%S@H5wyTgq4=e}QCw|3F+j&m5hhqi{ZR>a58+I`@TtMJzWIK6)jik%l+{C@`QYeVZ+m-^klzg@&Io7t9E^_lTTexEAY<3s?#B^@PlPVLUU*e!HD_>K0;AV5LM z^L1Pm(~={P0#j0iC@osBCt{zh4vke_F?1X_T`54eE6Kx{I6gxTl{ z1k-^fB`CO&mQ-lNv<9T+*j?3;A>od%=7KK0iR%(#2AJ1 z1Y35Su&rnt1I;>V0V_um*EOt%Yc7Um+Q@g^_1#B>ry$sZZ(5S z>#+>dHY;(Wk5l=L6>aIvUur2otd@a0yG=|O1s3q8#e6bi5Msl}7Z&aU53fU7zC2XSq_abDss`t9Y;1m_+5^kiM{USWNEe?b_`K-q1mRf7-Hu}Y3$UTW9fw{z=F8> z40g|^j?-_AM@Kap+wYjT|6)Y~97S)j*NQ_F^?3IXx~W?VE*$b=9BZNXY9&3E98;f4 zx^}Q)F?Q5&>Elc0C-nIW$(OkfjwKopl7}g9q0+U4V{po3JGWeCsZTu5f~vN!KbvTG z-i>bDosO?5V)c*#ks^QUpRy(-_Qiq!PmR+zuE%Z-U!tLHuXN3%zL=;cxs_4Rj;liW zdyRQIetinP>gJ>y!PE0cY~Iu2s~;1iVFh6K6(YoD#UFcD2W&Z}RKf2hp^q-r%~fnU kxq1vN@g17+OFZ6_YT9x{_9}-r(FIcfH{HJk1U$|EU+e&9jsO4v literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-oss/src/test/resources/images/lion2.jpg b/codes/javaee/javaee-oss/src/test/resources/images/lion2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6794cb3483aa2cc8fc06aca4459dfa49aa516569 GIT binary patch literal 31726 zcmb5V1yo$i)-KvuAi>?;f`{PJKyY{0;O_2{1cEit1PJcdSa5fDcXxO9$NvAb_dDmk zd;dG`>M?4Jso?0My$L@VW>P0l>k)!otG9y)|%f zaPQ!e5a8b~R7Ax0Na&~-80e_z=$JS}xR_W3*y!kZ&gfYa0L^0V)_O7zPR*0F4d>gAVoD1t9*5OgN~&=>7YG zgMxhrj{pPx{_VCZ8UP9g1{xLy77hU(_8kKJ+vCu09rSnP@EELLFqI4uC>#T^KF4I1 zV^az%8wItW;ZU(TfwRVG*hMO0vnwao&+#}oMOBQybx@0|y14%6e4CZO|e_!*B z258uKFz|0T1<~J@d|Lwn4jK*?8XD$}EU33GIvhDG#uueCOhd=Ox7EhqQG9M+$2!NR zWD{1#p<*{u2{LvPQJr{Q03gA<&5jO(4iE$!RY3uS&|v>=wAH0#u#qOz1vn?FK`x`e z0@{X5!18UzTUn3o_t)LE7KHA2Jls;65082VFV#7D5zi<|@?Uw@{pIy815YBp5~0oP z8)1#heYgs@wkR3}=IxLwF|yJ0xGyE&FDaHH9R~pd$nb>FaNYLs74Pw$p7o-@=ZTL9 zVS$Ct1CS(Xckjj8%6OZYGTETqD3Tv$UvwWBV`eD2Kb2FR)lY~S*r$bk^`wdTlRn)y z7r5ts&lINpBR`HxZs~yp8;$Cm(YmPwjvb5LQCWozjF&txp8CRb*-tA_sHFT5iX(A2 zD&Q3hiyXur*?_Ake4mS6S@^_1Q_=Eet6I%Y(>=%(gIavsc%pBueB3p6 zWefN56%djh$^e&m*rbJ|qcflCo|Hr{y(vs*dhRqQnlg&F%~xkk_*|6P!TL^_Rd;7u zV+_*u(Li-eyrJ*Mc*8l}<8XJgiQX$CDb*!Qz!1FLrasa-wB}DtS@^KiRN#HwdiyL973I9si7k%3XEI7q~Wbkik zgt{Dlq=tgrjrZyicS;Up%SJU?;RDdLKQ0l|(dP3keInJ3ox{c*SVvc1Hm5m<(KuY8 zQ^V&-?OQBvS|6J$kTUUrr|bgii+Ak;<$2Vo%{Yj-ObpoSPM9q}c~Vzy_jB7nxyNI% zS5>ihB!#7MQxM~|2lxq?Po2~!LUK|Ul}qk-MY4j^xG~0aqipOW%3$UmOq>J{%17?t z!s;T<$}{RE-#{W%Ha&zBfU(dsl$8A%Pg(in1BgE^woCX4@76i8dyd| z5fhi(5#8uwoK&!7aJcn%sJ9yudSeqiFKziA;x^fn=}e~j(HGP!^R@5d^h?E@uS|k4I$BdOf)SpHElHg|vsa_CO-Sal(FcIf7`Bj)z_)S4!AY^Y}tGZ>MC zC&`cOs1l^nRU4_sheQ<$rcO)PE&fqBapOr(s3wP0^AOLM7^@_0C|S|^9o~&`*`OJh~0&^g*qUr zUKZw&U#`Z9%*JN4%#WLP>0r@n4dkJU8Ml7sbDEfjz3`=u1R%;Rw z!`w>|r(nFP1H?wY&8^l?omM|L$SYID^)jBmibIY~7;hu0dLUvPlFIp8TmDN@;i_GI znc%3VT`Rlg9sBLhcTty)Q~~(Gu|*+US6APcTzjpcr~|iW20~kDIJ?JU=WvhPv5&mSM6AizFN8W zR$v&r&Li!H#H}CR8EWvZRIqTLGO(59I?z-Q5DAhHwxWR{ovSM_`TaJZT}6kwmA4Nm zt?}^MV1(v9=piLjeYN%78_IQ1;8hP6Nxh1v&PoBMsTM?jiKr3u8@eR9+zJa3#paH4 zs*iu@B7bGj2aq8^L-(B0GD7pOHJzU6U>!G>iv0A!t}}Fu$f*0`@csMS26`+pSTbGp zV#OXfyIlgck2Kr=)h?ZN?%9wQNV$KNb zj${d+@&NEQk8`=w6jp%%4_yy-&z$3aLq@`SXmm9M=k{M<9{DUua0iL!R8?0v0EX5@ zW{$>`qe?_VYd*TVzG~x&cK>Pj(C}7TXBOOr_ZuR=6k2a)WrY~VCJa2E6B163aPI-7 z+F&zeN2oW_F*p?Pi(1RxA0;t?c5|y)@4#j7%U~nk-BMnZ#m9quw61v>H#ROWw|EzB zYlwjR)~Yg15}sw@yn+IzQ84F4c_bmbzo4DGb6npb+m2K7p{oicj7D_I8lx{{MI&?% zEm|C73m0o@Qr4*_8h$@DKvO`xmYNzZC9>2SM)$<%-7c}3cO14|u!Zl(zok&+0~WUO z2SX^8hCqj$e`!&uv%751!MRx<;eL{mF%zF>64VzY|MmAZClq}?E#TB;L;F5MY3ZvK zu_)Tb!qjV##4`r=0xv5@ok1Ii2XNH4glsD%S7A;WsX}^+QGRn0V~6HNO1-QYQ+~&m z&y{3(XlM^fo!HCesy#PidU7FO7=DusgG6*EK4~lD_eFej3^B6H(+k;|zR>rF)AJ)* z__b&zufSILoZ@jU25E`Ps{W33Bc~zX(~XD+>!87o1cSqg()RGp_yO4IwF9i+AnI^?h+$ep!Hw_N-EYSH>UK>u-x->M#d zuZpCz&|L^92~S*nBsM}lolqjv)hzQ&H>&`jVC|dZZ!Ce&1E_5T&C{07?-48@$>50V zf5ZhI9vQ6P=}%C_(&)r4T`^N_ffdp;K9#EJ6pm+6P)BEVMF%{9xcbg|*z0>M=(Erg z!7lMTm8i)m4##so>N&BiG>O?#fR$kY)K+yREmODrvR9$1Dn1+z4CRmy$PbYz8i(v} z>P?04l|N*1(*450SNx*(_wd`BAx9^tv8i;j%tnxchbw>$X!Y^fzmOtZD9w=VV+ZCy zu5RkAs^!FS)y{-CT!V5P3#rAw8|XIp$5bV%q8m%U9B#*~js=K6<4{slw&+fV@D0-s zd^}JAdL$192#m$K9Sq2!c8BFvm>cogKA&{C!h9v#m?BHhI=CQN+uABBS8wMP;GR!9uO$9iyN9bB|8AEGEXDA<>s+s> z8+yCh^O~2R52-pgj%_LJX}hUmG|!JAZGoj&$w;yTW+guE8s%1=aJe_*#qCl3GmvtM zCO>XaX~E`Nu12XBII>T^ZA(qauO-t2;`I{WYaJ)hA~Gm36&M7~dL zfB(pWTGtMNG51klCKW&R%*wu;=Fh(o;uZ*rF3EjC7p>9hYoWUlyJRO;(o>A@4;|%; z$O@UCpXB0dp*Y~JN1egS5o+HfkO?69W*YSn#65feiNbm6rzaEQ)=P0%(`^Fne61Y2 z8M0onQS5a~D*h|rX^OV1a&^a8qj$+4$;e`x!Y<|AjQZXxbHWByoZSIgtXya~B|t7#Di>np(+bWl(O`;I!B!P*zMw2(snMpb zk8`)e(_bm}IYxP8i)+Qf)?%3?xXq32meXR`Pb`|89Sbhlz=;W=yeRuA-u3xC$}50G zm$cfh_iWqxT2y}erXKQS7S}*u=3c+6P-g<;CZg5sIq4!MV0#rk5hjY;6 z|ETc_Skin2z~;UJZj!fO0at<%GOvIiJ{og`ErmaKih`3mXh1nSIh4mtP|{yjPadqa zTS(R&6Y|Pg(#x&YiWkL~X7_y+B>56;w=;a4)D89v^`3bMS_G}ZzmF`h%N28o#3r1O zS~l(!V)s{T=RVBFt~bo=n;sc>lN9&t>y=D4&c)|UHTV@*eeue0POsE9w{R5Dq~+08 zHpDJJB)B!-vt>iejg`pv6D=Tb!#P29s4^g&t8vnjtKlh=skZy!z1f=J8W|C?6i+id z_K~6;o3RFp5x^rl1QSz__udq)*?A|7Vo#Ik%WYF{zgJIB{rnGdlemkf`jZ{OpcQK+ zc9GHI%Z}*J@i1n)|ctP1H?YYEb@vBsy^4EM~R&^BFH ze_XRS80)I4F1vWAQD)Ue>j7K)qfYjE6BGr?Z8OD958OIAGD zwK~~?DUeuF{!f0f<$;S-0fsnR6ssa(*7RiyMXFQQa^}kPWoiD%dvJU1piT}Ls z9ohm*?KsM+*qwFN+v@|Rrn~kXmblC&1`LukF&0_x?;YQHD_kAMc<}K z+{SHF#owzaD-Z&SUjaY0gXLJVsUEOfeg!%;88dw+DKSq5-L>~02Yj|$%LzdZrMH?m z(IXr^N?}%u5JUL zO(*3ex(jhK3oW(Ew4GOdBI&hK#kfRIGZ$R3n+_PL(3U8&A;$;6z#|oiV1)ISNM+N&Gu+ zW-gl5JU5+LDjXz!+{8!0ODRopySnP63-~Eep@PQ~h)QE0k5VN=8ZF4=X4w$+QzmCJ z;7Yq~GLiSMyd*b!=Wrt8Tru)TDax$Uj)OR#nM6;h&fc*uZdH$p$;3Tjbac|z%OIk5 zLuV}Zk(C=eR%)HdG1V;;SVJAq29`Yu--7ZiUP2&l^qJqXj9+roUuUVn@B+W&{?+xSqNXWOAW~y!^f%@2 zS3sye+lEvE-S1giV1CegvFzNo80)~xhjZSsF&piXdCwoI?<(%`DXp^}s9NoJcDNivLX-S$#X1+}v+QRJs|9;4NPJ5AVK#)L);)YB zo;;75a4$`PDwvR{hjD{S3eIqK4ZW2;_MONncj@@XxFK6|WWx*R5H6M>3Ln1l<;j6a zd5^ha$1Xpmo}y8;q2Le+$E*`)l*G!pHHZ1x4}We05AdW&IScnbS@}c6{56h34?LMn zeOhIdnyw!)Reg{*#B^BQHkgQUylOzJ8%|Neo*#Pe;_)&3nbTeY&#hdaoEc0WwrkDw z`xms{sibWPhOpch8mk=L`ULjqC}1&10!0`Ko7|pI3~J|8{RwlNUICnmd`>sC zSJm&6sSO03ahuM{!e{h7jlzZ@7 zd}*6#whz44AzOpTaHhcI4??OU}{Fg23}^WShHN9N-=HOdq) z41V3tt1+nI3>Mmi`;29^_1!1N$ib{7arR^OGW=eTUf&YF2APX*dE*R(q{MKF7wIO5 zQQs+bMM|`L$J1#6H^mfafqGSqpOtoUig=7Z8QAYRbgIq zw$EH#Ak~=T$V)^f=`?F3}NysZeXJrR#49#)9^6PEd8o=w` z&*=Tx%SE=yLl`8X(5`7X_x%?JW5me5&HXN$c3xs-&4Ae639`eXOt3(>yo%aXd-Z$$l>H$HXPU|83bYV9!=IaPQfQw0EN{HQ z{G-VsuUPf7=g9)EC9LDfdZGo9Ji+W{k*_$f@iOho0cAXrUVP0^L7HHch%^sX=W=&i z%4MQ8zDZ1t9aCOvV|@SONC*HO@E`>+w7 za<3=3Y;E3U^_^fh6I<6aC-Z}!5ls|wan`Ru4u;XaI(K4+_44)$G6QBYnoTa3z-%g; z98!z74ZGhutnURw5A4c)(fGoM%j@O2H|Wnh5X>=t5qS%5V>~RJi6aQ~Xc|T?_Q+;z z;-8$V(Sa-9j@A8mpN&1STO>SQR$|J)((EGQ6&5e)0-@J^1&=y$uYI4CuU(RBFD!hx*uKIfgXDz z#R^QjV&*I zh}PAvz|vU_ry_r9AQftwxhLzl#NHz~uWo{Yn{p1d+R*To2&;N`qHoSq3ynXgl~+!* zLA%z~L$_fJwk^(x#u40sL*k=uT_!WzQAc&C~v|FSpfNokSA@hk_qW2+4kO4_b^ z!D;tKg%4_QLIOl7Aal8&CjN<|(RLMz5@kB?#B*ifP=$dO()w#6c;_9F#x#pJlRm&Mvy&4T&$ z{Kq3-&7qF(yO;EzZmI~BDeUs}BO`7B0A)R_vvE1{$&rVeDrXvXOm8(iYC#O%r1Y5b zr9#0FzbGnBa8Vd9`^FZ$f*8(|{? zh$p8_0O>Rz6R!BpPJx##x#RXh)1&Z~seWHf)uL;vJbWl~MqK`_5ao+egZ|J?Yxe_g10C!T2<3;uYKry0?vZ7Q`d! z-yQ2u#LGF>yz7TW)%4Kn*5iMaY%~vE{AiC=vVcf=oy;!jPhM+#e{u&lnDcDc7o_o% z0OL!iMifwdre;7~(+!8Q^2N1E$~pyKGc)tUl9CV>iIl|0X39(E0PsS%#FVR)aU(jA z1SVtcRLTTg~COkQC_E~#__arx7f&!w4;6$G_w{_@_ zT{lWSvMYSp{G)QwYFUO~Wx^QMvd6dQYVI_x+pQW4PnF4fsk^dj*!N+8`+$B0^7EKC zb}lt@(;tfoY<8S`l#t{WQ8y-iXF@soJLM^>_tke>kBDi0-IHHOv_3+}*ONRS$@LVQiDjK!7bllx zIU(`V?(1(jTO)nEWRxr@(urT>r#t8UL9>!tku$axy_RhFyu$Y-?pfD|n!zF_H4a=t zHB~3&`Z%!IupAkGBYR-X0E)j2OXe3A8A21eednMwfyjgIX`G&C`-*h9-d8|E(OcX; zukZ@+^~NKWyHQ&!^0FLgjT^~+d4O@xK!AqP@Ro2CV8(Yiv5r8tNod%-(vcHXzF!h3 zw^yFI7BGjQ{Qa@zEI}o_7z=Z}ok`4Rq_9D~&x!#;a$+vU5K2p1hfg`Rb*rn-pj-Xf zrrJ-H_lYy=>U?=s`EayMUo;HD*e;CKSUZsvvfXy~29=~!Z?iYPH<_Zql(Vn^e1+Po z!etxl^NppC;EMD#jW#^jomZcE8ERT>&pt-X>upU`P+-A&Bp*`B>zb%6UbRkQj7rQl z85f`($j>)N14_SoKo#}4REh&K9)^{sEsKpFYf&%?x3Wk)JV|BYvO?T#0c z_atRb%c>1;=4@UL@ke0v|3(GBC5@eW2}%UVTll0@d*YQ2tXMzwPCtlx^PS+|_20Pu z8hO^owLLFOIBF4N?;lq)aIU|mY=ERyn)SARFpjskXnbD_O%)XE$&6w+*J12n;U;J~ z)Z5)0RPO~b#IW5fN{H8&*~zQ2^r|^JnL5Po!+lfoZ{SPqAH}`8(9UK5$hHTl)~9xt zRpgQeQ+@n6j~~;Tsb-{1VpI`~J`r#D7w_E4bOZU+GD6btY?E&tZ`gz*DASI0pzsop zS#-DZ`t*V6nASMv1bxDaSIRaP!>bSA%yt;xHU7NOD2rj+;G2H_JR*Y^Zj@~ux;(H2 z`O6Kv1e-|^=ESr|STH+>wpkEMT?sj$V!4Lb<#$7lWqT9$AK6kxObtgF{`lUP@5nzx zEvG{Y9g|vu1tN=*tB;t@!sL_WWBOx#W*rUF6?X5RaLJt^)j>fD+7^239h|oZKJhG0 z9L$+$Xy6z$(shu8hyL;$z!vt&d~=bcYMr7JA2Afc^Ux?vQxT~tHF{qcqFK)1_v4D(y+vBdB&v3*{Enx)oc$E2hfkE6^ zkxeDWLTvz)uwaP>35KOwHLis&E1SHKhOVK1*M)z3tp6HAW;=E?23LmsS^$GTJuCxt zh*hNUhwRA9NKp$EvNgV(Z5`X3{8#`otqu~PdZ)hSn4#t5LnS`D0V$8EUc|& zO!Q3b4jEi4u;`kAQoWc4e3&L=3!ajub;`_vKdl8a(F+P8$&d4oA#4_nOky(+JHv&g zbMe(}yY0j}2zTZ_wlRUxP-=A}RB;NDSr3Hy27Gl^cH=6=whQi4c@wI6XKy-i_L$GX zbTRC~s;$k$G%a5G0HkuQM-G*Ehr{(GQ`nI_W;ij>x(xR6J>Ad%@>iLs?rhPLF8_KiLoUMz$YJZVQJIXRE3d1`w7z30`{)6f3hm2dx(oIlM;EVlwt3jO9d!Z& z|8Z%a2jMsT!4^&YYbL~uHY**XL&TSa+=SyzZ*06SL@GT>S9^wa@C~srlFi)qju4UMSJqsay+zvrU4FY*?l- zT~x%m@TID{a~ba8G1^(p>+UUB1eh>Hs1W&@&XW!dKWUs#Z#qlIhmzl?CP&sr_I~A~ z$MkD|kATRqJrg`=R@}IhXM^=Cy1`RlLA=UjbJhlG)$|aFB}p{0Fe%MRGNxMp7;USB zk4ZhhVU?qMgjqU#YiqK6@lN&lRug^>zKjfbyH{SA2xFWR>15X2T0Prz*}m?410jZN zh0Jh~-Kd%Ni&9;d=9!uzi&6F?r_qXUF2O^y-IgS2#pC~edDkqf$H-!iS@0ZMO?jH~ zA){7}J82MGwx<7ER1=H>8+;q-8y4y0(t#hoEgqP$zi09vv2-fMz+G zfMp5svo4NBmB6lx3Wdp^qydZ5*^LPbp&YCPoHJ|(cJjN!d|n_k&Jt>o47c!n{vDUF z?ZN+@-}Ddb@rY~WD;NXcBYeOGyypY(PtDsKF*~ymxR!6IXYjJft77IA&{&^Tm)p_j zz+22os0Z<0(b8V&q(Q(q>z|lZSEmeeannh%s+FcEu4Ern)OP#sfI8isE{Scn_g02^43?8~+ zXh!71tyYhX>5kU7*sPy~Cyt0|j28kb@I`e9ime!4x>OCht2K^oI3hIAhj5j?&>Asq zDw1&sR;$;z1+O*lv?LjzZ0nEPXKV|c#VbmDy0(T{0%~V%5jp1D4p(UvS^zA39A8|% zP4BwfFPX%g>2i`QSE}+X#@M9XrneO>K8i5jmu1;06E zIe9VJ6e;`y=AMR;gSD4EIM+0UDr(Q1roE!){M3*zmO}5^Bvf5TTs22AP>oh*;iQ+m zTwaE-O#yYVqRy(f+XKMky=F=H?N5g>?VdHk7 zpdg%XSmUp}U@x$D>`whaL%-FQmZ?rz%-G~)Me5HU8vW+njcH(C?y-)` z$TX5}a^I0B(OYTOa)h0dk(3^n_e;pRx0uz%I+mg?9IZ~lcCx+*+@x5)u!fk(g5_#dfZsrDDBW};gLjoj8ZnbWC4Sl_09jS$4unC-ZP1<=?Q7(4dyKFVum^zrvagM+L z0yxf#3&KDktNP`BEY=1o)L0>^=XP(Ew*74z+iCUQlnE-OqFKkJN9sA6C>dSX<_-bv zV=>iz{PeMW|JfQZ-5#;Sj|>&Q?JIY*KZSb@+@AxKX5<%^Ir4LfPfW8Ja>}G z!@RWBD6Kg@2C}V}!1SxDc!5Phd)sDgEcD>r3&)qwe1at{ZM$`VTQyg_ZIfBs8;wkcu(H@D~U(j!Ws)~&2Hk&7_Tv^#C*VX;x}@@r%xF?G4EMCtkS`n%s#^3hTpYOqF`UDt`}$+1tzPRAhb zp+kD3oZNUw<}nCQ(BKHkHhq{|c4$qhdiH~u7usKanTnvFSnQ!f`O*^FrYjQmIa4t+|>w!mhC2Y+bx z52KE&%b$sZB*e5tuyt&%MnMM21c3@1{D0zkHHQ z@lON^wlrF7OHo=+iisLvM)_Fv7U8O@DZmKcG)*&4EWu8(b<$GHb+Fn7+$Tmcv|XRw zkM^584{Z?=qtz_XeH0P;Bs$Ydj98vPT1)K^cj+>X>URk7uyC7Fa#1}tR~yXDvcra< zg(+3u!bd{?xn^Q~C4NwS@)ll&#_W~9sc*$!@T2dURwr02Xhv@8CiaUw6MPrUe|`0j zyT9vca5b3tI&V#J@7KTM9EUimQT7bf`ziP-N!esy9&?VQT1Y9Pko0~hgd#ONu%=fYy2A?hbprQ*B zRb6plwyL(t-6a90mS}fC^pvvA&C;e5SzL-Ov99w=X)Fja{3VeuPvLEU`q+9g{Dr?n zIb#z|52F}NXzyw`h=eC-r;6m~*DmeW`eNiIw#7?}%;_-j1}(7xf+X~2(1hmjBJ4sl ze_a%xXz;0VDb$Lc?msk&T6nDRXx=kl%TbaAZsm zYUBfvVromKB)wPfYDjELGJXoYH*I^z8Nv_$vZ z$NO>}^^-7*ytSt1KEbEi&o1jw#9k42^E6!W@M|@esivx|Ug%n@l=f>iv!78dtqd6D zOp@cT++D*pBXu(BQ{Hk&uK-H#FZzsS(VWCzEHKNzy#m5vYVI%Ya@{>tL#Zh>yi7+O zyEkI4T$#_$`6PZZV2bu!*L<7cok>bdSDUl28=vHFLCq0;9})BI+Z4=_`x{Ej?GEy4 zSa!JypW(7vxXa3~K{!?&a_pzzf6pVK5=!urUR=bgXiLf4#MMwV_GWkp%*K06W z(pFS@Qc=Q~MeQEx0;TstG*_s;U-lvlfsn6&>Xn+MW8iYhd1F*NPX*ZmXE*f$X-ns0 zAq0d}Q;jQPIv2>!He;@b;f13m@+*M#!|3}^>f*>|_p^rQNJeS7FpV+|$lS`x=uD>B z+RX24~D_zzVn*l$+2jkBw3mN~GXC02KCArb@Vd2p$T;G~Sg#w1I%evp{Pyhv?z=hz;v1da zE1F@Z4lUUU8Fms{wtlL{xUO0rs$F6g*Pk`+G~AH|bS~zor`llkKN8lNU^j^Xn3S2v zi056yR(7hV$8m=#L_+H#Dwpa6d_5h-TcU&pk!U|-_zmgJ@_Mjz+J#4kE`n23?s-J*xyPg{Ts^H(kN=1>$)^J?~hH?ZqSDG>cpt z(n52ia-g7oo;&I5;c~Ev8))z={&8n!M(MrR5IGyNI2b%rFnRoSw^<@*$8eHwuwaS* z#VRK=oaoosXPkS$On@Mq1b-@3sn@Aa456ELGt{MQpV}WWW#NAr>%YhU z=^|-Fu&2wf%R_RvcbKcDc(QMj34cDe>CEZeFi@zzp%j-K5b#-J>(VX?iK;Jym^L*$ zc~uAhTV);73!*WhZPC`rm5BETor%iUsWdgXz_atAj>#oMber0DJdx9x0YbvoA8Hr1 zEE+0}zqsW=m`Sq;Hd_~jTiZx2(^kra!-?!KG*4Q5Q77{Fm@El{aMhh9CIA7uEcP;o z`*(&`6E2tU6beqth1Taf@lhQGTh|$Nx2)9$voNMKc>A1}Y)xcs9RF}c5S3W$0rqf5 zN$HypuBX*sXubNzBi>N9c*MRd7F*VkX?XN&C_#=*zT&Y7Q;Wp!P*4$v7RegU6TeXK zAH*|q?D%_G;m`HBI@4L?Xkl*+%EdrT6P(wV2W|)>?+%lIM{h9izxEErf5W}1q*c}` zESVV8VYd?|f-NT-r;o|gGhz)up@l_{jcjkDbe&T2;hGc$OK;1Z(3^GD5S1921P`vg z0?h@qu$hxc!v6s+ zD6YR7*;0G_Sgeu8Px7-Nw;5-G7#lp&LP*$N0dmXXdrtoEM<1bVU|s>qH+N;~2I$m9 zdb7r>?{p?;J%2$ykL97^9d%;V`HibvW(J<+pz(`Z@NzbH`5GX-0%kaL*Q~9ITv_Us zBB}QqUjguYJMje%`bpK(<^mi<%I2etmU^KB7#7el5x{c0;N#vy-d9EK8dl)&}CEw!l5?aAvk zFKE(XurlD_pSp8SBH1{Rf}erKj7W`A^l1tG5~)1+fiX(F9+U4GWS12tE=bitI5=+| zJZlS+cY@6|HfP7BMahz9-1&sJiL!-4X|$og;UL+=HR3qDdG|}ri6h1=vc<>VmbZd& zk8TxFO%F1+RFuy6Z^sp8;Lq@tR0~KVa=o!*XMgzHV0zL3Q)FQx}Pv)r{7<`!*HpuP5tatkx|ZrZIN>OZvj6ClIP~ zSA-q#McAVHzn3IYy#kyG{O5s+=jji2M+PFXb@GC9h~{sl7%$TYgB#S%)(s{5&a3Za zl=D5~=s%BU zpSl(lsdLzPA+fBzUnq=vR?)C<5*G>}6BNA5*B@N1GDlE*Zx4==Kf?IJo!FeyZEzS-=!PU^2eA>L3Wm>4fz`gxCV5pHSDs=FzO`= z3+;z`0zW+A? zP~nbV#foQ@s#CjgHA(SR55Je-SA!UJR-T1aK^wR)-Am3j zPz$^vUW|5hJjNOoE>eUfTni`B4e0MjiloUi3pL9e zBqdF|EG1Le;JRxn+)LE^uLisG&YHzk7)?GpbYD>?jCBmb@9if4|_qS6e-qYe!T>U_G0ejgBzbh z1L|+xfy|@uxDN2Yoss|A|Nm73qwcM?^a`ML5WgCGk)mHlW&nET*nfHjAUHML`2ibt zAQnH1wv9#5d^7Yb)wSvT01r)B5(2WE$AZMsbSQrH;FJNQp|Ie|6b1;33p^|iho3K1NLiE z+wDA^E46YI6E4Fuo2D;=6T9S17h38*6wxegyCi6I!Nl-c#-k$Dg&f>H@FwEVwB-Nb ztI4v8wN}0P4-YSCPi!qRk-qe!m`H8CX%xwD862vEmZ3 zc*%{8rspAFXZqTy12i%LeTQCB@?U>gt1XQI0m0Mkc`Z8Ft^S7^5KYNT*gA%{dhtb1 z-MI@5h7Zv3XyDfZKX!?T$ zGv8YsaNJV5Go;;rlf^1_;CCGYQcMVIRDfD|;oeW*k8kph=$*>Ia6HYfjDfF&x#37G zVIauOL%y_tHLIqdd zg%O8!J6UYCE*?4GIiDie(bdGE8~uA!4l7WR)1qOSbRfs&6gKbXeIH@iUxh6T3HYgW9^?BVoC`*m=aO2tkm_6qc(GIQA(>`W9;0m zGysoTR+d}ZO6Q{4T;Cjaw&-cYfM8%QFanY%%r3?>pIgA>FBMtNZHXUt^MDV+=5tjJk~$m z-yIlO=v2!n0GU&>O=0ceb4vUDpC;I!aOLRz65y@5n(dc|Bk9G9rw^Wo6xvZF-q&$j7dP?5pFX8O zT0gQ`bVY0RK$;bv%X1b`-qK@MKHK%~^evsfGZFB#ygpc8<%>qFy$}CvoIni9fBbc% zP(S^(^?bHk>RMJ8_MI5YS?}|h-?rwl>XjG}3++unahTT#7mXxQxlr@0mx|^mG z(T$l7+|j7Yy8e5!a-sPLfA*{})wf#G?b#9|o8fdeHj|uJw_Nl;?AU37_8tCB%1AM# zh(7UZrQj1nIj3y~jPa#2)ecZFBouesgjVH$bhKYkKLz$!n+2Q|>={#MZ892O42gFS zSy$jqF8;OG^4j!v$F9_$qr4&y0>=*Kb)&RdbW*~F3sSLyRy^C zil1ESbFI1L#js!?s$WlcdUfsgA>lD+V3hzft^Js2)mrFU)s+-kRU(C%^G_W0nl~BS5vE011iPgHY(3w z?lvt2#!xTgJj-TUB>%UK|8G&_^ZQt2E7{^k!4Y?nEVr+d`cOuKjLaAtAA8+Laww5V z3-F37mykb5T*P$M_Z`L0k(`4xf>hVLff8GE%-1K*MJLy&r3IdNR88qs#{Tj~B`;*D z#EQ|i;?(sg<%i#dO9D;w^!6K<`hWIy><&7S@b>TLIg@Nsejy8S)fovblgW&nM(jVx zj0Xw#M#RT_oA%)3;7^y{*w@0g{xvR&R7v*^cU zg=YLgB8vdco;|U>+L29z|97vNO~haw$}AUK%29Fzf z88BF>Q_mmbDt2RqxQl#}WR}KjE=zxq>->8co*kjb*kXsj>-tDN(v4U_j%1NmqU6}5 zc3xv_F24}0p`}@n`qI;__HON;yeyQlfAz%5QQVBz+NF$+{DWsb@xX~hRrQ>J2gA(! zRM^OvhOA{Isz@rUYWEb89u#=15=12qJt|CnMoJb_6ZGwIt^svah|n_&#Ca|SHPi5} z3%elHH^D*gImOotg4u>TuIt$xHKii zxHh+Kdl)utX^Ryou0=|bKyioS?(Qw_7F=6sancg3xLX3DSb(6#U4y&3yY`=b&b|Ad zd*AnKKIHeTHRqaZ${1sn6CcofHO)V%&@f?)-gXlg09xSUCSXjTJqx{~);HGcB&;~) z;xU4l4ZA1%SUNixZ;W~z3gNqV{`zMTXdmoxBz`-53p`x$hMx%Q8ZkkO1NJRFRgYIT z-QL8ax1Po+g|KSOmN)j)+{D*KNUbuh*e2wu1={c0`kWX@@SBl0!iCrKNzd zEFx1%=OL7@92ul;vKV&F0Ec*Ekh^da0>6h4P1DIH` z(_(D9Kw7hziT)>C`#tp&*X}57zYf)?`?bBk$o&UuP_adZ^v2m0l{MnU%6$i3DM+cNJ!a|$;kVZV%h5S5zK zx6a0cU2M?B+`(|esE6jn_@{Tj#@~)#)dz~da3M$)GB}}7;+koQ6C5wiDj6r%o3<}| zjeLFn3n|m1L{HXp3uA&t2(Kq<5p!zYh7HnB_|)CPH^M4vWs1T}5wU_&+?g|+z_GABc> zUX6@`-JfATDn@emEb6TKj!tUoN?YYaLUP|9YF_8#p@H(~>yFl|!2DfsKcgT^-tBb+ z^&ZCi|L!XMg&uRUw>7HLQ**)FRlA&wTVt_N45@&JR7y1IU^J3!HAKtRsg>BV%qCNm z7WF&W37wry4U8v+kn!uU9rC#zmWPx7o{Y5S)z<2In_IH+8!QqRA_U}rLKAmL;ufyQ zg`keBXFuO#W?^2ynt(1$2Dm1F^NWw}Z*Bz2quJ5f^{4i4N8PL9=Da-P`yT>$tZaiVr zaVp4XH&-=@xN>D%X~(bcO=U|Z(=UZ$f5$GJTc?(dN-8$cNNB>(&{4lae&VdI;Q%4h$ z@ZcwF4J8~dhPx!ZOT|UKz2#=Y*Ow_zb0La%CcKsjm1APMm_lT-l*62lnL$yR@D%1v z4=1Bs*DdWu{W0Y#>F?S#{S>V#GTf>`?~`CWVhm45d-$1N-kV@NF@KB45#xvl%J6EB)#h}U4O0=^xQ9ERq8 z274^qv7&)&D_yi+$BX;;p_y99SLjQNthMdilkhJU$U^yARlY6ygz^+xs9sw=tnoH2 z>U(Hvyg{Y#_t(4^fxjys-QaVUAws$~0XC$feqo_^GJ4|VVR1SMZgifo=110fGC778 zo*~nrz}WJf^Ne_z=`_pn^Wnl=M^JLyxZrx-8bdPSIv*)@R8(c9VXu&a=dKd*tJWT) z$~MpcQzzJRI0cH|NQGbSoh!2^O&RpkSBx=#z`Q^BeqbWrPPjj?o$TiqMAB2zu_j|K z{3YFA*!BPje?wj#8uH2iKCps}8MdN3!je@!DAluS8F5 zoeBgz&beiN;c9oQ>Whtn9wX~mQVyV=#It^B)mrYrxO3msQm@>!*`BYmLh#j;JC51! z9H-W-H=#9b$#t}Ks3={LObPmTJ8C)FK7Zd#5=yFe37rk!27Qhjw>1%GZLT^<7-Aac zz8A9s^%?jv}XN6w?C9EqZ&)7DVgp=uPp6{fo)+^0+qRArh{9 zDSbWbN;3geMCu?i(6_K5@!jzwBcl6`|U_|G(cD?K{zM`yXtq0V-*s|q<3EgiIKu&)va&fRewQu_-wA3`y1C$CroNuATb~fcS>!*z z-mjnNsd$b;ls);UYN6&m_oz7^Dl97uE5uwz2-g_3H`gQTD#6>Y~? zx`S4?8qUy(_7=Ai9gUF+J-=<>A*e=YR0}x|I}^%1112E#2F{X6z-sJ)Tz>SLUg+FKBp8XWI1U+6mbps40T5uvPe)ZA0=io^7L%S$edMsc@9T#LmrOHE`8X-Pvh z1*k5PntqLf`>@efQx_K|59p^Wx6*5eK#~ z-f*k1IOEty{QKef3c+K+eYYFV4CruFR^IPyypSD`4+ISry6`eT;7Yv1%f}?~|EP{w zI>586lWnDMn2zBPuccUA4f;)9)@f8D|LC35@~y?XB>hm!3`V)%_Lt$ned}cqwB=O| zi`Hg6fPuK;Z%`k`5f+0dxV5`eW>3;SYo|Hkd*|j8ld=U09b$KrS~>5YC3@lY&~f#N zZWFxi-DL3t)0SYkoVbbXuJ>c^lYT$o&{+`=Zh57Hli<_SPOa77Z^vZ4z$Bnje}94C z9Ew-P(03boi579(3%~vGX(ZM2Eccp_77Yyphw7Qo(_ZLA zzbA4BAD^H{#~c;0@V!$iH{0+g7W$nt;5RWQt+7T7*v!aKzDu2o45b4c#)U!l+_A|k zYUi?B<;^0u6LZHFExkejoIaVuze_%eFgj@{(A*~{DeU3O1%l?Y$K02BJb zy%5LCuMG;H-dD$j{Ot&sx25oq&6FRnN0!d5bApOdh>v)28a2519XTA7M}c-QtV~@; zALN`Aj~@nOD1;4%HgVtGyyo@sUvVE)TFhKrG>ScHI|S^+dJ@`MB%hj`G#|)R7N7P_ zd5ENR3t;xU%|A6W3msNEqjTbp3LJOadTPPY>u!p5x#}nqWAjFP)7cb-cSmIs{}(Pm zMg`IejCjKfhgR6`QPxI31b9^M&txCom^71iT>wEsclwY-W zx0Kx_<=%^I3%T`67T|?~i zxvzJO3Y^^$YE;B^O|Ll^P#E=1@_gj+MW1mWiW_#X@AuTobudI$Y4#4so&Q21Au%@P zBG!NlBiIS{CXU#Cc2sPzxCLXKG$YH3kgS&yE}o^JIp<st>c*UN=ra&ZULzxi9-) zR=~V@>GcJxxVkg-Hb8OK)bR8B*`I0*We+P;o6pa66Z8jF-l`ZCJsofOlA{wYp^;jU z92IyCMkq!4t%XY@AR;Sw2L*oj%_e2-CG2C=GcDPYO~=nIQV~`DmWZ|?ICnpuZ@lo% zQKM(EQ77B}1gK-rl;<^2R$C+%C_B%K zox(oBB~nH|`~MlvJb!8F4E(kG)p$}wZ;dfrPI*rh!EfeCaS2*d_Wf!@;RB=5_HOMx zLvw}|zqeyC8tXspN<)riR+MU6aJwJ!B*5<$Ax*JL<-2pPWi*H9Dl`)%6zNG}=K^

    HeTO7B)^p4~Swn3t@%e)K8n;)zuH3=r`T@%)5Yun%SV5 zGApZ8ggsfRP{>qz{22pY$a=+gnXp->sGwBwZ!4W|2EPM+HLWyAq~5*gcWh>)mk>J( z9KR?2I#@L@m*RfK8=BIACY-n)0R>}W-_TZQ|0^>?a|A9}!Hd~aNjJI`#)a1BI>D8Y zPH&6)6a(qi_QA~$^x|~fOQJ*@Z-p6Dwu@BYo_lLY?uF17Aep&XFB7B{0vKyJtWcA1 zd)a^EJl~4mVDy2Y8u!S0P@KlqFA-kni4)}Uea8E`Tr8P2gHeU!V$NeV^YM~jHFEXY zk4aa|oxKHK?Z(ETLiY8HEYgMWfRpcR5W_~HLhu8t`x?Y2O+!b9W2{i)G8i%{dSrtX(f_Je-Efu;nidbNs4Q0*L61T4Rb$SdhGkRxdkzW@AjKEUM5Zt1&YL}~+@ zQ$Og?AIA=|8oq0M?ZOiTT~&MK`3FrD0A||W!|1|3VwhANpTa!nhPP7%RfYBKG`BJwTj~3 zZyE8sJKrbsB;acn^(C7M_kNlZ4fKZ~J!40*QK_7TkB`%P8*ky^o3s0>f1p+?SDYxdPZ|9CNhQPp z6uFdaDoN9ssl%A8WRjNn-IsHSe zmr1R=|LQ*&qjNYnz%TSr^;W}a2ZHD z>1TNIF`vY7JFxB1OGLBD!X)KqapOrvg~t+M^|KtD z`$Q-}vuO=J1Cu9&O4x-DEEbZ+*Vu=rbdsd;B%oEXBQ@_j)ULU)M z5er}7Rs$v_mM<{r&6_Ty2$=L2imGREbc6#G)>C3)3+i#*1ZnR-&>!p8$q2K&)otRc zyh*GpkjjoEiq058R2r8!PfqWZm>jm)yw6y3-5o!^f6i(Mk3Fy4=kPW-lGC332_J7M zK5ib>U2*`B%g$sKnL*d`VwUep+0lpQdhoN9p(4++oOKdCRD|_T+*`=Ata)PjZ-chB zlTxbGcMe2dD(2{qix18R3cqA3TS&OFGEsZuV7g@HBdeC}{(E1p#t^|APg&|UW*;s*-cO~BuPu3KyJ2D4zBz>*dd-nJ z__C8e&t(3w+Z(%t6@RDk7sB-5a_$==j&?eDg0Kfzg=v1cO!!Mw=myZ|D5MyXLGSH* z!pq{Y7NXnLa9>B@#0bNscm+H*#C28z23?KhEgG+GIV<#D=;s>IVnon}NMODZmf&@P z68_@tctJ6BnG`eX2pE^*F-kTteF7o+M-z<=UR9@q>6O&5h-r=o=91%do~XQdwV4-h zrMWF(>=Bk)zL-0#hztCgwvv9cQOC4d_NJRPx0l9aZ+H;M!`QZCIRW4AKQ_>`tt%T7 zyadP;v)u?{7nA`kg7kZD5*xD!7ET0@X7-^f9)=H}_kppzG5F|iUQ|N`1Y0F~zAGBQ`q;Xx9{urx3 zmIe*K*zX4t=5Ff6+Z{|Ul$?h}s3kuK zrU|eaNfHP;Hqk{V$_q$$S`X)r?TfmsLiGwYk6|k4#ha_TiFv^4gMiPb+qo`xr7&UT z-!m|#k-yy1#c`_3@~yOuu;v?I&I%Q2DZw)yEQ2d~D{%}CFnAxim~zIwU_O?1n+`>3 z3wGxsupdFIXYI^MsTt(!l@LhED(?%CzRk^uB&phoFZusbb>q)Q4a)@mnwnwPh_v0? z$x=}tp0t=XT-m93hc|>^QH-T`ZQj9JYiIG;Fs@Lb|AKzJUSCc&AHpTKp9FIt$pvm% zOlRq$VEq*%D>|{3><&{q!*z3}Lyfq#Cp4&GpGj#+e&p08xdVO0(P&4vldx<%;{mk+ zj<*dgB$N0zh5leC<(ZHj(cz-~&N~i2Ev?CI6a8V_BNwK&_;dT^?go0ioxj8^ZN!ef z1m`VqXC4FWzK;)+=R~B#9i8`C5KmX7UGG zL9V0U;TC?zlBw@leJ{$M*6|sy`w- zeD4R&ZJo3K@2cfrpG(i}S6Bi{YC} zCczVe6xV9>L2@+58QrcHRzz$$?5ULAPNk(zo>rhc`8&_Y`7jMd$Y8zeu|v4!KFVo za+PsO>0;O9b^Q62A!6dxL;k5v_3^N@|;f!Sv;i)J>5tsda74es=IgF6Y3z z#=cVBqTFyRUN1RcS0fp%|JNtou%W0gV2mB~ttD8{b6m>HlzQX|Q#HDA}IY%U6beMERRg-9D>neQjL?`4!K`=$8=Ub~-t(yB?i^ zAC|HH7}FAV+q#Gv4afXKo3YRT5iQWjYq9wTQ5(fjck zF8`xaV1WV58)KoAzD0?Ksg=dJ+mm=GTg$73*+e?wUoDAJSZ(BRA!g)ER zXib=|X0 z1N0X0bHkrPlb}(l&y;9(nTZcf=0?s7I!X`2@)%X_x8+aQO4 zEaR0*lvxf?c>~sym&F1Fy);}%sKl5JD?uKeecB}^==#pc^)@dK z{9g1cabou04q+Ww{NEe%ZIV|sgW%4BbvkCrO;)3!pl znWQ(4$kZtP`#NzAjtdg$t${5ECQrvEEU|#yu%lHleb~Ns6?$wGXxxX6)-Xv0pumcVWCz?xE3~{DXGHQ-77Z?}Uzbmr$7F$&r?1epyosDuQlw1NPeuP|vaA|W?S}c;sc?d`U-vfkHsvD(c*ZLX|HxUlg|V>EgnRSU zQ=s_`fXbcC(11NHnb-KH2bx#pIASpGe)=BArl^Jk+oAJqK7ny5mv|EBjPONwycNZd z!#`-wFAnzOv{qvbm?y_vT*R8+IZ7D-2=d+zrX`1qS6mRTrSkP-mxB3YYW7`eze^Ia z#R>7V(tvXUDP!XrR0f}%c0b`#;q1_O-?Z+9X8F+fF}fhGY!%L#@<3^S_`+RSWr>+1 z!BmvbfZi*K&Rst^;#9obsy^b=aK870o-b6&xDS4Dwy~|S7GU!d(dROs&GLesnZ-mE zrP7(1^YMCg<#k$^u43yYWi{lA*ATA7Gmw8;NjmU-o9{w%5}MTWvXhn3M#LHSCFO*3 z_T5siNx3H)h)J;DDWL2Z%CV#N5iQ~fil)A^G3_aLrakLXKwrH^{G(l1gdJfIuT zNHbb?XqMq0qwmtqH`t1|c+M~%BX55@Dt7o8$SX%qFHZduEdsDKX=peW`o$#+4Viz8 zxXZH<9w@6bhdXn+$ITc$d-H-7^z&%cs#3DV%Bp7ZI<$D9pt@*t)mog{xF1NxW_gHy zxEA_ZXwB&h-6g4c`D)Ug>TjDdCai^1IBDfUHv4Ruv(UEQ1POJvcVyKW5Vz*wD$=8cr%H~ha zHN_M2O3qcX7pBX?^0&}pe@P0PuR^PcTpimQ?ytWV8&d^T#v3zt*1xK}FXX%s@CjZc3%@v33=;|r7xh;rx= z{LL#lE`E$}c-_&Il>N$;NtK_J-SSAhN#twr)B5jadrJ%3;otrWu5}59q!Dbndh9QY>vsNuouO&H^G)J0Byaf_|(Cc^Gi zX}65s%>&tfk;lZ?PQwWY#(-d1_@RXMQd+0I_4C1^rcrwIRykhtg0+6YU58kSfV{F% zqKV0!Iobeox~Y9bQ(q+(8Hc)vLIjot`=>!8NDbJTZ3$&dWJMCDs=ZwZ}T zdAF63d24Qnn!RH3c<;c%@7?(eefbVQYe^G4|5z=Xbw}TIima$M(!_dLp{nL2vt{J` zXkGP9xgIZ7$&(B~=lAxvl&}ZqPJ0E_k~HNw=fDM~^`iApy+L!n??QwTyF~64pXBs! z-Jkj99f~A%#L>rSI4ZZZzWo^B+;i791|))7af?mT7OLY<8N$@<)|kZegF|LQL@pCL zwXbT#Q{%F;ihUK^a^Svzk%F$$4@0uSwn6J*q6LU;O8Ce(CQ5=ch;Aolf#pkENxfk zm_)9IOWL$mcf>G!c$HDPcIEgCjdTOD$5@(ZMt8?#BbfHSZJNwF$(R*2NBK}OvGA^V z_gyT&VS6LQ9Xl5ILHNtKx!4~x#-qqjhuLwYQ2&AfI~0S@tIUF3r>p0K-FG`fza~+> zl-06SE@yJ{6|!Os7lMq#-*#dKSHZU+6Sa0C`xz=#1iRhB^{Hgh>!*@YZWl_mT1@pwT4Y;18+mY{^@%0V!vcBh z_lCH+Fm=@%y;LY!Yt&v?(5kX{QU=h4tN8{RBU-RUllPXpZl)Xdg53n?nK%P}spe)x zv~$72+_0yoEcH}_Q;M0E`JOToM}J=JE<)D|>`0+IB3>0g zMS)3$z^GN4=OEdp7}2&NzX3w73$0^SSepFgE8Trl-;M&o5c}xBHn39QY~*}mf_n^U z&msC!LRL4Du+}WR6l+W_jYMV(xtLR~_;or+RZ=c_>QE<*F|m(L;vz(BsYWGEJ38ky zyT^)6CJL;k-OIyJs80P$_1ct%?Dy%uwqWskWr#T#A{4evDdK7Oh$ShX7@YzJ^ywj^ zd@dhH=XipNIOX8A^CWcmL+q%Dgs9?@awR8wG31+wJGNy5Wed?3gD71=?W^cG$E*4y zb~lE2uwE`BxCbwRp{8-(&WZ1a6|zV{!RH{S*H9%_e%!lX%lvLhhmJF=0;;3kXFG9t zxX0#LOOahCHeOs-X~eD?Tca++suUn^Dwrzk_e1Dv`sxWQn`8(dC*v1qWUucX(R2{q z4t0eJWHWQIqf0bMUt2MWJ+ktp?LnqLwV-Pv1)3e@l}qF!aX9A{%EUXVJ{UR`4_!`0rSP%1cW}M zVnuJPSJhZsJgF3b7`HR(z?L4nf^tM9(bI%{D|d1rKH!3y3G$ z*LO6_CaQ2KoK-Qs$p(0nC+i{&TzJ&ri`!}d6NbBe*lFAsW@G3oDp21)*M~2z}~1-&56SyzRuZpNX)bprMUXs2Gv=T{d$^dQw`x6|-IP;6)Xm-;<$k!|-bCOFMqT|(Pp#hyN&p?@ zvZ&`@fQyHp@wRAqkDdx|`Ef?3o^3Rqq*}Li`d3S_Epy;mPkQ_CZWiSO*%F2aGov&f z8ooR(tkq3hRM7YMPx{0fz26R2`s=>`f&;hQA}f~0h)IoUER{)QerDc(rFBXuFfpl; z`GT?PENSQLJ0Zo-^ni>xQC#i{K}Z`X&6vVyZyHs(o>_~=fu3?@;hb3EHgG7j9bu$X@YH74qN+K6Dig?Fy%4h3 z5vzT`VU>cMgqTzL)KxonZQZ@4nH1$b*~j&MeUYx;xG1_o*e$WFeE%7v(e4f0a zqP+)TE;=wY{jFqCIR;M+OKGh548K*SDicbDefcDzUY?@E7d48<6lo)@ETQMn6D@&>kVYWOe@N@NY+;Jp&WGJd+Sam zS%#zjzYq-1OT1b4hM7 z6KV7z2T!PIPmT*~8{hE*m%WIBlEx=)?NXf)qY7Gfptn*~Y$&E;tSx%B???1dq!(+n zljVM*wL|H~R>DZ72R0DJlX#Qk*^N|Gb1*l88C(0G2CVWFYobAG z+rOY~`QLjt4^JYzCjuYW zUp?DeZiBOIc#%m@ayrr9T%NI}ml$Zm%nIt6L=M^OQre6rLsI<@BcuEa(;0fT9N5`Y ze+0$ni5ibyuEE>}=+a(=6WYsYpwfJwv-Wn82-$wg1~==4ZF8^aM55Uk9rYmwn;o79 zYZ@k$7{?Bx9Fmiic!#I@(7C{C=?R!MPyTFWZ#bK#_bwaUu5R)a7Flj7n+vmvDEVm1 zI4-X`*saMwJhMrZ_!Mu~@}@aqLh*JNS@@l!#DnqT>ZLu84W?a9V*l+BBx*~|$ko?N zTB9y00@Epd(}wEw*@u_2@vlLU3gn>L#*Bv0jT(JcQp%`oJj?x5y|W2T_$shku77Yy zb^2^LiQjm)ZQZZC`BDhpH}T!Y6J~N;B{SS9s&tO%>LreaD~rfEz%o+rCUWdZy6ODMm7cp zbuD+UOMvq; zs#``+QZWFbxjxI8y>-U?#!8N!jtZT4emLu{lPZ~QgXy<1k4Xw!TsF!J?ls&@3y@92 z8Yts4MrD3E3|wgyx6u1r0Jsy^poa0$x{pj~j1QIVj+r7q7{LNWC#b}k>`AA$g8FZa zCC=$MIz6)R3}w~ui0_K#p&ep+vX3vFmpF6=le|$tRXZ4iu0;Mrp^pW0_bn(jGk?&j zBvtO&ulF0-bs3*&)r!H0sojIivpT?N3*ZR?<-UI>;`4<=X zVGk~LB@VvkW#QPF9H9;0rQ)_rZQX>T7#|HcetYn4<%2wK;<=8(g!mS+QEE%+@TRd! zf~{WRxo{PFkW$1Q+9?``h-A%0RVl1L#C1!H#fRXTV@~`lJgY)~{gHdu6)Fnay1hXP z9zKT*296R~5m0S(cN&wsX*6A&;)ZZNaASPMCwCxHNi$8wL?FjNLv55p<>icuOo5AI z%j}@hCl8L;ManW^(5KKJ{;}Oj{K}GF?5LBBGm6|CB=l>P2e~CxHR(Ze4Gf$G-P9j~ zm#gU`E&cUVA=3+BX$#7S9&76USydbr*Wy)^`>L4sbp!; zRcqj8-GBk5FR#%tJsayBVOCB*LdzWc>#NZh?TWwq)a1aqml>6=*7h+g=QYT)_gA=^ zfO|@mX7YHM-fZ+Gs~f|knlHRe3jvu@(3YiQWAmjhfPlRA`!+8iJ`|&{aSf%!P1M~i zT6V6RGFig*Xqu$-J z!(~<<*~Q05?Vblnwg0rKw+Pk$gZ3HQ#ENIIB({=U&dwbo%l7vxA)W^~4y^C8p^+f$ j%(s0b2NAerWEZBjLtPa6#=yG{3%3b*u^&$`|IGY94%Y$R literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-oss/src/test/resources/images/lion2_watermark.png b/codes/javaee/javaee-oss/src/test/resources/images/lion2_watermark.png new file mode 100644 index 0000000000000000000000000000000000000000..2de3bb8a3b9f5cab8fe7e52027ca2ca6e577c4c5 GIT binary patch literal 139930 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

    |5vb=AZ+pN(v< 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 VX1BS3zV`h8t%E+*)-1>;{tuX(i9P@T literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-oss/src/test/resources/logback.xml b/codes/javaee/javaee-oss/src/test/resources/logback.xml new file mode 100644 index 00000000..1598ec4f --- /dev/null +++ b/codes/javaee/javaee-oss/src/test/resources/logback.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + + ${user.dir}/logs/${DIR_NAME}/all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + ${user.dir}/logs/${DIR_NAME}/spring.%d{yyyy-MM-dd}.log + + 30 + + + + + 10MB + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-servlet/pom.xml b/codes/javaee/javaee-servlet/pom.xml new file mode 100644 index 00000000..96f53191 --- /dev/null +++ b/codes/javaee/javaee-servlet/pom.xml @@ -0,0 +1,84 @@ + + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + io.github.dunwu + javaee-servlet + 1.0.0 + war + javaee-servlet + JavaEE 学习笔记之 servlet + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + 0.4.0 + + + + + + ch.qos.logback + logback-classic + + + + + javax.servlet + javax.servlet-api + + + org.eclipse.jetty + jetty-webapp + test + + + org.eclipse.jetty + jetty-annotations + test + + + org.eclipse.jetty + apache-jsp + test + + + org.eclipse.jetty + apache-jstl + test + + + + + junit + junit + test + + + org.assertj + assertj-core + test + + + + + org.apache.commons + commons-lang3 + + + commons-fileupload + commons-fileupload + + + + diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/AnnotationServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/AnnotationServlet.java new file mode 100644 index 00000000..9156ddb6 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/AnnotationServlet.java @@ -0,0 +1,85 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class AnnotationServlet extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = 7516608289980410869L; + + /** + * Constructor of the object. + */ + public AnnotationServlet() { + this.log("AnnotationServlet()"); + } + + public void log(String str) { + System.out.println(str); + } + + /** + * Destruction of the servlet.
    + */ + public void destroy() { + this.log("destroy()"); + } + + /** + * The doGet method of the servlet.
    + *

    + * This method is called when a form has its tag value method equals to get. + * + * @param request the request send by the client to the server + * @param response the response send by the server to the client + * @throws ServletException if an error occurred + * @throws IOException if an error occurred + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + this.log("doGet()"); + + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(" A Servlet"); + out.println(" "); + out.print(" This is "); + out.print(this.getClass()); + out.println(", using the GET method"); + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + + /** + * Initialization of the servlet.
    + * + * @throws ServletException if an error occure + */ + public void init() throws ServletException { + this.log("init()"); + } + + @PostConstruct + public void postConstruct() { + this.log("postConstruct()"); + } + + public @PreDestroy + void preDestroy() { + this.log("preDestroy()"); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ContextParamServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ContextParamServlet.java new file mode 100644 index 00000000..0c4c2732 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ContextParamServlet.java @@ -0,0 +1,64 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 读取web.xml中的 配置在中,只能让对应的servlet使用; 配置在全局中,可以让所有的servlet使用。 + */ +public class ContextParamServlet extends HttpServlet { + + private static final long serialVersionUID = 3194071196406358461L; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + logger.info("ContextParamServlet 读取 web.xml 中的"); + + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(" 读取文档参数"); + out.println(" "); + out.println(" "); + out.println("


    "); + out.println("
    所有的文档参数
    "); + + ServletContext servletContext = this.getServletConfig().getServletContext(); + String uploadFolder = servletContext.getInitParameter("upload folder"); + String allowedFileType = servletContext.getInitParameter("allowed file type"); + + out.println("
    "); + out.println("
    上传文件夹
    "); + out.println("
    " + uploadFolder + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    实际磁盘路径
    "); + out.println("
    " + servletContext.getRealPath(uploadFolder) + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    允许上传的类型
    "); + out.println("
    " + allowedFileType + "
    "); + out.println("
    "); + + out.println("
    "); + + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/FirstServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/FirstServlet.java new file mode 100644 index 00000000..36b6dde7 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/FirstServlet.java @@ -0,0 +1,92 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 第一个Servlet + */ +public class FirstServlet extends HttpServlet { + + private static final long serialVersionUID = 2386052823761867369L; + + /** + * 以 GET 方式访问页面时执行该函数。 执行 doGet 前会先执行 getLastModified,如果浏览器发现 getLastModified 返回的数值 + * 与上次访问时返回的数值相同,则认为该文档没有更新,浏览器采用缓存而不执行 doGet。 如果 getLastModified 返回 -1,则认为是时刻更新的,总是执行该函数。 + */ + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // 调用 HttpServlet 自带的日志函数输出信息到控制台 + this.log("执行 doGet 方法... "); + + // 处理 doGet + this.execute(request, response); + } + + private void execute(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + response.setCharacterEncoding("UTF-8"); + request.setCharacterEncoding("UTF-8"); + + // 访问该 Servlet 的 URI + String requestURI = request.getRequestURI(); + // 访问该 Servlet 的方式,是 GET 还是 POST + String method = request.getMethod(); + // 客户端提交的参数 param 值 + String param = request.getParameter("param"); + + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(" A Servlet"); + out.println(" "); + out.println(" 以 " + method + " 方式访问该页面。取到的 param 参数为:" + param + "
    "); + + out.println("
    "); + out.println("
    "); + + // 由客户端浏览器读取该文档的更新时间 + out.println(" "); + out.println(" "); + + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + + /** + * 以 POST 方式访问页面时执行该函数。 + */ + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // 调用 HttpServlet 自带的日志函数输出信息到控制台 + this.log("执行 doPost 方法... "); + + // 处理 doPost + this.execute(request, response); + } + + /** + * 返回该 Servlet 生成的文档的更新时间。对 Get 方式访问有效。 返回的时间为相对于 1970年1月1日08:00:00 的毫秒数。 如果为 -1 则认为是实时更新。默认为 -1。 + */ + @Override + public long getLastModified(HttpServletRequest request) { + + // 调用 HttpServlet 自带的日志函数输出信息到控制台 + this.log("执行 getLastModified 方法... "); + + return 0; + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ForwardServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ForwardServlet.java new file mode 100644 index 00000000..bb47a2ac --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ForwardServlet.java @@ -0,0 +1,47 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.util.Date; +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ForwardServlet extends HttpServlet { + + private static final long serialVersionUID = -291840563095094360L; + + public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doGet(request, response); + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + String destination = request.getParameter("destination"); + + // 跳转到 /WEB-INF/web.xml。通过地址栏输入网址是不能访问到该文件的,但是 forward 可以 + if ("file".equals(destination)) { + RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/web.xml"); + dispatcher.forward(request, response); + } + // 跳转到 /forward.jsp + else if ("jsp".equals(destination)) { + // 通过 setAttribute 方法传递一个 Date 对象给 JSP 页面 + Date date = new Date(); + request.setAttribute("date", date); + RequestDispatcher dispatcher = request.getRequestDispatcher("/forward.jsp"); + dispatcher.forward(request, response); + } + // 跳转到另一个 Servlet + else if ("servlet".equals(destination)) { + RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet"); + dispatcher.forward(request, response); + } else { + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + response.getWriter().println("缺少参数。用法:" + request.getRequestURL() + "?destination=jsp 或者 file 或者 servlet "); + } + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/HelloServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/HelloServlet.java new file mode 100644 index 00000000..97d42916 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/HelloServlet.java @@ -0,0 +1,108 @@ +/** + * The Apache License 2.0 Copyright (c) 2016 Zhang Peng + */ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2016/12/23. + */ +public class HelloServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * Constructor of the object. + */ + public HelloServlet() { + super(); + } + + /** + * Destruction of the servlet.
    + */ + public void destroy() { + super.destroy(); // Just puts "destroy" string in log + // Put your code here + } + + /** + * The doPost method of the servlet.
    + *

    + * This method is called when a form has its tag value method equals to post. + * + * @param request the request send by the client to the server + * @param response the response send by the server to the client + * @throws ServletException if an error occurred + * @throws IOException if an error occurred + */ + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + this.doGet(request, response); + } + + /** + * The doGet method of the servlet.
    + *

    + * This method is called when a form has its tag value method equals to get. + * + * @param request the request send by the client to the server + * @param response the response send by the server to the client + * @throws ServletException if an error occurred + * @throws IOException if an error occurred + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // 设置 request,response 编码方式 + response.setCharacterEncoding("UTF-8"); + request.setCharacterEncoding("UTF-8"); + + // 设置文档类型 + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + + // 输出到客户端浏览器 + out.println(""); + out.println(""); + out.println(""); + out.println("A Servlet"); + out.println(" "); + + String requestURI = request.getRequestURI(); + out.println("

    "); + out.println("请输入您的名字:"); + out.println(""); + out.println("
    "); + out.println(""); + + // 取浏览器提交的 name 参数 + String name = request.getParameter("name"); + + // 如果 name 不为空且长度大于 0 + if (name != null && name.trim().length() > 0) { + out.println("您好, " + name + ". 欢迎来到 Java Web 世界. "); + } + + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + + /** + * Initialization of the servlet.
    + * + * @throws ServletException if an error occure + */ + public void init() throws ServletException { + // Put your code here + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ImageServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ImageServlet.java new file mode 100644 index 00000000..1155ece9 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ImageServlet.java @@ -0,0 +1,94 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.*; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ImageServlet extends HttpServlet { + + private static final long serialVersionUID = -5446593186536558309L; + + public ImageServlet() { + System.out.println("正在加载 " + this.getClass().getName() + " ... "); + } + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + this.doGet(request, response); + } + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + String referer = request.getHeader("referer"); + + // 如果直接输入的网址,或者是从别的网站打开的,显示错误信息。 + if (referer == null || !referer.toLowerCase().startsWith("http://" + request.getServerName().toLowerCase())) { + // 打开图片 error.gif + request.getRequestDispatcher("/error.gif").forward(request, response); + return; + } + + String requestURI = request.getRequestURI(); + String fileName = requestURI.substring(requestURI.lastIndexOf("/") + 1); + + // 请求的文件位置 + File file = new File(this.getServletContext().getRealPath("upload"), fileName); + this.log("请求文件 " + file.getAbsolutePath()); + + // 如果文件不存在,显示错误信息 + if (!file.exists()) { + response.getWriter().println("File " + requestURI + " doesn't exist. "); + return; + } + + // 设置打开方式为 inline,浏览器中打开 + response.setHeader("Content-Disposition", "inline;filename=" + file.getName()); + response.setHeader("Connection", "close"); + + if (fileName.toLowerCase().endsWith(".jpg")) + // .jpg 图片格式 + { + response.setHeader("Content-Type", "image/jpeg"); + } else if (fileName.toLowerCase().endsWith(".gif")) + // .gif 图片格式 + { + response.setHeader("Content-Type", "image/gif"); + } else if (fileName.toLowerCase().endsWith(".doc")) + // word 格式 + { + response.setHeader("Content-Type", "application/msword"); + } else + // 其他格式 + { + response.setHeader("Content-Type", "application/octet-stream"); + } + + // 通过 ins 读取文件 + InputStream ins = new FileInputStream(file); + // 通过 ous 发送给客户端 + OutputStream ous = response.getOutputStream(); + + try { + // 缓存 + byte[] buffer = new byte[1024]; + int len = 0; + + // 读取文件内容并将它发送给客户端浏览器 + while ((len = ins.read(buffer)) > -1) { + ous.write(buffer, 0, len); + } + } finally { + if (ous != null) { + ous.close(); + } + if (ins != null) { + ins.close(); + } + } + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InitParamServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InitParamServlet.java new file mode 100644 index 00000000..e05c2a44 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InitParamServlet.java @@ -0,0 +1,81 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Enumeration; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 初始化参数示例 读取web.xml中的 配置在中,只能让对应的servlet使用; 配置在全局中,可以让所有的servlet使用。 + */ +public class InitParamServlet extends HttpServlet { + + private static final long serialVersionUID = 7298032096933866458L; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 提交的 username 参数 + String username = request.getParameter("username"); + // 提交的 password 参数 + String password = request.getParameter("password"); + // 取所有的初始化参数名称 + Enumeration params = this.getInitParameterNames(); + while (params.hasMoreElements()) { + String usernameParam = (String) params.nextElement(); + // 取参数值 + String passnameParam = this.getInitParameter(usernameParam); + // 如果 username 匹配且 password 匹配. username 大小写不敏感,password大小写敏感 + if (usernameParam.equalsIgnoreCase(username) && passnameParam.equals(password)) { + // 显示文件。/WEB-INF 下的文件不能通过浏览器访问到,因此是安全的 + request.getRequestDispatcher("/WEB-INF/notice.html").forward(request, response); + return; + } + } + // username,password 不匹配,显示登录页面 + logger.warn("用户名={}、密码={}不匹配。", username, password); + this.doGet(request, response); + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + logger.info("InitParamServlet 初始化用户名、密码参数"); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(" 请登录查看 Notice 文件"); + out.println(""); + out.println(" "); + out.println("
    "); + out.println("帐号:
    "); + out.println("密码:

    "); + out.println(""); + out.println("
    "); + + if (true) { + out.println("






    用户名、密码为:
    "); + Enumeration params = this.getInitParameterNames(); + while (params.hasMoreElements()) { + String username = (String) params.nextElement(); + String password = this.getInitParameter(username); + out.println("[" + username + ", " + password + "], "); + logger.info("用户名={}、密码={}", username, password); + } + } + + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InjectionServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InjectionServlet.java new file mode 100644 index 00000000..66eca83b --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/InjectionServlet.java @@ -0,0 +1,54 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.annotation.Resource; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class InjectionServlet extends HttpServlet { + + private static final long serialVersionUID = -8526907492073769090L; + + // 注入的 字符串 + private @Resource(name = "hello") + String hello; + + // 注入的 整数 + private @Resource(name = "i") + int i; + + // 注入更常见的写法 + @Resource(name = "persons") + private String persons; + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + response.setCharacterEncoding("UTF-8"); + request.setCharacterEncoding("UTF-8"); + + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(" 资源注入"); + out.println(""); + + out.println("注入的字符串
      - " + hello + "
    "); + out.println("注入的整数
      - " + i + "
    "); + out.println("注入的字符串数组
    "); + + for (String person : persons.split(",")) { + out.println("  - " + person + "
    "); + } + + out.println(" "); + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/LifeCycleServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/LifeCycleServlet.java new file mode 100644 index 00000000..f1c82384 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/LifeCycleServlet.java @@ -0,0 +1,138 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class LifeCycleServlet extends HttpServlet { + + private static final long serialVersionUID = -7197419401412129310L; + + private static double startPoint = 0; + + @Override + public void init() throws ServletException { + this.log("执行 init() 方法 ... "); + ServletConfig conf = this.getServletConfig(); + startPoint = Double.parseDouble(conf.getInitParameter("startPoint")); + } + + @Override + protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { + this.log("执行 service() 方法 ... "); + super.service(arg0, arg1); + } + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.log("执行 doPost() 方法 ... "); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println("个人所得税计算"); + out.println(""); + out.println(""); + + out.println("

    个税计算器
    "); + + try { + // 从参数中获取的工资数目 + double income = new Double(request.getParameter("income")); + // 应纳税部分 + double charge = income - startPoint; + // 缴税 + double tax = 0; + + if (charge <= 0) { + tax = 0; + } + if (charge > 0 && charge <= 500) { + tax = charge * 0.05; + } + if (charge > 500 && charge <= 2000) { + tax = charge * 0.1 - 25; + } + if (charge > 2000 && charge <= 5000) { + tax = charge * 0.15 - 125; + } + if (charge > 5000 && charge <= 20000) { + tax = charge * 0.2 - 375; + } + if (charge > 20000 && charge <= 40000) { + tax = charge * 0.25 - 1375; + } + if (charge > 40000 && charge <= 60000) { + tax = charge * 0.30 - 3375; + } + if (charge > 60000 && charge <= 80000) { + tax = charge * 0.35 - 6375; + } + if (charge > 80000 && charge <= 100000) { + tax = charge * 0.4 - 10375; + } + if (charge > 100000) { + tax = charge * 0.45 - 15375; + } + + out.println("
    "); + out.println("
    您的工资为
    " + income + " 元
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    您应纳税
    " + tax + " 元
    "); + out.println("

    "); + + out.println(""); + } catch (Exception e) { + out.println("请输入数值类型数据。"); + } + out.println(""); + out.println(""); + out.flush(); + out.close(); + } + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.log("执行 doGet() 方法 ... "); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println("个人所得税计算"); + + out.println("

    个税计算器
    "); + out.println("
    "); + + out.println("
    "); + out.println( + "
    您的工资为
    单位:元
    "); + out.println("

    "); + + out.println("
    "); + out.println( + "
    "); + out.println("
    "); + + out.println("
    "); + + out.println(""); + out.println(""); + out.println(""); + out.flush(); + out.close(); + } + + @Override + public void destroy() { + this.log("执行 destroy() 方法 ... "); + startPoint = 0; + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/PostServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/PostServlet.java new file mode 100644 index 00000000..33bb6a0c --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/PostServlet.java @@ -0,0 +1,153 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class PostServlet extends HttpServlet { + + private static final long serialVersionUID = 2112378505872783022L; + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setCharacterEncoding("UTF-8"); + response.getWriter().println("请使用 POST 方式提交数据。"); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + response.setCharacterEncoding("UTF-8"); + request.setCharacterEncoding("UTF-8"); + + // 从 文本框 text 中取姓名 + String name = request.getParameter("name"); + // 从 密码域 password 中取密码 + String password = request.getParameter("password"); + // 从 单选框 checkbox 中取性别 + String sex = request.getParameter("sex"); + + int age = 0; + try { + // 取 年龄. 需要把 字符串 转换为 int. + // 如果格式不对会抛出 NumberFormattingException + age = Integer.parseInt(request.getParameter("age")); + } catch (Exception e) { + } + + Date birthday = null; + try { + // 取 生日. 需要把 字符串 转化为 Date. + // 如果格式不对会抛出 ParseException + DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + birthday = format.parse(request.getParameter("birthday")); + } catch (Exception e) { + } + + // 从 多选框 checkbox 中取多个值 + String[] interesting = request.getParameterValues("interesting"); + // 从 下拉框 select 中取值 + String area = request.getParameter("area"); + // 从 文本域 textarea 中取值 + String description = request.getParameter("description"); + + // 取 提交按钮 的键值 + String btn = request.getParameter("btn"); + + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + + out.println(""); + out.println(""); + out.println("感谢您提交信息"); + out.println(""); + out.println(""); + + out.println("

    "); + out.println("
    填写用户信息
    "); + + out.println("
    "); + out.println("
    您的姓名:
    "); + out.println("
    " + name + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    您的密码:
    "); + out.println("
    " + password + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    您的性别:
    "); + out.println("
    " + sex + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    您的年龄:
    "); + out.println("
    " + age + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    您的生日:
    "); + out.println("
    "); + out.println(new SimpleDateFormat("yyyy年MM月dd日").format(birthday)); + out.println("
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    您的兴趣:
    "); + out.println("
    "); + + if (interesting != null) { + for (String str : interesting) { + out.println(str + ", "); + } + } + + out.println("
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    自我描述:
    "); + out.println("
    " + description + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    按钮键值:
    "); + out.println("
    " + btn + "
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    "); + out.println("
    "); + out.println( + "

    "); + out.println("
    "); + out.println("
    "); + + out.println(""); + out.println(""); + out.println(""); + out.flush(); + out.close(); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RedirectServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RedirectServlet.java new file mode 100644 index 00000000..f751bb3c --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RedirectServlet.java @@ -0,0 +1,78 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class RedirectServlet extends HttpServlet { + + private static final long serialVersionUID = 4442189888545647793L; + + Map map = new HashMap(); + + @Override + public void init() throws ServletException { + map.put("/download/setup.exe", 0); + map.put("/download/application.zip", 0); + map.put("/download/01.mp3", 0); + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + String filename = request.getParameter("filename"); + + if (filename != null) { + // 取下载次数 + int hit = map.get(filename); + // 下载次数 + 1 后保存 + map.put(filename, ++hit); + // 重定向到文件 + response.sendRedirect(request.getContextPath() + filename); + } else { + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(" 文件下载"); + out.println(" "); + out.println("
    "); + + out.println("
    文件下载"); + out.println(""); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(" "); + + for (Entry entry : map.entrySet()) { + out.println(""); + out.println(" "); + out.println(" "); + out.println(" "); + out.println(""); + } + + out.println("
    文件名下载次数下载
    " + entry.getKey() + "" + entry.getValue() + "下载
    "); + out.println(" "); + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + } + + @Override + public void destroy() { + map = null; + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RequestServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RequestServlet.java new file mode 100644 index 00000000..177e97af --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/RequestServlet.java @@ -0,0 +1,187 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import java.security.Principal; +import java.util.Locale; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 获取HttpServletRequest信息示例 + */ +public class RequestServlet extends HttpServlet { + + private static final long serialVersionUID = -7936817351382556277L; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + logger.info("访问 doGet"); + + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + + response.setContentType("text/html"); + + String authType = request.getAuthType(); + String localAddr = request.getLocalAddr(); + Locale locale = request.getLocale(); + String localName = request.getLocalName(); + String contextPath = request.getContextPath(); + int localPort = request.getLocalPort(); + String method = request.getMethod(); + String pathInfo = request.getPathInfo(); + String pathTranslated = request.getPathTranslated(); + String protocol = request.getProtocol(); + String queryString = request.getQueryString(); + String remoteAddr = request.getRemoteAddr(); + int port = request.getRemotePort(); + String remoteUser = request.getRemoteUser(); + String requestedSessionId = request.getRequestedSessionId(); + String requestURI = request.getRequestURI(); + StringBuffer requestURL = request.getRequestURL(); + String scheme = request.getScheme(); + String serverName = request.getServerName(); + int serverPort = request.getServerPort(); + String servletPath = request.getServletPath(); + Principal userPrincipal = request.getUserPrincipal(); + + String accept = request.getHeader("accept"); + String referer = request.getHeader("referer"); + String userAgent = request.getHeader("user-agent"); + + String serverInfo = this.getServletContext().getServerInfo(); + + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + + // 这里之间的信息在浏览器中显示为标题 + out.println(" Request Servlet"); + out.println(" "); + out.println(" "); + + out.println("您的IP为 " + remoteAddr + ";您使用 " + getOS(userAgent) + " 操作系统," + + getNavigator(userAgent) + " 。您使用 " + getLocale(locale) + "。
    "); + out.println("服务器IP为 " + localAddr + localAddr + ";服务器使用 " + serverPort + " 端口,您的浏览器使用了 " + + port + " 端口访问本网页。
    "); + out.println("服务器软件为:" + serverInfo + "。服务器名称为 " + localName + "。
    "); + out.println("您的浏览器接受 " + getAccept(accept) + "。
    "); + out.println("您从 " + referer + " 访问到该页面。
    "); + out.println("使用的协议为 " + protocol + "。URL协议头 " + scheme + ",服务器名称 " + serverName + + ",您访问的URI为 " + requestURI + "。
    "); + out.println("该 Servlet 路径为 " + servletPath + ",该 Servlet 类名为 " + this.getClass().getName() + + "。
    "); + out.println("本应用程序在硬盘的根目录为 " + this.getServletContext().getRealPath("") + ",网络相对路径为 " + + contextPath + "。
    "); + + out.println("
    "); + + out.println("

    点击刷新本页面 "); + + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + + /** + * @param userAgent + * @return 客户端操作系统 + */ + private String getOS(String userAgent) { + if (userAgent.indexOf("Windows NT 5.1") > 0) { + return "Windows XP"; + } + if (userAgent.indexOf("Windows 98") > 0) { + return "Windows 98"; + } + if (userAgent.indexOf("Windows NT 5.0") > 0) { + return "Windows 2000"; + } + if (userAgent.indexOf("Linux") > 0) { + return "Linux"; + } + if (userAgent.indexOf("Unix") > 0) { + return "Unix"; + } + return "未知"; + } + + /** + * @param userAgent + * @return 客户端浏览器信息 + */ + private String getNavigator(String userAgent) { + if (userAgent.indexOf("TencentTraveler") > 0) { + return "腾讯浏览器"; + } + if (userAgent.indexOf("Maxthon") > 0) { + return "Maxthon浏览器"; + } + if (userAgent.indexOf("MyIE2") > 0) { + return "MyIE2浏览器"; + } + if (userAgent.indexOf("Firefox") > 0) { + return "Firefox浏览器"; + } + if (userAgent.indexOf("MSIE") > 0) { + return "IE 浏览器"; + } + return "未知浏览器"; + } + + /** + * @param locale + * @return 语言环境名称 + */ + private String getLocale(Locale locale) { + if (Locale.SIMPLIFIED_CHINESE.equals(locale)) { + return "简体中文"; + } + if (Locale.TRADITIONAL_CHINESE.equals(locale)) { + return "繁体中文"; + } + if (Locale.ENGLISH.equals(locale)) { + return "英文"; + } + if (Locale.JAPANESE.equals(locale)) { + return "日文"; + } + return "未知语言环境"; + } + + /** + * @param accept + * @return 客户端浏览器接受的文件类型 + */ + private String getAccept(String accept) { + StringBuffer buffer = new StringBuffer(); + if (accept.contains("image/gif")) { + buffer.append("GIF 文件, "); + } + if (accept.contains("image/x-xbitmap")) { + buffer.append("BMP 文件, "); + } + if (accept.contains("image/jpeg")) { + buffer.append("JPG 文件, "); + } + if (accept.contains("application/vnd.ms-excel")) { + buffer.append("Excel 文件, "); + } + if (accept.contains("application/vnd.ms-powerpoint")) { + buffer.append("PPT 文件, "); + } + if (accept.contains("application/msword")) { + buffer.append("Word 文件, "); + } + return buffer.toString().replaceAll(", $", ""); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ThreadSafetyServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ThreadSafetyServlet.java new file mode 100644 index 00000000..3dd596f0 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/ThreadSafetyServlet.java @@ -0,0 +1,34 @@ +package io.github.dunwu.javaee.servlet; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ThreadSafetyServlet extends HttpServlet { + + private static final long serialVersionUID = 2957055449370562943L; + + private String name; + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + name = request.getParameter("name"); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + response.getWriter().println("您好, " + name + ". 您使用了 GET 方式提交数据"); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + name = request.getParameter("name"); + + response.getWriter().println("您好, " + name + ". 您使用了 POST 方式提交数据"); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/UploadServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/UploadServlet.java new file mode 100644 index 00000000..4c8c1220 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/UploadServlet.java @@ -0,0 +1,175 @@ +package io.github.dunwu.javaee.servlet; + +import org.apache.commons.fileupload.DiskFileUpload; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileUploadException; + +import java.io.*; +import java.net.URLEncoder; +import java.util.List; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class UploadServlet extends HttpServlet { + + private static final long serialVersionUID = 7523024737218332088L; + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setCharacterEncoding("UTF-8"); + response.getWriter().println("请以 POST 方式上传文件"); + } + + @SuppressWarnings("unchecked") + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + File file1 = null, file2 = null; + String description1 = null, description2 = null; + + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(" A Servlet"); + out.println(" "); + out.println(" "); + + out.println("

    "); + out.println("
    上传文件
    "); + + out.println("
    "); + out.println("
    上传日志:
    "); + out.println("
    "); + + // 使用 DiskFileUpload 对象解析 request + DiskFileUpload diskFileUpload = new DiskFileUpload(); + try { + // 将 解析的结果 放置在 List 中 + List list = diskFileUpload.parseRequest(request); + out.println("遍历所有的 FileItem ...
    "); + // 遍历 list 中所有的 FileItem + for (FileItem fileItem : list) { + if (fileItem.isFormField()) { + // 如果是 文本域 + if ("description1".equals(fileItem.getFieldName())) { + // 如果该 FileItem 名称为 description1 + out.println("遍历到 description1 ...
    "); + description1 = new String(fileItem.getString().getBytes(), "UTF-8"); + } + if ("description2".equals(fileItem.getFieldName())) { + // 如果该 FileItem 名称为 description2 + out.println("遍历到 description2 ...
    "); + description2 = new String(fileItem.getString().getBytes(), "UTF-8"); + } + } else { + // 否则,为文件域 + if ("file1".equals(fileItem.getFieldName())) { + // 客户端文件路径构建的 File 对象 + File remoteFile = new File(new String(fileItem.getName().getBytes(), "UTF-8")); + out.println("遍历到 file1 ...
    "); + out.println("客户端文件位置: " + remoteFile.getAbsolutePath() + "
    "); + // 服务器端文件,放在 upload 文件夹下 + file1 = new File(this.getServletContext().getRealPath("attachment"), remoteFile.getName()); + file1.getParentFile().mkdirs(); + file1.createNewFile(); + + // 写文件,将 FileItem 的文件内容写到文件中 + InputStream ins = fileItem.getInputStream(); + OutputStream ous = new FileOutputStream(file1); + + try { + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = ins.read(buffer)) > -1) { + ous.write(buffer, 0, len); + } + out.println("已保存文件" + file1.getAbsolutePath() + "
    "); + } finally { + ous.close(); + ins.close(); + } + } + if ("file2".equals(fileItem.getFieldName())) { + // 客户端文件路径构建的 File 对象 + File remoteFile = new File(new String(fileItem.getName().getBytes(), "UTF-8")); + out.println("遍历到 file2 ...
    "); + out.println("客户端文件位置: " + remoteFile.getAbsolutePath() + "
    "); + // 服务器端文件,放在 upload 文件夹下 + file2 = new File(this.getServletContext().getRealPath("attachment"), remoteFile.getName()); + file2.getParentFile().mkdirs(); + file2.createNewFile(); + + // 写文件,将 FileItem 的文件内容写到文件中 + InputStream ins = fileItem.getInputStream(); + OutputStream ous = new FileOutputStream(file2); + + try { + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = ins.read(buffer)) > -1) { + ous.write(buffer, 0, len); + } + out.println("已保存文件" + file2.getAbsolutePath() + "
    "); + } finally { + ous.close(); + ins.close(); + } + } + } + } + out.println("Request 解析完毕"); + } catch (FileUploadException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + out.println("
    "); + out.println("
    "); + + if (file1 != null) { + out.println("
    "); + out.println("
    file1:
    "); + out.println("
    "); + out.println(" " + file1.getName() + ""); + out.println("
    "); + out.println("
    "); + } + + if (file2 != null) { + out.println("
    "); + out.println("
    file2:
    "); + out.println("
    "); + out.println(" " + file2.getName() + ""); + out.println("
    "); + out.println("
    "); + } + + out.println("
    "); + out.println("
    description1:
    "); + out.println("
    "); + out.println(description1); + out.println("
    "); + out.println("
    "); + + out.println("
    "); + out.println("
    description2:
    "); + out.println("
    "); + out.println(description2); + out.println("
    "); + out.println("
    "); + + out.println("
    "); + + out.println(" "); + out.println(""); + out.flush(); + out.close(); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/ProgressUploadServlet.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/ProgressUploadServlet.java new file mode 100644 index 00000000..fe42b6ec --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/ProgressUploadServlet.java @@ -0,0 +1,121 @@ +package io.github.dunwu.javaee.servlet.upload; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; + +import java.io.*; +import java.util.Iterator; +import java.util.List; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ProgressUploadServlet extends HttpServlet { + + private static final long serialVersionUID = -4935921396709035718L; + + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // 上传状态 + UploadStatus status = new UploadStatus(); + + // 监听器 + UploadListener listener = new UploadListener(status); + + // 把 UploadStatus 放到 session 里 + request.getSession(true).setAttribute("uploadStatus", status); + + // Apache 上传工具 + ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); + + // 设置 listener + upload.setProgressListener(listener); + + try { + List itemList = upload.parseRequest(request); + + for (Iterator it = itemList.iterator(); it.hasNext(); ) { + FileItem item = (FileItem) it.next(); + if (item.isFormField()) { + System.out.println("FormField: " + item.getFieldName() + " = " + item.getString()); + } else { + System.out.println("File: " + item.getName()); + + // 统一 Linux 与 windows 的路径分隔符 + String fileName = item.getName().replace("/", "\\"); + fileName = fileName.substring(fileName.lastIndexOf("\\")); + + File saved = new File("C:\\upload_test", fileName); + saved.getParentFile().mkdirs(); + + InputStream ins = item.getInputStream(); + OutputStream ous = new FileOutputStream(saved); + + byte[] tmp = new byte[1024]; + int len = -1; + + while ((len = ins.read(tmp)) != -1) { + ous.write(tmp, 0, len); + } + + ous.close(); + ins.close(); + + response.getWriter().println("已保存文件:" + saved); + } + } + } catch (Exception e) { + e.printStackTrace(); + response.getWriter().println("上传发生错误:" + e.getMessage()); + } + } + + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + response.setHeader("Cache-Control", "no-store"); + response.setHeader("Pragrma", "no-cache"); + response.setDateHeader("Expires", 0); + + UploadStatus status = (UploadStatus) request.getSession(true).getAttribute("uploadStatus"); + + if (status == null) { + response.getWriter().println("没有上传信息"); + return; + } + + long startTime = status.getStartTime(); + long currentTime = System.currentTimeMillis(); + + // 已传输的时间 单位:s + long time = (currentTime - startTime) / 1000 + 1; + + // 传输速度 单位:byte/s + double velocity = ((double) status.getBytesRead()) / (double) time; + + // 估计总时间 单位:s + double totalTime = status.getContentLength() / velocity; + + // 估计剩余时间 单位:s + double timeLeft = totalTime - time; + + // 已完成的百分比 + int percent = (int) (100 * (double) status.getBytesRead() / (double) status.getContentLength()); + + // 已完成数 单位:M + double length = ((double) status.getBytesRead()) / 1024 / 1024; + + // 总长度 单位:M + double totalLength = ((double) status.getContentLength()) / 1024 / 1024; + + // 格式:百分比||已完成数(M)||文件总长度(M)||传输速率(K)||已用时间(s)||估计总时间(s)||估计剩余时间(s)||正在上传第几个文件 + String value = percent + "||" + length + "||" + totalLength + "||" + velocity + "||" + time + "||" + totalTime + + "||" + timeLeft + "||" + status.getItems(); + + response.getWriter().println(value); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadListener.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadListener.java new file mode 100644 index 00000000..3812ae18 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadListener.java @@ -0,0 +1,19 @@ +package io.github.dunwu.javaee.servlet.upload; + +import org.apache.commons.fileupload.ProgressListener; + +public class UploadListener implements ProgressListener { + + private UploadStatus status; + + public UploadListener(UploadStatus status) { + this.status = status; + } + + public void update(long bytesRead, long contentLength, int items) { + status.setBytesRead(bytesRead); + status.setContentLength(contentLength); + status.setItems(items); + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadStatus.java b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadStatus.java new file mode 100644 index 00000000..0483f070 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/java/io/github/dunwu/javaee/servlet/upload/UploadStatus.java @@ -0,0 +1,45 @@ +package io.github.dunwu.javaee.servlet.upload; + +public class UploadStatus { + + private long bytesRead; + + private long contentLength; + + private int items; + + private long startTime = System.currentTimeMillis(); + + public long getBytesRead() { + return bytesRead; + } + + public void setBytesRead(long bytesRead) { + this.bytesRead = bytesRead; + } + + public long getContentLength() { + return contentLength; + } + + public void setContentLength(long contentLength) { + this.contentLength = contentLength; + } + + public int getItems() { + return items; + } + + public void setItems(int items) { + this.items = items; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + +} diff --git a/codes/javaee/javaee-servlet/src/main/resources/logback.xml b/codes/javaee/javaee-servlet/src/main/resources/logback.xml new file mode 100644 index 00000000..0062bccc --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/resources/logback.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + ${user.dir}/logs/${DIR_NAME}/all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-servlet/src/main/webapp/META-INF/MANIFEST.MF b/codes/javaee/javaee-servlet/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/notice.html b/codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/notice.html new file mode 100644 index 00000000..aebd0084 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/notice.html @@ -0,0 +1,116 @@ + + + + + Eclipse.org Software User Agreement + + + +

    Eclipse Foundation Software User Agreement

    +

    March 17, 2005

    + +

    Usage Of Content

    + +

    THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE + PROJECTS + (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT + AND/OR THE TERMS AND + CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR + USE + OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR + NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS + AND + CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE + CONTENT.

    + +

    Applicable Licenses

    + +

    Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms + and conditions of the Eclipse Public License Version 1.0 + ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. + For purposes of the EPL, "Program" will mean the Content.

    + +

    Content includes, but is not limited to, source code, object code, documentation and other files maintained in the + Eclipse.org CVS repository ("Repository") in CVS + modules ("Modules") and made available as downloadable archives ("Downloads").

    + +
      +
    • Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the + Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and + features ("Features"). +
    • +
    • Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named + "plugins". +
    • +
    • A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be + packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" + may contain a list of the names and version numbers of the Plug-ins + and/or Fragments associated with that Feature. +
    • +
    • Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" + may contain a list of the names and version numbers of Included Features. +
    • +
    + +

    The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). + The terms and conditions governing Features and + Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts + and Feature Licenses may be located in any directory of a Download or Module + including, but not limited to the following locations:

    + +
      +
    • The top-level (root) directory
    • +
    • Plug-in and Fragment directories
    • +
    • Inside Plug-ins and Fragments packaged as JARs
    • +
    • Sub-directories of the directory named "src" of certain Plug-ins
    • +
    • Feature directories
    • +
    + +

    Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must + agree to a license ("Feature Update License") during the + installation process. If the Feature contains Included Features, the Feature Update License should either provide you + with the terms and conditions governing the Included Features or + inform you where you can locate them. Feature Update Licenses may be found in the "license" property of + files named "feature.properties" found within a Feature. + Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such + terms and conditions) that govern your use of the associated Content in + that directory.

    + +

    THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES + OR TERMS AND CONDITIONS. SOME OF THESE + OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):

    + + + +

    IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, + Feature License, or Feature Update License is provided, please + contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.

    + +

    Cryptography

    + +

    Content may contain encryption software. The country in which you are currently may have restrictions on the import, + possession, and use, and/or re-export to + another country, of encryption software. BEFORE using any encryption software, please check the country's laws, + regulations and policies concerning the import, + possession, or use, and re-export of encryption software, to see if this is permitted.

    + +Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other + countries, or both. + + diff --git a/codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/web.xml b/codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..38144543 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,216 @@ + + + + + FirstServlet + + io.github.dunwu.javaee.servlet.FirstServlet + + + message + welcome to FirstServlet + + + encoding + utf-8 + + 1 + + + FirstServlet + /servlet/FirstServlet + /servlet/FirstServlet.asp + /servlet/FirstServlet.jsp + /servlet/FirstServlet.php + /servlet/FirstServlet.aspx + + + + RequestServlet + + io.github.dunwu.javaee.servlet.RequestServlet + + + + RequestServlet + /servlet/RequestServlet + + + + InitParamServlet + + io.github.dunwu.javaee.servlet.InitParamServlet + + + root + root + + + admin + admin + + + + InitParamServlet + /servlet/InitParamServlet + + + + + upload folder + attachment + + + allowed file type + .gif,.jpg,.bmp + + + ContextParamServlet + + io.github.dunwu.javaee.servlet.ContextParamServlet + + + + ContextParamServlet + /servlet/ContextParamServlet + + + + InjectionServlet + + io.github.dunwu.javaee.servlet.InjectionServlet + + + + InjectionServlet + /servlet/InjectionServlet + + + + PostServlet + + io.github.dunwu.javaee.servlet.PostServlet + + + + PostServlet + /servlet/PostServlet + + + + ImageServlet + + io.github.dunwu.javaee.servlet.ImageServlet + + 1 + + + UploadServlet + + io.github.dunwu.javaee.servlet.UploadServlet + + + + LifeCycleServlet + + io.github.dunwu.javaee.servlet.LifeCycleServlet + + + startPoint + 2000 + + + + AnnotationServlet + + io.github.dunwu.javaee.servlet.AnnotationServlet + + + + ForwardServlet + + io.github.dunwu.javaee.servlet.ForwardServlet + + + + RedirectServlet + + io.github.dunwu.javaee.servlet.RedirectServlet + + + + ProgressUploadServlet + + io.github.dunwu.javaee.servlet.upload.ProgressUploadServlet + + + + ThreadSafetyServlet + + io.github.dunwu.javaee.servlet.ThreadSafetyServlet + + + + + ImageServlet + /upload/* + + + UploadServlet + /servlet/UploadServlet + + + LifeCycleServlet + /servlet/LifeCycleServlet + + + AnnotationServlet + /servlet/AnnotationServlet + + + ForwardServlet + /servlet/ForwardServlet + + + RedirectServlet + /servlet/RedirectServlet + + + ProgressUploadServlet + /servlet/ProgressUploadServlet + + + ThreadSafetyServlet + /servlet/ThreadSafetyServlet + + + + index.jsp + + + + hello + java.lang.String + + Hello, Welcome to the JavaEE Resource Injection. + + + + + i + java.lang.Integer + 30 + + + + persons + java.lang.String + + Helloween, Cobain, Roses, Axl, + + + diff --git a/codes/javaee/javaee-servlet/src/main/webapp/index.jsp b/codes/javaee/javaee-servlet/src/main/webapp/index.jsp new file mode 100644 index 00000000..b4a2d228 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/webapp/index.jsp @@ -0,0 +1,33 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + javaee-web + + +

    首页

    +

    欢迎访问

    +

    测试链接

    + + + diff --git a/codes/javaee/javaee-servlet/src/main/webapp/views/jsp/postPersonalInformation.html b/codes/javaee/javaee-servlet/src/main/webapp/views/jsp/postPersonalInformation.html new file mode 100644 index 00000000..771902df --- /dev/null +++ b/codes/javaee/javaee-servlet/src/main/webapp/views/jsp/postPersonalInformation.html @@ -0,0 +1,152 @@ + + + + 提交用户信息 + + + + +
    +
    +
    +
    + 填写用户信息 +
    +
    +
    请填写您的姓名:
    +
    + +
    +
    +
    +
    请填写您的密码:
    +
    + +
    +
    +
    +
    请再次输入密码:
    +
    + +
    +
    +
    +
    请选择性别:
    +
    + + + + +
    +
    +
    +
    请输入年龄:
    +
    + +
    +
    +
    +
    请输入生日:
    +
    + +
    格式:"yyyy-mm-dd" +
    +
    +
    +
    请选择您的爱好
    +
    + + + + + + +
    +
    +
    +
    请选择省市:
    +
    + +
    +
    +
    +
    自我描述:
    +
    + +
    +
    +
    +
    +
    +

    +
    +
    +
    +
    +
    + + diff --git a/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java b/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java new file mode 100644 index 00000000..460b9e3f --- /dev/null +++ b/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java @@ -0,0 +1,114 @@ +package io.github.dunwu.javaee.server; + +import java.util.ArrayList; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * JettyFactory 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("unused") +public class JettyFactory { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + private static final int PORT = 8080; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "shiro-web", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static Server initServer() { + Profiles.setProfileAsSystemProperty(Profiles.DEVELOPMENT); + WebAppContext webAppContext = new WebAppContext(); + Server server = new Server(PORT); + server.setHandler(webAppContext); + return server; + } + + public static void initWebAppContext(Server server, int type) throws Exception { + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + + if (IDE_INTELLIJ == type) { + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + } else { + webAppContext.setParentLoaderPriority(true); + } + + System.out.println("[INFO] Application loaded"); + } + + public static String getAbsolutePath() { + String path = null; + String folderPath = JettyFactory.class.getProtectionDomain().getCodeSource().getLocation().getPath() + .substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + public static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + ArrayList jarNameExprssions = Lists.newArrayList(".*/[^/]*servlet-api-[^/]*\\.jar$", + ".*/javax.servlet.jsp.jstl-.*\\.jar$", ".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + jarNameExprssions.add(".*/" + jarName + "-[^/]*\\.jar$"); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(jarNameExprssions, '|')); + } + + public static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + + public static void startServer(Server server) throws Exception { + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + server.start(); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + } + +} diff --git a/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/Profiles.java b/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/Profiles.java new file mode 100644 index 00000000..dcfd3e39 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/Profiles.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2005, 2014 springside.github.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + *******************************************************************************/ +package io.github.dunwu.javaee.server; + +/** + * Spring profile 常用方法与profile名称。 + * + * @author calvin + */ +public class Profiles { + + public static final String ACTIVE_PROFILE = "spring.profiles.active"; + + public static final String DEFAULT_PROFILE = "spring.profiles.default"; + + public static final String PRODUCTION = "production"; + + public static final String DEVELOPMENT = "development"; + + public static final String UNIT_TEST = "test"; + + public static final String FUNCTIONAL_TEST = "functional"; + + /** + * 在Spring启动前,设置profile的环境变量。 + */ + public static void setProfileAsSystemProperty(String profile) { + System.setProperty(ACTIVE_PROFILE, profile); + } + +} diff --git a/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java b/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java new file mode 100644 index 00000000..049c8802 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.server; + +import org.eclipse.jetty.server.Server; + +/** + * 快速启动 jetty 服务器,方便测试 + * + * @author Zhang Peng + */ +public class QuickStartServer { + + // private static int STARTUP_TYPE = JettyFactory.IDE_ECLIPSE; + private static int STARTUP_TYPE = JettyFactory.IDE_INTELLIJ; + + public static void main(String[] args) throws Exception { + Server server = JettyFactory.initServer(); + JettyFactory.initWebAppContext(server, STARTUP_TYPE); + + try { + JettyFactory.startServer(server); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + JettyFactory.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + +} diff --git a/codes/javaee/javaee-servlet/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-servlet/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-servlet/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-servlet/src/test/resources/logback.xml b/codes/javaee/javaee-servlet/src/test/resources/logback.xml new file mode 100644 index 00000000..5b969d92 --- /dev/null +++ b/codes/javaee/javaee-servlet/src/test/resources/logback.xml @@ -0,0 +1,46 @@ + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-session/pom.xml b/codes/javaee/javaee-session/pom.xml new file mode 100644 index 00000000..cd0d5743 --- /dev/null +++ b/codes/javaee/javaee-session/pom.xml @@ -0,0 +1,88 @@ + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + io.github.dunwu + javaee-session + 1.0.0 + war + javaee-session + JavaEE 学习笔记之 session + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + org.slf4j + jcl-over-slf4j + + + + + + org.apache.commons + commons-lang3 + + + + + + javax.servlet + javax.servlet-api + + + + + + org.eclipse.jetty + jetty-webapp + test + + + org.eclipse.jetty + jetty-annotations + test + + + org.eclipse.jetty + apache-jsp + test + + + org.eclipse.jetty + apache-jstl + test + + + + + + junit + junit + test + + + org.assertj + assertj-core + test + + + + + diff --git a/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/AddCookies.java b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/AddCookies.java new file mode 100644 index 00000000..d30df96a --- /dev/null +++ b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/AddCookies.java @@ -0,0 +1,68 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.cookie; + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URLEncoder; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/26. + */ +@WebServlet("/servlet/AddCookies") +public class AddCookies extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public AddCookies() { + super(); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + doGet(request, response); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 为名字和姓氏创建 Cookie + Cookie name = new Cookie("name", URLEncoder.encode(request.getParameter("name"), "UTF-8")); // 中文转码 + Cookie url = new Cookie("url", request.getParameter("url")); + + // 为两个 Cookie 设置过期日期为 24 小时后 + name.setMaxAge(60 * 60 * 24); + url.setMaxAge(60 * 60 * 24); + + // 在响应头中添加两个 Cookie + response.addCookie(name); + response.addCookie(url); + + // 设置响应内容类型 + response.setContentType("text/html;charset=UTF-8"); + + PrintWriter out = response.getWriter(); + String title = "设置 Cookie 实例"; + String docType = "\n"; + out.println(docType + "\n" + "" + title + "\n" + + "\n" + "

    " + title + "

    \n" + "
      \n" + + "
    • 站点名::" + request.getParameter("name") + "\n
    • " + "
    • 站点 URL::" + + request.getParameter("url") + "\n
    • " + "
    \n" + ""); + } + +} diff --git a/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/DeleteCookies.java b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/DeleteCookies.java new file mode 100644 index 00000000..b3cd3193 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/DeleteCookies.java @@ -0,0 +1,75 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.cookie; + +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/26. + */ +@WebServlet("/servlet/DeleteCookies") +public class DeleteCookies extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public DeleteCookies() { + super(); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + doGet(request, response); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Cookie cookie = null; + Cookie[] cookies = null; + // 获取与该域相关的 Cookie 的数组 + cookies = request.getCookies(); + + // 设置响应内容类型 + response.setContentType("text/html;charset=UTF-8"); + + PrintWriter out = response.getWriter(); + String title = "删除 Cookie 实例"; + String docType = "\n"; + out.println( + docType + "\n" + "" + title + "\n" + "\n"); + if (cookies != null) { + out.println("

    Cookie 名称和值

    "); + for (int i = 0; i < cookies.length; i++) { + cookie = cookies[i]; + if ((cookie.getName()).compareTo("url") == 0) { + cookie.setMaxAge(0); + response.addCookie(cookie); + out.print("已删除的 cookie:" + cookie.getName() + "
    "); + } + out.print("名称:" + cookie.getName() + ","); + out.print("值:" + cookie.getValue() + "
    "); + } + } else { + out.println("

    No Cookie founds

    "); + } + out.println(""); + out.println(""); + } + +} diff --git a/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/ReadCookies.java b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/ReadCookies.java new file mode 100644 index 00000000..add3ecab --- /dev/null +++ b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/ReadCookies.java @@ -0,0 +1,76 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.cookie; + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URLDecoder; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author Zhang Peng + * @since 2017/3/26. + */ +@WebServlet("/servlet/ReadCookies") +public class ReadCookies extends HttpServlet { + + private static final long serialVersionUID = 1L; + + /** + * @see HttpServlet#HttpServlet() + */ + public ReadCookies() { + super(); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + doGet(request, response); + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Cookie cookie = null; + Cookie[] cookies = null; + // 获取与该域相关的 Cookie 的数组 + cookies = request.getCookies(); + + // 设置响应内容类型 + response.setContentType("text/html;charset=UTF-8"); + + PrintWriter out = response.getWriter(); + String title = "Delete Cookie Example"; + String docType = "\n"; + out.println( + docType + "\n" + "" + title + "\n" + "\n"); + if (cookies != null) { + out.println("

    Cookie 名称和值

    "); + for (int i = 0; i < cookies.length; i++) { + cookie = cookies[i]; + if ((cookie.getName()).compareTo("name") == 0) { + cookie.setMaxAge(0); + response.addCookie(cookie); + out.print("已删除的 cookie:" + cookie.getName() + "
    "); + } + out.print("名称:" + cookie.getName() + ","); + out.print("值:" + URLDecoder.decode(cookie.getValue(), "utf-8") + "
    "); + } + } else { + out.println("

    No Cookie founds

    "); + } + out.println(""); + out.println(""); + } + +} diff --git a/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Person.java b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Person.java new file mode 100644 index 00000000..6e4d9271 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Person.java @@ -0,0 +1,65 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.cookie.bean; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author Zhang Peng + * @since 2017/3/26. + */ +public class Person implements Serializable { + + private static final long serialVersionUID = -827111150707830908L; + + private String name; + + private String password; + + private int age; + + private Date birthday; + + public Person(String name, String password, int age, Date birthday) { + // super(); + this.name = name; + this.password = password; + this.age = age; + this.birthday = birthday; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + +} diff --git a/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Topic.java b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Topic.java new file mode 100644 index 00000000..4e263d60 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/cookie/bean/Topic.java @@ -0,0 +1,42 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.cookie.bean; + +/** + * @author Zhang Peng + * @since 2017/3/26. + */ +public class Topic { + + private int id; + + private String title; + + private String content; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + +} diff --git a/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/session/SessionTrackServlet.java b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/session/SessionTrackServlet.java new file mode 100644 index 00000000..a495546d --- /dev/null +++ b/codes/javaee/javaee-session/src/main/java/io/github/dunwu/javaee/session/SessionTrackServlet.java @@ -0,0 +1,69 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.session; + +import java.io.IOException; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +/** + * @author Zhang Peng + * @since 2017/3/26. + */ +@WebServlet("/servlet/SessionTrackServlet") +public class SessionTrackServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + // 如果不存在 session 会话,则创建一个 session 对象 + HttpSession session = request.getSession(true); + // 获取 session 创建时间 + Date createTime = new Date(session.getCreationTime()); + // 获取该网页的最后一次访问时间 + Date lastAccessTime = new Date(session.getLastAccessedTime()); + + // 设置日期输出的格式 + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + String title = "Servlet Session 实例"; + Integer visitCount = new Integer(0); + String visitCountKey = new String("visitCount"); + String userIDKey = new String("userID"); + String userID = new String("admin"); + + // 检查网页上是否有新的访问者 + if (session.isNew()) { + session.setAttribute(userIDKey, userID); + } else { + visitCount = (Integer) session.getAttribute(visitCountKey); + visitCount = visitCount + 1; + userID = (String) session.getAttribute(userIDKey); + } + session.setAttribute(visitCountKey, visitCount); + + // 设置响应内容类型 + response.setContentType("text/html;charset=UTF-8"); + PrintWriter out = response.getWriter(); + + String docType = "\n"; + out.println(docType + "\n" + "" + title + "\n" + + "\n" + "

    " + title + "

    \n" + + "

    Session 信息

    \n" + "\n" + + "\n" + " \n" + "\n" + " \n" + + " \n" + "\n" + " \n" + " \n" + "\n" + " \n" + " \n" + "\n" + " \n" + " \n" + "\n" + " \n" + " \n" + + "
    Session 信息
    id" + session.getId() + "
    创建时间" + + df.format(createTime) + "
    最后访问时间" + + df.format(lastAccessTime) + "
    用户 ID" + userID + + "
    访问统计:" + visitCount + "
    \n" + ""); + } + +} diff --git a/codes/javaee/javaee-session/src/main/resources/logback.xml b/codes/javaee/javaee-session/src/main/resources/logback.xml new file mode 100644 index 00000000..0e8f7363 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/resources/logback.xml @@ -0,0 +1,45 @@ + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/META-INF/MANIFEST.MF b/codes/javaee/javaee-session/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/codes/javaee/javaee-session/src/main/webapp/META-INF/context.xml b/codes/javaee/javaee-session/src/main/webapp/META-INF/context.xml new file mode 100644 index 00000000..8f05edc7 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/META-INF/context.xml @@ -0,0 +1,4 @@ + + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/WEB-INF/web.xml b/codes/javaee/javaee-session/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..83c873a5 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,49 @@ + + + + + AddCookies + io.github.dunwu.javaee.servlet.cookie.AddCookies + + + AddCookies + /servlet/AddCookies + + + + ReadCookies + io.github.dunwu.javaee.servlet.cookie.ReadCookies + + + ReadCookies + /servlet/ReadCookies + + + + DeleteCookies + io.github.dunwu.javaee.servlet.cookie.DeleteCookies + + + DeleteCookies + /servlet/DeleteCookies + + + + SessionTrackServlet + io.github.dunwu.javaee.session.SessionTrackServlet + + + SessionTrackServlet + /servlet/SessionTrackServlet + + + + 20 + + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/encodeURL.jsp b/codes/javaee/javaee-session/src/main/webapp/encodeURL.jsp new file mode 100644 index 00000000..c2aeaad0 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/encodeURL.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + + + Cookie Encoding + + +">Homepage + +<%= response.encodeURL("index.jsp") %>?c=1&wd=Java + + + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/index.jsp b/codes/javaee/javaee-session/src/main/webapp/index.jsp new file mode 100644 index 00000000..79af5bcc --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/index.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" pageEncoding="UTF-8" %> +<% + String path = request.getContextPath(); + String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; +%> + + + + + + + My JSP 'index.jsp' starting page + + + + + + + + + +This is my JSP page.
    + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/css/style.css b/codes/javaee/javaee-session/src/main/webapp/views/css/style.css new file mode 100644 index 00000000..2ae2e7bd --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/css/style.css @@ -0,0 +1,51 @@ +body, div, td, input { + font-size: 12px; + margin: 0px; +} + +select { + height: 20px; + width: 300px; +} + +.title { + font-size: 16px; + padding: 10px; + margin: 10px; + width: 80%; +} + +.text { + height: 20px; + width: 300px; + border: 1px solid #AAAAAA; +} + +.line { + margin: 2px; +} + +.leftDiv { + width: 110px; + float: left; + height: 22px; + line-height: 22px; + font-weight: bold; +} + +.rightDiv { + height: 22px; + line-height: 22px; +} + +.button { + color: #FFFFFF; + font-weight: bold; + font-size: 11px; + text-align: center; + padding: .17em 0 .2em .17em; + border-style: solid; + border-width: 1px; + border-color: #99CCFF #115599 #115599 #99CCFF; + background: #6699CC url(../images/bg-btn-blue.gif) repeat-x; +} diff --git a/codes/javaee/javaee-session/src/main/webapp/views/images/bg-btn-blue.gif b/codes/javaee/javaee-session/src/main/webapp/views/images/bg-btn-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc03f1bd5948a2057abb97707ece2434cea75203 GIT binary patch literal 827 zcmZ?wbhEHbWMnX6_|CwPHuG*k>y@ysYcAF2qxx^ePrhYUcrtm~ZLfxlcBN++M!{$Z w4C@e3{K*3LpALuw>Qm;Jxj`0rlh|A$@w9(4VG)c@~M-~Y$c|2>)h z|LMH{&*uGmI`7}JdH)-y6 z{|6)f9gO&YF!JBQ$p1hsr_2AHuK0YU;@`#gf0sHQAME~rd;Y5vlm0(gT^%S~7c9~m zA=VrwRu>}L5+U9lE7=tz*%d3{jASsC)D=O>?>lXPrW!qJ%tM`tBm zT9STYaoU;rDW~Qop8$%_PCPOz;quaqOG`2?EzP*NIQ{&hv~!En&MrtjJul_t+~ni4 zla9|xIyyV?#G?Fj3sTQ7OglO=@!Y!Bt9$0%J+t%w|Njis1ByRc7#SGS7<52Jg5rdM zeQiTpQ*&x?aB6dBSE!U!aMy%XA0f$*jtM}2o0?1b&S*;U6}7Y!4^LSTAz)!;t0b5> zBR)Yy(aze8KQexTAFGzJgT09sn_pMFyRe#(le3W;Q`FvOe+Fe0Lsu6ARaM65=J)_+ zP4yQqG&NW}uEuca>gmYayUA6z3obJRnSdDW7c4h+@+$P5Uu literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-session/src/main/webapp/views/images/errorstate.gif b/codes/javaee/javaee-session/src/main/webapp/views/images/errorstate.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3b621b5709ff889e5b435d5d6d6a9f8220d1340 GIT binary patch literal 609 zcmZ?wbhEHb6k!lyc*el+DJK4Na@yyV^snt5AN<2U1cbkfi2W2D|1mn@Q+m$(yyDln zg&&H`zgE?Mt!a4c9{ABW?4w`UU9XUP-of|%!@uU1e#tG}Eu?TrUi+M;#W8KOch(*k zEnM$9_bzWQ2fcl$iU#tpaXI{C{7sI_cb^-HMg|3wRd!Ob?fWt z7#Zp4>UZlJnb{c{+L;;YcIp{fo0?cy7#mm`>9y+{Ihflz*>2hFU^JywNyN&=#?i^f z$&8qW_nJ%28zd{SOo`oJfr zkJ9qjcFBtIJMsT_Y_eH#!LenbxVDIj!hsEmOstYcqCpcI9hsRWcuf)}IJzo{s;lWp d7$h{Z@Muc3UMM)o(k>t*esYdyahd{yH2_yuu)_cV literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-session/src/main/webapp/views/images/mail.gif b/codes/javaee/javaee-session/src/main/webapp/views/images/mail.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f2b0d7618913ad725dfc296b4af442d8518b88c GIT binary patch literal 226 zcmZ?wbhEHb6krfwIKsg2|NsAAzy5vt^n3G(XKN2XS-SV(>}~g^ZMxIH_EzJft91*n zl+L=CIq__H`EskwbOwb~3QWE2#9PWX?-jye?-oSAou9 z#t$Y<#sW3x`T3;v7JmLK!?p0if(xSaSQk86U?L%KZiRB;f_p4sEY9pP8f&gTYuGVW mYRU~q^Mkewf?jh=_p@s;HZ(Rhn)A1{cXVoW_oyl|SOWkQuTW|L literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-session/src/main/webapp/views/images/vertical_line.gif b/codes/javaee/javaee-session/src/main/webapp/views/images/vertical_line.gif new file mode 100644 index 0000000000000000000000000000000000000000..65f8ee7882196570f92051f9c5fc4f48c5bfa066 GIT binary patch literal 301 zcma)1+X=!z5S-0D5-%5X=NS!&f(2NCKYj>7t;ik(!8&Y0L9hiMKX!7SehBf)Sr(R= zVRqMF{S#*0tQrszmZ9JuSU_^l1(!m|jtre9QYNWZDpg7w{ejWl+~i&DT)*$!sIKeL zL gJo)DBuOGJO@6e3GGG;Nyc5_&rX1noz+FbnY1^zZDQUCw| literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/addCookies.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/addCookies.jsp new file mode 100644 index 00000000..58b5ff9e --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/addCookies.jsp @@ -0,0 +1,16 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + + + + 添加Cookie + + +
    + 站点名 : +
    + 站点 URL:
    + +
    + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64.jsp new file mode 100644 index 00000000..49b525ac --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64.jsp @@ -0,0 +1,35 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + + +<% + File file = new File(this.getServletContext().getRealPath("../../images/cookie.gif")); + + // 二进制数组 + byte[] binary = new byte[(int) file.length()]; + + // 从图片文件读取二进制数据. + InputStream ins = this.getServletContext().getResourceAsStream(file.getName()); + ins.read(binary); + ins.close(); + + // BASE64 编码 + String content = BASE64Encoder.class.newInstance().encode(binary); + + // 包含二进制数据的 Cookie + Cookie cookie = new Cookie("file", content); + + // 将 Cookie 发送到客户端 + response.addCookie(cookie); +%> + + + + Cookie Encoding + + +从 Cookie 中获取到的二进制图片:
    + + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64_decode.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64_decode.jsp new file mode 100644 index 00000000..e317b628 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/base64_decode.jsp @@ -0,0 +1,32 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + +<% + // 清除输出 + out.clear(); + + for (Cookie cookie : request.getCookies()) { + + if (cookie.getName().equals("file")) { + + // 从 Cookie 中取二进制数据 + byte[] binary = BASE64Decoder.class.newInstance().decodeBuffer(cookie.getValue().replace(" ", "")); + + // 设置内容类型为 gif 图片 + response.setHeader("Content-Type", "image/gif"); + response.setHeader("Content-Disposition", "inline;filename=cookie.gif"); + response.setHeader("Connection", "close"); + + // 设置长度 + response.setContentLength(binary.length); + + // 输出到客户端 + response.getOutputStream().write(binary); + response.getOutputStream().flush(); + response.getOutputStream().close(); + + return; + } + } + +%> diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookie.gif b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookie.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c6bd580872e46427d52e49b46612c19dacce7dd GIT binary patch literal 592 zcmZ?wbhEHb6krfwc*el+?{@LO+a>>Qm;Jxj`0rlh|A$@w9(4VG)c@~M-~Y$c|2>)h z|LMH{&*uGmI`7}JdH)-y6 z{|6)f9gO&YF!JBQ$p1hsr_2AHuK0YU;@`#gf0sHQAME~rd;Y5vlm0(gT^%S~7c9~m zA=VrwRu>}L5+U9lE7=tz*%d3{jASsC)D=O>?>lXPrW!qJ%tM`tBm zT9STYaoU;rDW~Qop8$%_PCPOz;quaqOG`2?EzP*NIQ{&hv~!En&MrtjJul_t+~ni4 zla9|xIyyV?#G?Fj3sTQ7OglO=@!Y!Bt9$0%J+t%w|Njis1ByRc7#SGS7<52Jg5rdM zeQiTpQ*&x?aB6dBSE!U!aMy%XA0f$*jtM}2o0?1b&S*;U6}7Y!4^LSTAz)!;t0b5> zBR)Yy(aze8KQexTAFGzJgT09sn_pMFyRe#(le3W;Q`FvOe+Fe0Lsu6ARaM65=J)_+ zP4yQqG&NW}uEuca>gmYayUA6z3obJRnSdDW7c4h+@+$P5Uu literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookie.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookie.jsp new file mode 100644 index 00000000..e6d40bbd --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookie.jsp @@ -0,0 +1,81 @@ +<%@ page language="java" pageEncoding="UTF-8" errorPage="login.jsp" %> +<% + request.setCharacterEncoding("UTF-8"); + + String username = ""; + int visitTimes = 0; + + // 所有的 cookie + Cookie[] cookies = request.getCookies(); + + // 遍历所有的 Cookie 寻找 用户帐号信息与登录次数信息 + for (int i = 0; cookies != null && i < cookies.length; i++) { + Cookie cookie = cookies[i]; + if ("username".equals(cookie.getName())) { + username = cookie.getValue(); + } else if ("visitTimes".equals(cookie.getName())) { + visitTimes = Integer.parseInt(cookie.getValue()); + cookie.setValue("" + ++visitTimes); + } + } + + // 如果没有找到 Cookie 中保存的用户名,则转到登录界面 + if (username == null || username.trim().equals("")) { + throw new Exception("您还没有登录。请先登录"); + } + + // 修改 Cookie,更新用户的访问次数 + Cookie visitTimesCookie = new Cookie("visitTimes", Integer.toString(++visitTimes)); + response.addCookie(visitTimesCookie); + +%> + + + + + Cookie + + + + + + + + +
    +
    + 登录信息 +
    + + + + + + + + + + + + + +
    + 您的帐号: + + <%= username %> +
    + 登录次数: + + <%= visitTimes %> +
    + + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieAttribute.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieAttribute.jsp new file mode 100644 index 00000000..2fda1553 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieAttribute.jsp @@ -0,0 +1,30 @@ +<%@ page language="java" pageEncoding="UTF-8" errorPage="login.jsp" %> +<% + + Cookie[] cc = request.getCookies(); + + out.println(cc); + + Cookie cookie = new Cookie("password1", "babyface009988"); + + cookie.setPath(request.getContextPath()); + + response.addCookie(cookie); + +%> + + + + + Cookie + + + + + + + + + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieDomain.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieDomain.jsp new file mode 100644 index 00000000..4bfa7b8b --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/cookieDomain.jsp @@ -0,0 +1,27 @@ +<%@ page language="java" pageEncoding="UTF-8" errorPage="login.jsp" %> +<% + + Cookie cookie = new Cookie("time", "20080808"); + cookie.setDomain(".h_google.com"); + cookie.setPath("/"); + cookie.setMaxAge(Integer.MAX_VALUE); + + response.addCookie(cookie); + +%> + + + + + Cookie + + + + + + + + + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/encoding.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/encoding.jsp new file mode 100644 index 00000000..02391beb --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/encoding.jsp @@ -0,0 +1,33 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + +<% + // 使用中文的 Cookie. name 与 value 都使用 UTF-8 编码. + Cookie cookie = new Cookie(URLEncoder.encode("姓名", "UTF-8"), URLEncoder.encode("张三", "UTF-8")); + + // 发送到客户端 + response.addCookie(cookie); +%> + + + + Cookie Encoding + + +<% + Cookie[] cookies = request.getCookies(); + if (null != cookies) { + for (int i = 0; i < cookies.length; i++) { + + String cookieName = URLDecoder.decode(cookies[i].getName(), "UTF-8"); + String cookieValue = URLDecoder.decode(cookies[i].getValue(), "UTF-8"); + + out.println(cookieName + "="); + out.println(cookieValue + ";
    "); + } + } else { + out.println("Cookie 已经写入客户端. 请刷新页面. "); + } +%> + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.js b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.js new file mode 100644 index 00000000..52dee341 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.js @@ -0,0 +1,27 @@ +function getCookie(name) { + var str = document.cookie; + if (!str || str.indexOf(name + '=') < 0) return; + var cookies = str.split('; '); + for (var i = 0; i < cookies.length; i++) { + var cookie = cookies[i]; + if (cookie.indexOf(name + '=') == 0) { + var value = cookie.substring(name.length + 1) + } + } +} + +function setCookie(name, value) { + var expires = (arguments.length > 2) ? arguments[2] : null; + var path = (arguments.length > 3) ? arguments[3] : null; + var domain = (arguments.length > 4) ? arguments[4] : null; + var secure = (arguments.length > 5) ? arguments[5] : false; + document.cookie = name + + '=' + + encodeURI(value) + + ((expires == null) ? '' : ('; expires=' + expires.toGMTString())) + + ((path == null) ? '' : ('; path=' + path)) + + ((domain == null) ? '' : ('; domain=' + domain)) + + ((secure == true) ? '; secure' : '') +} + +var ss = getCookie('history'); diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.jsp new file mode 100644 index 00000000..55a2886a --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/history.jsp @@ -0,0 +1,64 @@ +<%@ page language="java" pageEncoding="UTF-8" isErrorPage="false" %> +<%! + +%> +<% + + +%> + + + + . + + + +
    +
    + 当前有效的 Cookie + +
    +
    + 历史记录 +
    + + + + + + + + + + + + + + + + + +
    + 帐号: + + +
    + 密码: + + +
    + 有效期: + + 关闭浏览器即失效
    + 30天内有效
    + 永久有效
    +
    + + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/javascript.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/javascript.jsp new file mode 100644 index 00000000..1060d5d5 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/javascript.jsp @@ -0,0 +1,106 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + + + 欢迎您 + + + + +
    +
    + 当前有效的 Cookie +
    + +
    +
    + + 欢迎您 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + 读取 Cookie: + + +
    +   + +
    + 设置 Cookie: + +
    + Name 属性: + + +
    + Value 属性: + + +
    + + +
    +
    +
    + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/login.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/login.jsp new file mode 100644 index 00000000..09f2a0a3 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/login.jsp @@ -0,0 +1,68 @@ +<%@ page language="java" pageEncoding="UTF-8" isErrorPage="true" %> +<% + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + + if ("POST".equals(request.getMethod())) { + + Cookie usernameCookie = new Cookie("username", request.getParameter("username")); + Cookie visittimesCookie = new Cookie("visitTimes", "0"); + + response.addCookie(usernameCookie); + response.addCookie(visittimesCookie); + + response.sendRedirect(request.getContextPath() + "/cookie.jsp"); + + return; + } +%> + + + + 请先登录 + + + +
    +
    + 登录 +
    + + + + + + + + + + + + + + + + + +
    + + + <%= exception.getMessage() %> +
    + 帐号: + + +
    + 密码: + + +
    + + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/loginCookie.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/loginCookie.jsp new file mode 100644 index 00000000..00ce6801 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/loginCookie.jsp @@ -0,0 +1,165 @@ +<%@ page language="java" pageEncoding="UTF-8" isErrorPage="false" %> + +<%! + // 密钥 + private static final String KEY = ":cookie@helloweenvsfei.com"; + + // MD5 加密算法 + public final static String calcMD5(String ss) { + + String s = ss == null ? "" : ss; + + char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + try { + byte[] strTemp = s.getBytes(); + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(strTemp); + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + for (int i = 0; i < j; i++) { + byte byte0 = md[i]; + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + return null; + } + } + +%> +<% + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + + String action = request.getParameter("action"); + + if ("login".equals(action)) { + + String account = request.getParameter("account"); + String password = request.getParameter("password"); + int timeout = new Integer(request.getParameter("timeout")); + + // 把帐号连同密钥使用MD5后加密后保存 + String ssid = calcMD5(account + KEY); + + // 把帐号保存到Cookie中 并控制有效期 + Cookie accountCookie = new Cookie("account", account); + accountCookie.setMaxAge(timeout); + + // 把加密结果保存到Cookie中 并控制有效期 + Cookie ssidCookie = new Cookie("ssid", ssid); + ssidCookie.setMaxAge(timeout); + + response.addCookie(accountCookie); + response.addCookie(ssidCookie); + + // 重新请求本页面 + response.sendRedirect(request.getRequestURI() + "?" + System.currentTimeMillis()); + return; + } else if ("logout".equals(action)) { + + // 删除Cookie中的帐号 + Cookie accountCookie = new Cookie("account", ""); + accountCookie.setMaxAge(0); + + // 删除Cookie中的加密结果 + Cookie ssidCookie = new Cookie("ssid", ""); + ssidCookie.setMaxAge(0); + + response.addCookie(accountCookie); + response.addCookie(ssidCookie); + + // 重新请求本页面 + response.sendRedirect(request.getRequestURI() + "?" + System.currentTimeMillis()); + return; + } + + boolean loggin = false; + + String account = null; + String ssid = null; + + // 获取Cookie中的account与ssid + if (request.getCookies() != null) { + for (Cookie cookie : request.getCookies()) { + if (cookie.getName().equals("account")) { + account = cookie.getValue(); + } + if (cookie.getName().equals("ssid")) { + ssid = cookie.getValue(); + } + } + } + + if (account != null && ssid != null) { + // 如果加密规则正确, 则视为已经登录 + loggin = ssid.equals(calcMD5(account + KEY)); + } + +%> + + + + <%= loggin ? "欢迎您回来" : "请先登录" %> + + + + +
    +
    + 当前有效的 Cookie + +
    +
    + <%= loggin ? "欢迎您回来" : "请先登录" %> + + <% if (loggin) { %> + 欢迎您, ${ cookie.account.value }.    + 注销 + <% } else { %> +
    + + + + + + + + + + + + + + + + + +
    + 帐号: + + +
    + 密码: + + +
    + 有效期: + + 关闭浏览器即失效
    + 30天内有效
    + 永久有效
    +
    + + +
    +
    + <% } %> +
    +
    + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/maxAge.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/maxAge.jsp new file mode 100644 index 00000000..afc2ff95 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/maxAge.jsp @@ -0,0 +1,26 @@ +<%@ page language="java" pageEncoding="UTF-8" %> +<% + Cookie cookie = new Cookie("username", "helloweenvsfei"); + cookie.setMaxAge(0); + + // 必须执行这一句 + response.addCookie(cookie); + +%> + + + + + Cookie maxAge + + + + + + + + + +This is my JSP page.
    + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/setCookie.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/setCookie.jsp new file mode 100644 index 00000000..bf6c1234 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/cookie/setCookie.jsp @@ -0,0 +1,109 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + +<%! + boolean isNull(String str) { + return str == null || str.trim().length() == 0; + } +%> +<% + request.setCharacterEncoding("UTF-8"); + + if ("POST".equals(request.getMethod())) { + + String name = request.getParameter("name"); + String value = request.getParameter("value"); + String maxAge = request.getParameter("maxAge"); + String domain = request.getParameter("domain"); + String path = request.getParameter("path"); + String comment = request.getParameter("comment"); + String secure = request.getParameter("secure"); + + if (!isNull(name)) { + + Cookie cookie = new Cookie(URLEncoder.encode(name, "UTF-8"), URLEncoder.encode(value, "UTF-8")); + + if (!isNull(maxAge)) { + cookie.setMaxAge(Integer.parseInt(maxAge)); + } + if (!isNull(domain)) { + cookie.setDomain(domain); + } + if (!isNull(path)) { + cookie.setPath(path); + } + if (!isNull(comment)) { + cookie.setComment(comment); + } + if (!isNull(secure)) { + cookie.setSecure("true".equalsIgnoreCase(secure)); + } + + response.addCookie(cookie); + } + } +%> + + + + Cookie + + + + + + + + +
    +
    + 当前有效的 Cookie + +
    +
    + 设置新 Cookie +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name:
    value:
    maxAge:
    domain:
    path:
    comment:
    secure:
    + + +
    +
    +
    +
    + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/session.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/session.jsp new file mode 100644 index 00000000..1a547152 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/session.jsp @@ -0,0 +1,94 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + + +<%@ page import="java.util.Date" %> +<%! + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); +%> +<% + response.setCharacterEncoding("UTF-8"); + + Person[] persons = {new Person("Liu Jinghua", "password1", 34, dateFormat.parse("1982-01-01")), + new Person("Hello Kitty", "hellokitty", 23, dateFormat.parse("1984-02-25")), + new Person("Garfield", "garfield_pass", 23, dateFormat.parse("1994-09-12")),}; + + String message = ""; + + if (request.getMethod().equals("POST")) { + + for (int i = 0; i < persons.length; i++) { + // 如果 用户名正确 且 密码正确 + if (persons[i].getName().equalsIgnoreCase(request.getParameter("username")) && persons[i].getPassword() + .equals( + request.getParameter( + "password"))) { + + // 登录成功, 设置将用户的信息以及登录时间保存到 Session + session.setAttribute("person", persons[i]); + session.setAttribute("loginTime", new Date()); + + response.sendRedirect(request.getContextPath() + "welcome.jsp"); + return; + } + } + + // 登录失败 + message = "用户名密码不匹配,登录失败。"; + } + +%> + + + + 请先登录 + + + +
    +
    + 登录 +
    + + <% if (!message.equals("")) { %> + + + + + <% } %> + + + + + + + + + + + + +
    + + + <%= message %> +
    + 帐号: + + +
    + 密码: + + +
    + + +
    +
    +
    +
    + +Hello Kitty, hellokitty + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/vote.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/vote.jsp new file mode 100644 index 00000000..17d7c865 --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/vote.jsp @@ -0,0 +1,52 @@ +<%@ page language="java" pageEncoding="UTF-8" %> + + + + 欢迎您 + + + +
    +
    + 投票 + + + + + + + + + + + + + + + + + + + + + +
    + 您的姓名: + +
    + +
    + 您的年龄: + +
    + 您的生日: + +
    + + +
    +
    +
    + + + diff --git a/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/welcome.jsp b/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/welcome.jsp new file mode 100644 index 00000000..5cb7b51b --- /dev/null +++ b/codes/javaee/javaee-session/src/main/webapp/views/jsp/session/welcome.jsp @@ -0,0 +1,63 @@ +<%@ page language="java" pageEncoding="UTF-8" %> +<% + if (session.getAttribute("person") == null) { + response.sendRedirect("session.jsp"); + return; + } +%> + + + + 欢迎您, ${ person.name } + + + +
    +
    + 欢迎您${ person.name } + + + + + + + + + + + + + + + + + + + + + +
    + 您的姓名: + + ${ person.name } +
    + 登录时间: + + ${ loginTime } +
    + 您的年龄: + + ${ person.age } +
    + 您的生日: + + ${ person.birthday } +
    + + +
    +
    +
    + + + diff --git a/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java b/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java new file mode 100644 index 00000000..c15c631a --- /dev/null +++ b/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java @@ -0,0 +1,114 @@ +package io.github.dunwu.javaee.server; + +import java.util.ArrayList; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * JettyFactory 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("unused") +public class JettyFactory { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + private static final int PORT = 9899; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "shiro-web", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static Server initServer() { + Profiles.setProfileAsSystemProperty(Profiles.DEVELOPMENT); + WebAppContext webAppContext = new WebAppContext(); + Server server = new Server(PORT); + server.setHandler(webAppContext); + return server; + } + + public static void initWebAppContext(Server server, int type) throws Exception { + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + + if (IDE_INTELLIJ == type) { + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + } else { + webAppContext.setParentLoaderPriority(true); + } + + System.out.println("[INFO] Application loaded"); + } + + public static String getAbsolutePath() { + String path = null; + String folderPath = JettyFactory.class.getProtectionDomain().getCodeSource().getLocation().getPath() + .substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + public static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + ArrayList jarNameExprssions = Lists.newArrayList(".*/[^/]*servlet-api-[^/]*\\.jar$", + ".*/javax.servlet.jsp.jstl-.*\\.jar$", ".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + jarNameExprssions.add(".*/" + jarName + "-[^/]*\\.jar$"); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(jarNameExprssions, '|')); + } + + public static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + + public static void startServer(Server server) throws Exception { + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + server.start(); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + } + +} diff --git a/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/Profiles.java b/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/Profiles.java new file mode 100644 index 00000000..dcfd3e39 --- /dev/null +++ b/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/Profiles.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2005, 2014 springside.github.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + *******************************************************************************/ +package io.github.dunwu.javaee.server; + +/** + * Spring profile 常用方法与profile名称。 + * + * @author calvin + */ +public class Profiles { + + public static final String ACTIVE_PROFILE = "spring.profiles.active"; + + public static final String DEFAULT_PROFILE = "spring.profiles.default"; + + public static final String PRODUCTION = "production"; + + public static final String DEVELOPMENT = "development"; + + public static final String UNIT_TEST = "test"; + + public static final String FUNCTIONAL_TEST = "functional"; + + /** + * 在Spring启动前,设置profile的环境变量。 + */ + public static void setProfileAsSystemProperty(String profile) { + System.setProperty(ACTIVE_PROFILE, profile); + } + +} diff --git a/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java b/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java new file mode 100644 index 00000000..049c8802 --- /dev/null +++ b/codes/javaee/javaee-session/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.server; + +import org.eclipse.jetty.server.Server; + +/** + * 快速启动 jetty 服务器,方便测试 + * + * @author Zhang Peng + */ +public class QuickStartServer { + + // private static int STARTUP_TYPE = JettyFactory.IDE_ECLIPSE; + private static int STARTUP_TYPE = JettyFactory.IDE_INTELLIJ; + + public static void main(String[] args) throws Exception { + Server server = JettyFactory.initServer(); + JettyFactory.initWebAppContext(server, STARTUP_TYPE); + + try { + JettyFactory.startServer(server); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + JettyFactory.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + +} diff --git a/codes/javaee/javaee-session/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-session/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-session/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-taglib/pom.xml b/codes/javaee/javaee-taglib/pom.xml new file mode 100644 index 00000000..ab7de1e7 --- /dev/null +++ b/codes/javaee/javaee-taglib/pom.xml @@ -0,0 +1,118 @@ + + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + + io.github.dunwu + javaee-taglib + 1.0.0 + war + + + + + javaee-taglib + JavaEE 学习笔记之 taglib + + + + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + org.slf4j + jcl-over-slf4j + + + + + + org.apache.commons + commons-lang3 + + + + + + javax.servlet + javax.servlet-api + provided + + + javax.servlet.jsp + javax.servlet.jsp-api + provided + + + + + + org.eclipse.jetty + jetty-webapp + test + + + org.eclipse.jetty + jetty-annotations + test + + + org.eclipse.jetty + apache-jsp + test + + + org.eclipse.jetty + apache-jstl + test + + + + + + junit + junit + test + + + org.assertj + assertj-core + test + + + + + + + xalan + xalan + 2.7.2 + + + xerces + xercesImpl + 2.11.0 + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/Copyright.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/Copyright.java new file mode 100644 index 00000000..a1208fb2 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/Copyright.java @@ -0,0 +1,62 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.taglib; + +import java.io.IOException; +import java.util.ResourceBundle; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.PageContext; +import javax.servlet.jsp.tagext.Tag; + +/** + * @author Zhang Peng + * @since 2017/4/3. + */ +public class Copyright implements Tag { + + private Tag parent; + + private PageContext pageContext; + + @Override + public int doEndTag() throws JspException { + JspWriter out = pageContext.getOut(); + + try { + out.println("
    "); + out.println(ResourceBundle.getBundle("copyright").getString("copyright")); + out.println("
    "); + } catch (IOException e) { + throw new JspException(e); + } + + return EVAL_PAGE; + } + + @Override + public int doStartTag() throws JspException { + return SKIP_BODY; + } + + @Override + public Tag getParent() { + return this.parent; + } + + @Override + public void setParent(Tag parent) { + this.parent = parent; + } + + @Override + public void release() { + } + + @Override + public void setPageContext(PageContext pageContext) { + this.pageContext = pageContext; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag.java new file mode 100644 index 00000000..348c1d2e --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag.java @@ -0,0 +1,24 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.taglib; + +/** + * @author Zhang Peng + * @since 2017/4/3. + */ + +import java.io.IOException; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +public class HelloTag extends SimpleTagSupport { + + @Override + public void doTag() throws JspException, IOException { + JspWriter out = getJspContext().getOut(); + out.println("Hello Custom Tag!"); + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag2.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag2.java new file mode 100644 index 00000000..604014b7 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag2.java @@ -0,0 +1,24 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.taglib; + +import java.io.IOException; +import java.io.StringWriter; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * @author Zhang Peng + * @since 2017/4/3. + */ +public class HelloTag2 extends SimpleTagSupport { + + StringWriter sw = new StringWriter(); + + public void doTag() throws JspException, IOException { + getJspBody().invoke(sw); + getJspContext().getOut().println(sw.toString()); + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag3.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag3.java new file mode 100644 index 00000000..5aeb9a3a --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/HelloTag3.java @@ -0,0 +1,38 @@ +/** + * The Apache License 2.0 Copyright (c) 2017 Zhang Peng + */ +package io.github.dunwu.javaee.taglib; + +import java.io.IOException; +import java.io.StringWriter; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +/** + * @author Zhang Peng + * @since 2017/4/3. + */ +public class HelloTag3 extends SimpleTagSupport { + + StringWriter sw = new StringWriter(); + + private String message; + + public void setMessage(String msg) { + this.message = msg; + } + + public void doTag() throws JspException, IOException { + if (message != null) { + /* 从属性中使用消息 */ + JspWriter out = getJspContext().getOut(); + out.println(message); + } else { + /* 从内容体中使用消息 */ + getJspBody().invoke(sw); + getJspContext().getOut().println(sw.toString()); + } + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/bean/Person.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/bean/Person.java new file mode 100644 index 00000000..07868678 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/bean/Person.java @@ -0,0 +1,105 @@ +package io.github.dunwu.javaee.taglib.bean; + +public class Person { + + private int id; + + private String name; + + private String sex; + + private int age; + + private String telephone; + + private String birthday; + + private String mobile; + + private String address; + + private String city; + + private boolean deleted; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public boolean isDeleted() { + return deleted; + } + + public void setDeleted(boolean deleted) { + this.deleted = deleted; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/function/Function.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/function/Function.java new file mode 100644 index 00000000..9858e9c6 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/function/Function.java @@ -0,0 +1,62 @@ +package io.github.dunwu.javaee.taglib.function; + +import java.util.Collection; + +public class Function { + + /** + * 返回字节长度 + * + * @param obj + * @return + */ + @SuppressWarnings("unchecked") + public static int length(Object obj) { + + if (obj == null) { + return 0; + } + + if (obj instanceof StringBuffer) { + return length(((StringBuffer) obj).toString()); + } + + if (obj instanceof String) { + return ((String) obj).getBytes().length; + } + + if (obj instanceof Collection) { + return ((Collection) obj).size(); + } + + return 0; + } + + public static String substring(String str, int byteLength) { + + if (str == null) { + return ""; + } + + StringBuffer buffer = new StringBuffer(); + + for (int i = 0; i < str.length(); i++) { + char ch = str.charAt(i); + if (length(buffer.toString() + ch) > byteLength) { + break; + } else { + buffer.append(ch); + } + } + + return buffer.toString(); + } + + public static void main(String[] args) { + + System.out.println(length("中文测试")); + + System.out.println(substring("中文测试", 5)); + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/AddTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/AddTag.java new file mode 100644 index 00000000..a8f23eac --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/AddTag.java @@ -0,0 +1,32 @@ +package io.github.dunwu.javaee.taglib.tags; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.TagSupport; + +public class AddTag extends TagSupport { + + private static final long serialVersionUID = -579746915908972833L; + + private int num1; + + private int num2; + + public void setNum1(int num1) { + this.num1 = num1; + } + + public void setNum2(int num2) { + this.num2 = num2; + } + + @Override + public int doEndTag() throws JspException { + try { + this.pageContext.getOut().println(num1 + " + " + num2 + " = " + (num1 + num2)); + } catch (Exception e) { + e.printStackTrace(); + } + return EVAL_PAGE; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright.java new file mode 100644 index 00000000..649a5aa4 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright.java @@ -0,0 +1,57 @@ +package io.github.dunwu.javaee.taglib.tags; + +import java.io.IOException; +import java.util.ResourceBundle; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.PageContext; +import javax.servlet.jsp.tagext.Tag; + +public class Copyright implements Tag { + + private Tag parent; + + private PageContext pageContext; + + @Override + public int doEndTag() throws JspException { + JspWriter out = pageContext.getOut(); + + try { + out.println("
    "); + out.println(ResourceBundle.getBundle("copyright").getString("copyright")); + out.println("
    "); + } catch (IOException e) { + throw new JspException(e); + } + + return EVAL_PAGE; + } + + @Override + public int doStartTag() throws JspException { + return SKIP_BODY; + } + + @Override + public Tag getParent() { + return this.parent; + } + + @Override + public void setParent(Tag parent) { + this.parent = parent; + } + + @Override + public void release() { + } + + @Override + public void setPageContext(PageContext pageContext) { + this.pageContext = pageContext; + } + +} + +// end diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright2.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright2.java new file mode 100644 index 00000000..93e6c32f --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/Copyright2.java @@ -0,0 +1,33 @@ +package io.github.dunwu.javaee.taglib.tags; + +import java.io.IOException; +import java.util.ResourceBundle; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.TagSupport; + +public class Copyright2 extends TagSupport { + + private static final long serialVersionUID = -2936770589554413334L; + + @Override + public int doEndTag() throws JspException { + JspWriter out = pageContext.getOut(); + + try { + out.println("
    "); + out.println(ResourceBundle.getBundle("copyright").getString("copyright")); + out.println("
    "); + } catch (IOException e) { + throw new JspException(e); + } + + return EVAL_PAGE; + } + + @Override + public int doStartTag() throws JspException { + return super.doStartTag(); + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/DynamicAttributeTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/DynamicAttributeTag.java new file mode 100644 index 00000000..69edd78d --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/DynamicAttributeTag.java @@ -0,0 +1,58 @@ +package io.github.dunwu.javaee.taglib.tags; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.DynamicAttributes; +import javax.servlet.jsp.tagext.TagSupport; + +public class DynamicAttributeTag extends TagSupport implements DynamicAttributes { + + private static final long serialVersionUID = -1477571708507488373L; + + private Map map = new HashMap(); + + @Override + public int doEndTag() throws JspException { + + JspWriter out = pageContext.getOut(); + + double min = 0, max = 0; + + for (Double d : map.values()) { + min = Math.min(d, min); + max = Math.max(d, max); + } + + StringBuffer buffer = new StringBuffer(); + + buffer.append(""); + + for (Entry entry : map.entrySet()) { + buffer.append(""); + buffer.append(""); + buffer.append(""); + buffer.append(""); + } + + buffer.append("
    " + entry.getKey() + " " + entry.getValue() + "
    "); + + try { + out.write(buffer.toString()); + } catch (Exception e) { + } + + return super.doEndTag(); + } + + @Override + public void setDynamicAttribute(String uri, String key, Object value) throws JspException { + + map.put(key, Double.parseDouble((String) value)); + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/HelloTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/HelloTag.java new file mode 100644 index 00000000..68fe5624 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/HelloTag.java @@ -0,0 +1,32 @@ +package io.github.dunwu.javaee.taglib.tags; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.TagSupport; + +public class HelloTag extends TagSupport { + + private static final long serialVersionUID = -8828591126748246256L; + + private String name; + + @Override + public int doEndTag() throws JspException { + + try { + this.pageContext.getOut().println("Hello, " + name); + } catch (Exception e) { + throw new JspException(e); + } + + return EVAL_PAGE; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/IteratorTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/IteratorTag.java new file mode 100644 index 00000000..22eaad19 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/IteratorTag.java @@ -0,0 +1,31 @@ +package io.github.dunwu.javaee.taglib.tags; + +import java.util.Collection; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.TagSupport; + +public class IteratorTag extends TagSupport { + + private static final long serialVersionUID = -8828591126748246256L; + + private Collection connection; + + @Override + public int doEndTag() throws JspException { + + try { + for (Object obj : connection) { + this.pageContext.getOut().println(obj + ",
    "); + } + } catch (Exception e) { + throw new JspException(e); + } + + return EVAL_PAGE; + } + + public void setConnection(Collection connection) { + this.connection = connection; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/LoopTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/LoopTag.java new file mode 100644 index 00000000..d89122ff --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/LoopTag.java @@ -0,0 +1,40 @@ +package io.github.dunwu.javaee.taglib.tags; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.BodyTagSupport; + +public class LoopTag extends BodyTagSupport { + + private static final long serialVersionUID = 5882067091737658241L; + + private int times; + + @Override + public int doStartTag() throws JspException { + times = 5; + return super.doStartTag(); + } + + @Override + public int doAfterBody() throws JspException { + + if (times-- > 0) { + + /** 只要 times > 0 就继续循环,同时 times 自减 */ + try { + this.getPreviousOut().println(this.getBodyContent().getString()); + } catch (Exception e) { + } + + return EVAL_BODY_AGAIN; + } else { + + /** 结束运行,同时复原 times */ + + times = 5; + + return SKIP_BODY; + } + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/ToLowerCaseTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/ToLowerCaseTag.java new file mode 100644 index 00000000..60e372b3 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/ToLowerCaseTag.java @@ -0,0 +1,23 @@ +package io.github.dunwu.javaee.taglib.tags; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.BodyTagSupport; + +public class ToLowerCaseTag extends BodyTagSupport { + + private static final long serialVersionUID = -2529343271020971948L; + + @Override + public int doEndTag() throws JspException { + + String content = this.getBodyContent().getString(); + + try { + this.pageContext.getOut().print(content.toLowerCase()); + } catch (Exception e) { + } + + return EVAL_PAGE; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Column.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Column.java new file mode 100644 index 00000000..016c7746 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Column.java @@ -0,0 +1,64 @@ +package io.github.dunwu.javaee.taglib.tags.table; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.TagSupport; + +public class Column extends TagSupport { + + private static final long serialVersionUID = 5119493903438602864L; + + private String property; + + private String label; + + private String type; + + public int doStartTag() throws JspException { + if (!(this.getParent() instanceof Table)) { + throw new JspException("Column must be inside Table. "); + } + + Map column = new HashMap(); + + column.put("label", label); + column.put("property", property); + column.put("type", type); + + Table table = (Table) this.getParent(); + + table.getColumns().add(column); + + return SKIP_BODY; + } + + public int doEndTag() throws JspException { + return EVAL_PAGE; + } + + public String getProperty() { + return property; + } + + public void setProperty(String property) { + this.property = property; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Table.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Table.java new file mode 100644 index 00000000..5b13dd31 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags/table/Table.java @@ -0,0 +1,203 @@ +package io.github.dunwu.javaee.taglib.tags.table; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.BodyContent; +import javax.servlet.jsp.tagext.BodyTagSupport; + +public class Table extends BodyTagSupport { + + private static final long serialVersionUID = 3358444196409845360L; + + /** + * 存储列信息 + */ + private List> columns = new ArrayList>(); + + /** + * 存储数据,可能为 集合类型的或者数组类型的 + */ + private Object items; + + /** + * 取排序数据的 URL + */ + private String url; + + @Override + public int doStartTag() throws JspException { + columns.clear(); + + return super.doStartTag(); + } + + @Override + @SuppressWarnings("unchecked") + public int doAfterBody() throws JspException { + try { + BodyContent bc = getBodyContent(); + JspWriter out = bc.getEnclosingWriter(); + + HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); + + /** 按哪一列排序 */ + String orderName = request.getParameter("orderName"); + /** 按升序还是降序排序 */ + String orderType = request.getParameter("orderType"); + + orderType = "desc".equals(orderType) ? "desc" : "asc"; + + out.println(""); + out.println(" "); + out.println(" "); + + for (int i = 0; i < columns.size(); i++) { + /** 获取列信息 */ + Map column = columns.get(i); + + /** 列头 */ + String label = column.get("label"); + /** 该列对应的 Java Bean 的属性 */ + String property = column.get("property"); + + label = label == null ? property : label; + + out.println(""); + out.println(""); + } + + out.println(" "); + + if (items != null) { + + /** 遍历所有的数据 */ + for (Object obj : (Iterable) items) { + + out.println(" "); + + for (int i = 0; i < columns.size(); i++) { + + Map column = columns.get(i); + + String property = column.get("property"); + + String getterStyle = toGetterStyle(property); + + try { + String getter = "get" + getterStyle; + String is = "is" + getterStyle; + + Method method = null; + + try { + /** 获取 getXxx() 形式的方法 */ + method = obj.getClass().getMethod(getter); + } catch (Exception e) { + } + + if (method == null) { + /** 如果没有,获取 isXxx() 形式的方法 */ + method = obj.getClass().getMethod(is); + } + + method.setAccessible(true); + + /** 获取属性值 */ + Object value = method.invoke(obj); + out.println(""); + } catch (Exception e) { + throw new JspException(e); + } + } + out.println(" "); + } + } + + out.println("
    "); + out.println(""); + + out.println(""); + + out.println(label); + + if (property.equals(orderName)) { + + out.println(""); + } + + out.println(""); + + out.println("
    " + value + "
    "); + + out.println(""); + } catch (IOException ioe) { + throw new JspException("Error: " + ioe.getMessage()); + } + + return SKIP_BODY; + } + + /** + * 首字母大写 + * + * @param column + * @return + */ + public String toGetterStyle(String column) { + if (column.length() == 1) { + return column.toUpperCase(); + } + + char ch = column.charAt(0); + + return Character.toUpperCase(ch) + column.substring(1); + } + + public Object getItems() { + return items; + } + + public void setItems(Object items) { + this.items = items; + } + + public List> getColumns() { + return columns; + } + + public void setColumns(List> columns) { + this.columns = columns; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiAttributeTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiAttributeTag.java new file mode 100644 index 00000000..610efed7 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiAttributeTag.java @@ -0,0 +1,44 @@ +package io.github.dunwu.javaee.taglib.tags2; + +import java.io.IOException; +import java.io.StringWriter; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.JspFragment; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +public class MultiAttributeTag extends SimpleTagSupport { + + private JspFragment body1; + + private JspFragment body2; + + public void setBody1(JspFragment body1) { + this.body1 = body1; + } + + public void setBody2(JspFragment body2) { + this.body2 = body2; + } + + @Override + public void doTag() throws JspException, IOException { + + StringWriter writer1 = new StringWriter(); + StringWriter writer2 = new StringWriter(); + + for (int i = 0; i < 5; i++) { + // body1 调用 5 次 + body1.invoke(writer1); + } + + for (int i = 0; i < 3; i++) { + // body2 调用 3 次 + body2.invoke(writer2); + } + + this.getJspContext().getOut().print("3 次调用 body2 后的结果:" + writer2.getBuffer().toString() + "

    "); + + this.getJspContext().getOut().print("5 次调用 body1 后的结果:" + writer1.getBuffer().toString() + "

    "); + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiTag.java new file mode 100644 index 00000000..6ec8ca32 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/MultiTag.java @@ -0,0 +1,34 @@ +package io.github.dunwu.javaee.taglib.tags2; + +import java.io.IOException; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +public class MultiTag extends SimpleTagSupport { + + private int num1; + + private int num2; + + @Override + public void doTag() throws JspException, IOException { + this.getJspContext().getOut().write("" + num1 + " * " + num2 + " = " + (num1 * num2)); + } + + public int getNum1() { + return num1; + } + + public void setNum1(int num1) { + this.num1 = num1; + } + + public int getNum2() { + return num2; + } + + public void setNum2(int num2) { + this.num2 = num2; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/RepeatTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/RepeatTag.java new file mode 100644 index 00000000..ecd9dd61 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/RepeatTag.java @@ -0,0 +1,17 @@ +package io.github.dunwu.javaee.taglib.tags2; + +import javax.servlet.jsp.tagext.SimpleTagSupport; + +public class RepeatTag extends SimpleTagSupport { + + private int times; + + public int getTimes() { + return times; + } + + public void setTimes(int times) { + this.times = times; + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/ToUpperCaseTag.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/ToUpperCaseTag.java new file mode 100644 index 00000000..e48cb349 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/tags2/ToUpperCaseTag.java @@ -0,0 +1,28 @@ +package io.github.dunwu.javaee.taglib.tags2; + +import java.io.IOException; +import java.io.StringWriter; +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.JspFragment; +import javax.servlet.jsp.tagext.SimpleTagSupport; + +public class ToUpperCaseTag extends SimpleTagSupport { + + @Override + public void doTag() throws JspException, IOException { + + // 将 标签体内容读入该 writer + StringWriter writer = new StringWriter(); + + // 标签体 为 JspFragment 的形式 + JspFragment jspFragment = this.getJspBody(); + + // 通过 invoke 输出到指定的 writer 中。 + // 如果参数为 null,将输出到默认的 writer 中,即 getJspContext().getOut() 输出到HTML中 + jspFragment.invoke(writer); + + String content = writer.getBuffer().toString(); + this.getJspContext().getOut().print(content.toUpperCase()); + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/Messages.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/Messages.java new file mode 100644 index 00000000..624e2da6 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/Messages.java @@ -0,0 +1,34 @@ +package io.github.dunwu.javaee.taglib.test; + +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + + private static final String BUNDLE_NAME = "com.helloweenvsfei.test.messages"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static String getString(String key, Object... params) { + try { + String value = RESOURCE_BUNDLE.getString(key); + + return MessageFormat.format(value, params); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/TestMessage.java b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/TestMessage.java new file mode 100644 index 00000000..e97e5ed9 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/TestMessage.java @@ -0,0 +1,9 @@ +package io.github.dunwu.javaee.taglib.test; + +public class TestMessage { + + public static void main(String[] args) { + System.out.println(Messages.getString("TestMessage.0", "A", "B")); //$NON-NLS-1$ + } + +} diff --git a/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/messages.properties b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/messages.properties new file mode 100644 index 00000000..c99d9bfc --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/java/io/github/dunwu/javaee/taglib/test/messages.properties @@ -0,0 +1 @@ +TestMessage.0=test {0}, {1} diff --git a/codes/javaee/javaee-taglib/src/main/resources/copyright.properties b/codes/javaee/javaee-taglib/src/main/resources/copyright.properties new file mode 100644 index 00000000..2a835e8b --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/resources/copyright.properties @@ -0,0 +1 @@ +copyright=©2016-2017, Zhang Peng diff --git a/codes/javaee/javaee-taglib/src/main/resources/logback.xml b/codes/javaee/javaee-taglib/src/main/resources/logback.xml new file mode 100644 index 00000000..112831e0 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/resources/logback.xml @@ -0,0 +1,46 @@ + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5p] %c.%M - %m%n + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/function.tld b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/function.tld new file mode 100644 index 00000000..4bf0a5e4 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/function.tld @@ -0,0 +1,44 @@ + + + + + custom functions library + custom functions + 1.1 + function + http://www.victorzhang.com/function + + + + + length + + io.github.dunwu.javaee.taglib.function.Function + + + int length(java.lang.Object) + + + ${fn:length(string)} + + + + + + + substring + + io.github.dunwu.javaee.taglib.function.Function + + + java.lang.String substring(java.lang.String, int) + + + ${fn:length(string, 3)} + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello.tld b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello.tld new file mode 100644 index 00000000..2dca9237 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello.tld @@ -0,0 +1,10 @@ + + 1.0 + 2.0 + Example TLD + + Hello + io.github.dunwu.javaee.taglib.HelloTag + empty + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello2.tld b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello2.tld new file mode 100644 index 00000000..44728ef9 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello2.tld @@ -0,0 +1,10 @@ + + 1.0 + 2.0 + Example TLD with Body + + Hello + io.github.dunwu.javaee.taglib.HelloTag2 + scriptless + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello3.tld b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello3.tld new file mode 100644 index 00000000..6d995a74 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/hello3.tld @@ -0,0 +1,13 @@ + + 1.0 + 2.0 + Example TLD with Body + + Hello + io.github.dunwu.javaee.taglib.HelloTag3 + scriptless + + message + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/taglib.tld b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/taglib.tld new file mode 100644 index 00000000..0874c62f --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/tld/taglib.tld @@ -0,0 +1,149 @@ + + + + + + + 1.0 + 1.1 + taglib + http://www.victorzhang.com/tags + A simple tab library for the examples + + + copyright + io.github.dunwu.javaee.taglib.Copyright + JSP + Copyright tag. + + + + hello + io.github.dunwu.javaee.taglib.tags.HelloTag + empty + Hello tag with parameters. + + name + true + true + + + + + add + io.github.dunwu.javaee.taglib.tags.AddTag + empty + Add tag with parameters. + + num1 + true + true + + + num2 + true + true + + + + + toLowerCase + io.github.dunwu.javaee.taglib.tags.ToLowerCaseTag + JSP + Tag with body. + + + + loop + io.github.dunwu.javaee.taglib.tags.LoopTag + JSP + Tag with body. + + + + dynamicAttribute + io.github.dunwu.javaee.taglib.tags.DynamicAttributeTag + empty + true + Tag with dynamic attribute. + + + + table + io.github.dunwu.javaee.taglib.tags.table.Table + JSP + Table tag. + + items + true + true + + + url + false + true + + + + + column + io.github.dunwu.javaee.taglib.tags.table.Column + empty + Column tag. + + property + true + true + + + label + false + true + + + + + multi + io.github.dunwu.javaee.taglib.tags2.MultiTag + empty + multi tag with parameters. + + num1 + true + true + + + num2 + true + true + + + + + toUpperCase + io.github.dunwu.javaee.taglib.tags2.ToUpperCaseTag + tagdependent + body tag + + + + multiAttribute + io.github.dunwu.javaee.taglib.tags2.MultiAttributeTag + tagdependent + multi attribute tag with parameters. + + body1 + false + true + + + body2 + false + true + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/web.xml b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..a403cc53 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,25 @@ + + + + + HelloServlet + /examples/configuration.jsp + + message + welcome to jsp + + 1 + + + HelloServlet + /config + /config.jsp + + + + + /WEB-INF/views/jsp/index.jsp + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/dynamic.jsp b/codes/javaee/javaee-taglib/src/main/webapp/dynamic.jsp new file mode 100644 index 00000000..abb85b60 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/dynamic.jsp @@ -0,0 +1,18 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/function.jsp b/codes/javaee/javaee-taglib/src/main/webapp/function.jsp new file mode 100644 index 00000000..67b405b6 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/function.jsp @@ -0,0 +1,46 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/function" prefix="fn" %> + + + + Insert title here + + + + +<% + request.setAttribute("string", "字符串测试"); +%> + + + + + + + + + + + + + + +
    字符串变量${ string }
    字符串长度(按字节计)${ fn:length(string) }
    截取 7 个字节${ fn:substring(string, 7) }
    + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/hello.jsp b/codes/javaee/javaee-taglib/src/main/webapp/hello.jsp new file mode 100644 index 00000000..2aa13cd9 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/hello.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + +
    +
    +
    + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/I.png b/codes/javaee/javaee-taglib/src/main/webapp/images/I.png new file mode 100644 index 0000000000000000000000000000000000000000..e8512fb911f40ec90e7cbf057ace91404573df37 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv*$P6UUaa~gcQtTz3zOL*Scz79AwQm3V5DFCH zEbxddW?AMyVi9{#UaQ0r%7Fss&l*vy)E6e!K$>FVdQ&MBb@0CA5htN;K2 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/L.png b/codes/javaee/javaee-taglib/src/main/webapp/images/L.png new file mode 100644 index 0000000000000000000000000000000000000000..eb334edaeac52e2f473ffd92a49b025fb6148ec3 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv*$P6UUaa~gcQtTz3zOL*Scz79Am98pQqyvRG z3p^r=85p=efH0%e8j~47LAC&&5ZCE_)&Kwh7Y~}?0Tf{>3Gxg6&+v4+fftY`;pyTS tQgJK!NBsYWhyUvpj=8p5Ib^(%U@*zon(m*SoDEdN;OXk;vd$@?2>{+EE2IDb literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/Lminus.png b/codes/javaee/javaee-taglib/src/main/webapp/images/Lminus.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c43c0aa3bebb499e86eb744b1e47b9a9445ba7 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv*!VDzYUPT51DfSXiUsv`EJiLsmQh${X`~(Vd z7I;J!Gca&{0AWU_H6}BFf(8LTA+A9B|NsBf`>KHqVn8Lk#c`lIrjj7P;QtIyw;Ol? zc?O;?jv*Ddk_A|pTm=*lC~zFVdQ&MBb@0OtiQr2qf` literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/Lplus.png b/codes/javaee/javaee-taglib/src/main/webapp/images/Lplus.png new file mode 100644 index 0000000000000000000000000000000000000000..848ec2fc3bbaab6345864c303684ff8a86559cfb GIT binary patch literal 224 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 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/Tminus.png b/codes/javaee/javaee-taglib/src/main/webapp/images/Tminus.png new file mode 100644 index 0000000000000000000000000000000000000000..2260e4248cef23f97d59b9c3defa571564debca3 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv*!VDzYUPT51DfSXiUsv`EJiLr*Oh=QrbAUpe z1s;*b3=CW!K$y{KjmZq4ph197i0l9V|EKp=19?OO=>#nkpi;(?AirP+hi5m^fE-m% z7srr_TgeFwOpI(f46|1#2yiGY`Di?KiU>FVdQ I&MBb@06e2A@c;k- literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/Tplus.png b/codes/javaee/javaee-taglib/src/main/webapp/images/Tplus.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8d8f4fd38259b2ef70fc63fad505fb0a0f55a4 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv*!VDzYUPT51DfSXiUsv`EJiLtRLI=-jc>;wv z3p^r=85p=efH0%e8j~47L4yFF5LY1m|NsB#ebqn)F`$y&;y6$pQ%R6t@PCG<+YP*c zJY!E6$B>F!$pS1)t^$e&6gZd#)XV}^6#`leL>0XheB5$;*x1}$U0qr4a0#d>%86hy4NT6+w`tp00i_>zopr0L}p{>Hq)$ literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/asc.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca472c094c121031c4ee67778702c77cbe3c8d02 GIT binary patch literal 118 zcmZ?wbhEHbV|(KLGNbUC`+o%) FtO23?AZ7pn literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/bg-btn-blue.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/bg-btn-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc03f1bd5948a2057abb97707ece2434cea75203 GIT binary patch literal 827 zcmZ?wbhEHbWMnX6_|CwPHuG*k>y@ysYcAF2qxx^ePrhYUcrtm~ZLfxlcBN++M!{$Z w4C@e3{K*3LpALuw!M=S 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 Dp1HQ5 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/btn-go-dark.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/btn-go-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..206207a790322f0ca6a0a200a2594fb7b13d2317 GIT binary patch literal 276 zcmZ?wbhEHb6lV}&IKsfdVBEo-wdw!=|4B=qvw6;E^IpgvxP&Wt9ee09HowJeev7!$ zHgG1a<&0Uym9ddMXbDHe3XX`CZ2pVc1DCS-FZ%KOFIU=npfR|B;!hT^ln#gl*~!2< zQ9+?EC9}_Y)w&#QK1ZGNCV#J4)IG1+^L?lM1~m~0)=i5GzZF^ZF79I1GP06g-zv6h zE5i=%53e2CCY@$th^nnHymvvFnah8Fe6P(GLI2l(dG!SZ1O>e^1=^Ja1@t-k`&B2Z zOwecJXA_=2n{CeA8PoMSg}9b-a&j%_5?QrknLg{rO`ErD(P!DQbJyihO9GFSru DNlRJ} literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/delete.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..c610608f3d6a0e2e73aba4d38ad8e52be2c3222e GIT binary patch literal 74 zcmZ?wbhEHb6krfwXkcLY4@Cd}EB<6*WME)q&|v@qkPHKpVo(3d)eLVYRA*kR$T?hf ZmakFq7>oSQz(tH*+1|NNeUw=ltN{z17VZE5 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/delimiter.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/delimiter.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/desc.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..dfab21c17f49a20c788ce0c8dc2a960d04ffb827 GIT binary patch literal 118 zcmZ?wbhEHb+d54hU0L>&W8h&TvTl!gj2 GSOWn1BO#Xn literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/edit.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..255832653fde9e9748855347fe7bce013aa0a6c7 GIT binary patch literal 162 zcmZ?wbhEHb6krfw*v!Ci|Ni{?`uO?t>-X=UfB*je|NsB*2eRhRZ)j)$vKcUd;!hSv z1_n+B9gqyj3&>#;PFW3S?Ey~Z^d=Ib=Q)_ty((#Hu?(NPPIEQ wFt9a7JasYQt8+ZHp~C0XEcX|=2_;e6_wsD`%rk?zV@6`Fg@V`I3Kj-y0F-Mvy#N3J literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/element.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/element.gif new file mode 100644 index 0000000000000000000000000000000000000000..b07b87b10022e1359621cdb280df664fe5eb006b GIT binary patch literal 330 zcmV-Q0k!@|Nk%w1VGsZi0M!5hT6d9MdX!>*m}rBXU3!yZf0$^5n|QY5ki+S1iJx$c zqN>sFyxQ`mdK;vA8>oIAt$`r3gd)0$CAx|w!H+4xk15BLEX|oO&6qIMoifv%GTWmz z|LDBgpf&!yNdCc7{>5MZ%y0kFfBx8z|KFnjtaW$toq@^^Fde|q(bhX4Qn0000000000 z00000A^8LW0027xEC2ui01yBW000JOz@2bNEE_7#bZLLP`!EA0Qzj cBP1mpCXh=zg@+Lm6c!g5kAteKtV2NnJ7=Pig#Z8m literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/file.png b/codes/javaee/javaee-taglib/src/main/webapp/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a20c6fa0c88a959109264446a69020a0892ca454 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF$k8C-m2iN8 Zo#CR6tYFg7L+v1&Jzf1=);T3K0RT{JOkDr~ literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/foldericon.png b/codes/javaee/javaee-taglib/src/main/webapp/images/foldericon.png new file mode 100644 index 0000000000000000000000000000000000000000..2684748b0af9804a3a6d74ee82099f660976c1e3 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@MtwUbVx|CCuD_3M1(}kL@rTAt`?@NJD7g1T-cVt+{lozLxII0fq`Ms9dUP2 S4@VK8*$kepelF{r5}E+oVobaM literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/ibm-tab-background.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/ibm-tab-background.gif new file mode 100644 index 0000000000000000000000000000000000000000..d36dc07306126c5361d4aaa52303fbadaea76c46 GIT binary patch literal 2538 zcmd6l_g52!0)=^230j~QsaUj@jwgte@{|e>t)-R`LV{F#7?CPg1Y`uN77% zq9|b#Ru*IsAVHR42-%<@U|3-$1PCDsnP8s%FWx=(_wPIBUSB^S_kZ8W{>Z^(#l!@L z#63V$vMXrUvoJSuYHz{oq7d~_h`QT(4KaBQvH94zd~7@t7hiyjM`9CDco-53E5Ifc z;1W={gCkZ%W0)o(n>FJ^jY6`SJ~lkFXo z;~kp=Ovv+&$^P-$Ul(tspAWm^5emC-?Jw}%$KZR9e~C=Llw5Q!6m~hSkMi=71*pe`Po5S%dtQt#DJ?6nKz&k;sj022Z@}X41Y#q;l1!mC(^^{F=nV26 zi_Wg@o|nwtzW#w%gZ<`g4wuIl43E5iGdeb6IWhT8I5j;pJ13f-cUoFr5ldF3YwH`b z&9zSzO4atK2emrAVQ2Tf(d458)@B$?Z`NBY$1s+Quo-^v8&CzXx%O55p`$U=tY2$P z_SyZCcg&Ag&n|MfLJVWm8n|eeo16;2mPqbC_q)<*b_;H}+B56G7a&(WzYbXB_&cYS za0TaG2dV_M5ntm%;s-sMZH*I@@cz6n{OL{aTB1jZzjNuNDMq4kkyGiYjeXdUmA@jrVgTvz1YIp zOtTYs(ZdyjNR)NZ$6-F(Iw*QR=SZYBJo8wRWFBsp>#%_Mwm5p>(KkZeLY@;{Qv2Yu z3cE$5>v;5Hf%^)65p`Z2()ZZY^yE^Z*WuesPk<)~OU9=_wPdL%(5Lj9{l5j>UVa`D zNmwopOIlq)Ve9xvHYPbCg*Y=3-oEM7B{A|`2OA80l-a~S|< ztti_DrkzLFleG&-H<`Q0+sj$E^eh;rTP}$r>sBg~$+|@h+*vQFN5k~1c$}qv?~zuS zevLZhY*=rdfEhO0#bkr5OCvLEG6COr$$qg;*x6#)Q+5dH1NgBn+A0bW;QFs^*eo9p#gjs0{kQghY!FoOw1iiG!i~)i zNL3h%Fy;*oKfT-Y&l1HmJh;Izn9T|5P&}t18ywM|T&Pe{+|FxoPG)nj=@n?EIo1X4 z$NNM0=D8~ndm7E=MS3VpN03-o+`l28hbYS?d06upCLflnEEk#M+=u)GcgmC%GXt3( z6Kp|Jhq6+R#GM!W4W|kZ0VF)!1r7UBf>2a#VuAMrfJPqLsxW2{{6!nbkKz~iP%!6BafhnGrGNmA0*#hc{RVL7 z69SSsqg8qp&eMVz2nUT}gep7`LcEOTjA1>t34uR4T94wCA>1az_BCG9a3*^6&nYPuP2m9l$v#^( z6#GqS2*6G zZle~E;;#D(g+evGolk-#bEjtYY6jCn79Zt5y}1;{~0M% z(=o{>Co#A)vQ$l{$bynG zyfm?-W&psV9iN}g%mSznZFnNnbK2g6D5^2r9z1{GsQm`!i|*qesI}uwLw(Gx?;QDgMIDz>$A^8LW000L7 zEC2ui0B!&>000C3c)HyFFv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_i00Q|sU zP(TzKje$lWa10I{gF$o1t6HzvY>PP^7Q0=+VF?C28RcIx#VrfS>0=TeZp7Exyneqi zO6WfgK0*#%3{q1xei2_lN{eWT3vEYymL-r6fMo`SQ%eVfk}{bNn_!)GpGl%kiiC`< zU;(L-LWn=OxuuuAzL&fVr-q(DL<+74!7a-Q!=tu8$I6w|LBH79dd;D-kFe1Ipkv_H zj@szy>Qx2p1tGGllyTRMLgVIm=0;)=?;rEz(L*vOptOGG&LEqDP(eEb|JIdocOas~ z5fm+UFnHuG4aYKPo=qz#PF0hJ4K!|uck)@6C=2Wb!H29^$CMN=>fFh*r_Y~2g9`nb G0028EJEUX) literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/left-nav-corner.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/left-nav-corner.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae395ea6b4106e8de138797e5574f1a47de63740 GIT binary patch literal 909 zcmZ?wbhEHb+`=HraFv1Kz=gX8p)ZEhA)}A58!67ClF5cJQJF%~iW5NW^nZ1+5r%#zWXW@i7oRfQdmMrXD z*5AK!Mc=YTlP68xyl(llZL610n!alNl6i*@igE5(d}#61CDP|FT$Jv=aOLXdtKyf= z-@1MG;{6BLZ$G(n^TwrXuU_1_`|jDB7w_Ibz5MX&_Yaqp{`~#-pMjZ6#$&^RgUuYm zS}`XI651FTjXdW35J)=OE~4&sW=G&6*Df*TJQ2yD#qJX%{L}Vi2rW4=RbRXB%a0

    pU=)sPft%*Prg?p(VWh}VAswjE9IPdepzsTn68xR%PVW6*W1NbnY_F@ zzj!s<-0E%F*Or(5{-?Xk?9GF%nX{ky&e{Iy9)n8F48Og*zP`S(Is5*(y}Q4^e{i^4 zzTfr`BQqNpheSfd-(TOD9_<$oX!y&(_=0=Ma(f5+zrQ}LygrZd(^>KP)$EVTA2573 z+;Ok!onVAR?MJ~1`FeK06$_gAlWwe%Yj|~Zxm+{DJ$1#p7l{@NTNN*Dzh5Q%?f8Q_ z-EY?)wtO`$IKU|L<;CNEhoTJ*6I{eHQzkget$Z@c$L!^jiJo>ZQzr4fsc2x2NL%@I zT1?r?r_&SKG@s2#nU?u%W=57}<5cz#2S!%W9Y2@NEU6robuvD^I`WkDamQ zR`=$6Hoy4W9(hb-x<2*AsckDbkAL#ff7iR+l;g`kejX;aBa1$E_-IW(v+Ofxuh;S` ftAaX2qqg5!_nn)syZ7d%{2ss6*WaWvGFSru(Cs)h literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/line01.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/line01.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b9a6e3f23c267ae32f48eb614ec4a22d76a5e4c GIT binary patch literal 46 ucmZ?wbhEHbWMbfCXkcJy+4fz)bBf|m76uT|0TCb>1}0XXp5>XW4AubUya<*6 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/masthead-links-gradient.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/masthead-links-gradient.gif new file mode 100644 index 0000000000000000000000000000000000000000..b20772a45e1cb1b43d8d4ec5be025aef824a2bfe GIT binary patch literal 264 zcmZ?wbhEHbhPf+)dM#?^?X&$lASU_MW@5=j`o$=kIPicKN`CdxtMS zICSa$v8#`cUU_)%()|M$@9jN%^ThSX$FBiJ9vr@Omw^z_0Vx34#lYIDpwO3+FmJ_z zb#ET*Gf+Hll62o<$$Oip{||H)c%(@5pXew$nPaAUVTFiis>!+=Ym!dC)!P@(e&b_> z%Bi$3iD&bqxmcTR0)h#SwcJg=KXKO%>2IQz4kMwizmA)sgkydJf69$ySTGE zMP=ruZsNvn6iqc(brn~3rI;0SQ5SJx7m8IjXLS~5b|xS>nUgw+6FZ>*HlTrpWlU4> z#8WddV>1d`RH~+8%BB=5&=fTh6E>j`g;`c(F=k_eMywjCkr=TNSfLtV5Dk@(g&v53 z4QOCtnZi)ic%sUx6#hVqN<@WKDC|N7nk>q!OmGiTm{k%bR)Rg`0h!oF9Pkeja0t}^ zgJ`J4D0F}r*nkEWMRL(bjmIJsLBbzsQ85b>a)n)}KvRf?kRy^t0MLbT1P!-{5_v!- zwh;$3!7v;`HNYSmn~((^AO<#|DNYpAXrsm>Tns_NA81iA#m5o3ruU9!dcue~y-Lic zK}YIocCnhq5l2WJ22v_IZj$N<;1n941FnSd;3=pw8BdbonWe$Wg}$-*a+3L%$(DBS z*{QDC*}HG6@lff=v7gN+Hk*$BYAJlJuHC55uQxQVz|$+elKp4&?orkA@XAN9_zctYh&QqE?}6&0S#;nP3xw;};M9fbz` z5tT%{dg$Fm?fL$V;=pHHJ$EN}uW?H(k%F@{jxKs+!i@#`DWtUmiBkp1QI9 zzRO-TcNVXdI-a)Hyq$09|Io2K_wvWV!pNU*n{`Rk{<9$k8C-m2iN8 Zo#CR6tYFg7L+v1&Jzf1=);T3K0RT{JOkDr~ literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/next.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/next.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0d7d2fe75187b37b0896a1d54b490b1eb919926 GIT binary patch literal 302 zcmZ?wbhEHb6krfwxXQpVbN8#d6%W^*cwe*fVdLt@IbD|UIluejXQ`x+OXiPP^ow_ICz z@Xds+&zaX?!G#6_sf#S4}$w{Cry7S=69fc$^B(V-n6cNX+|z+ldx z1Cj^%iGj`g!0ZAK9jX2k!c3W4b|&~da&|CwZQVF?jq1)mGp&GSBBG2uEJs@oT`6$l o4tsuR%NnibE9zaGCINEcoC55o;pX~0tnKD1d_5B;Ix<)T0E1PHrT_o{ literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/openfoldericon.png b/codes/javaee/javaee-taglib/src/main/webapp/images/openfoldericon.png new file mode 100644 index 0000000000000000000000000000000000000000..15fcd567111e13cfd9e6f1c0cd8103ca0e2d76ff GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFKheKdVb6i#4OEw{M26cw_Gj{yv63W{1!+$*s*N3f2 zemsk&HQ&u~&f!%4#A(caCa+!4-!jYT%bH^M9p4*PZTkKrpyj95hk2~iCLLVQKL3cY Ud_U9dR-h#ep00i_>zopr03|O{b^rhX literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/pagetools-gradient.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/pagetools-gradient.gif new file mode 100644 index 0000000000000000000000000000000000000000..7beb3cb9ee8abc13178dc6c0d40774bbdfe21eeb GIT binary patch literal 986 zcmV<0110=NNk%w1VLSjb0M!5h?(XjJ@bCHh`u+a?`S|+&{Qmm+`ThL;$;rvf%gdIQ zmc6~brlzLy^76{c%EZLPv$M1J_xJ4V?E3op^YioY@bLEb_V@Po`S|$v_xSep_44!c z^YZid_V@ex`}p|y_4fAu{{8y<`|$7Z`}+F$_xSt!`uOm&_WS$$=;-L}?d|pT_5S|;>gww8@$vlp z{LIYEA^8LV00000EC2ui06YLP000L6z@2bNEEW+Keb?5Icjv3y@A$la&+q&HfPsQHJ~xJig@lHSjE#$Rj**9viHANO z6C@KiCLT8)A~z&A6Cx8PpPC|`ogyT!o1G@A9wxS-6Q!WDH>;z)9-6r;xf2F40uwP4 z$pXpD%Eivc#nrjT#Rk^P#@f;o7%M6tDHs?t7z7vs<>f0YGvx;G?#5? z1_Y=mr$SsleC5o=Sdn4{h7>O{WOz~HLxvJ3PJDP_@x_Z18BTmG0mEWRix(?$3@H)h z2^b__L^x3*!bF)QE0T=BGeV31o<1Ykh=2m9QKLhH9$m`xC(sTTqDHV_p#xM4HlSXB zilPHmsuvd;_8um%t=G{}&#_;Fy!lr7+m?4ogD9Uv^|1wliw>C>oFt6t5zb!rM6Hf-Pkdjo|A zv~9ztu)D$T-@IeCZZ@o4l1I^Vv8*1z{89*)@b96IOeG1 zjyB>@qmMk`;3JSg200{+L<%`$kxB;1qmV;FDdm(@R%zvxSZ1l^mRxo@r2=4vDdw1D zmTBghXpYIinryb|=9_TFDd(JSLSW~ec;>0+o_zM{XPyfLD(Iku7Ha6Bh$c$t1B^E6 z=%bKED(R$@K8nDlm}aW!rkr-_>8F}HAnK^3mTKy$sHUoFsR^{|>Z`EED(kGY)(Yzn zxaO+suDtf@>#x8DE9|hu7HjOW$R?}ovdlK??6c5DEA6z@R%`9G*k-Hkw%m5>?YH2D IOKcDTJCkH9)&Kwi literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/pagetools_gradient_a.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/pagetools_gradient_a.gif new file mode 100644 index 0000000000000000000000000000000000000000..50b38ed018817d5a059de3581c27f8728ca0478c GIT binary patch literal 946 zcmeHG%PRzN9G`NTa#2!yKpPiHQpzI^4q|s*#MKtLEICLHZe9oF;-HoTq1DoQuE8F( zNw%1ol_W`ab8y+Feaz1Iy=Q)z{Tp0;ZlBlp@TqUVx38mftXpsiND%V*ysj4rr8egT zQ*Loeh;7-jEUT&-3+Fvb8v&TYz=UeFn(7-7b!lXW^66HH3b3k8P*2#{kVL@5CP65?Eg+~x>D##knk z$>nkY0M5ClX~kmEvaDn>Dg5Jqfj=zJRO*&~K@c~DDzVygzI(SURyH<0?(W^MRMh*n zJkh#d(bYPcdW?o1*4*vQF7L&@yxuSz8JRE^)s2>MWy>ptpEkuAEhS3_&pSQK#%#~! z;Y-M~-so3;0!s&jA>X#|D)M$TG#^MSS4Zz>qxY*d1J}nNQs6b>SFcY#W7FTt_CV}3 XeKTijX*G8Cb-PejUOUz17P@``3z7zz literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/password.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/password.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e3d48a637e96d36565e4964b8f7f93227fdb48d GIT binary patch literal 239 zcmZ?wbhEHb6krfwIKsg2`_JFMpHIKI*z)yG&!1=WHub1)pQy8Yn&JLgrU&O)%&gH} z+HSh6(_&q}&AtWRC)dWmI9+n@Q2xy$?G@3&%j;xTHp;JUQ@(g`_W%F?8L$DxpDc_F z3=#}FAW4v&46Hc{YJDl0Nz)g`J+Dx85KwvZQ)r6Uh2@SC%JLUn8Ux&pCcm7TVKsYe zpp)BDHz8G*28Rg-Dt9;*l{Czd6>hgI(vW0oKA8Nm!@X^>Q_B4SlW&5os$z^xOkBcT ZZGvK|q74(OMO{RuPMfMbQ%RA*8UVO3S=j&p literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/prev.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7d51fd7ec024ab197d8739f44dda383a9174710 GIT binary patch literal 303 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 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/template-gradient.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/template-gradient.gif new file mode 100644 index 0000000000000000000000000000000000000000..1bd540ead6b30538c920d4d805a7fddb1fb5495a GIT binary patch literal 659 zcmZ?wbhEHbG-F6%xXQpFBO{}rpdc?Vuc4tKCnqN>D{E|QtgWrBudlDGt7~XzXliPz zqN1Xxs3(+1BxM}m2ty@`k?A*0`&)$9e_cI+jeB|h{ z<0np@WIS{B-1!R^FI~ROd+qv-o40P?xqDamfv}{o?1RS-A3uHc@b#eg)?) z8P7>7Et55ZSH+y%wA6b#d(x>no|~7Qoo!L5cH`vc<>xodcWCAk?OL$n;$n}hKGkcgtg<&?AZAD_ylF|c|JQgJv}|cIQ!n2otvMZU*Oy= z=eujm%gZZ*SI3>*we|J&4aukH`R?BK_V$kA*Z0ou-v0jnfo5)bzdbuXK0Yy7JO13B You8jySnNIDZ||Px# literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/top-content-shadow.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/top-content-shadow.gif new file mode 100644 index 0000000000000000000000000000000000000000..34035a8a14113c16fe601d031e08762a916d5c45 GIT binary patch literal 325 zcmV-L0lNN2Nk%w1VYC1g0J8u9|NsB~{{H>_{rmg-_4W1a?Cjv+;Ly;}yu7@rsi~Ef zm4$_c000000000000000EC2ui0JH!U000E~aLGxly*TU5yZ>M)W=d(EXsWJk>%MR- z&veZuc&_h!@BhG{a7Zi~kH{Zl$!t2G(5Q4uty-_xtad9sc)#GVcuX#v&*-#z&2GEP zhPZrAuiNkVynfH``~QG}cm;%ohKGoWii?bmj*pO$l9QB+1echZnwy-Ro}ZwhqNAjx zrl+0*s;jK6uCK7Mva__cwzs&sy0HSizQ4f1!o$SH#>dFX%FE2n!~xLJ($mz{*4NnC z+S}aS-rwNY0ORE4=I7|?>g(+7?(gvN^7Hid_V@Vt`uqI-{{H|23LHqVpuvL(6DnND Xu%W|;5F<*QNU@^Dix@NJivR#SVQ0X7 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/top-left.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/top-left.gif new file mode 100644 index 0000000000000000000000000000000000000000..00b8ab415bae3b73edf82449ef3c22e87b504831 GIT binary patch literal 917 zcmaJ=&r8&C5FMd|;KfT+>Lt8-sfkF0D8kZ+prj%qXocor_7kO$f+9+i4!fbqkOdLC z#1c~2Ars6t%4q6fhhniXq90IEskmv_^yd2qG`C@9-n{qb^V!n4d0lO4IaN@R$Ro^M z-Nl{VDKaxRbrUysqbRDms;juND@CuEi@JylyHJd>Ijgfcvoit7$(+V0!2|1F<}!5Qs`wh7GpLhaKxyQ8i^4bVJlbz45Yyl zv{1uhU;`Rh7^V;uIYLxfl|moZA`?+z6$-gvfg+1CD-+a%6nd3JiIpG^et;&XVF&bs z1Qdcbz(5)-(Fz_|3~WFHi^91mBS)|Zg^|#QwaA!-3BE!uSfD7xLhunz!vOF?JB)@} zSP4Hs6VtE*oFEtq!5Uy7jY-e~4=e^Ypeari-6$hR5H1EIp$}`3F~#EuUz2-BF*#w_ zoLnV(6QjfR#JdI3Ii!29XCmM1aJb4=YT80JZQqI#l^q#3xB@MOm7f)VI?&#=lI^DDDOz+;ay8nD%s`L86t{X?v18qIGF5bL%_3qfUp?r4a z+2Es>xzXp3CkllRUyAb!Gjm0}Y#{$XR?aUeA)2L{Xp28Vr6;JQw5lOJwf5xOiA!Zq z)2Xq}nZofy4R_w>&rQF}|Pt)Xq=a=x6J2 z-=6KCt$lrCOXafeYC2k9+g#T>)I2hLS!nj|u5H?&DBQ&Y|jmY*$aN-4uuHq1JMYLeOh9rnCv_4hc0vMdKm!ZI z=%&~cp=M&nW)y3YshWx@n^LeqQPf0C*o1-F>0hnV#G$+3f2GvX|Mz> z)UX)XfCd(ZDFj815LH&C(1*3iL{wOXLM~XK$fC^31oa?=UL{dtCCGyxpowYN0sSBW zgX_a4yQo5iCMsB=lh|GG<|duaFBCCP zSBc)l=x{ypE=ChO;s}YtKuSo*O%fgfoIv9_;7TwLny_kW>TiDX&)4zXmv29IwD-04 z4W7F*(w`Z9{OaAh#*_FG`hdnoj`tCiw z^616I2hWFJj*WfzG?AbD`FjE{8_55Ul6+ACQH~ZwTl@){)<8qW(@PiDE^c^Br5i`u zvYF<>!GW&VSLY75WJm6w*s!ytqV;2DZ_)ShdF9(?R&K8D?C*Vc?DN{jrX%e=D^I7g zqr=75X0JNFbkXIiRPKG*_T??ha;K`(ncZ)?SG3OmmA!SL@NV6V!}VKl@7nZa-<-;u Lmuk`l1yueIn##a8 literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/images/trans.gif b/codes/javaee/javaee-taglib/src/main/webapp/images/trans.gif new file mode 100644 index 0000000000000000000000000000000000000000..6964168b947afc2cf76780a85f43d4f77c257b77 GIT binary patch literal 43 qcmZ?wbhEHbWMp7uXkcLY4+e@qSs2-Y0y+#p0Fq%~V)9{Rum%7ZDGCMv literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/main/webapp/index.jsp b/codes/javaee/javaee-taglib/src/main/webapp/index.jsp new file mode 100644 index 00000000..b3346ace --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/index.jsp @@ -0,0 +1,83 @@ +<%@ page language="java" contentType="text/html; charset=gb2312" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + + + + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/loop.jsp b/codes/javaee/javaee-taglib/src/main/webapp/loop.jsp new file mode 100644 index 00000000..540e2cb2 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/loop.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + +

    +Loop. 
    +
    + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/multi.jsp b/codes/javaee/javaee-taglib/src/main/webapp/multi.jsp new file mode 100644 index 00000000..c960cbd1 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/multi.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/multiAttribute.jsp b/codes/javaee/javaee-taglib/src/main/webapp/multiAttribute.jsp new file mode 100644 index 00000000..f245d55d --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/multiAttribute.jsp @@ -0,0 +1,21 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + + + + 标签体一, + 标签体二, + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/style/style.css b/codes/javaee/javaee-taglib/src/main/webapp/style/style.css new file mode 100644 index 00000000..94ac1b2f --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/style/style.css @@ -0,0 +1,66 @@ +body, td, div, input, textarea, span { + font-size: 12px; + font-family: Arial; +} + +.list_table { + border-collapse: collapse; +} + +.list_table .tr_title { + +} + +.list_table .tr_title td { + border: 1px solid #DDDDDD; + background: #EEEEEE; + background: url("../images/ibm-tab-background.gif") no-repeat 0px 0px; + border-top: 1px solid #7E9AB0; + color: #FFFFFF; + text-align: center; + padding-top: 4px; + padding-bottom: 4px; + white-space: nowrap; + font-weight: bold; +} + +.list_table .tr_title td span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.list_table .tr_title img { + padding-top: 1px; + padding-bottom: 1px; +} + +.list_table .tr_data { + padding: 2px; + text-align: center; +} + +.list_table .tr_data td { + border: 1px solid #DDDDDD; + padding: 2px; +} + +.list_table .tr_data td span { + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.button { + color: #FFFFFF; + font-weight: bold; + font-size: 11px; + font-family: verdana; + text-align: center; + padding: .17em 0 .2em .17em; + border-style: solid; + border-width: 1px; + border-color: #99CCFF #115599 #115599 #99CCFF; + background: #6699CC url(../images/bg-btn-blue.gif) repeat-x; +} diff --git a/codes/javaee/javaee-taglib/src/main/webapp/table.jsp b/codes/javaee/javaee-taglib/src/main/webapp/table.jsp new file mode 100644 index 00000000..ea9c96ef --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/table.jsp @@ -0,0 +1,184 @@ +<%@ page language="java" contentType="text/html; charset=gb2312" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> +<%@page import="io.github.dunwu.javaee.taglib.bean.Person" %> +<%@page import="java.util.ArrayList" %> +<%@page import="java.util.List" %> +<% + List personList = new ArrayList(); + + int i = 1; + + Person person = new Person(); + person.setId(i++); + person.setName(""); + person.setAge(20); + person.setSex(""); + person.setAddress("кϵ԰"); + person.setBirthday("2008-08-08"); + person.setMobile("13820080808"); + person.setTelephone("69653234"); + person.setCity(""); + + personList.add(person); + + Person person2 = new Person(); + person2.setId(i++); + person2.setName(""); + person2.setAge(20); + person2.setSex(""); + person2.setAddress("жʳǸͬ"); + person2.setBirthday("2008-01-01"); + person2.setMobile("13820080808"); + person2.setTelephone("20054879"); + person2.setCity(""); + + personList.add(person2); + + Person person3 = new Person(); + person3.setId(i++); + person3.setName(""); + person3.setAge(20); + person3.setSex(""); + person3.setAddress("жʳǸͬ"); + person3.setBirthday("2008-01-01"); + person3.setMobile("13820080808"); + person3.setTelephone("20054879"); + person3.setCity(""); + + personList.add(person3); + + Person person4 = new Person(); + person4.setId(i++); + person4.setName(""); + person4.setAge(20); + person4.setSex("Ů"); + person4.setAddress("жʳǸͬ"); + person4.setBirthday("2008-01-01"); + person4.setMobile("13820080808"); + person4.setTelephone("20054879"); + person4.setCity(""); + + personList.add(person4); + + Person person5 = new Person(); + person5.setId(i++); + person5.setName(""); + person5.setAge(20); + person5.setSex(""); + person5.setAddress("жʳǸͬ"); + person5.setBirthday("2008-01-01"); + person5.setMobile("13820080808"); + person5.setTelephone("20054879"); + person5.setCity(""); + + personList.add(person5); + + Person person6 = new Person(); + person6.setId(i++); + person6.setName(""); + person6.setAge(20); + person6.setSex("Ů"); + person6.setAddress("жʳǸͬ"); + person6.setBirthday("2008-01-01"); + person6.setMobile("13820080808"); + person6.setTelephone("20054879"); + person6.setCity(""); + + personList.add(person6); + + Person person7 = new Person(); + person7.setId(i++); + person7.setName(""); + person7.setAge(20); + person7.setSex(""); + person7.setAddress("кּ36A"); + person7.setBirthday("2008-01-01"); + person7.setMobile("13820080808"); + person7.setTelephone("20054879"); + person7.setCity(""); + + personList.add(person7); + + request.setAttribute("personList", personList); +%> + + + + Insert title here + + + + + + + + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/taglib/copyright.jsp b/codes/javaee/javaee-taglib/src/main/webapp/taglib/copyright.jsp new file mode 100644 index 00000000..c8dc90db --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/taglib/copyright.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + +Hello, taglib + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag.jsp b/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag.jsp new file mode 100644 index 00000000..209768fb --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag.jsp @@ -0,0 +1,9 @@ +<%@ taglib prefix="ex" uri="/WEB-INF/tld/hello.tld" %> + + + A sample custom tag + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag2.jsp b/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag2.jsp new file mode 100644 index 00000000..ab30e991 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag2.jsp @@ -0,0 +1,11 @@ +<%@ taglib prefix="ex" uri="/WEB-INF/tld/hello2.tld" %> + + + A sample custom tag + + + + This is message body + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag3.jsp b/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag3.jsp new file mode 100644 index 00000000..e36e2737 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/taglib/helloTag3.jsp @@ -0,0 +1,9 @@ +<%@ taglib prefix="ex" uri="/WEB-INF/tld/hello3.tld" %> + + + A sample custom tag + + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/test.jsp b/codes/javaee/javaee-taglib/src/main/webapp/test.jsp new file mode 100644 index 00000000..8191a043 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/test.jsp @@ -0,0 +1,38 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@page import="io.github.dunwu.javaee.taglib.bean.Person" %> +<%@page import="java.util.ArrayList" %> +<%@page import="java.util.List" %> +<% + if (true) { + List personList = new ArrayList(); + + Person person = new Person(); + person.setId(1); + person.setName("张三"); + person.setAge(20); + person.setSex("男"); + person.setAddress("北京市海淀区上地软件园"); + person.setBirthday("2008-08-08"); + person.setMobile("13820080808"); + person.setTelephone("69653234"); + person.setCity("北京"); + + personList.add(person); + Person person2 = new Person(); + person2.setId(2); + person2.setName("李四"); + person2.setAge(20); + person2.setSex("女"); + person2.setAddress("北京市东皇城根锡拉胡同"); + person2.setBirthday("2008-01-01"); + person2.setMobile("13820080808"); + person2.setTelephone("20054879"); + person2.setCity("北京"); + + personList.add(person2); + + request.setAttribute("personList", personList); + + request.getRequestDispatcher("/index.jsp").forward(request, response); + } +%> diff --git a/codes/javaee/javaee-taglib/src/main/webapp/toLowerCase.jsp b/codes/javaee/javaee-taglib/src/main/webapp/toLowerCase.jsp new file mode 100644 index 00000000..2e7b1f49 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/toLowerCase.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + +Hello, To Lower Case Tag with Body. + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/toUpperCase.jsp b/codes/javaee/javaee-taglib/src/main/webapp/toUpperCase.jsp new file mode 100644 index 00000000..c761cf88 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/main/webapp/toUpperCase.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" %> +<%@ taglib uri="http://www.victorzhang.com/tags" prefix="taglib" %> + + + + Insert title here + + + + + This is a to upper case tag. + + + + diff --git a/codes/javaee/javaee-taglib/src/main/webapp/vote.gif b/codes/javaee/javaee-taglib/src/main/webapp/vote.gif new file mode 100644 index 0000000000000000000000000000000000000000..26a5a3e52a9fbede373ff93f07998c08243b766d GIT binary patch literal 65 zcmZ?wbhEHbWMtrESj52a`QpdFzkh$f_w{D_ja#|5p3QptV$rh;&KDGavM_*v4u}A$ QWngBj2o^|sqQYPe0NYO)l>h($ literal 0 HcmV?d00001 diff --git a/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java b/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java new file mode 100644 index 00000000..f4706199 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/JettyFactory.java @@ -0,0 +1,114 @@ +package io.github.dunwu.javaee.server; + +import java.util.ArrayList; +import org.apache.commons.lang3.StringUtils; +import org.assertj.core.util.Lists; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; + +/** + * JettyFactory 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("unused") +public class JettyFactory { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + private static final int PORT = 9798; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "shiro-web", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static Server initServer() { + Profiles.setProfileAsSystemProperty(Profiles.DEVELOPMENT); + WebAppContext webAppContext = new WebAppContext(); + Server server = new Server(PORT); + server.setHandler(webAppContext); + return server; + } + + public static void initWebAppContext(Server server, int type) { + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + + if (IDE_INTELLIJ == type) { + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + } else { + webAppContext.setParentLoaderPriority(true); + } + + System.out.println("[INFO] Application loaded"); + } + + public static String getAbsolutePath() { + String path = null; + String folderPath = JettyFactory.class.getProtectionDomain().getCodeSource().getLocation().getPath() + .substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + public static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + ArrayList jarNameExprssions = Lists.newArrayList(".*/[^/]*servlet-api-[^/]*\\.jar$", + ".*/javax.servlet.jsp.jstl-.*\\.jar$", ".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + jarNameExprssions.add(".*/" + jarName + "-[^/]*\\.jar$"); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(jarNameExprssions, '|')); + } + + public static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + + public static void startServer(Server server) throws Exception { + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + server.start(); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + } + +} diff --git a/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/Profiles.java b/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/Profiles.java new file mode 100644 index 00000000..dcfd3e39 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/Profiles.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2005, 2014 springside.github.io + * + * Licensed under the Apache License, Version 2.0 (the "License"); + *******************************************************************************/ +package io.github.dunwu.javaee.server; + +/** + * Spring profile 常用方法与profile名称。 + * + * @author calvin + */ +public class Profiles { + + public static final String ACTIVE_PROFILE = "spring.profiles.active"; + + public static final String DEFAULT_PROFILE = "spring.profiles.default"; + + public static final String PRODUCTION = "production"; + + public static final String DEVELOPMENT = "development"; + + public static final String UNIT_TEST = "test"; + + public static final String FUNCTIONAL_TEST = "functional"; + + /** + * 在Spring启动前,设置profile的环境变量。 + */ + public static void setProfileAsSystemProperty(String profile) { + System.setProperty(ACTIVE_PROFILE, profile); + } + +} diff --git a/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java b/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java new file mode 100644 index 00000000..049c8802 --- /dev/null +++ b/codes/javaee/javaee-taglib/src/test/java/io/github/dunwu/javaee/server/QuickStartServer.java @@ -0,0 +1,35 @@ +package io.github.dunwu.javaee.server; + +import org.eclipse.jetty.server.Server; + +/** + * 快速启动 jetty 服务器,方便测试 + * + * @author Zhang Peng + */ +public class QuickStartServer { + + // private static int STARTUP_TYPE = JettyFactory.IDE_ECLIPSE; + private static int STARTUP_TYPE = JettyFactory.IDE_INTELLIJ; + + public static void main(String[] args) throws Exception { + Server server = JettyFactory.initServer(); + JettyFactory.initWebAppContext(server, STARTUP_TYPE); + + try { + JettyFactory.startServer(server); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + JettyFactory.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + +} diff --git a/codes/javaee/javaee-taglib/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-taglib/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-taglib/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-websocket/pom.xml b/codes/javaee/javaee-websocket/pom.xml new file mode 100644 index 00000000..2e170eb9 --- /dev/null +++ b/codes/javaee/javaee-websocket/pom.xml @@ -0,0 +1,120 @@ + + + 4.0.0 + + + io.github.dunwu.javaee + javaee + 1.0.0 + + + io.github.dunwu + javaee-websocket + 1.0.0 + war + javaee-websocket + JavaEE 学习笔记之 WebSocket + + + UTF-8 + 1.7 + ${java.version} + ${java.version} + + + + + + ch.qos.logback + logback-classic + + + org.slf4j + jcl-over-slf4j + + + + + + javax.servlet + javax.servlet-api + provided + + + javax.servlet.jsp + javax.servlet.jsp-api + provided + + + javax.websocket + javax.websocket-api + provided + + + + + + org.eclipse.jetty + jetty-webapp + + + org.eclipse.jetty + jetty-annotations + + + org.eclipse.jetty + apache-jsp + + + org.eclipse.jetty + apache-jstl + + + org.eclipse.jetty.websocket + javax-websocket-server-impl + + + + + + org.apache.commons + commons-lang3 + + + com.google.guava + guava + + + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + 8089 + /${artifactId} + UTF-8 + + + + org.eclipse.jetty + jetty-maven-plugin + 9.4.18.v20190429 + + + 8089 + + + /${artifactId} + + + + + + + diff --git a/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/servlet/SocketServlet.java b/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/servlet/SocketServlet.java new file mode 100644 index 00000000..c2730f56 --- /dev/null +++ b/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/servlet/SocketServlet.java @@ -0,0 +1,58 @@ +package io.github.dunwu.javaee.servlet; + +import io.github.dunwu.javaee.websocket.WebSocketServer; +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * SocketServlet信息示例 + */ +public class SocketServlet extends HttpServlet { + + private static final long serialVersionUID = -7936817351382556277L; + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * Constructor of the object. + */ + public SocketServlet() { + super(); + } + + public void destroy() { + super.destroy(); // Just puts "destroy" string in log + // Put your code here + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doGet(request, response); + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // 设置 request,response 编码方式 + response.setCharacterEncoding("UTF-8"); + request.setCharacterEncoding("UTF-8"); + + // 取浏览器提交的 name 参数 + String id = request.getParameter("id"); + String text = request.getParameter("text"); + + if (id != null && id.length() > 0) { + WebSocketServer.send(id, text); + } else { + WebSocketServer.sendAll(text); + } + } + + public void init() throws ServletException { + // Put your code here + } + +} diff --git a/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServer.java b/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServer.java new file mode 100644 index 00000000..d896a8d7 --- /dev/null +++ b/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServer.java @@ -0,0 +1,118 @@ +package io.github.dunwu.javaee.websocket; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; + +/** + * Websocket 消息处理中心 + * + * @author Zhang Peng + * @see https://github.com/jetty-project/embedded-jetty-websocket-examples + */ +@ServerEndpoint(value = "/auth/user/{id}", configurator = WebSocketServerConfigurator.class) +public class WebSocketServer { + + private static final Logger logger = LoggerFactory.getLogger(WebSocketServer.class); + + static Map> userSessionMap = new ConcurrentHashMap<>(); + + // private static Map userSessionMap = new ConcurrentHashMap>(); + + /** + * 发送广播消息 + * + * @param message + */ + public static void sendAll(String message) { + logger.info("SendAll: {}", message); + + for (Set groups : userSessionMap.values()) { + for (Session session : groups) { + try { + session.getBasicRemote().sendObject(message); + } catch (IOException e) { + logger.error(e.toString()); + } catch (EncodeException e) { + logger.error(e.toString()); + } + } + } + } + + public static void send(String userId, String message) { + for (String id : userSessionMap.keySet()) { + if (id.equals(userId)) { + for (Session session : userSessionMap.get(userId)) { + try { + session.getBasicRemote().sendObject(message); + logger.info("SendAll: {}", message); + } catch (Exception e) { + logger.error(e.toString()); + } + } + } + } + } + + @OnMessage + public void onMessage(String message, Session session) throws IOException, InterruptedException { + logger.debug("收到一条客户端消息。session:{}, msg:{}", session.getId(), message); + } + + @OnOpen + public void onOpen(Session session, EndpointConfig config, @PathParam("id") String id) { + logger.info("Session {} connected.", session.getId()); + + // 如果是新 Session,记录进 Map + boolean isNewUser = true; + Iterator i = userSessionMap.entrySet().iterator(); + while (i.hasNext()) { + Map.Entry entry = (Map.Entry) i.next(); + String key = (String) entry.getKey(); + if (key.equals(id)) { + userSessionMap.get(key).add(session); + isNewUser = false; + break; + } + } + if (isNewUser) { + Set sessions = new HashSet<>(); + sessions.add(session); + userSessionMap.put(id, sessions); + } + logger.info("当前在线用户数: {}", userSessionMap.values().size()); + } + + @OnClose + public void onClose(Session session, CloseReason closeReason) { + logger.info("Session {} disconnected. Because of {}", session.getId(), closeReason); + for (Set item : userSessionMap.values()) { + if (item.contains(session)) { + // 删除连接 session + item.remove(session); + // 如果 userId 对应的 session 数为 0 ,删除该 userId 对应的记录 + if (0 == item.size()) { + userSessionMap.values().remove(item); + } + break; + } + } + logger.info("当前在线用户数: {}", userSessionMap.values().size()); + } + + @OnError + public void onError(Throwable error) { + logger.error("Websocket error: {}", error.getMessage()); + } + +} diff --git a/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServerConfigurator.java b/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServerConfigurator.java new file mode 100644 index 00000000..4b515645 --- /dev/null +++ b/codes/javaee/javaee-websocket/src/main/java/io/github/dunwu/javaee/websocket/WebSocketServerConfigurator.java @@ -0,0 +1,19 @@ +package io.github.dunwu.javaee.websocket; + +import javax.servlet.http.HttpSession; +import javax.websocket.HandshakeResponse; +import javax.websocket.server.HandshakeRequest; +import javax.websocket.server.ServerEndpointConfig; + +/** + * @author Zhang Peng + */ +public class WebSocketServerConfigurator extends ServerEndpointConfig.Configurator { + + @Override + public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { + HttpSession httpSession = (HttpSession) request.getHttpSession(); + sec.getUserProperties().put(HttpSession.class.getName(), httpSession); + } + +} diff --git a/codes/javaee/javaee-websocket/src/main/resources/logback.xml b/codes/javaee/javaee-websocket/src/main/resources/logback.xml new file mode 100644 index 00000000..c9733094 --- /dev/null +++ b/codes/javaee/javaee-websocket/src/main/resources/logback.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + ${user.dir}/logs/${DIR_NAME}/all.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + + + + + + + + + diff --git a/codes/javaee/javaee-websocket/src/main/webapp/WEB-INF/web.xml b/codes/javaee/javaee-websocket/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..942745f7 --- /dev/null +++ b/codes/javaee/javaee-websocket/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,23 @@ + + + + + SocketServlet + + io.github.dunwu.javaee.servlet.SocketServlet + + + + SocketServlet + /sock/* + + + + index.jsp + + + diff --git a/codes/javaee/javaee-websocket/src/main/webapp/websocketA.html b/codes/javaee/javaee-websocket/src/main/webapp/websocketA.html new file mode 100644 index 00000000..6b15a582 --- /dev/null +++ b/codes/javaee/javaee-websocket/src/main/webapp/websocketA.html @@ -0,0 +1,60 @@ + + + + + webscocket test + + + + + + + + +
    +
    + + + diff --git a/codes/javaee/javaee-websocket/src/main/webapp/websocketB.html b/codes/javaee/javaee-websocket/src/main/webapp/websocketB.html new file mode 100644 index 00000000..b9b7b081 --- /dev/null +++ b/codes/javaee/javaee-websocket/src/main/webapp/websocketB.html @@ -0,0 +1,60 @@ + + + + + webscocket test + + + + + + + + +
    +
    + + + diff --git a/codes/javaee/javaee-websocket/src/test/java/io/github/dunwu/javaee/server/DevServer.java b/codes/javaee/javaee-websocket/src/test/java/io/github/dunwu/javaee/server/DevServer.java new file mode 100644 index 00000000..1331516a --- /dev/null +++ b/codes/javaee/javaee-websocket/src/test/java/io/github/dunwu/javaee/server/DevServer.java @@ -0,0 +1,137 @@ +package io.github.dunwu.javaee.server; + +import com.google.common.collect.Lists; +import io.github.dunwu.javaee.websocket.WebSocketServer; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppClassLoader; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.websocket.jsr356.server.ServerContainer; +import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; + +import java.util.ArrayList; + +/** + * DevServer 可以工作在 Eclipse 和 Intellij 中,用来启动 jetty 服务。 Intellij 并不支持jetty,所以要想类似eclipse一样的使用jetty,需要配置webdefault.xml。 + * + * @author Zhang Peng + */ +@SuppressWarnings("unused") +public class DevServer { + + public static final int IDE_ECLIPSE = 0; + + public static final int IDE_INTELLIJ = 1; + + public static final String PRODUCTION = "production"; + + public static final String DEVELOPMENT = "development"; + + public static final String UNIT_TEST = "test"; + + public static final String FUNCTIONAL_TEST = "functional"; + + private static final int PORT = 8089; + + private static final String CONTEXT = "/"; + + private static final String RESOURCE_BASE_PATH = "src/main/webapp"; + + private static final String WEB_XML_PATH = "/WEB-INF/web.xml"; + + private static final String[] TLD_JAR_NAMES = new String[] { "sitemesh", "spring-webmvc", "shiro-web", "tiles" }; + + private static final String WINDOWS_WEBDEFAULT_PATH = "jetty/webdefault.xml"; + + public static void main(String[] args) { + + // 初始化 WebAppContext + System.out.println("[INFO] Application loading"); + WebAppContext webAppContext = new WebAppContext(); + webAppContext.setContextPath(CONTEXT); + webAppContext.setResourceBase(getAbsolutePath() + RESOURCE_BASE_PATH); + webAppContext.setDescriptor(getAbsolutePath() + RESOURCE_BASE_PATH + WEB_XML_PATH); + webAppContext.setDefaultsDescriptor(WINDOWS_WEBDEFAULT_PATH); + + // 初始化 server + Server server = new Server(PORT); + server.setHandler(webAppContext); + supportJspAndSetTldJarNames(server, TLD_JAR_NAMES); + + System.out.println("[INFO] Application loaded"); + + try { + // Initialize javax.websocket layer + ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(webAppContext); + + // Add WebSocket endpoint to javax.websocket layer + wscontainer.addEndpoint(WebSocketServer.class); + + System.out.println("[HINT] Don't forget to set -XX:MaxPermSize=128m"); + System.out.println("Server running at http://localhost:" + PORT + CONTEXT); + System.out.println("[HINT] Hit Enter to reload the application quickly"); + + server.start(); + // server.join(); + + // 等待用户输入回车重载应用 + while (true) { + char c = (char) System.in.read(); + if (c == '\n') { + DevServer.reloadWebAppContext(server); + } + } + } catch (Exception e) { + e.printStackTrace(); + System.exit(-1); + } + } + + private static String getAbsolutePath() { + String path = null; + String folderPath = DevServer.class.getProtectionDomain().getCodeSource().getLocation().getPath().substring(1); + if (folderPath.indexOf("target") > 0) { + path = folderPath.substring(0, folderPath.indexOf("target")); + } + return path; + } + + private static void supportJspAndSetTldJarNames(Server server, String... jarNames) { + WebAppContext context = (WebAppContext) server.getHandler(); + // This webapp will use jsps and jstl. We need to enable the + // AnnotationConfiguration in + // order to correctly set up the jsp container + org.eclipse.jetty.webapp.Configuration.ClassList classlist = org.eclipse.jetty.webapp.Configuration.ClassList + .setServerDefault(server); + classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", + "org.eclipse.jetty.annotations.AnnotationConfiguration"); + // Set the ContainerIncludeJarPattern so that jetty examines these container-path + // jars for + // tlds, web-fragments etc. + // If you omit the jar that contains the jstl .tlds, the jsp engine will scan for + // them + // instead. + ArrayList jarNameExprssions = Lists.newArrayList(".*/[^/]*servlet-api-[^/]*\\.jar$", + ".*/javax.servlet.jsp.jstl-.*\\.jar$", ".*/[^/]*taglibs.*\\.jar$"); + + for (String jarName : jarNames) { + jarNameExprssions.add(".*/" + jarName + "-[^/]*\\.jar$"); + } + + context.setAttribute("org.eclipse.jetty.io.github.dunwu.javaee.server.webapp.ContainerIncludeJarPattern", + StringUtils.join(jarNameExprssions, '|')); + } + + private static void reloadWebAppContext(Server server) throws Exception { + WebAppContext webAppContext = (WebAppContext) server.getHandler(); + System.out.println("[INFO] Application reloading"); + webAppContext.stop(); + WebAppClassLoader classLoader = new WebAppClassLoader(webAppContext); + classLoader.addClassPath(getAbsolutePath() + "target/classes"); + classLoader.addClassPath(getAbsolutePath() + "target/test-classes"); + webAppContext.setClassLoader(classLoader); + webAppContext.start(); + System.out.println("[INFO] Application reloaded"); + } + +} diff --git a/codes/javaee/javaee-websocket/src/test/resources/jetty/webdefault.xml b/codes/javaee/javaee-websocket/src/test/resources/jetty/webdefault.xml new file mode 100644 index 00000000..b991d44c --- /dev/null +++ b/codes/javaee/javaee-websocket/src/test/resources/jetty/webdefault.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + org.eclipse.jetty.servlet.listener.ELContextCleaner + + + + + + + + org.eclipse.jetty.servlet.listener.IntrospectorCleaner + + + + + + + + + + + + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + aliases + false + + + acceptRanges + true + + + dirAllowed + true + + + welcomeServlets + false + + + redirectWelcome + false + + + maxCacheSize + 256000000 + + + maxCachedFileSize + 200000000 + + + maxCachedFiles + 2048 + + + gzip + false + + + etags + false + + + useFileMappedBuffer + false + + + + 0 + + + + default + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jsp + org.eclipse.jetty.jsp.JettyJspServlet + + logVerbosityLevel + DEBUG + + + fork + false + + + xpoweredBy + false + + + compilerTargetVM + 1.7 + + + compilerSourceVM + 1.7 + + + 0 + + + + jsp + *.jsp + *.jspf + *.jspx + *.xsp + *.JSP + *.JSPF + *.JSPX + *.XSP + + + + + + + + 30 + + + + + + + + + + + + + + + index.html + index.htm + index.jsp + + + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + + + + Disable TRACE + / + TRACE + + + + + + Enable everything but TRACE + / + TRACE + + + + + diff --git a/codes/javaee/javaee-websocket/src/test/resources/logback.xml b/codes/javaee/javaee-websocket/src/test/resources/logback.xml new file mode 100644 index 00000000..6de5c7eb --- /dev/null +++ b/codes/javaee/javaee-websocket/src/test/resources/logback.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + ${user.dir}/logs/${DIR_NAME}/test.%d{yyyy-MM-dd}.log + 30 + + + + + 30MB + + + + %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n + + + + + + + + + + + + + + + + diff --git a/codes/javaee/pom.xml b/codes/javaee/pom.xml new file mode 100644 index 00000000..376eb379 --- /dev/null +++ b/codes/javaee/pom.xml @@ -0,0 +1,111 @@ + + + 4.0.0 + + + io.github.dunwu + dunwu-parent + 0.5.1 + + + io.github.dunwu.javaee + javaee + 1.0.0 + pom + JAVAEE + + + javaee-servlet + javaee-jsp + javaee-session + javaee-filter + javaee-listener + javaee-jstl + javaee-taglib + javaee-oss + javaee-websocket + + + + UTF-8 + 1.6 + ${java.version} + ${java.version} + + + + + + + + 2.9.5 + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + + org.eclipse.jetty + jetty-maven-plugin + ${jetty.version} + + + org.codehaus.mojo + aspectj-maven-plugin + + 1.2 + + + + org.aspectj + aspectjrt + 1.8.1 + + + org.aspectj + aspectjtools + 1.8.1 + + + + + + compile + test-compile + + + + + true + ${java.version} + ${java.version} + + + + + org.mybatis.generator + mybatis-generator-maven-plugin + 1.3.5 + + + org.mybatis.generator + mybatis-generator-core + 1.3.5 + + + + + + + diff --git a/codes/javalib/javalib-bean/README.md b/codes/javalib/javalib-bean/README.md deleted file mode 100644 index 3b9709fa..00000000 --- a/codes/javalib/javalib-bean/README.md +++ /dev/null @@ -1,373 +0,0 @@ -# Lombok 应用指南 - - - -- [1. Lombok 简介](#1-lombok-简介) -- [2. Lombok 安装](#2-lombok-安装) -- [3. Lombok 使用](#3-lombok-使用) - - [3.1. @Getter and @Setter](#31-getter-and-setter) - - [3.2. @NonNull](#32-nonnull) - - [3.3. @ToString](#33-tostring) - - [3.4. @EqualsAndHashCode](#34-equalsandhashcode) - - [3.5. @Data](#35-data) - - [3.6. @Cleanup](#36-cleanup) - - [3.7. @Synchronized](#37-synchronized) - - [3.8. @SneakyThrows](#38-sneakythrows) - - [3.9. 示例源码](#39-示例源码) -- [4. 参考资料](#4-参考资料) - - - -## 1. Lombok 简介 - -Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lombok,开发人员可以节省构建诸如 `hashCode()` 和 `equals()` 、`getter / setter` 这样的方法以及以往用来分类各种 accessor 和 mutator 的大量时间。 - -## 2. Lombok 安装 - -使 IntelliJ IDEA 支持 Lombok 方式如下: - -- **Intellij 设置支持注解处理** - - 点击 File > Settings > Build > Annotation Processors - - 勾选 Enable annotation processing -- **安装插件** - - 点击 Settings > Plugins > Browse repositories - - 查找 Lombok Plugin 并进行安装 - - 重启 IntelliJ IDEA -- **将 lombok 添加到 pom 文件** - -```xml - - org.projectlombok - lombok - 1.16.8 - -``` - -## 3. Lombok 使用 - -Lombok 提供注解 API 来修饰指定的类: - -### 3.1. @Getter and @Setter - -[@Getter and @Setter](http://jnb.ociweb.com/jnb/jnbJan2010.html#gettersetter) Lombok 代码: - -```java -@Getter @Setter private boolean employed = true; -@Setter(AccessLevel.PROTECTED) private String name; -``` - -等价于 Java 源码: - -```java -private boolean employed = true; -private String name; - -public boolean isEmployed() { - return employed; -} - -public void setEmployed(final boolean employed) { - this.employed = employed; -} - -protected void setName(final String name) { - this.name = name; -} -``` - -### 3.2. @NonNull - -[@NonNull](http://jnb.ociweb.com/jnb/jnbJan2010.html#nonnull) Lombok 代码: - -```java -@Getter @Setter @NonNull -private List members; -``` - -等价于 Java 源码: - -```java -@NonNull -private List members; - -public Family(@NonNull final List members) { - if (members == null) throw new java.lang.NullPointerException("members"); - this.members = members; -} - -@NonNull -public List getMembers() { - return members; -} - -public void setMembers(@NonNull final List members) { - if (members == null) throw new java.lang.NullPointerException("members"); - this.members = members; -} -``` - -### 3.3. @ToString - -[@ToString](http://jnb.ociweb.com/jnb/jnbJan2010.html#tostring) Lombok 代码: - -```java -@ToString(callSuper=true,exclude="someExcludedField") -public class Foo extends Bar { - private boolean someBoolean = true; - private String someStringField; - private float someExcludedField; -} -``` - -等价于 Java 源码: - -```java -public class Foo extends Bar { - private boolean someBoolean = true; - private String someStringField; - private float someExcludedField; - - @java.lang.Override - public java.lang.String toString() { - return "Foo(super=" + super.toString() + - ", someBoolean=" + someBoolean + - ", someStringField=" + someStringField + ")"; - } -} -``` - -### 3.4. @EqualsAndHashCode - -[@EqualsAndHashCode](http://jnb.ociweb.com/jnb/jnbJan2010.html#equals) Lombok 代码: - -```java -@EqualsAndHashCode(callSuper=true,exclude={"address","city","state","zip"}) -public class Person extends SentientBeing { - enum Gender { Male, Female } - - @NonNull private String name; - @NonNull private Gender gender; - - private String ssn; - private String address; - private String city; - private String state; - private String zip; -} -``` - -等价于 Java 源码: - -```java -public class Person extends SentientBeing { - - enum Gender { - /*public static final*/ Male /* = new Gender() */, - /*public static final*/ Female /* = new Gender() */; - } - @NonNull - private String name; - @NonNull - private Gender gender; - private String ssn; - private String address; - private String city; - private String state; - private String zip; - - @java.lang.Override - public boolean equals(final java.lang.Object o) { - if (o == this) return true; - if (o == null) return false; - if (o.getClass() != this.getClass()) return false; - if (!super.equals(o)) return false; - final Person other = (Person)o; - if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false; - if (this.gender == null ? other.gender != null : !this.gender.equals(other.gender)) return false; - if (this.ssn == null ? other.ssn != null : !this.ssn.equals(other.ssn)) return false; - return true; - } - - @java.lang.Override - public int hashCode() { - final int PRIME = 31; - int result = 1; - result = result * PRIME + super.hashCode(); - result = result * PRIME + (this.name == null ? 0 : this.name.hashCode()); - result = result * PRIME + (this.gender == null ? 0 : this.gender.hashCode()); - result = result * PRIME + (this.ssn == null ? 0 : this.ssn.hashCode()); - return result; - } -} -``` - -### 3.5. @Data - -[@Data](http://jnb.ociweb.com/jnb/jnbJan2010.html#data) Lombok 代码: - -```java -@Data(staticConstructor="of") -public class Company { - private final Person founder; - private String name; - private List employees; -} -``` - -等价于 Java 源码: - -```java -public class Company { - private final Person founder; - private String name; - private List employees; - - private Company(final Person founder) { - this.founder = founder; - } - - public static Company of(final Person founder) { - return new Company(founder); - } - - public Person getFounder() { - return founder; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - public List getEmployees() { - return employees; - } - - public void setEmployees(final List employees) { - this.employees = employees; - } - - @java.lang.Override - public boolean equals(final java.lang.Object o) { - if (o == this) return true; - if (o == null) return false; - if (o.getClass() != this.getClass()) return false; - final Company other = (Company)o; - if (this.founder == null ? other.founder != null : !this.founder.equals(other.founder)) return false; - if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false; - if (this.employees == null ? other.employees != null : !this.employees.equals(other.employees)) return false; - return true; - } - - @java.lang.Override - public int hashCode() { - final int PRIME = 31; - int result = 1; - result = result * PRIME + (this.founder == null ? 0 : this.founder.hashCode()); - result = result * PRIME + (this.name == null ? 0 : this.name.hashCode()); - result = result * PRIME + (this.employees == null ? 0 : this.employees.hashCode()); - return result; - } - - @java.lang.Override - public java.lang.String toString() { - return "Company(founder=" + founder + ", name=" + name + ", employees=" + employees + ")"; - } -} -``` - -### 3.6. @Cleanup - -[@Cleanup](http://jnb.ociweb.com/jnb/jnbJan2010.html#cleanup) Lombok 代码: - -```java -public void testCleanUp() { - try { - @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream(); - baos.write(new byte[] {'Y','e','s'}); - System.out.println(baos.toString()); - } catch (IOException e) { - e.printStackTrace(); - } -} -``` - -等价于 Java 源码: - -```java -public void testCleanUp() { - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try { - baos.write(new byte[]{'Y', 'e', 's'}); - System.out.println(baos.toString()); - } finally { - baos.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } -} -``` - -### 3.7. @Synchronized - -[@Synchronized](http://jnb.ociweb.com/jnb/jnbJan2010.html#synchronized) Lombok 代码: - -```java -private DateFormat format = new SimpleDateFormat("MM-dd-YYYY"); - -@Synchronized -public String synchronizedFormat(Date date) { - return format.format(date); -} -``` - -等价于 Java 源码: - -```java -private final java.lang.Object $lock = new java.lang.Object[0]; -private DateFormat format = new SimpleDateFormat("MM-dd-YYYY"); - -public String synchronizedFormat(Date date) { - synchronized ($lock) { - return format.format(date); - } -} -``` - -### 3.8. @SneakyThrows - -[@SneakyThrows](http://jnb.ociweb.com/jnb/jnbJan2010.html#sneaky) Lombok 代码: - -```java -@SneakyThrows -public void testSneakyThrows() { - throw new IllegalAccessException(); -} -``` - -等价于 Java 源码: - -```java -public void testSneakyThrows() { - try { - throw new IllegalAccessException(); - } catch (java.lang.Throwable $ex) { - throw lombok.Lombok.sneakyThrow($ex); - } -} -``` - -### 3.9. 示例源码 - -> 示例源码:[javalib-bean](https://github.com/dunwu/java-tutorial/tree/master/javalib-bean) - -## 4. 参考资料 - -- [Lombok 官网](https://projectlombok.org/) -- [Lombok Github](https://github.com/rzwitserloot/lombok) -- [IntelliJ IDEA - Lombok Plugin](http://plugins.jetbrains.com/plugin/6317-lombok-plugin) diff --git a/codes/javalib/javalib-bean/pom.xml b/codes/javalib/javalib-bean/pom.xml deleted file mode 100644 index 3dc0efcc..00000000 --- a/codes/javalib/javalib-bean/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-bean - 1.0.0 - jar - - java-bean - JavaBean 相关的 Lib 示例 - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - - - - - org.projectlombok - lombok - - - - - junit - junit - test - - - org.assertj - assertj-core - test - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - - - - - src/main/resources - - - - diff --git a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/DataDemo.java b/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/DataDemo.java deleted file mode 100644 index df20bb38..00000000 --- a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/DataDemo.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -import lombok.Data; - -import java.util.List; - -/** - * @Data 示例 - * - * @author Zhang Peng - * @see @Data - * @since 2019-11-22 - */ -@Data(staticConstructor = "of") -public class DataDemo { - - private final Person founder; - - protected List employees; - - private String name; - -} diff --git a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/EqualsAndHashCodeDemo.java b/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/EqualsAndHashCodeDemo.java deleted file mode 100644 index 2bdfd2b3..00000000 --- a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/EqualsAndHashCodeDemo.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NonNull; - -class Parent {} - -/** - * @EqualsAndHashCode 示例 - * - * @author Zhang Peng - * @see @EqualsAndHashCode - * @since 2019-11-22 - */ -@Data -@EqualsAndHashCode(callSuper = true, exclude = { "address", "city", "state", "zip" }) -public class EqualsAndHashCodeDemo extends Person { - - @NonNull - private String name; - - @NonNull - private Gender gender; - - private String ssn; - - private String address; - - private String city; - - private String state; - - private String zip; - - public EqualsAndHashCodeDemo(@NonNull String name, @NonNull Gender gender) { - this.name = name; - this.gender = gender; - } - - public EqualsAndHashCodeDemo(@NonNull String name, @NonNull Gender gender, - String ssn, String address, String city, String state, String zip) { - this.name = name; - this.gender = gender; - this.ssn = ssn; - this.address = address; - this.city = city; - this.state = state; - this.zip = zip; - } - - enum Gender { - Male, - Female - } - -} diff --git a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/GetterAndSetterDemo.java b/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/GetterAndSetterDemo.java deleted file mode 100644 index 0adfd3e6..00000000 --- a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/GetterAndSetterDemo.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; - -/** - * @Getter@Setter 示例 - * - * @author Zhang Peng - * @see @Getter and @Setter - * @since 2019-11-22 - */ -public class GetterAndSetterDemo { - - @Getter - @Setter - private boolean employed = true; - - @Setter(AccessLevel.PROTECTED) - private String name; - -} diff --git a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/NonNullDemo.java b/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/NonNullDemo.java deleted file mode 100644 index 638eae9b..00000000 --- a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/NonNullDemo.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -import lombok.Getter; -import lombok.NonNull; -import lombok.Setter; - -import java.util.List; - -/** - * @NonNull 示例 - * - * @author Zhang Peng - * @see @NonNull - * @since 2019-11-22 - */ -public class NonNullDemo { - - @Getter - @Setter - @NonNull - private List members; - -} diff --git a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/Person.java b/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/Person.java deleted file mode 100644 index f6a28465..00000000 --- a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/Person.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -/** - * @Data@ToString@EqualsAndHashCode 示例 - * - * @author Zhang Peng - * @see @Data - * 、@ToString@EqualsAndHashCode - * @since 2019-11-22 - */ -@Data -@ToString(exclude = "age") -@EqualsAndHashCode(exclude = { "age", "sex" }) -public class Person { - - private String name; - - private Integer age; - - private String sex; - -} diff --git a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/ToStringDemo.java b/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/ToStringDemo.java deleted file mode 100644 index ea896d9a..00000000 --- a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/ToStringDemo.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -import lombok.ToString; - -/** - * @author Zhang Peng - * @since 2019-11-22 - */ -@ToString(callSuper = true, exclude = "someExcludedField") -public class ToStringDemo { - - private boolean someBoolean = true; - - private String someStringField; - - private float someExcludedField; - - public ToStringDemo(boolean someBoolean, String someStringField, float someExcludedField) { - this.someBoolean = someBoolean; - this.someStringField = someStringField; - this.someExcludedField = someExcludedField; - } - -} diff --git a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/package-info.java b/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/package-info.java deleted file mode 100644 index 5bb08c07..00000000 --- a/codes/javalib/javalib-bean/src/main/java/io/github/dunwu/javalib/lombok/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * 本 package 下所有代码均为 Lombok 示例 - * - * @author Zhang Peng - * @see Reducing Boilerplate Code with Project Lombok - * @since 2019-11-22 - */ -package io.github.dunwu.javalib.lombok; diff --git a/codes/javalib/javalib-bean/src/test/java/io/github/dunwu/javalib/lombok/LombokTest.java b/codes/javalib/javalib-bean/src/test/java/io/github/dunwu/javalib/lombok/LombokTest.java deleted file mode 100644 index 1adbe085..00000000 --- a/codes/javalib/javalib-bean/src/test/java/io/github/dunwu/javalib/lombok/LombokTest.java +++ /dev/null @@ -1,116 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -import lombok.Cleanup; -import org.junit.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Lombok 单元测试 - * - * @author Zhang Peng - * @see Reducing Boilerplate Code with Project Lombok - */ -public class LombokTest { - - @Test - public void testGetterAndSetterDemo() { - GetterAndSetterDemo demo = new GetterAndSetterDemo(); - demo.setEmployed(true); - demo.setName("xxx"); - assertThat(demo.isEmployed()).isTrue(); - } - - @Test - public void testToStringDemo() { - ToStringDemo demo = new ToStringDemo(true, "abc", 0.5f); - System.out.println(demo.toString()); - assertThat(demo.toString()).contains("someBoolean=true, someStringField=abc"); - - Person person = new Person(); - person.setName("张三"); - person.setAge(20); - person.setSex("男"); - System.out.println(person.toString()); - assertThat(person.toString()).isEqualTo("Person(name=张三, sex=男)"); - } - - @Test - public void testEqualsAndHashCodeDemo() { - EqualsAndHashCodeDemo demo1 = - new EqualsAndHashCodeDemo("name1", EqualsAndHashCodeDemo.Gender.Female, "ssn", "xxx", "xxx", "xxx", "xxx"); - EqualsAndHashCodeDemo demo2 = - new EqualsAndHashCodeDemo("name1", EqualsAndHashCodeDemo.Gender.Female, "ssn", "ooo", "ooo", "ooo", "ooo"); - assertThat(demo1.equals(demo2)).isTrue(); - - Person person = new Person(); - person.setName("张三"); - person.setAge(20); - person.setSex("男"); - - Person person2 = new Person(); - person2.setName("张三"); - person2.setAge(18); - person2.setSex("男"); - - Person person3 = new Person(); - person3.setName("李四"); - person3.setAge(20); - person3.setSex("男"); - - assertThat(person.equals(person2)).isTrue(); - assertThat(person.equals(person3)).isFalse(); - } - - @Test - public void testDataDemo() { - Person huangshiren = new Person(); - huangshiren.setName("黄世仁"); - huangshiren.setAge(30); - huangshiren.setSex("男"); - Person yangbailao = new Person(); - yangbailao.setName("杨白劳"); - yangbailao.setAge(50); - yangbailao.setSex("男"); - Person xiaobaicai = new Person(); - xiaobaicai.setName("小白菜"); - xiaobaicai.setAge(20); - xiaobaicai.setSex("女"); - - List personList = new ArrayList<>(); - personList.add(yangbailao); - personList.add(xiaobaicai); - - DataDemo demo = DataDemo.of(huangshiren); - demo.setName("黑心农产品公司"); - demo.setEmployees(personList); - assertThat(demo.getName()).isEqualTo("黑心农产品公司"); - assertThat(demo.getFounder()).isEqualTo(huangshiren); - - System.out.println("公司名:" + demo.getName()); - System.out.println("创始人:" + demo.getFounder()); - System.out.println("员工信息"); - assertThat(demo.getEmployees()).contains(yangbailao, xiaobaicai); - demo.getEmployees().forEach(person -> { - System.out.println(person.toString()); - }); - } - - @Test - public void testCleanUp() { - try { - @Cleanup - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - baos.write(new byte[] { 'Y', 'e', 's' }); - System.out.println(baos.toString()); - } catch (IOException e) { - e.printStackTrace(); - } - } - -} diff --git a/codes/javalib/javalib-cli/pom.xml b/codes/javalib/javalib-cli/pom.xml deleted file mode 100644 index 63f491db..00000000 --- a/codes/javalib/javalib-cli/pom.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-cli - 1.0.0 - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - 5.4.0 - - - - - org.apache.commons - commons-lang3 - - - commons-cli - commons-cli - 1.4 - - - com.github.oshi - oshi-core - 4.1.0 - - - net.java.dev.jna - jna - - - net.java.dev.jna - jna-platform - - - - - net.java.dev.jna - jna - ${jna.version} - - - net.java.dev.jna - jna-platform - ${jna.version} - - - net.java.dev.jna - jna - - - - - junit - junit - test - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/AnsiSystem.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/AnsiSystem.java deleted file mode 100644 index 3dd7030e..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/AnsiSystem.java +++ /dev/null @@ -1,244 +0,0 @@ -package io.github.dunwu.javalib; - -import io.github.dunwu.javalib.constant.AnsiBgColor; -import io.github.dunwu.javalib.constant.AnsiColor; -import io.github.dunwu.javalib.constant.AnsiSgr; -import io.github.dunwu.javalib.constant.Color; -import org.apache.commons.lang3.StringUtils; - -/** - * 以 Ansi 方式在控制台输出(输出彩色字体、粗体、斜体、下划线等) - * - * @author Zhang Peng - * @see ANSI escape code - * @since 2019/10/30 - */ -public class AnsiSystem { - - public static final AnsiSystem RED = new AnsiSystem("\033[;31m"); - - public static final AnsiSystem GREEN = new AnsiSystem("\033[;32m"); - - public static final AnsiSystem YELLOW = new AnsiSystem("\033[;33m"); - - public static final AnsiSystem BLUE = new AnsiSystem("\033[;34m"); - - public static final AnsiSystem MAGENTA = new AnsiSystem("\033[;35m"); - - public static final AnsiSystem CYAN = new AnsiSystem("\033[;36m"); - - public static final AnsiSystem WHITE = new AnsiSystem("\033[;37m"); - - private static final String ENCODE_JOIN = ";"; - - private static final String ENCODE_START = "\033["; - - private static final String ENCODE_END = "m"; - - private static final String RESET = "\033[0;m"; - - private String code; - - public AnsiSystem(String code) { - this.code = code; - } - - public AnsiSystem(AnsiConfig config) { - this.code = encode(config); - } - - private String encode(AnsiConfig config) { - StringBuilder sb = new StringBuilder(); - sb.append(ENCODE_START); - if (config.isBold()) { - sb.append(ENCODE_JOIN).append(AnsiSgr.BOLD.getCode()); - } - if (config.isItalic()) { - sb.append(ENCODE_JOIN).append(AnsiSgr.ITALIC.getCode()); - } - if (config.isUnderline()) { - sb.append(ENCODE_JOIN).append(AnsiSgr.UNDERLINE.getCode()); - } - if (config.isSlowBlink()) { - sb.append(ENCODE_JOIN).append(AnsiSgr.SLOW_BLINK.getCode()); - } else { - if (config.isRapidBlink()) { - sb.append(ENCODE_JOIN).append(AnsiSgr.RAPID_BLINK.getCode()); - } - } - if (config.isReverseVideo()) { - sb.append(ENCODE_JOIN).append(AnsiSgr.REVERSE_VIDEO.getCode()); - } - if (config.isCanceal()) { - sb.append(ENCODE_JOIN).append(AnsiSgr.CONCEAL.getCode()); - } - if (config.getColor() != null) { - AnsiColor color = AnsiColor.valueOf(config.getColor().name()); - if (StringUtils.isNotBlank(color.getCode())) { - sb.append(ENCODE_JOIN).append(color.getCode()); - } - } - if (config.getBgColor() != null) { - AnsiBgColor color = AnsiBgColor.valueOf(config.getBgColor().name()); - if (StringUtils.isNotBlank(color.getCode())) { - sb.append(ENCODE_JOIN).append(color.getCode()); - } - } - sb.append(ENCODE_END); - return sb.toString(); - } - - public void print(String message) { - System.out.print(code + message + RESET); - } - - public void println(String message) { - System.out.println(code + message + RESET); - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - /** - * Ansi 配置 - */ - public static class AnsiConfig { - - private boolean bold; - - private boolean italic; - - private boolean underline; - - private boolean slowBlink; - - private boolean rapidBlink; - - private boolean reverseVideo; - - private boolean canceal; - - private Color color; - - private Color bgColor; - - public AnsiConfig() { - this.bold = false; - this.italic = false; - this.underline = false; - this.slowBlink = false; - this.rapidBlink = false; - this.reverseVideo = false; - this.canceal = false; - this.color = Color.DEFAULT; - this.bgColor = Color.DEFAULT; - } - - public AnsiConfig(boolean bold, boolean italic, boolean underline, boolean slowBlink, boolean rapidBlink, - boolean reverseVideo, boolean canceal, Color color, Color bgColor) { - this.bold = bold; - this.italic = italic; - this.underline = underline; - this.slowBlink = slowBlink; - this.rapidBlink = rapidBlink; - this.reverseVideo = reverseVideo; - this.canceal = canceal; - this.color = color; - this.bgColor = bgColor; - } - - @Override - public String toString() { - return "AnsiParam{" + - "bold=" + bold + - ", italic=" + italic + - ", underline=" + underline + - ", slowBlink=" + slowBlink + - ", rapidBlink=" + rapidBlink + - ", reverseVideo=" + reverseVideo + - ", canceal=" + canceal + - ", color=" + color + - ", bgColor=" + bgColor + - '}'; - } - - public boolean isBold() { - return bold; - } - - public void setBold(boolean bold) { - this.bold = bold; - } - - public boolean isItalic() { - return italic; - } - - public void setItalic(boolean italic) { - this.italic = italic; - } - - public boolean isUnderline() { - return underline; - } - - public void setUnderline(boolean underline) { - this.underline = underline; - } - - public boolean isSlowBlink() { - return slowBlink; - } - - public void setSlowBlink(boolean slowBlink) { - this.slowBlink = slowBlink; - } - - public boolean isRapidBlink() { - return rapidBlink; - } - - public void setRapidBlink(boolean rapidBlink) { - this.rapidBlink = rapidBlink; - } - - public boolean isReverseVideo() { - return reverseVideo; - } - - public void setReverseVideo(boolean reverseVideo) { - this.reverseVideo = reverseVideo; - } - - public boolean isCanceal() { - return canceal; - } - - public void setCanceal(boolean canceal) { - this.canceal = canceal; - } - - public Color getColor() { - return color; - } - - public void setColor(Color color) { - this.color = color; - } - - public Color getBgColor() { - return bgColor; - } - - public void setBgColor(Color bgColor) { - this.bgColor = bgColor; - } - - } - -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliDemo.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliDemo.java deleted file mode 100644 index 7477b9eb..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliDemo.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.github.dunwu.javalib; - -import org.apache.commons.cli.ParseException; - -import java.util.Date; -import java.util.Properties; -import java.util.Scanner; - -/** - * @author Zhang Peng - * @since 2019/10/29 - */ -public class CliDemo { - - public static void main(String[] args) throws ParseException { - - while (true) { - Scanner scanner = new Scanner(System.in); - String param = ""; - if (scanner.hasNext()) { - param = scanner.next(); - } - - switch (param) { - case "date": - AnsiSystem.BLUE.println("date = " + new Date()); - break; - case "area": - AnsiSystem.BLUE.println("area = " + "China"); - break; - case "system": - Properties props = System.getProperties(); - System.out.println("Java的运行环境版本:" + props.getProperty("java.version")); - System.out.println("默认的临时文件路径:" + props.getProperty("java.io.tmpdir")); - System.out.println("操作系统的名称:" + props.getProperty("os.name")); - System.out.println("操作系统的构架:" + props.getProperty("os.arch")); - System.out.println("操作系统的版本:" + props.getProperty("os.version")); - System.out.println("用户的账户名称:" + props.getProperty("user.name")); - System.out.println("用户的主目录:" + props.getProperty("user.home")); - System.out.println("用户的当前工作目录:" + props.getProperty("user.dir")); - System.out.println("操作系统:" + props.getProperty("sun.desktop")); - System.out.println("CPU个数:" + Runtime.getRuntime().availableProcessors()); - System.out.println("虚拟机内存总量:" + Runtime.getRuntime().totalMemory()); - System.out.println("虚拟机空闲内存量:" + Runtime.getRuntime().freeMemory()); - System.out.println("虚拟机使用最大内存量:" + Runtime.getRuntime().maxMemory()); - break; - case "exit": - return; - default: - System.err.println("invalid param"); - break; - } - } - } - -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliUtil.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliUtil.java deleted file mode 100644 index 1b04607f..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/CliUtil.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.dunwu.javalib; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; - -public class CliUtil { - - public static void prepare(String[] args) throws Exception { - // commons-cli命令行参数,需要带参数值 - Options options = new Options(); - // sql文件路径 - options.addOption("sql", true, "sql config"); - // 任务名称 - options.addOption("name", true, "job name"); - - // 解析命令行参数 - CommandLineParser parser = new DefaultParser(); - CommandLine cl = parser.parse(options, args); - String sql = cl.getOptionValue("sql"); - String name = cl.getOptionValue("name"); - - System.out.println("sql : " + sql); - System.out.println("name : " + name); - } - -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/SystemInfoUtil.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/SystemInfoUtil.java deleted file mode 100644 index cac4c90a..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/SystemInfoUtil.java +++ /dev/null @@ -1,265 +0,0 @@ -package io.github.dunwu.javalib; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import oshi.SystemInfo; -import oshi.hardware.*; -import oshi.software.os.*; -import oshi.util.FormatUtil; -import oshi.util.Util; - -import java.util.Arrays; -import java.util.List; - -/** - * @author Zhang Peng - * @since 2019/10/30 - */ -public class SystemInfoUtil { - - private static Logger logger = LoggerFactory.getLogger(SystemInfoUtil.class); - - public static void main(String[] args) { - - logger.info("Initializing System..."); - SystemInfo systemInfo = new SystemInfo(); - HardwareAbstractionLayer hal = systemInfo.getHardware(); - logger.info("Checking computer system..."); - printComputerSystem(hal.getComputerSystem()); - logger.info("Checking Processor..."); - printProcessor(hal.getProcessor()); - logger.info("Checking Memory..."); - printMemory(hal.getMemory()); - logger.info("Checking CPU..."); - printCpu(hal.getProcessor()); - logger.info("Checking Sensors..."); - printSensors(hal.getSensors()); - logger.info("Checking Power sources..."); - printPowerSources(hal.getPowerSources()); - logger.info("Checking Disks..."); - printDisks(hal.getDiskStores()); - logger.info("Checking Network interfaces..."); - printNetworkInterfaces(hal.getNetworkIFs()); - // hardware: displays - logger.info("Checking Displays..."); - printDisplays(hal.getDisplays()); - // hardware: USB devices - logger.info("Checking USB Devices..."); - printUsbDevices(hal.getUsbDevices(true)); - OperatingSystem os = systemInfo.getOperatingSystem(); - System.out.println(os); - logger.info("Checking Processes..."); - printProcesses(os, hal.getMemory()); - logger.info("Checking File System..."); - printFileSystem(os.getFileSystem()); - logger.info("Checking Network parameterss..."); - printNetworkParameters(os.getNetworkParams()); - } - - public static void printComputerSystem(final ComputerSystem computerSystem) { - System.out.println("manufacturer: " + computerSystem.getManufacturer()); - System.out.println("model: " + computerSystem.getModel()); - System.out.println("serialnumber: " + computerSystem.getSerialNumber()); - final Firmware firmware = computerSystem.getFirmware(); - System.out.println("firmware:"); - System.out.println(" manufacturer: " + firmware.getManufacturer()); - System.out.println(" name: " + firmware.getName()); - System.out.println(" description: " + firmware.getDescription()); - System.out.println(" version: " + firmware.getVersion()); - System.out.println(" release date: " + (firmware.getReleaseDate() == null ? "unknown" - : firmware.getReleaseDate() == null ? "unknown" : firmware.getReleaseDate())); - final Baseboard baseboard = computerSystem.getBaseboard(); - System.out.println("baseboard:"); - System.out.println(" manufacturer: " + baseboard.getManufacturer()); - System.out.println(" model: " + baseboard.getModel()); - System.out.println(" version: " + baseboard.getVersion()); - System.out.println(" serialnumber: " + baseboard.getSerialNumber()); - } - - public static void printProcessor(CentralProcessor processor) { - System.out.println(processor); - System.out.println(" " + processor.getPhysicalProcessorCount() + " physical CPU(s)"); - System.out.println(" " + processor.getLogicalProcessorCount() + " logical CPU(s)"); - System.out.println("Identifier: " + processor.getIdentifier()); - System.out.println("ProcessorID: " + processor.getProcessorID()); - } - - public static void printMemory(GlobalMemory memory) { - System.out.println("以使用内存: " + FormatUtil.formatBytes(memory.getAvailable()) + "总共内存" - + FormatUtil.formatBytes(memory.getTotal())); - } - - public static void printCpu(CentralProcessor processor) { - long[] prevTicks = processor.getSystemCpuLoadTicks(); - System.out.println("CPU, IOWait, and IRQ ticks @ 0 sec:" + Arrays.toString(prevTicks)); - // Wait a second... - Util.sleep(1000); - long[] ticks = processor.getSystemCpuLoadTicks(); - System.out.println("CPU, IOWait, and IRQ ticks @ 1 sec:" + Arrays.toString(ticks)); - long user = - ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; - long nice = - ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; - long sys = - ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; - long idle = - ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; - long iowait = - ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; - long irq = - ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; - long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; - long steal = - ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; - long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal; - System.out.format( - "User: %.1f%% Nice: %.1f%% System: %.1f%% Idle: %.1f%% IOwait: %.1f%% IRQ: %.1f%% SoftIRQ: %.1f%% Steal: %.1f%%%n", - 100d * user / totalCpu, 100d * nice / totalCpu, 100d * sys / totalCpu, 100d * idle / totalCpu, - 100d * iowait / totalCpu, 100d * irq / totalCpu, 100d * softirq / totalCpu, 100d * steal / totalCpu); - // System.out.format("CPU load: %.1f%% (counting ticks)%n", processor.getSystemCpuLoadTicks() * 100); - // System.out.format("CPU load: %.1f%% (OS MXBean)%n", processor.getProcessorCpuLoadBetweenTicks() * 100); - double[] loadAverage = processor.getSystemLoadAverage(3); - System.out.println("CPU load averages:" + (loadAverage[0] < 0 ? " N/A" : String.format(" %.2f", loadAverage[0])) - + (loadAverage[1] < 0 ? " N/A" : String.format(" %.2f", loadAverage[1])) - + (loadAverage[2] < 0 ? " N/A" : String.format(" %.2f", loadAverage[2]))); - // per core CPU - StringBuilder procCpu = new StringBuilder("CPU load per processor:"); - double[] load = processor.getProcessorCpuLoadBetweenTicks(processor.getProcessorCpuLoadTicks()); - for (double avg : load) { - procCpu.append(String.format(" %.1f%%", avg * 100)); - } - System.out.println(procCpu.toString()); - } - - public static void printSensors(Sensors sensors) { - System.out.println("Sensors:"); - System.out.format(" CPU Temperature: %.1f°C%n", sensors.getCpuTemperature()); - System.out.println(" Fan Speeds: " + Arrays.toString(sensors.getFanSpeeds())); - System.out.format(" CPU Voltage: %.1fV%n", sensors.getCpuVoltage()); - } - - public static void printPowerSources(PowerSource[] powerSources) { - StringBuilder sb = new StringBuilder("Power: "); - if (powerSources.length == 0) { - sb.append("Unknown"); - } else { - double timeRemaining = powerSources[0].getTimeRemaining(); - if (timeRemaining < -1d) { - sb.append("Charging"); - } else if (timeRemaining < 0d) { - sb.append("Calculating time remaining"); - } else { - sb.append(String.format("%d:%02d remaining", (int) (timeRemaining / 3600), - (int) (timeRemaining / 60) % 60)); - } - } - for (PowerSource pSource : powerSources) { - sb.append(String.format("%n %s @ %.1f%%", pSource.getName(), pSource.getRemainingCapacity() * 100d)); - } - System.out.println(sb.toString()); - } - - public static void printDisks(HWDiskStore[] diskStores) { - System.out.println("Disks:"); - for (HWDiskStore disk : diskStores) { - boolean readwrite = disk.getReads() > 0 || disk.getWrites() > 0; - System.out.format(" %s: (model: %s - S/N: %s) size: %s, reads: %s (%s), writes: %s (%s), xfer: %s ms%n", - disk.getName(), disk.getModel(), disk.getSerial(), - disk.getSize() > 0 ? FormatUtil.formatBytesDecimal(disk.getSize()) : "?", - readwrite ? disk.getReads() : "?", readwrite ? FormatUtil.formatBytes(disk.getReadBytes()) : "?", - readwrite ? disk.getWrites() : "?", readwrite ? FormatUtil.formatBytes(disk.getWriteBytes()) : "?", - readwrite ? disk.getTransferTime() : "?"); - HWPartition[] partitions = disk.getPartitions(); - if (partitions == null) { - // TODO Remove when all OS's implemented - continue; - } - for (HWPartition part : partitions) { - System.out.format(" |-- %s: %s (%s) Maj:Min=%d:%d, size: %s%s%n", part.getIdentification(), - part.getName(), part.getType(), part.getMajor(), part.getMinor(), - FormatUtil.formatBytesDecimal(part.getSize()), - part.getMountPoint().isEmpty() ? "" : " @ " + part.getMountPoint()); - } - } - } - - public static void printNetworkInterfaces(NetworkIF[] networkIFs) { - System.out.println("Network interfaces:"); - for (NetworkIF net : networkIFs) { - System.out.format(" Name: %s (%s)%n", net.getName(), net.getDisplayName()); - System.out.format(" MAC Address: %s %n", net.getMacaddr()); - System.out.format(" MTU: %s, Speed: %s %n", net.getMTU(), FormatUtil.formatValue(net.getSpeed(), "bps")); - System.out.format(" IPv4: %s %n", Arrays.toString(net.getIPv4addr())); - System.out.format(" IPv6: %s %n", Arrays.toString(net.getIPv6addr())); - boolean hasData = net.getBytesRecv() > 0 || net.getBytesSent() > 0 || net.getPacketsRecv() > 0 - || net.getPacketsSent() > 0; - System.out.format(" Traffic: received %s/%s%s; transmitted %s/%s%s %n", - hasData ? net.getPacketsRecv() + " packets" : "?", - hasData ? FormatUtil.formatBytes(net.getBytesRecv()) : "?", - hasData ? " (" + net.getInErrors() + " err)" : "", - hasData ? net.getPacketsSent() + " packets" : "?", - hasData ? FormatUtil.formatBytes(net.getBytesSent()) : "?", - hasData ? " (" + net.getOutErrors() + " err)" : ""); - } - } - - public static void printDisplays(Display[] displays) { - System.out.println("Displays:"); - int i = 0; - for (Display display : displays) { - System.out.println(" Display " + i + ":"); - System.out.println(display.toString()); - i++; - } - } - - public static void printUsbDevices(UsbDevice[] usbDevices) { - System.out.println("USB Devices:"); - for (UsbDevice usbDevice : usbDevices) { - System.out.println(usbDevice.toString()); - } - } - - public static void printProcesses(OperatingSystem os, GlobalMemory memory) { - System.out.println("Processes: " + os.getProcessCount() + ", Threads: " + os.getThreadCount()); - // Sort by highest CPU - List procs = Arrays.asList(os.getProcesses(5, OperatingSystem.ProcessSort.CPU)); - System.out.println(" PID %CPU %MEM VSZ RSS Name"); - for (int i = 0; i < procs.size() && i < 5; i++) { - OSProcess p = procs.get(i); - System.out.format(" %5d %5.1f %4.1f %9s %9s %s%n", p.getProcessID(), - 100d * (p.getKernelTime() + p.getUserTime()) / p.getUpTime(), - 100d * p.getResidentSetSize() / memory.getTotal(), FormatUtil.formatBytes(p.getVirtualSize()), - FormatUtil.formatBytes(p.getResidentSetSize()), p.getName()); - } - } - - public static void printFileSystem(FileSystem fileSystem) { - System.out.println("File System:"); - System.out.format(" File Descriptors: %d/%d%n", fileSystem.getOpenFileDescriptors(), - fileSystem.getMaxFileDescriptors()); - OSFileStore[] fsArray = fileSystem.getFileStores(); - for (OSFileStore fs : fsArray) { - long usable = fs.getUsableSpace(); - long total = fs.getTotalSpace(); - System.out.format( - " %s (%s) [%s] %s of %s free (%.1f%%) is %s " - + (fs.getLogicalVolume() != null && fs.getLogicalVolume().length() > 0 ? "[%s]" : "%s") - + " and is mounted at %s%n", - fs.getName(), fs.getDescription().isEmpty() ? "file system" : fs.getDescription(), fs.getType(), - FormatUtil.formatBytes(usable), FormatUtil.formatBytes(fs.getTotalSpace()), 100d * usable / total, - fs.getVolume(), fs.getLogicalVolume(), fs.getMount()); - } - } - - public static void printNetworkParameters(NetworkParams networkParams) { - System.out.println("Network parameters:"); - System.out.format(" Host name: %s%n", networkParams.getHostName()); - System.out.format(" Domain name: %s%n", networkParams.getDomainName()); - System.out.format(" DNS servers: %s%n", Arrays.toString(networkParams.getDnsServers())); - System.out.format(" IPv4 Gateway: %s%n", networkParams.getIpv4DefaultGateway()); - System.out.format(" IPv6 Gateway: %s%n", networkParams.getIpv6DefaultGateway()); - } - -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiBgColor.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiBgColor.java deleted file mode 100644 index b4bc5475..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiBgColor.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.github.dunwu.javalib.constant; - -/** - * ANSI 背景显示颜色枚举 - * - * @author Zhang Peng - * @see ANSI Colors - * @since 2019/10/30 - */ -public enum AnsiBgColor implements AnsiElement { - - DEFAULT(""), - BLACK("40"), - RED("41"), - GREEN("42"), - YELLOW("43"), - BLUE("44"), - MAGENTA("45"), - CYAN("46"), - WHITE("47"), - BRIGHT_BLACK("100"), - BRIGHT_RED("101"), - BRIGHT_GREEN("102"), - BRIGHT_YELLOW("109"), - BRIGHT_BLUE("104"), - BRIGHT_MAGENTA("105"), - BRIGHT_CYAN("106"), - BRIGHT_WHITE("107"); - - private final String code; - - AnsiBgColor(String code) { - this.code = code; - } - - @Override - public String toString() { - return code; - } - - public String getCode() { - return code; - } -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiColor.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiColor.java deleted file mode 100644 index 752bf2e5..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiColor.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.github.dunwu.javalib.constant; - -/** - * ANSI 字体显示颜色枚举 - * - * @author Zhang Peng - * @see ANSI Colors - * @since 2019/10/30 - */ -public enum AnsiColor implements AnsiElement { - - DEFAULT(""), - BLACK("30"), - RED("31"), - GREEN("32"), - YELLOW("33"), - BLUE("34"), - MAGENTA("35"), - CYAN("36"), - WHITE("37"), - BRIGHT_BLACK("90"), - BRIGHT_RED("91"), - BRIGHT_GREEN("92"), - BRIGHT_YELLOW("99"), - BRIGHT_BLUE("94"), - BRIGHT_MAGENTA("95"), - BRIGHT_CYAN("96"), - BRIGHT_WHITE("97"); - - private final String code; - - AnsiColor(String code) { - this.code = code; - } - - @Override - public String toString() { - return code; - } - - public String getCode() { - return code; - } -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiElement.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiElement.java deleted file mode 100644 index 3e807ded..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiElement.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.dunwu.javalib.constant; - -public interface AnsiElement { - - /** - * @return the ANSI escape code - */ - @Override - String toString(); - -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiSgr.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiSgr.java deleted file mode 100644 index 27636a10..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/AnsiSgr.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.dunwu.javalib.constant; - -/** - * SGR (Select Graphic Rendition) 设置显示属性。 - *

    - * 可以按相同的顺序设置多个属性,并用分号隔开。 - *

    - * 每个显示属性一直有效,直到随后发生SGR重置它为止。 - *

    - * 如果未给出代码,则将CSI m视为CSI 0 m(重置/正常)。 - * - * @author Zhang Peng - * @see SGR - * @since 2019/10/30 - */ -public enum AnsiSgr implements AnsiElement { - - NORMAL("0"), - BOLD("1"), - FAINT("2"), - ITALIC("3"), - UNDERLINE("4"), - SLOW_BLINK("5"), - RAPID_BLINK("6"), - REVERSE_VIDEO("7"), - CONCEAL("8"); - - private final String code; - - AnsiSgr(String code) { - this.code = code; - } - - @Override - public String toString() { - return code; - } - - public String getCode() { - return code; - } -} diff --git a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/Color.java b/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/Color.java deleted file mode 100644 index 28c722ef..00000000 --- a/codes/javalib/javalib-cli/src/main/java/io/github/dunwu/javalib/constant/Color.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.github.dunwu.javalib.constant; - -/** - * @author Zhang Peng - * @since 2019/10/30 - */ -public enum Color { - - DEFAULT("默认"), - BLACK("黑色"), - RED("红色"), - GREEN("绿色"), - YELLOW("黄色"), - BLUE("蓝色"), - MAGENTA("紫色"), - CYAN("青色"), - WHITE("白色"), - BRIGHT_BLACK("亮黑色"), - BRIGHT_RED("亮红色"), - BRIGHT_GREEN("亮绿色"), - BRIGHT_YELLOW("亮黄色"), - BRIGHT_BLUE("亮蓝色"), - BRIGHT_MAGENTA("亮紫色"), - BRIGHT_CYAN("亮青色"), - BRIGHT_WHITE("亮白色"); - - private String desc; - - Color(String desc) { - this.desc = desc; - } - - public String getDesc() { - return desc; - } -} diff --git a/codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/CliUtilTests.java b/codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/CliUtilTests.java deleted file mode 100644 index 92181a57..00000000 --- a/codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/CliUtilTests.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.github.dunwu.javalib; - -import org.junit.Test; - -/** - * @author Zhang Peng - * @since 2019/10/29 - */ -public class CliUtilTests { - - @Test - public void prepare() throws Exception { - String[] args = { "-sql", "select * from aa", "-name", "测试" }; - CliUtil.prepare(args); - } - -} diff --git a/codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/SystemInfoTest.java b/codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/SystemInfoTest.java deleted file mode 100644 index c6c28490..00000000 --- a/codes/javalib/javalib-cli/src/test/java/io/github/dunwu/javalib/SystemInfoTest.java +++ /dev/null @@ -1,320 +0,0 @@ -package io.github.dunwu.javalib; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import oshi.PlatformEnum; -import oshi.SystemInfo; -import oshi.hardware.*; -import oshi.hardware.CentralProcessor.TickType; -import oshi.software.os.*; -import oshi.software.os.OperatingSystem.ProcessSort; -import oshi.util.FormatUtil; -import oshi.util.Util; - -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertFalse; - -/** - * A demonstration of access to many of OSHI's capabilities - */ -public class SystemInfoTest { - - private static final Logger logger = LoggerFactory.getLogger(SystemInfoTest.class); - - static List oshi = new ArrayList<>(); - - /** - * Test that this platform is implemented.. - */ - @Test - public void testPlatformEnum() { - assertFalse(PlatformEnum.UNKNOWN.equals(SystemInfo.getCurrentPlatformEnum())); - // Exercise the main method - main(null); - } - - /** - * The main method, demonstrating use of classes. - * - * @param args the arguments (unused) - */ - public static void main(String[] args) { - logger.info("Initializing System..."); - SystemInfo si = new SystemInfo(); - - HardwareAbstractionLayer hal = si.getHardware(); - OperatingSystem os = si.getOperatingSystem(); - - printOperatingSystem(os); - - logger.info("Checking computer system..."); - printComputerSystem(hal.getComputerSystem()); - - logger.info("Checking Processor..."); - printProcessor(hal.getProcessor()); - - logger.info("Checking Memory..."); - printMemory(hal.getMemory()); - - logger.info("Checking CPU..."); - printCpu(hal.getProcessor()); - - logger.info("Checking Processes..."); - printProcesses(os, hal.getMemory()); - - logger.info("Checking Services..."); - printServices(os); - - logger.info("Checking Sensors..."); - printSensors(hal.getSensors()); - - logger.info("Checking Power sources..."); - printPowerSources(hal.getPowerSources()); - - logger.info("Checking Disks..."); - printDisks(hal.getDiskStores()); - - logger.info("Checking File System..."); - printFileSystem(os.getFileSystem()); - - logger.info("Checking Network interfaces..."); - printNetworkInterfaces(hal.getNetworkIFs()); - - logger.info("Checking Network parameters..."); - printNetworkParameters(os.getNetworkParams()); - - // hardware: displays - logger.info("Checking Displays..."); - printDisplays(hal.getDisplays()); - - // hardware: USB devices - logger.info("Checking USB Devices..."); - printUsbDevices(hal.getUsbDevices(true)); - - logger.info("Checking Sound Cards..."); - printSoundCards(hal.getSoundCards()); - - StringBuilder output = new StringBuilder(); - for (int i = 0; i < oshi.size(); i++) { - output.append(oshi.get(i)); - if (oshi.get(i) != null && !oshi.get(i).endsWith("\n")) { - output.append('\n'); - } - } - logger.info("Printing Operating System and Hardware Info:{}{}", '\n', output); - } - - private static void printOperatingSystem(final OperatingSystem os) { - oshi.add(String.valueOf(os)); - oshi.add("Booted: " + Instant.ofEpochSecond(os.getSystemBootTime())); - oshi.add("Uptime: " + FormatUtil.formatElapsedSecs(os.getSystemUptime())); - oshi.add("Running with" + (os.isElevated() ? "" : "out") + " elevated permissions."); - } - - private static void printComputerSystem(final ComputerSystem computerSystem) { - oshi.add("system: " + computerSystem.toString()); - oshi.add(" firmware: " + computerSystem.getFirmware().toString()); - oshi.add(" baseboard: " + computerSystem.getBaseboard().toString()); - } - - private static void printProcessor(CentralProcessor processor) { - oshi.add(processor.toString()); - } - - private static void printMemory(GlobalMemory memory) { - oshi.add("Memory: \n " + memory.toString()); - VirtualMemory vm = memory.getVirtualMemory(); - oshi.add("Swap: \n " + vm.toString()); - PhysicalMemory[] pmArray = memory.getPhysicalMemory(); - if (pmArray.length > 0) { - oshi.add("Physical Memory: "); - for (PhysicalMemory pm : pmArray) { - oshi.add(" " + pm.toString()); - } - } - } - - private static void printCpu(CentralProcessor processor) { - oshi.add("Context Switches/Interrupts: " + processor.getContextSwitches() + " / " + processor.getInterrupts()); - - long[] prevTicks = processor.getSystemCpuLoadTicks(); - long[][] prevProcTicks = processor.getProcessorCpuLoadTicks(); - oshi.add("CPU, IOWait, and IRQ ticks @ 0 sec:" + Arrays.toString(prevTicks)); - // Wait a second... - Util.sleep(1000); - long[] ticks = processor.getSystemCpuLoadTicks(); - oshi.add("CPU, IOWait, and IRQ ticks @ 1 sec:" + Arrays.toString(ticks)); - long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; - long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; - long sys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; - long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; - long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; - long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; - long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; - long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; - long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal; - - oshi.add(String.format( - "User: %.1f%% Nice: %.1f%% System: %.1f%% Idle: %.1f%% IOwait: %.1f%% IRQ: %.1f%% SoftIRQ: %.1f%% Steal: %.1f%%", - 100d * user / totalCpu, 100d * nice / totalCpu, 100d * sys / totalCpu, 100d * idle / totalCpu, - 100d * iowait / totalCpu, 100d * irq / totalCpu, 100d * softirq / totalCpu, 100d * steal / totalCpu)); - oshi.add(String.format("CPU load: %.1f%%", processor.getSystemCpuLoadBetweenTicks(prevTicks) * 100)); - double[] loadAverage = processor.getSystemLoadAverage(3); - oshi.add("CPU load averages:" + (loadAverage[0] < 0 ? " N/A" : String.format(" %.2f", loadAverage[0])) - + (loadAverage[1] < 0 ? " N/A" : String.format(" %.2f", loadAverage[1])) - + (loadAverage[2] < 0 ? " N/A" : String.format(" %.2f", loadAverage[2]))); - // per core CPU - StringBuilder procCpu = new StringBuilder("CPU load per processor:"); - double[] load = processor.getProcessorCpuLoadBetweenTicks(prevProcTicks); - for (double avg : load) { - procCpu.append(String.format(" %.1f%%", avg * 100)); - } - oshi.add(procCpu.toString()); - long freq = processor.getProcessorIdentifier().getVendorFreq(); - if (freq > 0) { - oshi.add("Vendor Frequency: " + FormatUtil.formatHertz(freq)); - } - freq = processor.getMaxFreq(); - if (freq > 0) { - oshi.add("Max Frequency: " + FormatUtil.formatHertz(freq)); - } - long[] freqs = processor.getCurrentFreq(); - if (freqs[0] > 0) { - StringBuilder sb = new StringBuilder("Current Frequencies: "); - for (int i = 0; i < freqs.length; i++) { - if (i > 0) { - sb.append(", "); - } - sb.append(FormatUtil.formatHertz(freqs[i])); - } - oshi.add(sb.toString()); - } - } - - private static void printProcesses(OperatingSystem os, GlobalMemory memory) { - oshi.add("Processes: " + os.getProcessCount() + ", Threads: " + os.getThreadCount()); - // Sort by highest CPU - List procs = Arrays.asList(os.getProcesses(5, ProcessSort.CPU)); - - oshi.add(" PID %CPU %MEM VSZ RSS Name"); - for (int i = 0; i < procs.size() && i < 5; i++) { - OSProcess p = procs.get(i); - oshi.add(String.format(" %5d %5.1f %4.1f %9s %9s %s", p.getProcessID(), - 100d * (p.getKernelTime() + p.getUserTime()) / p.getUpTime(), - 100d * p.getResidentSetSize() / memory.getTotal(), FormatUtil.formatBytes(p.getVirtualSize()), - FormatUtil.formatBytes(p.getResidentSetSize()), p.getName())); - } - } - - private static void printServices(OperatingSystem os) { - oshi.add("Services: "); - oshi.add(" PID State Name"); - // DO 5 each of running and stopped - int i = 0; - for (OSService s : os.getServices()) { - if (s.getState().equals(OSService.State.RUNNING) && i++ < 5) { - oshi.add(String.format(" %5d %7s %s", s.getProcessID(), s.getState(), s.getName())); - } - } - i = 0; - for (OSService s : os.getServices()) { - if (s.getState().equals(OSService.State.STOPPED) && i++ < 5) { - oshi.add(String.format(" %5d %7s %s", s.getProcessID(), s.getState(), s.getName())); - } - } - } - - private static void printSensors(Sensors sensors) { - oshi.add("Sensors: " + sensors.toString()); - } - - private static void printPowerSources(PowerSource[] powerSources) { - StringBuilder sb = new StringBuilder("Power Sources: "); - if (powerSources.length == 0) { - sb.append("Unknown"); - } - for (PowerSource powerSource : powerSources) { - sb.append("\n ").append(powerSource.toString()); - } - oshi.add(sb.toString()); - } - - private static void printDisks(HWDiskStore[] diskStores) { - oshi.add("Disks:"); - for (HWDiskStore disk : diskStores) { - oshi.add(" " + disk.toString()); - - HWPartition[] partitions = disk.getPartitions(); - for (HWPartition part : partitions) { - oshi.add(" |-- " + part.toString()); - } - } - } - - private static void printFileSystem(FileSystem fileSystem) { - oshi.add("File System:"); - - oshi.add(String.format(" File Descriptors: %d/%d", fileSystem.getOpenFileDescriptors(), - fileSystem.getMaxFileDescriptors())); - - OSFileStore[] fsArray = fileSystem.getFileStores(); - for (OSFileStore fs : fsArray) { - long usable = fs.getUsableSpace(); - long total = fs.getTotalSpace(); - oshi.add(String.format( - " %s (%s) [%s] %s of %s free (%.1f%%), %s of %s files free (%.1f%%) is %s " - + (fs.getLogicalVolume() != null && fs.getLogicalVolume().length() > 0 ? "[%s]" : "%s") - + " and is mounted at %s", - fs.getName(), fs.getDescription().isEmpty() ? "file system" : fs.getDescription(), fs.getType(), - FormatUtil.formatBytes(usable), FormatUtil.formatBytes(fs.getTotalSpace()), 100d * usable / total, - FormatUtil.formatValue(fs.getFreeInodes(), ""), FormatUtil.formatValue(fs.getTotalInodes(), ""), - 100d * fs.getFreeInodes() / fs.getTotalInodes(), fs.getVolume(), fs.getLogicalVolume(), - fs.getMount())); - } - } - - private static void printNetworkInterfaces(NetworkIF[] networkIFs) { - StringBuilder sb = new StringBuilder("Network Interfaces:"); - if (networkIFs.length == 0) { - sb.append(" Unknown"); - } - for (NetworkIF net : networkIFs) { - sb.append("\n ").append(net.toString()); - } - oshi.add(sb.toString()); - } - - private static void printNetworkParameters(NetworkParams networkParams) { - oshi.add("Network parameters:\n " + networkParams.toString()); - } - - private static void printDisplays(Display[] displays) { - oshi.add("Displays:"); - int i = 0; - for (Display display : displays) { - oshi.add(" Display " + i + ":"); - oshi.add(String.valueOf(display)); - i++; - } - } - - private static void printUsbDevices(UsbDevice[] usbDevices) { - oshi.add("USB Devices:"); - for (UsbDevice usbDevice : usbDevices) { - oshi.add(String.valueOf(usbDevice)); - } - } - - private static void printSoundCards(SoundCard[] cards) { - oshi.add("Sound Cards:"); - for (SoundCard card : cards) { - oshi.add(" " + String.valueOf(card)); - } - } - -} diff --git a/codes/javalib/javalib-io-binary/pom.xml b/codes/javalib/javalib-io-binary/pom.xml deleted file mode 100644 index 8cbf26e2..00000000 --- a/codes/javalib/javalib-io-binary/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-io-binary - 1.0.0 - - javalib-io-binary - Java binary serialize Lib Examples - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - - - - - - de.ruedigermoeller - fst - 2.56 - - - com.esotericsoftware - kryo - 5.0.0-RC4 - - - - io.github.dunwu - dunwu-common - - - - - junit - junit - test - - - org.assertj - assertj-core - test - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - - - - - src/main/resources - - - - diff --git a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/FstDemo.java b/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/FstDemo.java deleted file mode 100644 index 54b9428e..00000000 --- a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/FstDemo.java +++ /dev/null @@ -1,73 +0,0 @@ -package io.github.dunwu.javalib.io; - -import org.nustaq.serialization.FSTConfiguration; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -/** - * FST 序列化/反序列化示例 - * - * @author Zhang Peng - * @see FST - * @since 2019-11-22 - */ -public class FstDemo { - - private static FSTConfiguration DEFAULT_CONFIG = FSTConfiguration.createDefaultConfiguration(); - - /** - * 将对象序列化为 byte 数组后,再使用 Base64 编码 - * - * @param obj 任意对象 - * @param 对象的类型 - * @return 序列化后的字符串 - */ - public static String writeToString(T obj) { - byte[] bytes = writeToBytes(obj); - return new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); - } - - /** - * 将对象序列化为 byte 数组 - * - * @param obj 任意对象 - * @param 对象的类型 - * @return 序列化后的 byte 数组 - */ - public static byte[] writeToBytes(T obj) { - return DEFAULT_CONFIG.asByteArray(obj); - } - - /** - * 将字符串反序列化为原对象,先使用 Base64 解码 - * - * @param str {@link #writeToString} 方法序列化后的字符串 - * @param clazz 原对象的类型 - * @param 原对象的类型 - * @return 原对象 - */ - public static T readFromString(String str, Class clazz) throws IOException { - byte[] bytes = str.getBytes(StandardCharsets.UTF_8); - return readFromBytes(Base64.getDecoder().decode(bytes), clazz); - } - - /** - * 将 byte 数组反序列化为原对象 - * - * @param bytes {@link #writeToBytes} 方法序列化后的 byte 数组 - * @param clazz 原对象的类型 - * @param 原对象的类型 - * @return 原对象 - */ - public static T readFromBytes(byte[] bytes, Class clazz) throws IOException { - Object obj = DEFAULT_CONFIG.asObject(bytes); - if (clazz.isInstance(obj)) { - return (T) obj; - } else { - throw new IOException("derialize failed"); - } - } - -} diff --git a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/JdkSerializeDemo.java b/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/JdkSerializeDemo.java deleted file mode 100644 index 758b315c..00000000 --- a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/JdkSerializeDemo.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.github.dunwu.javalib.io; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -/** - * JDK 默认序列化、反序列化机制示例 - * - * @author Zhang Peng - * @since 2019-11-22 - */ -public class JdkSerializeDemo { - - /** - * 将对象序列化为 byte 数组后,再使用 Base64 编码 - * - * @param obj 任意对象 - * @param 对象的类型 - * @return 序列化后的字符串 - */ - public static String writeToString(T obj) throws IOException { - byte[] bytes = writeToBytes(obj); - return new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); - } - - /** - * 将对象序列化为 byte 数组 - * - * @param obj 任意对象 - * @param 对象的类型 - * @return 序列化后的 byte 数组 - */ - public static byte[] writeToBytes(T obj) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(obj); - byte[] bytes = baos.toByteArray(); - baos.close(); - oos.close(); - return bytes; - } - - /** - * 将字符串反序列化为原对象,先使用 Base64 解码 - * - * @param str {@link #writeToString} 方法序列化后的字符串 - * @param clazz 原对象的类型 - * @param 原对象的类型 - * @return 原对象 - */ - public static T readFromString(String str, Class clazz) throws IOException, ClassNotFoundException { - byte[] bytes = str.getBytes(StandardCharsets.UTF_8); - return readFromBytes(Base64.getDecoder().decode(bytes), clazz); - } - - /** - * 将 byte 数组反序列化为原对象 - * - * @param bytes {@link #writeToBytes} 方法序列化后的 byte 数组 - * @param clazz 原对象的类型 - * @param 原对象的类型 - * @return 原对象 - */ - public static T readFromBytes(byte[] bytes, Class clazz) throws IOException, ClassNotFoundException { - ByteArrayInputStream bais = new ByteArrayInputStream(bytes); - ObjectInputStream ois = new ObjectInputStream(bais); - Object obj = ois.readObject(); - bais.close(); - ois.close(); - if (clazz.isInstance(obj)) { - return (T) obj; - } else { - throw new IOException("derialize failed"); - } - } - -} diff --git a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/KryoDemo.java b/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/KryoDemo.java deleted file mode 100644 index 624fd48a..00000000 --- a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/KryoDemo.java +++ /dev/null @@ -1,114 +0,0 @@ -package io.github.dunwu.javalib.io; - -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; -import com.esotericsoftware.kryo.util.DefaultInstantiatorStrategy; -import org.objenesis.strategy.StdInstantiatorStrategy; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -/** - * Kyro 序列化/反序列化示例 - * - * @author Zhang Peng - * @author Kryo 应用指南 - * @since 2019-11-26 - */ -public class KryoDemo { - - // 每个线程的 Kryo 实例 - private static final ThreadLocal kryoLocal = ThreadLocal.withInitial(() -> { - Kryo kryo = new Kryo(); - - /** - * 不要轻易改变这里的配置!更改之后,序列化的格式就会发生变化, - * 上线的同时就必须清除 Redis 里的所有缓存, - * 否则那些缓存再回来反序列化的时候,就会报错 - */ - //支持对象循环引用(否则会栈溢出) - kryo.setReferences(true); //默认值就是 true,添加此行的目的是为了提醒维护者,不要改变这个配置 - - //不强制要求注册类(注册行为无法保证多个 JVM 内同一个类的注册编号相同;而且业务系统中大量的 Class 也难以一一注册) - kryo.setRegistrationRequired(false); //默认值就是 false,添加此行的目的是为了提醒维护者,不要改变这个配置 - - //Fix the NPE bug when deserializing Collections. - ((DefaultInstantiatorStrategy) kryo.getInstantiatorStrategy()) - .setFallbackInstantiatorStrategy(new StdInstantiatorStrategy()); - - return kryo; - }); - - /** - * 将对象序列化为 byte 数组后,再使用 Base64 编码 - * - * @param obj 任意对象 - * @param 对象的类型 - * @return 序列化后的字符串 - */ - public static String writeToString(T obj) { - byte[] bytes = writeToBytes(obj); - return new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8); - } - - /** - * 将对象序列化为 byte 数组 - * - * @param obj 任意对象 - * @param 对象的类型 - * @return 序列化后的 byte 数组 - */ - public static byte[] writeToBytes(T obj) { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - Output output = new Output(byteArrayOutputStream); - - Kryo kryo = getInstance(); - kryo.writeObject(output, obj); - output.flush(); - - return byteArrayOutputStream.toByteArray(); - } - - /** - * 获得当前线程的 Kryo 实例 - * - * @return 当前线程的 Kryo 实例 - */ - public static Kryo getInstance() { - return kryoLocal.get(); - } - - /** - * 将字符串反序列化为原对象,先使用 Base64 解码 - * - * @param str {@link #writeToString} 方法序列化后的字符串 - * @param clazz 原对象的类型 - * @param 原对象的类型 - * @return 原对象 - */ - public static T readFromString(String str, Class clazz) { - byte[] bytes = str.getBytes(StandardCharsets.UTF_8); - return readFromBytes(Base64.getDecoder().decode(bytes), clazz); - } - - /** - * 将 byte 数组反序列化为原对象 - * - * @param bytes {@link #writeToBytes} 方法序列化后的 byte 数组 - * @param clazz 原对象的类型 - * @param 原对象的类型 - * @return 原对象 - */ - @SuppressWarnings("unchecked") - public static T readFromBytes(byte[] bytes, Class clazz) { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); - Input input = new Input(byteArrayInputStream); - - Kryo kryo = getInstance(); - return (T) kryo.readObject(input, clazz); - } - -} diff --git a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/BeanUtils.java b/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/BeanUtils.java deleted file mode 100644 index f9c5ab76..00000000 --- a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/BeanUtils.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.dunwu.javalib.io.bean; - -import io.github.dunwu.util.time.DateExtUtils; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.*; - -/** - * @author Zhang Peng - * @since 2019-11-22 - */ -public class BeanUtils { - - public static TestBean initJdk8Bean() { - String[] strArray = { "a", "b", "c" }; - Integer[] intArray = { 1, 2, 3, 4, 5 }; - List intList = new ArrayList<>(Arrays.asList(intArray)); - Map map = new HashMap<>(); - map.put("name", "jack"); - map.put("age", 18); - map.put("length", 175.3f); - TestBean bean = new TestBean(); - LocalDateTime localDateTime = LocalDateTime.of(2000, 1, 1, 12, 0, 0); - Date date = DateExtUtils.localDateTime2Date(localDateTime); - LocalDate localDate = LocalDate.of(1949, 10, 1); - bean.setI1(10).setI2(1024).setF1(0.5f).setD1(100.0) - .setDate1(date).setDate2(localDateTime).setDate3(localDate) - .setColor(TestBean.Color.BLUE).setStrArray(strArray).setIntList(intList).setMap(map); - return bean; - } - -} diff --git a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/TestBean.java b/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/TestBean.java deleted file mode 100644 index 539e3ebd..00000000 --- a/codes/javalib/javalib-io-binary/src/main/java/io/github/dunwu/javalib/io/bean/TestBean.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.github.dunwu.javalib.io.bean; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 定义一个满足大多数情况的 Bean 结构(含 JDK8 数据类型),使得各种 Json 库测试性能时能相对公平 - * - * @author Zhang Peng - * @since 2019-11-22 - */ -@Data -@ToString -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -public class TestBean implements Serializable { - - private static final long serialVersionUID = -6473181683996762084L; - - private int i1; - - private Integer i2; - - private float f1; - - private Double d1; - - private Date date1; - - private LocalDateTime date2; - - private LocalDate date3; - - private Color color; - - private String[] strArray; - - private List intList; - - private Map map; - - public enum Color { - RED, - YELLOW, - BLUE - } - -} diff --git a/codes/javalib/javalib-io-binary/src/test/java/io/github/dunwu/javalib/io/SerializePerformanceTest.java b/codes/javalib/javalib-io-binary/src/test/java/io/github/dunwu/javalib/io/SerializePerformanceTest.java deleted file mode 100644 index ac50556f..00000000 --- a/codes/javalib/javalib-io-binary/src/test/java/io/github/dunwu/javalib/io/SerializePerformanceTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.github.dunwu.javalib.io; - -import io.github.dunwu.javalib.io.bean.BeanUtils; -import io.github.dunwu.javalib.io.bean.TestBean; -import org.junit.Test; - -import java.io.IOException; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * 序列化、反序列化性能测试 - * - * @author Zhang Peng - * @since 2019-11-22 - */ -public class SerializePerformanceTest { - - private static final int BATCH_SIZE = 100000; - - @Test - public void testJdkSerialize() throws IOException, ClassNotFoundException { - long begin = System.currentTimeMillis(); - for (int i = 0; i < BATCH_SIZE; i++) { - TestBean oldBean = BeanUtils.initJdk8Bean(); - byte[] bytes = JdkSerializeDemo.writeToBytes(oldBean); - assertThat(bytes).isNotEmpty(); - TestBean newBean = JdkSerializeDemo.readFromBytes(bytes, TestBean.class); - assertThat(newBean).isNotNull(); - } - long end = System.currentTimeMillis(); - System.out.printf("JDK 默认序列化/反序列化耗时:%s", (end - begin)); - } - - @Test - public void testFst() throws IOException { - long begin = System.currentTimeMillis(); - for (int i = 0; i < BATCH_SIZE; i++) { - TestBean oldBean = BeanUtils.initJdk8Bean(); - byte[] bytes = FstDemo.writeToBytes(oldBean); - assertThat(bytes).isNotEmpty(); - TestBean newBean = FstDemo.readFromBytes(bytes, TestBean.class); - assertThat(newBean).isNotNull(); - } - long end = System.currentTimeMillis(); - System.out.printf("FST 序列化/反序列化耗时:%s", (end - begin)); - } - - @Test - public void testKryo() throws IOException { - long begin = System.currentTimeMillis(); - for (int i = 0; i < BATCH_SIZE; i++) { - TestBean oldBean = BeanUtils.initJdk8Bean(); - byte[] bytes = KryoDemo.writeToBytes(oldBean); - assertThat(bytes).isNotEmpty(); - TestBean newBean = KryoDemo.readFromBytes(bytes, TestBean.class); - assertThat(newBean).isNotNull(); - } - long end = System.currentTimeMillis(); - System.out.printf("Kryo 序列化/反序列化耗时:%s", (end - begin)); - } - -} diff --git a/codes/javalib/javalib-io-json/pom.xml b/codes/javalib/javalib-io-json/pom.xml deleted file mode 100644 index a9710004..00000000 --- a/codes/javalib/javalib-io-json/pom.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-io-json - 1.0.0 - - javalib-io-json - Java Json Lib Examples - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - - - - - - de.ruedigermoeller - fst - 2.56 - - - - com.alibaba - fastjson - - - com.fasterxml.jackson.core - jackson-databind - - - com.google.code.gson - gson - 2.8.6 - - - - org.projectlombok - lombok - - - io.github.dunwu - dunwu-common - - - - - junit - junit - test - - - org.assertj - assertj-core - test - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - - - - - src/main/resources - - - - diff --git a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/Group.java b/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/Group.java deleted file mode 100644 index 5ccb4bd9..00000000 --- a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/Group.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.dunwu.javalib.json.bean; - -import java.util.ArrayList; -import java.util.List; - -public class Group { - - private Long id; - - private String name; - - private List users = new ArrayList(); - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getUsers() { - return users; - } - - public void setUsers(List users) { - this.users = users; - } - - public void addUser(User user) { - users.add(user); - } - -} diff --git a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/User.java b/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/User.java deleted file mode 100644 index d52c02d4..00000000 --- a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/bean/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.dunwu.javalib.json.bean; - -public class User { - - private Long id; - - private String name; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/FastjsonFeildBean.java b/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/FastjsonFeildBean.java deleted file mode 100644 index abae3fd9..00000000 --- a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/FastjsonFeildBean.java +++ /dev/null @@ -1,140 +0,0 @@ -package io.github.dunwu.javalib.json.fastjson; - -import com.alibaba.fastjson.annotation.JSONField; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; -import java.util.Objects; - -/** - * @JSONField 的使用 - *

    - * @JSONField 可以配置在 getter/setter 方法上 - *

    - * @JSONField 可以配置在字段上,但是要求字段必须是 public - * - * @author Zhang Peng - * @see @JSONField - * @since 2019-03-18 - */ -public class FastjsonFeildBean { - - private int id; - - // 配置date序列化和反序列使用yyyyMMdd日期格式 - @JSONField(format = "yyyyMMdd") - private Date date1; - - // 不序列化 - @JSONField(serialize = false, format = "yyyy-MM-dd hh:mm:ss") - private LocalDate date2; - - // 不反序列化 - @JSONField(deserialize = false, format = "yyyy-MM-dd") - private LocalDateTime date3; - - @JSONField(ordinal = 1) - private Double d1; - - // 按ordinal排序 - @JSONField(ordinal = 2) - private float f1; - - public FastjsonFeildBean() { - } - - public FastjsonFeildBean(int id, Date date1, LocalDate date2, LocalDateTime date3, float f1, Double d1) { - this.id = id; - this.date1 = date1; - this.date2 = date2; - this.date3 = date3; - this.f1 = f1; - this.d1 = d1; - } - - @Override - public int hashCode() { - return Objects.hash(id, date1, date2, date3, f1, d1); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof FastjsonFeildBean)) { - return false; - } - FastjsonFeildBean that = (FastjsonFeildBean) o; - return id == that.id && - Float.compare(that.f1, f1) == 0 && - Objects.equals(date1, that.date1) && - Objects.equals(date2, that.date2) && - Objects.equals(date3, that.date3) && - Objects.equals(d1, that.d1); - } - - @Override - public String toString() { - return "FastjsonAnnotationBean{" + - "id=" + id + - ", date1=" + date1 + - ", date2=" + date2 + - ", date3=" + date3 + - ", f1=" + f1 + - ", f2=" + d1 + - '}'; - } - - @JSONField(name = "ID") - public int getId() { - return id; - } - - @JSONField(name = "ID") - public void setId(int id) { - this.id = id; - } - - public Date getDate1() { - return date1; - } - - public void setDate1(Date date1) { - this.date1 = date1; - } - - public LocalDate getDate2() { - return date2; - } - - public void setDate2(LocalDate date2) { - this.date2 = date2; - } - - public LocalDateTime getDate3() { - return date3; - } - - public void setDate3(LocalDateTime date3) { - this.date3 = date3; - } - - public float getF1() { - return f1; - } - - public void setF1(float f1) { - this.f1 = f1; - } - - public Double getD1() { - return d1; - } - - public void setD1(Double d1) { - this.d1 = d1; - } - -} diff --git a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/JacksonAnnotationBean.java b/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/JacksonAnnotationBean.java deleted file mode 100644 index b5b5ee22..00000000 --- a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/fastjson/JacksonAnnotationBean.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.github.dunwu.javalib.json.fastjson; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * @author Zhang Peng - * @since 2019-03-18 - */ -@JsonPropertyOrder(alphabetic = true) -public class JacksonAnnotationBean { - - private String Name; - - private int Age; - - @JsonIgnore - private String Sex; - - public JacksonAnnotationBean() { - } - - public JacksonAnnotationBean(String name, int age, String sex) { - Name = name; - Age = age; - Sex = sex; - } - - @JsonProperty("username") - public String getName() { - return Name; - } - - public void setName(String name) { - Name = name; - } - - public int getAge() { - return Age; - } - - public void setAge(int age) { - Age = age; - } - - public String getSex() { - return Sex; - } - - public void setSex(String sex) { - Sex = sex; - } - -} diff --git a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/GsonAnnotationBean.java b/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/GsonAnnotationBean.java deleted file mode 100644 index 93626b07..00000000 --- a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/GsonAnnotationBean.java +++ /dev/null @@ -1,52 +0,0 @@ -package io.github.dunwu.javalib.json.gson; - -import com.google.gson.annotations.SerializedName; - -import java.util.Objects; - -/** - * @author Zhang Peng - * @since 2019-11-24 - */ -public class GsonAnnotationBean { - - @SerializedName("custom_naming") - private String someField; - - private String someOtherField; - - @Override - public int hashCode() { - return Objects.hash(someField, someOtherField); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof GsonAnnotationBean)) { - return false; - } - GsonAnnotationBean that = (GsonAnnotationBean) o; - return Objects.equals(someField, that.someField) && - Objects.equals(someOtherField, that.someOtherField); - } - - public String getSomeField() { - return someField; - } - - public void setSomeField(String someField) { - this.someField = someField; - } - - public String getSomeOtherField() { - return someOtherField; - } - - public void setSomeOtherField(String someOtherField) { - this.someOtherField = someOtherField; - } - -} diff --git a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/VersionedClass.java b/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/VersionedClass.java deleted file mode 100644 index f435e783..00000000 --- a/codes/javalib/javalib-io-json/src/main/java/io/github/dunwu/javalib/json/gson/VersionedClass.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.github.dunwu.javalib.json.gson; - -import com.google.gson.annotations.Since; - -public class VersionedClass { - - @Since(1.1) - private final String newerField; - - @Since(1.0) - private final String newField; - - private final String field; - - public VersionedClass() { - this.newerField = "newer"; - this.newField = "new"; - this.field = "old"; - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean.java deleted file mode 100644 index 567c0a95..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.github.dunwu.javalib.json; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; -import lombok.experimental.Accessors; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 定义一个满足大多数情况的 Bean 结构(含 JDK8 数据类型),使得各种 Json 库测试性能时能相对公平 - * - * @author Zhang Peng - * @since 2019-11-22 - */ -@Data -@ToString -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -public class TestBean { - - private int i1; - - private Integer i2; - - private float f1; - - private Double d1; - - private Date date1; - - private LocalDateTime date2; - - private LocalDate date3; - - private Color color; - - private String[] strArray; - - private List intList; - - private Map map; - - public static enum Color { - RED, - YELLOW, - BLUE - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean2.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean2.java deleted file mode 100644 index 0c989ed3..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/TestBean2.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.github.dunwu.javalib.json; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; -import lombok.experimental.Accessors; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -/** - * 定义一个满足大多数情况的 Bean 结构(不含 JDK8 数据类型),使得各种 Json 库测试性能时能相对公平 - * - * @author Zhang Peng - * @since 2019-11-22 - */ -@Data -@ToString -@Accessors(chain = true) -@NoArgsConstructor -@AllArgsConstructor -public class TestBean2 { - - private int i1; - - private Integer i2; - - private float f1; - - private Double d1; - - private Date date1; - - private Color color; - - private String[] strArray; - - private List intList; - - private Map map; - - public static enum Color { - RED, - YELLOW, - BLUE - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonCaseTests.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonCaseTests.java deleted file mode 100644 index d1004e12..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonCaseTests.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.github.dunwu.javalib.json.fastjson; - -import com.alibaba.fastjson.JSON; -import io.github.dunwu.javalib.json.bean.Group; -import io.github.dunwu.javalib.json.util.BeanUtils; -import io.github.dunwu.util.time.DateExtUtils; -import org.junit.Test; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Zhang Peng - * @since 2019-11-22 - */ -public class FastjsonCaseTests { - - @Test - public void test() { - Group oldGroup = BeanUtils.initGroupBean(); - String jsonString = JSON.toJSONString(oldGroup); - System.out.println(jsonString); - Group newGroup = JSON.parseObject(jsonString, Group.class); - assertThat(newGroup).isNotNull(); - } - - /** - * 序列化测试 - */ - @Test - public void serialize() { - LocalDate localDate = LocalDate.of(1949, 10, 1); - LocalDateTime localDateTime = LocalDateTime.of(2000, 1, 1, 12, 0, 0); - Date date = DateExtUtils.localDateTime2Date(localDateTime); - FastjsonFeildBean bean = new FastjsonFeildBean(1, date, localDate, localDateTime, 0.5f, 100.0); - String json = JSON.toJSONString(bean); - assertThat(json).isEqualTo( - "{\"ID\":1,\"date1\":\"20000101\",\"date3\":\"2000-01-01\",\"d1\":100.0,\"f1\":0.5}"); - System.out.println("json = [" + json + "]"); - } - - /** - * 反序列化测试 - */ - @Test - public void deserialize() { - final String json = "{\"ID\":1,\"date1\":\"20000101\",\"date3\":\"2000-01-01\",\"d1\":100.0,\"f1\":0.5}"; - FastjsonFeildBean actualBean = JSON.parseObject(json, FastjsonFeildBean.class); - System.out.printf("deserialize result: %s", actualBean.toString()); - assertThat(actualBean).isNotNull(); - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonPerformanceTests.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonPerformanceTests.java deleted file mode 100644 index a696d86a..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonPerformanceTests.java +++ /dev/null @@ -1,50 +0,0 @@ -package io.github.dunwu.javalib.json.fastjson; - -import com.alibaba.fastjson.JSON; -import io.github.dunwu.javalib.json.TestBean2; -import io.github.dunwu.javalib.json.util.BeanUtils; -import org.junit.Test; - -import java.util.concurrent.TimeUnit; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Fastjson 性能测试 - * - * @author Zhang Peng - * @since 2019-03-18 - */ -public class FastjsonPerformanceTests { - - private static final int BATCH_SIZE = 100000; - - /** - * 测试十次,每次序列化、反序列化 100000 条数据,平均耗时约 380 ms - */ - @Test - public void testPerformance() { - long time = 0L; - for (int i = 0; i < 10; i++) { - time += donSerializeAndDeserialize(); - } - System.out.println(String.format("time: %d ms", TimeUnit.NANOSECONDS.toMillis(time / 10))); - } - - /** - * 循环序列化、反序列 {@link #BATCH_SIZE} 条数据,测试性能 - */ - private long donSerializeAndDeserialize() { - TestBean2 bean = BeanUtils.initNotJdk8Bean(); - long begin = System.nanoTime(); - for (int i = 0; i < BATCH_SIZE; i++) { - String json = JSON.toJSONString(bean); - assertThat(json).isNotBlank(); - TestBean2 newBean = JSON.parseObject(json, TestBean2.class); - assertThat(newBean).isNotNull(); - } - long end = System.nanoTime(); - return (end - begin); - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonCaseTests.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonCaseTests.java deleted file mode 100644 index ba016f49..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonCaseTests.java +++ /dev/null @@ -1,80 +0,0 @@ -package io.github.dunwu.javalib.json.gson; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import org.junit.Test; - -import java.lang.reflect.Modifier; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Zhang Peng - * @since 2019-11-24 - */ -public class GsonCaseTests { - - private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); - - private Gson gson2 = new GsonBuilder() - .setVersion(1.0) - .setPrettyPrinting() - .setDateFormat("yyyy-MM-dd HH:mm:ss") - .excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT, Modifier.VOLATILE) - .create(); - - @Test - public void test() { - // Serialization - Gson gson = new Gson(); - gson.toJson(1); // ==> 1 - gson.toJson("abcd"); // ==> "abcd" - gson.toJson(10L); // ==> 10 - int[] values = { 1 }; - gson.toJson(values); // ==> [1] - - // Deserialization - int i1 = gson.fromJson("1", int.class); - Integer i2 = gson.fromJson("1", Integer.class); - Long l1 = gson.fromJson("1", Long.class); - Boolean b1 = gson.fromJson("false", Boolean.class); - String str = gson.fromJson("\"abc\"", String.class); - String[] anotherStr = gson.fromJson("[\"abc\"]", String[].class); - - assertThat(i1).isEqualTo(1); - assertThat(i2).isEqualTo(1); - assertThat(l1).isEqualTo(1L); - assertThat(b1).isFalse(); - assertThat(str).isEqualTo("abc"); - } - - @Test - public void testAnnotation() { - GsonAnnotationBean oldBean = new GsonAnnotationBean(); - oldBean.setSomeField("hello"); - oldBean.setSomeOtherField("world"); - - String expectStr = "{\"custom_naming\":\"hello\",\"someOtherField\":\"world\"}"; - String json = gson.toJson(oldBean); - assertThat(json).isEqualTo(expectStr); - - GsonAnnotationBean newBean = gson.fromJson(expectStr, GsonAnnotationBean.class); - assertThat(newBean).isEqualTo(oldBean); - } - - @Test - public void testVersionedClass() { - VersionedClass versionedObject = new VersionedClass(); - String jsonOutput = gson2.toJson(versionedObject); - System.out.println(jsonOutput); - assertThat(jsonOutput).isEqualTo("{\n" - + " \"newField\": \"new\",\n" - + " \"field\": \"old\"\n" - + "}"); - - jsonOutput = gson.toJson(versionedObject); - System.out.println(jsonOutput); - assertThat(jsonOutput).isEqualTo("{\"newerField\":\"newer\",\"newField\":\"new\",\"field\":\"old\"}"); - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonPerformanceTests.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonPerformanceTests.java deleted file mode 100644 index be79f438..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/gson/GsonPerformanceTests.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.github.dunwu.javalib.json.gson; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import io.github.dunwu.javalib.json.TestBean2; -import io.github.dunwu.javalib.json.util.BeanUtils; -import org.junit.Test; - -import java.util.concurrent.TimeUnit; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Gson 性能测试 - * - * @author Zhang Peng - * @since 2019-11-22 - */ -public class GsonPerformanceTests { - - private static final int BATCH_SIZE = 100000; - - private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); - - /** - * 测试十次,每次序列化、反序列化 100000 条数据,平均耗时约 704 ms - */ - @Test - public void testPerformance() { - long time = 0L; - for (int i = 0; i < 10; i++) { - time += donSerializeAndDeserialize(); - } - System.out.println(String.format("time: %d ms", TimeUnit.NANOSECONDS.toMillis(time / 10))); - } - - /** - * 循环序列化、反序列 {@link #BATCH_SIZE} 条数据,测试性能 - */ - private long donSerializeAndDeserialize() { - TestBean2 bean = BeanUtils.initNotJdk8Bean(); - long begin = System.nanoTime(); - for (int i = 0; i < BATCH_SIZE; i++) { - String json = gson.toJson(bean); - assertThat(json).isNotBlank(); - TestBean2 newBean = gson.fromJson(json, TestBean2.class); - assertThat(newBean).isNotNull(); - } - long end = System.nanoTime(); - return (end - begin); - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonPerformanceTests.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonPerformanceTests.java deleted file mode 100644 index 5e960c89..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonPerformanceTests.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.github.dunwu.javalib.json.jackson; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.github.dunwu.javalib.json.TestBean2; -import io.github.dunwu.javalib.json.util.BeanUtils; -import org.junit.Test; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Jackson 性能测试 - * - * @author Zhang Peng - * @since 2019-03-18 - */ -public class JacksonPerformanceTests { - - private static final int BATCH_SIZE = 100000; - - private final ObjectMapper mapper = new ObjectMapper(); - - /** - * 测试十次,每次序列化、反序列化 100000 条数据,平均耗时约 334 ms - */ - @Test - public void testPerformance() throws IOException { - long time = 0L; - for (int i = 0; i < 10; i++) { - time += donSerializeAndDeserialize(); - } - System.out.println(String.format("time: %d ms", TimeUnit.NANOSECONDS.toMillis(time / 10))); - } - - /** - * 循环序列化、反序列 {@link #BATCH_SIZE} 条数据,测试性能 - */ - private long donSerializeAndDeserialize() throws IOException { - TestBean2 bean = BeanUtils.initNotJdk8Bean(); - long begin = System.nanoTime(); - for (int i = 0; i < BATCH_SIZE; i++) { - String json = mapper.writeValueAsString(bean); - assertThat(json).isNotBlank(); - TestBean2 newBean = mapper.readValue(json, TestBean2.class); - assertThat(newBean).isNotNull(); - } - long end = System.nanoTime(); - return (end - begin); - } - -} diff --git a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/util/BeanUtils.java b/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/util/BeanUtils.java deleted file mode 100644 index 6cf32ad4..00000000 --- a/codes/javalib/javalib-io-json/src/test/java/io/github/dunwu/javalib/json/util/BeanUtils.java +++ /dev/null @@ -1,74 +0,0 @@ -package io.github.dunwu.javalib.json.util; - -import io.github.dunwu.javalib.json.TestBean; -import io.github.dunwu.javalib.json.TestBean2; -import io.github.dunwu.javalib.json.bean.Group; -import io.github.dunwu.javalib.json.bean.User; - -import java.sql.Date; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.*; - -/** - * @author Zhang Peng - * @since 2019-11-22 - */ -public class BeanUtils { - - public static Group initGroupBean() { - Group group = new Group(); - group.setId(0L); - group.setName("admin"); - - User guestUser = new User(); - guestUser.setId(2L); - guestUser.setName("guest"); - - User rootUser = new User(); - rootUser.setId(3L); - rootUser.setName("root"); - - group.addUser(guestUser); - group.addUser(rootUser); - - return group; - } - - public static TestBean initJdk8Bean() { - String[] strArray = { "a", "b", "c" }; - Integer[] intArray = { 1, 2, 3, 4, 5 }; - List intList = new ArrayList<>(); - intList.addAll(Arrays.asList(intArray)); - Map map = new HashMap<>(); - map.put("name", "jack"); - map.put("age", 18); - map.put("length", 175.3f); - TestBean bean = new TestBean(); - Date date = Date.valueOf("2019-11-22"); - LocalDateTime localDateTime = LocalDateTime.of(2000, 1, 1, 12, 0, 0); - LocalDate localDate = LocalDate.of(1949, 10, 1); - bean.setI1(10).setI2(1024).setF1(0.5f).setD1(100.0) - .setDate1(date).setDate2(localDateTime).setDate3(localDate) - .setColor(TestBean.Color.BLUE).setStrArray(strArray).setIntList(intList).setMap(map); - return bean; - } - - public static TestBean2 initNotJdk8Bean() { - String[] strArray = { "a", "b", "c" }; - Integer[] intArray = { 1, 2, 3, 4, 5 }; - List intList = new ArrayList<>(); - intList.addAll(Arrays.asList(intArray)); - Map map = new HashMap<>(); - map.put("name", "jack"); - map.put("age", 18); - map.put("length", 175.3f); - TestBean2 bean = new TestBean2(); - Date date = Date.valueOf("2019-11-22"); - bean.setI1(10).setI2(1024).setF1(0.5f).setD1(100.0) - .setDate1(date) - .setColor(TestBean2.Color.BLUE).setStrArray(strArray).setIntList(intList).setMap(map); - return bean; - } - -} diff --git a/codes/javalib/javalib-io/pom.xml b/codes/javalib/javalib-io/pom.xml deleted file mode 100644 index f7668693..00000000 --- a/codes/javalib/javalib-io/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-io - 1.0.0 - - javalib-io - IO Lib Examples - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - - - - - - de.ruedigermoeller - fst - 2.56 - - - - com.alibaba - fastjson - 1.2.56 - - - com.fasterxml.jackson.core - jackson-databind - 2.9.10.1 - - - - - io.github.dunwu - dunwu-common - 0.4.8 - - - - - junit - junit - 4.12 - test - - - org.assertj - assertj-core - 3.14.0 - test - - - - - - - true - src/main/resources - - - - - diff --git a/codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/FstDemo.java b/codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/FstDemo.java deleted file mode 100644 index 0d0efbf3..00000000 --- a/codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/FstDemo.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.dunwu.javalib.serialize; - -import org.nustaq.serialization.FSTConfiguration; - -import java.io.IOException; - -/** - * @author Zhang Peng - * @since 2019-11-22 - */ -public class FstDemo { - - private static FSTConfiguration DEFAULT_CONFIG = FSTConfiguration.createDefaultConfiguration(); - - public static byte[] serializ(T obj) { - return DEFAULT_CONFIG.asByteArray(obj); - } - - public static T derialize(byte[] bytes, Class clazz) throws IOException { - Object obj = DEFAULT_CONFIG.asObject(bytes); - if (clazz.isInstance(obj)) { - return (T) obj; - } else { - throw new IOException("derialize failed"); - } - } - -} diff --git a/codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/JdkSerializeDemo.java b/codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/JdkSerializeDemo.java deleted file mode 100644 index 89bd8821..00000000 --- a/codes/javalib/javalib-io/src/main/java/io/github/dunwu/javalib/serialize/JdkSerializeDemo.java +++ /dev/null @@ -1,36 +0,0 @@ -package io.github.dunwu.javalib.serialize; - -import java.io.*; - -/** - * JDK 原生序列化、反序列化示例 - * - * @author Zhang Peng - * @since 2019-11-22 - */ -public class JdkSerializeDemo { - - public static byte[] serializ(T obj) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(obj); - byte[] bytes = baos.toByteArray(); - baos.close(); - oos.close(); - return bytes; - } - - public static T derialize(byte[] bytes, Class clazz) throws IOException, ClassNotFoundException { - ByteArrayInputStream bais = new ByteArrayInputStream(bytes); - ObjectInputStream ois = new ObjectInputStream(bais); - Object obj = ois.readObject(); - bais.close(); - ois.close(); - if (clazz.isInstance(obj)) { - return (T) obj; - } else { - throw new IOException("derialize failed"); - } - } - -} diff --git a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/bean/Person.java b/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/bean/Person.java deleted file mode 100644 index 69ee8a28..00000000 --- a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/bean/Person.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.github.dunwu.javalib.bean; - -import java.io.Serializable; - -public class Person implements Serializable { - - private static final long serialVersionUID = -210388541252854256L; - - private String name; - - private int age; - - public Person() { - } - - public Person(String name, int age) { - this.name = name; - this.age = age; - } - - @Override - public String toString() { - return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - -} diff --git a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonAnnotationBean.java b/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonAnnotationBean.java deleted file mode 100644 index ec94ddaa..00000000 --- a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonAnnotationBean.java +++ /dev/null @@ -1,95 +0,0 @@ -package io.github.dunwu.javalib.json.fastjson; - -import com.alibaba.fastjson.annotation.JSONField; - -import java.util.Date; - -/** - * @author Zhang Peng - * @since 2019-03-18 - */ -public class FastjsonAnnotationBean { - - private int id; - - // 配置date序列化和反序列使用yyyyMMdd日期格式 - @JSONField(format = "yyyy-MM-dd") - private Date date1; - - // 不序列化 - @JSONField(serialize = false) - private Date date2; - - // 不反序列化 - @JSONField(deserialize = false) - private Date date3; - - // 按ordinal排序 - @JSONField(ordinal = 2) - private int f1; - - @JSONField(ordinal = 1) - private int f2; - - public FastjsonAnnotationBean() { - } - - public FastjsonAnnotationBean(int id, Date date1, Date date2, Date date3, int f1, int f2) { - this.id = id; - this.date1 = date1; - this.date2 = date2; - this.date3 = date3; - this.f1 = f1; - this.f2 = f2; - } - - @JSONField(name = "ID") - private int getId() { - return id; - } - - private void setId(int id) { - this.id = id; - } - - private Date getDate1() { - return date1; - } - - private void setDate1(Date date1) { - this.date1 = date1; - } - - private Date getDate2() { - return date2; - } - - private void setDate2(Date date2) { - this.date2 = date2; - } - - private Date getDate3() { - return date3; - } - - private void setDate3(Date date3) { - this.date3 = date3; - } - - private int getF1() { - return f1; - } - - private void setF1(int f1) { - this.f1 = f1; - } - - private int getF2() { - return f2; - } - - private void setF2(int f2) { - this.f2 = f2; - } - -} diff --git a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonTests.java b/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonTests.java deleted file mode 100644 index 128b6ad9..00000000 --- a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/fastjson/FastjsonTests.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.github.dunwu.javalib.json.fastjson; - -import com.alibaba.fastjson.JSON; -import io.github.dunwu.javalib.bean.Person; -import org.junit.Assert; -import org.junit.Test; - -import java.util.Date; - -/** - * Fastjson 使用示例 - * - * @author Zhang Peng - * @since 2019-03-18 - */ -public class FastjsonTests { - - /** - * 序列化测试 - */ - @Test - public void serialize() { - Person p = new Person("Tom", 20); - String json = JSON.toJSONString(p); - Assert.assertNotNull(json); - System.out.println("json = [" + json + "]"); - } - - /** - * 反序列化测试 - */ - @Test - public void deserialize() { - final String json = "{\"age\":20,\"name\":\"Tom\"}"; - Person p = JSON.parseObject(json, Person.class); - Assert.assertNotNull(p); - System.out.println("p = [" + p + "]"); - } - - /** - * 序列化测试 - */ - @Test - public void serializeAnnotation() { - FastjsonAnnotationBean bean = new FastjsonAnnotationBean(1, new Date(), new Date(), new Date(), 10, 20); - String json = JSON.toJSONString(bean); - Assert.assertNotNull(json); - System.out.println("json = [" + json + "]"); - } - -} diff --git a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonAnnotationBean.java b/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonAnnotationBean.java deleted file mode 100644 index 91c72899..00000000 --- a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonAnnotationBean.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.github.dunwu.javalib.json.jackson; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -/** - * @author Zhang Peng - * @since 2019-03-18 - */ -@JsonPropertyOrder(alphabetic = true) -public class JacksonAnnotationBean { - - private String Name; - - private int Age; - - @JsonIgnore - private String Sex; - - public JacksonAnnotationBean() { - } - - public JacksonAnnotationBean(String name, int age, String sex) { - Name = name; - Age = age; - Sex = sex; - } - - @JsonProperty("username") - public String getName() { - return Name; - } - - public void setName(String name) { - Name = name; - } - - public int getAge() { - return Age; - } - - public void setAge(int age) { - Age = age; - } - - public String getSex() { - return Sex; - } - - public void setSex(String sex) { - Sex = sex; - } - -} diff --git a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonTests.java b/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonTests.java deleted file mode 100644 index aa75f894..00000000 --- a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/json/jackson/JacksonTests.java +++ /dev/null @@ -1,101 +0,0 @@ -package io.github.dunwu.javalib.json.jackson; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.github.dunwu.javalib.bean.Person; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * Jackson 使用示例 - * - * @author Zhang Peng - * @since 2019-03-18 - */ -public class JacksonTests { - - final ObjectMapper mapper = new ObjectMapper(); - - /** - * 序列化测试 - */ - @Test - public void serialize() { - Person p = new Person("Tom", 20); - String json = null; - try { - json = mapper.writeValueAsString(p); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertNotNull(json); - System.out.println("json = [" + json + "]"); - } - - /** - * 反序列化测试 - */ - @Test - public void deserialize() { - final String json = "{\"age\":20,\"name\":\"Tom\"}"; - Person p = null; - try { - p = mapper.readValue(json, Person.class); - } catch (IOException e) { - e.printStackTrace(); - } - Assert.assertNotNull(p); - System.out.println("p = [" + p + "]"); - } - - /** - * 序列化测试 - */ - @Test - public void serialize2() { - Person p = new Person("Tom", 20); - Person p2 = new Person("Jack", 22); - Person p3 = new Person("Mary", 18); - - List persons = new LinkedList<>(); - persons.add(p); - persons.add(p2); - persons.add(p3); - - Map map = new HashMap<>(); - map.put("persons", persons); - - String json = null; - try { - json = mapper.writeValueAsString(map); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - - Assert.assertNotNull(json); - System.out.println("json = [" + json + "]"); - } - - /** - * 序列化测试 - */ - @Test - public void serialize3() { - JacksonAnnotationBean jacksonAnnotationBean = new JacksonAnnotationBean("jack", 19, "男"); - String json = null; - try { - json = mapper.writeValueAsString(jacksonAnnotationBean); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - Assert.assertNotNull(json); - System.out.println("json = [" + json + "]"); - } - -} diff --git a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/serialize/SerializeTest.java b/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/serialize/SerializeTest.java deleted file mode 100644 index d02e19c5..00000000 --- a/codes/javalib/javalib-io/src/test/java/io/github/dunwu/javalib/serialize/SerializeTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.github.dunwu.javalib.serialize; - -import io.github.dunwu.javalib.bean.Person; -import io.github.dunwu.util.RandomExtUtils; -import org.apache.commons.lang3.RandomUtils; -import org.junit.Test; - -import java.io.IOException; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Zhang Peng - * @since 2019-11-22 - */ -public class SerializeTest { - - public static final int BATCH_SIZE = 100000; - - @Test - public void testJdkSerialize() throws IOException, ClassNotFoundException { - long begin = System.currentTimeMillis(); - for (int i = 0; i < BATCH_SIZE; i++) { - Person oldPerson = new Person(RandomExtUtils.randomChineseName(), RandomUtils.nextInt(0, 100)); - byte[] bytes = JdkSerializeDemo.serializ(oldPerson); - assertThat(bytes).isNotEmpty(); - Person newPerson = JdkSerializeDemo.derialize(bytes, Person.class); - assertThat(newPerson).isNotNull(); - } - long end = System.currentTimeMillis(); - System.out.printf("耗时:%s", (end - begin)); - } - - @Test - public void testFst() throws IOException { - long begin = System.currentTimeMillis(); - for (int i = 0; i < BATCH_SIZE; i++) { - Person oldPerson = new Person(RandomExtUtils.randomChineseName(), RandomUtils.nextInt(0, 100)); - byte[] bytes = FstDemo.serializ(oldPerson); - assertThat(bytes).isNotEmpty(); - Person newPerson = FstDemo.derialize(bytes, Person.class); - assertThat(newPerson).isNotNull(); - } - long end = System.currentTimeMillis(); - System.out.printf("耗时:%s", (end - begin)); - } - -} diff --git a/codes/javalib/javalib-log/javalib-log-log4j/pom.xml b/codes/javalib/javalib-log/javalib-log-log4j/pom.xml deleted file mode 100644 index 7c9b1805..00000000 --- a/codes/javalib/javalib-log/javalib-log-log4j/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-log-log4j - 1.0.0 - log4j2 示例 - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - - - - - - org.slf4j - slf4j-api - - - org.slf4j - slf4j-log4j12 - - - log4j - log4j - 1.2.17 - - - - - junit - junit - test - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - - - - - true - src/main/resources - - - - - diff --git a/codes/javalib/javalib-log/javalib-log-log4j/src/main/java/io/github/dunwu/javalib/log/Log4jDemo.java b/codes/javalib/javalib-log/javalib-log-log4j/src/main/java/io/github/dunwu/javalib/log/Log4jDemo.java deleted file mode 100644 index c9606900..00000000 --- a/codes/javalib/javalib-log/javalib-log-log4j/src/main/java/io/github/dunwu/javalib/log/Log4jDemo.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.dunwu.javalib.log; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * log4j 示例 - * - * @author Zhang Peng - * @see log4j 官网 - * @since 2018/3/29 - */ -public class Log4jDemo { - - private static final Logger logger = LoggerFactory.getLogger(Log4jDemo.class); - - public static void main(String[] args) { - for (int i = 0; i < 10; i++) { - logger.trace("NO.{} 这是一条 {} 日志记录", i, "trace"); - logger.debug("NO.{} 这是一条 {} 日志记录", i, "debug"); - logger.info("NO.{} 这是一条 {} 日志记录", i, "info"); - logger.warn("NO.{} 这是一条 {} 日志记录", i, "warn"); - logger.error("NO.{} 这是一条 {} 日志记录", i, "error"); - } - } - -} diff --git a/codes/javalib/javalib-log/javalib-log-log4j/src/main/resources/log4j.xml b/codes/javalib/javalib-log/javalib-log-log4j/src/main/resources/log4j.xml deleted file mode 100644 index d8e86c72..00000000 --- a/codes/javalib/javalib-log/javalib-log-log4j/src/main/resources/log4j.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/codes/javalib/javalib-log/javalib-log-log4j2/pom.xml b/codes/javalib/javalib-log/javalib-log-log4j2/pom.xml deleted file mode 100644 index 9ab009b4..00000000 --- a/codes/javalib/javalib-log/javalib-log-log4j2/pom.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-log-log4j2 - 1.0.0 - log4j2 示例 - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - - - - - - org.slf4j - slf4j-api - - - org.apache.logging.log4j - log4j-slf4j-impl - - - org.apache.logging.log4j - log4j-core - - - - - junit - junit - test - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - - - - - true - src/main/resources - - - - - diff --git a/codes/javalib/javalib-log/javalib-log-log4j2/src/main/java/io/github/dunwu/javalib/log/Log4j2Demo.java b/codes/javalib/javalib-log/javalib-log-log4j2/src/main/java/io/github/dunwu/javalib/log/Log4j2Demo.java deleted file mode 100644 index 2d0ea236..00000000 --- a/codes/javalib/javalib-log/javalib-log-log4j2/src/main/java/io/github/dunwu/javalib/log/Log4j2Demo.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.dunwu.javalib.log; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Log4j2 示例 - * - * @author Zhang Peng - * @see Log4j2 官网 - * @since 2018/3/29 - */ -public class Log4j2Demo { - - private static final Logger logger = LoggerFactory.getLogger(Log4j2Demo.class); - - public static void main(String[] args) { - for (int i = 0; i < 10; i++) { - logger.trace("NO.{} 这是一条 {} 日志记录", i, "trace"); - logger.debug("NO.{} 这是一条 {} 日志记录", i, "debug"); - logger.info("NO.{} 这是一条 {} 日志记录", i, "info"); - logger.warn("NO.{} 这是一条 {} 日志记录", i, "warn"); - logger.error("NO.{} 这是一条 {} 日志记录", i, "error"); - } - } - -} diff --git a/codes/javalib/javalib-log/javalib-log-log4j2/src/main/resources/log4j2.xml b/codes/javalib/javalib-log/javalib-log-log4j2/src/main/resources/log4j2.xml deleted file mode 100644 index 2a0fa1d9..00000000 --- a/codes/javalib/javalib-log/javalib-log-log4j2/src/main/resources/log4j2.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - ???? - - - - - - - - - - - - - - - ${PATTERN} - - - - - - - - - - - - - - - - - - - - - - diff --git a/codes/javalib/javalib-log/javalib-log-logback/src/main/java/io/github/dunwu/javalib/log/LogbackDemo.java b/codes/javalib/javalib-log/javalib-log-logback/src/main/java/io/github/dunwu/javalib/log/LogbackDemo.java deleted file mode 100644 index fcfe8f9e..00000000 --- a/codes/javalib/javalib-log/javalib-log-logback/src/main/java/io/github/dunwu/javalib/log/LogbackDemo.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.dunwu.javalib.log; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Logback 示例 - * - * @author Zhang Peng - * @see logback 官网 - * @since 2018/3/29 - */ -public class LogbackDemo { - - private static final Logger logger = LoggerFactory.getLogger(LogbackDemo.class); - - public static void main(String[] args) { - for (int i = 0; i < 10; i++) { - logger.trace("NO.{} 这是一条 {} 日志记录", i, "trace"); - logger.debug("NO.{} 这是一条 {} 日志记录", i, "debug"); - logger.info("NO.{} 这是一条 {} 日志记录", i, "info"); - logger.warn("NO.{} 这是一条 {} 日志记录", i, "warn"); - logger.error("NO.{} 这是一条 {} 日志记录", i, "error"); - } - } - -} diff --git a/codes/javalib/javalib-log/javalib-log-logback/src/main/resources/logback.xml b/codes/javalib/javalib-log/javalib-log-logback/src/main/resources/logback.xml deleted file mode 100644 index 4dd6492d..00000000 --- a/codes/javalib/javalib-log/javalib-log-logback/src/main/resources/logback.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - ${PATTERN} - - - - - - - - logs/${DIR_NAME}/%d{yyyy-MM,aux}/${FILE_NAME}.%d{yyyy-MM-dd}.%i.log - - 30 - - 100MB - - - - ${PATTERN} - - - - - - - - - - - - diff --git a/codes/javalib/javalib-log/pom.xml b/codes/javalib/javalib-log/pom.xml deleted file mode 100644 index 1a5e6b86..00000000 --- a/codes/javalib/javalib-log/pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-log - 1.0.0 - pom - javalib 之日志库示例集锦 - - - javalib-log-log4j - javalib-log-log4j2 - javalib-log-logback - - diff --git a/codes/javalib/javalib-mvel/pom.xml b/codes/javalib/javalib-mvel/pom.xml deleted file mode 100644 index 16f22c08..00000000 --- a/codes/javalib/javalib-mvel/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-mvel - 1.0.0 - - - - org.mvel - mvel2 - 2.4.2.Final - - - com.alibaba - fastjson - 1.2.31 - - - commons-io - commons-io - 2.5 - - - ch.qos.logback - logback-classic - 1.1.3 - - - junit - junit - 4.12 - test - - - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - - diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/BasicRule.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/BasicRule.java deleted file mode 100644 index ebaccf9a..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/BasicRule.java +++ /dev/null @@ -1,128 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -public class BasicRule implements Rule, Comparable { - - protected String name; - - private String description; - - private int priority; - - private String condition; - - private String action; - - public BasicRule() { - } - - @Override - public int hashCode() { - int result = name.hashCode(); - result = 31 * result + (description != null ? description.hashCode() : 0); - result = 31 * result + priority; - return result; - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - BasicRule basicRule = (BasicRule) o; - - if (priority != basicRule.priority) { - return false; - } - if (!name.equals(basicRule.name)) { - return false; - } - return !(description != null ? !description.equals(basicRule.description) : basicRule.description != null); - } - - @Override - public String toString() { - return name; - } - - @Override - public int compareTo(Rule rule) { - if (priority < rule.getPriority()) { - return -1; - } else if (priority > rule.getPriority()) { - return 1; - } else { - return getName().compareTo(rule.getName()); - } - } - - @Override - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - @Override - public int getPriority() { - return priority; - } - - public void setPriority(int priority) { - this.priority = priority; - } - - @Override - public String getCondition() { - return condition; - } - - public void setCondition(String condition) { - this.condition = condition; - } - - @Override - public String getAction() { - return action; - } - - @Override - public boolean validate() { - if (condition == null || condition.length() == 0) { - throw new IllegalArgumentException("The rule condition must not be null or empty"); - } - if (action == null || action.length() == 0) { - throw new IllegalArgumentException("The rule action must not be null or empty"); - } - return true; - } - - @Override - public boolean evaluate(RuleContext ruleContext) { - return false; - } - - @Override - public void execute(RuleContext ruleContext) { - // do nothing - } - - public void setAction(String action) { - this.action = action; - } - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/DefaultRuleEngine.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/DefaultRuleEngine.java deleted file mode 100644 index 7c1ba12a..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/DefaultRuleEngine.java +++ /dev/null @@ -1,163 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; - -public class DefaultRuleEngine implements RuleEngine { - - protected Logger logger = LoggerFactory.getLogger(this.getClass()); - - /** - * The rules set. - */ - protected Set rules; - - /** - * The engine parameters - */ - protected RuleEngineParams params; - - /** - * The rule fact - */ - protected RuleContext fact; - - /** - * ruleSet Map - */ - private Map> ruleSetMap = new ConcurrentHashMap<>(); - - public DefaultRuleEngine(RuleEngineParams params) { - this.params = params; - this.rules = new TreeSet<>(); - if (params.isSilentMode()) { - // cancle log - } - } - - @Override - public RuleEngineParams getParams() { - return params; - } - - @Override - public void registerRule(Rule rule) { - // 检查规则 - if (rule.validate()) { - rules.add(rule); - } - } - - @Override - public void registerRule(MvelRuleSet ruleSet) { - ruleSet.getRules().forEach(rule -> registerRule(rule)); - logRegisteredRules(); - } - - private void logRegisteredRules() { - logger.info("Registered rules:"); - for (Rule rule : rules) { - logger.info("Rule { name = {}, description = {}, priority = {}}", rule.getName(), rule.getDescription(), - rule.getPriority()); - } - } - - @Override - public void unregisterRule(Rule rule) { - rules.remove(rule); - } - - @Override - public void clearRules() { - ruleSetMap.clear(); - } - - @Override - public Set getRules() { - return rules; - } - - @Override - public Map checkRules() { - logger.info("Checking rules"); - sortRules(); - Map result = new HashMap<>(); - for (Rule rule : rules) { - result.put(rule, rule.evaluate(fact)); - } - return result; - } - - @Override - public void launch(RuleContext fact) { - if (rules.isEmpty()) { - logger.warn("No rules registered! Nothing to apply"); - return; - } - - logEngineParams(); - sortRules(); - applyRules(fact); - } - - private void logEngineParams() { - logger.info("----- Params -----"); - logger.info("Engine name: {}", params.getName()); - logger.info("Rule priority threshold: {}", params.getPriorityThreshold()); - logger.info("Skip on first applied rule: {}", params.isSkipOnFirstAppliedRule()); - logger.info("Skip on first unapplied rule: {}", params.isSkipOnFirstUnAppliedRule()); - logger.info("Skip on first failed rule: {}", params.isSkipOnFirstFailedRule()); - } - - private void applyRules(RuleContext fact) { - logger.info("Rules evaluation started"); - - for (Rule rule : rules) { - final String name = rule.getName(); - final int priority = rule.getPriority(); - - if (priority > params.getPriorityThreshold()) { - logger.info( - "Rule priority threshold ({}) exceeded at rule {} with priority={}, next rules will be skipped", - new Object[] { params.getPriorityThreshold(), name, priority }); - break; - } - - if (rule.evaluate(fact)) { - logger.info("Rule [{}] triggered", name); - try { - rule.execute(fact); - logger.info("Rule {} performed successfully", name); - if (params.isSkipOnFirstAppliedRule()) { - logger.info("Next rules will be skipped since parameter skipOnFirstAppliedRule is set"); - break; - } - if (params.isSkipOnFirstUnAppliedRule()) { - logger.info("Next rules will be skipped since parameter skipOnFirstUnAppliedRule is set"); - break; - } - } catch (Exception exception) { - logger.error("Rule [{}] performed with error {}", name, exception); - - if (params.isSkipOnFirstFailedRule()) { - logger.info("Next rules will be skipped since parameter skipOnFirstFailedRule is set"); - break; - } - } - } else { - logger.info("Rule [{}] has been evaluated to false, it has not been executed", name); - } - } - } - - private void sortRules() { - rules = new TreeSet<>(rules); - } - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRule.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRule.java deleted file mode 100644 index ed3a3073..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRule.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -import org.mvel2.MVEL; - -import java.io.Serializable; - -public class MvelRule extends BasicRule { - - /** - * 判断条件是否匹配 - */ - @Override - public boolean evaluate(RuleContext ruleContext) { - try { - return (Boolean) MVEL.eval(getCondition(), ruleContext); - } catch (Exception e) { - throw new RuntimeException(String.format("条件[%s]匹配发生异常:", getCondition()), e); - } - } - - /** - * 执行条件匹配后的操作 - */ - @Override - public void execute(RuleContext ruleContext) { - try { - Serializable exp = MVEL.compileExpression(getAction(), ruleContext); - MVEL.executeExpression(exp, ruleContext); - } catch (Exception e) { - throw new RuntimeException(String.format("后续操作[%s]执行发生异常:", getAction()), e); - } - } - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRuleSet.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRuleSet.java deleted file mode 100644 index f8269acc..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/MvelRuleSet.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -import java.util.Set; -import java.util.TreeSet; - -public class MvelRuleSet { - - private String name; - - private TreeSet rules; - - public String getName() { - return name; - } - - public void setName(String name) { - if (name == null || name.length() == 0) { - name = RuleConstant.DEFAULT_RULE_NAME; - } - this.name = name; - } - - public Set getRules() { - if (rules == null) { - rules = new TreeSet<>(); - } - return rules; - } - - public void setRules(TreeSet rules) { - this.rules = rules; - } - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/Rule.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/Rule.java deleted file mode 100644 index 19a71e56..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/Rule.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -public interface Rule { - - /** - * Getter for rule name. - * - * @return the rule name - */ - String getName(); - - /** - * Getter for rule description. - * - * @return rule description - */ - String getDescription(); - - /** - * Getter for rule priority. - * - * @return rule priority - */ - int getPriority(); - - /** - * Getter for the rule condition - * - * @return rule condition - */ - String getCondition(); - - /** - * Getter for the rule action - * - * @return rule action - */ - String getAction(); - - /** - * validate - * - * @return boolean - */ - boolean validate(); - - /** - * Rule conditions abstraction : this method encapsulates the rule's conditions. - * - * @return true if the rule should be applied, false else - */ - boolean evaluate(RuleContext ruleContext); - - /** - * Rule actions abstraction : this method encapsulates the rule's actions. - * - * @throws Exception thrown if an exception occurs during actions performing - */ - void execute(RuleContext ruleContext) throws Exception; - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleConstant.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleConstant.java deleted file mode 100644 index 0ded47bd..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleConstant.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -/** - * 规则常量 - */ -public final class RuleConstant { - - /** - * Default rule name. - */ - public static final String DEFAULT_RULE_NAME = "rule"; - - /** - * Default engine name. - */ - public static final String DEFAULT_ENGINE_NAME = "engine"; - - /** - * Default rule description. - */ - public static final String DEFAULT_RULE_DESCRIPTION = "description"; - - /** - * Default rule priority. - */ - public static final int DEFAULT_RULE_PRIORITY = Integer.MAX_VALUE - 1; - - /** - * Default rule priority threshold. - */ - public static final int DEFAULT_RULE_PRIORITY_THRESHOLD = Integer.MAX_VALUE; - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleContext.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleContext.java deleted file mode 100644 index ae65bdd8..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleContext.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class RuleContext extends ConcurrentHashMap implements Map { - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngine.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngine.java deleted file mode 100644 index 3cb19902..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngine.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -import java.util.Map; -import java.util.Set; - -public interface RuleEngine { - - /** - * 规则引擎 设置参数 - * - * @return The rules engine parameters - */ - RuleEngineParams getParams(); - - /** - * 注册rule - */ - void registerRule(Rule rule); - - /** - * 注册ruleSet - */ - void registerRule(MvelRuleSet ruleSet); - - /** - * 取消注册rule - */ - void unregisterRule(Rule rule); - - /** - * 清空规则列表 - */ - void clearRules(); - - /** - * Return the set of registered rules. - * - * @return the set of registered rules - */ - Set getRules(); - - /** - * Check rules without firing them. - * - * @return a map with the result of evaluation of each rule - */ - Map checkRules(); - - /** - * Launch all registered rules. - */ - void launch(RuleContext ruleContext); - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineBuilder.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineBuilder.java deleted file mode 100644 index 47364478..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineBuilder.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -public class RuleEngineBuilder { - - private RuleEngineParams params; - - private RuleEngineBuilder() { - params = new RuleEngineParams(RuleConstant.DEFAULT_ENGINE_NAME, false, false, false, - RuleConstant.DEFAULT_RULE_PRIORITY_THRESHOLD, false); - } - - public static RuleEngineBuilder newRuleEngine() { - return new RuleEngineBuilder(); - } - - public RuleEngine build() { - return new DefaultRuleEngine(params); - } - - public RuleEngineBuilder named(final String name) { - params.setName(name); - return this; - } - - public RuleEngineBuilder withSkipOnFirstAppliedRule(final boolean skipOnFirstAppliedRule) { - params.setSkipOnFirstAppliedRule(skipOnFirstAppliedRule); - return this; - } - - public RuleEngineBuilder withSkipOnFirstFailedRule(final boolean skipOnFirstFailedRule) { - params.setSkipOnFirstFailedRule(skipOnFirstFailedRule); - return this; - } - - public RuleEngineBuilder withRulePriorityThreshold(final int priorityThreshold) { - params.setPriorityThreshold(priorityThreshold); - return this; - } - - public RuleEngineBuilder withSilentMode(final boolean silentMode) { - params.setSilentMode(silentMode); - return this; - } - -} diff --git a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineParams.java b/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineParams.java deleted file mode 100644 index b9498311..00000000 --- a/codes/javalib/javalib-mvel/src/main/java/io/github/dunwu/javalib/mvel/RuleEngineParams.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -public class RuleEngineParams { - - /** - * The engine name. - */ - protected String name; - - /** - * 满足任意条件(即遇到第一个匹配规则时停止) Parameter to skip next applicable rules when a rule is applied. - */ - private boolean skipOnFirstAppliedRule; - - /** - * 满足所有条件(即遇到第第一个未匹配规则时停止) Parameter to skip next applicable rules when a rule has failed. - */ - private boolean skipOnFirstUnAppliedRule; - - /** - * Parameter to skip next applicable rules when a rule has failed. - */ - private boolean skipOnFirstFailedRule; - - /** - * Parameter to skip next rules if priority exceeds a user defined threshold. - */ - private int priorityThreshold; - - /** - * Parameter to mute loggers. - */ - private boolean silentMode; - - public RuleEngineParams(String name, boolean skipOnFirstAppliedRule, boolean skipOnFirstUnAppliedRule, - boolean skipOnFirstFailedRule, int priorityThreshold, boolean silentMode) { - this.name = name; - this.skipOnFirstAppliedRule = skipOnFirstAppliedRule; - this.skipOnFirstUnAppliedRule = skipOnFirstUnAppliedRule; - this.skipOnFirstFailedRule = skipOnFirstFailedRule; - this.priorityThreshold = priorityThreshold; - this.silentMode = silentMode; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getPriorityThreshold() { - return priorityThreshold; - } - - public void setPriorityThreshold(int priorityThreshold) { - this.priorityThreshold = priorityThreshold; - } - - public boolean isSilentMode() { - return silentMode; - } - - public void setSilentMode(boolean silentMode) { - this.silentMode = silentMode; - } - - public boolean isSkipOnFirstAppliedRule() { - return skipOnFirstAppliedRule; - } - - public void setSkipOnFirstAppliedRule(boolean skipOnFirstAppliedRule) { - this.skipOnFirstAppliedRule = skipOnFirstAppliedRule; - } - - public boolean isSkipOnFirstFailedRule() { - return skipOnFirstFailedRule; - } - - public void setSkipOnFirstFailedRule(boolean skipOnFirstFailedRule) { - this.skipOnFirstFailedRule = skipOnFirstFailedRule; - } - - public boolean isSkipOnFirstUnAppliedRule() { - return skipOnFirstUnAppliedRule; - } - - public void setSkipOnFirstUnAppliedRule(boolean skipOnFirstUnAppliedRule) { - this.skipOnFirstUnAppliedRule = skipOnFirstUnAppliedRule; - } - -} diff --git a/codes/javalib/javalib-mvel/src/main/resources/logback.xml b/codes/javalib/javalib-mvel/src/main/resources/logback.xml deleted file mode 100644 index 0163bdd0..00000000 --- a/codes/javalib/javalib-mvel/src/main/resources/logback.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - 10 - 100 - - - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [javalib-mvel] [%thread] [%p] %c{36}#%M - %m%n - - - - - - - ${LOG_PATH}/logs/${FILE_NAME}-error.%d{yyyy-MM-dd}.log - 30 - - - - - 10MB - - - - ERROR - ACCEPT - DENY - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [javalib-mvel] [%thread] [%p] %c{36}#%M - %m%n - - - - - - ${LOG_PATH}/logs/${FILE_NAME}-warn.%d{yyyy-MM-dd}.log - 30 - - - - - 10MB - - - - WARN - ACCEPT - DENY - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [javalib-mvel] [%thread] [%p] %c{36}#%M - %m%n - - - - - - ${LOG_PATH}/logs/${FILE_NAME}-info.%d{yyyy-MM-dd}.log - 30 - - - - - 10MB - - - - INFO - ACCEPT - DENY - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [javalib-mvel] [%thread] [%p] %c{36}#%M - %m%n - - - - - - ${LOG_PATH}/logs/${FILE_NAME}-debug.%d{yyyy-MM-dd}.log - 30 - - - - - 10MB - - - - DEBUG - ACCEPT - DENY - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [javalib-mvel] [%thread] [%p] %c{36}#%M - %m%n - - - - - - ${LOG_PATH}/logs/${FILE_NAME}-trace.%d{yyyy-MM-dd}.log - 30 - - - - - 10MB - - - - TRACE - ACCEPT - DENY - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [javalib-mvel] [%thread] [%p] %c{36}#%M - %m%n - - - - - - - - - - - - - - diff --git a/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/ClassTests.java b/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/ClassTests.java deleted file mode 100644 index 27ec240d..00000000 --- a/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/ClassTests.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -import org.junit.Assert; -import org.junit.Test; -import org.mvel2.MVEL; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -/** - * @author Mike Brock - */ -public class ClassTests { - - private final String dir = "src/test/java/" + getClass().getPackage().getName().replaceAll("\\.", "/"); - - @Test - public void testScript() throws IOException { - final Object o = MVEL.evalFile(new File(dir + "/demo.mvel"), new HashMap()); - } - - @Test - public void testEval() { - String expression = "foobar > 99"; - Map vars = new HashMap(); - vars.put("foobar", new Integer(100)); - Boolean result = (Boolean) MVEL.eval(expression, vars); - Assert.assertEquals(true, result); - } - - @Test - public void testCompileExpression() { - String expression = "foobar > 99"; - Serializable compiled = MVEL.compileExpression(expression); - Map vars = new HashMap(); - vars.put("foobar", new Integer(100)); - Boolean result = (Boolean) MVEL.executeExpression(compiled, vars); - Assert.assertEquals(true, result); - } - -} diff --git a/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/SalaryRuleTest.java b/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/SalaryRuleTest.java deleted file mode 100644 index 2a07528d..00000000 --- a/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/SalaryRuleTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package io.github.dunwu.javalib.mvel; - -import com.alibaba.fastjson.JSON; -import org.apache.commons.io.FileUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; - -public class SalaryRuleTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private final String SALARY_RULE_PATH = System.getProperty("user.dir") + "\\src\\test\\resources\\SalaryRule.json"; - - private RuleEngine ruleEngine; - - @Before - public void before() throws IOException { - logger.info("Begin"); - RuleEngineParams params = new RuleEngineParams("SalaryEngine", true, false, true, - RuleConstant.DEFAULT_RULE_PRIORITY_THRESHOLD, false); - ruleEngine = new DefaultRuleEngine(params); - - String json = FileUtils.readFileToString(new File(SALARY_RULE_PATH), "utf-8"); - MvelRuleSet ruleSet = JSON.parseObject(json, MvelRuleSet.class); - ruleEngine.registerRule(ruleSet); - } - - @Test - public void test_salaryRule() { - RuleContext ruleContext = new RuleContext(); - ruleContext.put("fee", 0.0); - - ruleContext.put("salary", 1000); - ruleEngine.launch(ruleContext); - assertEquals(0, ruleContext.get("fee")); - - ruleContext.put("salary", 4000); - ruleEngine.launch(ruleContext); - assertEquals(15.0, ruleContext.get("fee")); - - ruleContext.put("salary", 7000); - ruleEngine.launch(ruleContext); - assertEquals(245.0, ruleContext.get("fee")); - - ruleContext.put("salary", 10000); - ruleEngine.launch(ruleContext); - assertEquals(745.0, ruleContext.get("fee")); - - ruleContext.put("salary", 18000); - ruleEngine.launch(ruleContext); - assertEquals(2620.0, ruleContext.get("fee")); - - ruleContext.put("salary", 40005); - ruleEngine.launch(ruleContext); - assertEquals(8196.50, ruleContext.get("fee")); - - ruleContext.put("salary", 70005); - ruleEngine.launch(ruleContext); - assertEquals(17771.75, ruleContext.get("fee")); - - ruleContext.put("salary", 100000); - ruleEngine.launch(ruleContext); - assertEquals(29920.00, ruleContext.get("fee")); - } - - @After - public void after() { - logger.info("End"); - } - -} diff --git a/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/demo.mvel b/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/demo.mvel deleted file mode 100644 index ec1733ee..00000000 --- a/codes/javalib/javalib-mvel/src/test/java/io/github/dunwu/javalib/mvel/demo.mvel +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This is an MVEL script. - */ - -def Person { - String name; - int age; - String color; - - def speak() { - System.out.println("My name is " + name + " and I am " + age + " years old. I like the color " + color + "."); - } - - def makeUpperCase() { - name = name.toUpperCase(); - } - - def sayName(amount) { - for (int i = 0; i < amount; i++) { - System.out.println((i + 1) + ". " + name); - } - } -} - -tm = System.currentTimeMillis; - -def print(str) { - System.out.println(str); -} - -var p = new Person(); - -p.{ - name = "Bob", - age = 5, - color = "blue" -}; - -p.speak(); -p.makeUpperCase(); -p.speak(); - -print("\n---------\n"); - -p.sayName(10); - -for (a : "gorkem") { - print("->" + a); -} - -var list = ["cow", "pig", "lion"]; -var blah = ($.toUpperCase() in list if $.length() == 3); - -print(blah); -print(tm()); - diff --git a/codes/javalib/javalib-mvel/src/test/resources/SalaryRule.json b/codes/javalib/javalib-mvel/src/test/resources/SalaryRule.json deleted file mode 100644 index 6a43150e..00000000 --- a/codes/javalib/javalib-mvel/src/test/resources/SalaryRule.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "salaryRule", - "rules": [ - { - "name": "step1", - "action": "fee=0", - "condition": "salary<=3500" - }, - { - "name": "step2", - "action": "fee=(salary-3500)*0.03", - "condition": "salary>3500 && salary<=5000" - }, - { - "name": "step3", - "action": "fee=(salary-3500)*0.1-105", - "condition": "salary>5000 && salary<=8000", - "priority": 3 - }, - { - "name": "step4", - "action": "fee=(salary-3500)*0.2-555", - "condition": "salary>8000 && salary<=12500", - "priority": 4 - }, - { - "name": "step5", - "action": "fee=(salary-3500)*0.25-1005", - "condition": "salary>12500 && salary<=38500", - "priority": 5 - }, - { - "name": "step6", - "action": "fee=(salary-3500)*0.3-2755", - "condition": "salary>38500 && salary<=58500", - "priority": 6 - }, - { - "name": "step7", - "action": "fee=(salary-3500)*0.35-5505", - "condition": "salary>58500 && salary<=83500", - "priority": 7 - }, - { - "name": "step8", - "action": "fee=(salary-3500)*0.45-13505", - "condition": "salary>83500", - "priority": 8 - } - ] -} diff --git a/codes/javalib/javalib-test/pom.xml b/codes/javalib/javalib-test/pom.xml deleted file mode 100644 index 48733b93..00000000 --- a/codes/javalib/javalib-test/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-test - 1.0.0 - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - 1.22 - - - - - ch.qos.logback - logback-classic - - - - - org.junit.jupiter - junit-jupiter-api - test - - - org.junit.jupiter - junit-jupiter-params - test - - - org.junit.jupiter - junit-jupiter-engine - test - - - - - junit - junit - test - - - - - org.assertj - assertj-core - test - - - org.mockito - mockito-core - test - - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - provided - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - diff --git a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/QuickStart.java b/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/QuickStart.java deleted file mode 100644 index bf130aae..00000000 --- a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/QuickStart.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.github.dunwu.javalib.jmh; - -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.RunnerException; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; - -import java.util.concurrent.TimeUnit; - -@BenchmarkMode(Mode.Throughput) -@Warmup(iterations = 3) -@Measurement(iterations = 10, time = 5, timeUnit = TimeUnit.SECONDS) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -public class QuickStart { - - public static void main(String[] args) throws RunnerException { - Options opt = new OptionsBuilder() - .include(QuickStart.class.getSimpleName()) - .forks(1) - .build(); - new Runner(opt).run(); - } - - @Benchmark - public String testStringAdd() { - String a = ""; - for (int i = 0; i < 10; i++) { - a += i; - } - return a; - } - - @Benchmark - public String testStringBuilderAdd() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 10; i++) { - sb.append(i); - } - return sb.toString(); - } - -} diff --git a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/StringBuilderBenchmark.java b/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/StringBuilderBenchmark.java deleted file mode 100644 index 8596d3c3..00000000 --- a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/jmh/StringBuilderBenchmark.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.github.dunwu.javalib.jmh; - -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.RunnerException; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; - -import java.util.concurrent.TimeUnit; - -@BenchmarkMode(Mode.Throughput) -@Warmup(iterations = 3) -@Measurement(iterations = 10, time = 5, timeUnit = TimeUnit.SECONDS) -@Threads(8) -@Fork(2) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -public class StringBuilderBenchmark { - - public static void main(String[] args) throws RunnerException { - Options options = new OptionsBuilder() - .include(StringBuilderBenchmark.class.getSimpleName()) - .output("d:/Benchmark.log") - .build(); - new Runner(options).run(); - } - - @Benchmark - public void testStringAdd() { - String a = ""; - for (int i = 0; i < 10; i++) { - a += i; - } - // System.out.println(a); - } - - @Benchmark - public void testStringBuilderAdd() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 10; i++) { - sb.append(i); - } - // System.out.println(sb.toString()); - } - -} diff --git a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Calculator.java b/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Calculator.java deleted file mode 100644 index 10612632..00000000 --- a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Calculator.java +++ /dev/null @@ -1,9 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -public class Calculator { - - public int add(int a, int b) { - return a + b; - } - -} diff --git a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Person.java b/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Person.java deleted file mode 100644 index d41f6059..00000000 --- a/codes/javalib/javalib-test/src/main/java/io/github/dunwu/javalib/lombok/Person.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.dunwu.javalib.lombok; - -/** - * @author Zhang Peng - * @since 2018-11-29 - */ -public class Person { - - private String firstName; - - private String lastName; - - public Person(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - -} diff --git a/codes/javalib/javalib-test/src/main/resources/logback.xml b/codes/javalib/javalib-test/src/main/resources/logback.xml deleted file mode 100644 index 240ee4c6..00000000 --- a/codes/javalib/javalib-test/src/main/resources/logback.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%boldYellow(%thread)] [%highlight(%-5level)] %boldGreen(%c{36}.%M) - %boldBlue(%m%n) - - - - - - - - - - diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit4/JUnitTest.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit4/JUnitTest.java deleted file mode 100644 index 6370a692..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit4/JUnitTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package io.github.dunwu.javalib.junit4; - -import org.junit.*; -import org.junit.runners.MethodSorters; - -/** - * JUnit 使用示例。 请注意各个方法的执行顺序。 - * - * @author Zhang Peng - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class JUnitTest { - - /** - * @BeforeClass 注解指出这是附着在静态方法必须执行一次并在类的所有测试之前。 一般用于共享配置方法(如连接到数据库)。 - */ - @BeforeClass - public static void beforeClass() { - System.out.println("call @BeforeClass"); - } - - /** - * 当需要执行所有的测试在JUnit测试用例类后执行,@AfterClass 注解可以使用以清理建立方法,(从数据库如断开连接)。 注意:附有此批注(类似于BeforeClass)的方法必须定义为静态。 - */ - @AfterClass - public static void afterClass() { - System.out.println("call @AfterClass"); - } - - @Test - public void testA() { - System.out.println("call @Test testA"); - int sum = 1 + 2 + 3; - Assert.assertEquals(6, sum); - } - - @Test - public void testC() { - System.out.println("call @Test testC"); - } - - @Test - public void testB() { - System.out.println("call @Test testB"); - } - - /** - * @Before 注解修饰的方法必须在类中的每个测试之前执行,以便执行测试某些必要的先决条件。 - */ - @Before - public void before() { - System.out.println("call @Before"); - } - - /** - * @After 注解修饰的方法在执行每项测试后执行(如执行每一个测试后重置某些变量 , 删除临时变量等) - */ - @After - public void after() { - System.out.println("call @After"); - } - - /** - * 当想暂时禁用特定的测试执行可以使用忽略注释。每个被注解为 @Ignore 的方法将不被执行。 - */ - @Ignore - public void ignore() { - System.out.println("call @Ignore"); - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssertionsTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssertionsTests.java deleted file mode 100644 index ddadf729..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssertionsTests.java +++ /dev/null @@ -1,151 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import static java.time.Duration.ofMillis; -import static java.time.Duration.ofMinutes; -import static org.junit.jupiter.api.Assertions.*; - -/** - * Junit5 断言示例 - * - * @author Zhang Peng - * @since 2018-11-29 - */ -@Disabled -class AssertionsTests { - - private static Person person; - - @BeforeAll - static void beforeAll() { - person = new Person("John", "Doe"); - } - - @Test - void dependentAssertions() { - // Within a code block, if an assertion fails the - // subsequent code in the same block will be skipped. - assertAll("properties", () -> { - String firstName = person.getFirstName(); - assertNotNull(firstName); - - // Executed only if the previous assertion is valid. - assertAll("first name", () -> assertTrue(firstName.startsWith("J")), - () -> assertTrue(firstName.endsWith("n"))); - }, () -> { - // Grouped assertion, so processed independently - // of results of first name assertions. - String lastName = person.getLastName(); - assertNotNull(lastName); - - // Executed only if the previous assertion is valid. - assertAll("last name", () -> assertTrue(lastName.startsWith("D")), - () -> assertTrue(lastName.endsWith("e"))); - }); - } - - @Test - void exceptionTesting() { - Throwable exception = assertThrows(IllegalArgumentException.class, () -> { - throw new IllegalArgumentException("a message"); - }); - assertEquals("a message", exception.getMessage()); - } - - @Test - void groupedAssertions() { - // In a grouped assertion all assertions are executed, and any - // failures will be reported together. - assertAll("person", () -> assertEquals("John", person.getFirstName()), - () -> assertEquals("Doe", person.getLastName())); - } - - @Test - void standardAssertions() { - assertEquals(2, 2); - assertEquals(4, 4, "The optional assertion message is now the last parameter."); - assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- " - + "to avoid constructing complex messages unnecessarily."); - } - - @Test - void timeoutExceeded() { - // The following assertion fails with an error message similar to: - // execution exceeded timeout of 10 ms by 91 ms - assertTimeout(ofMillis(10), () -> { - // Simulate task that takes more than 10 ms. - Thread.sleep(100); - }); - } - - @Test - void timeoutExceededWithPreemptiveTermination() { - // The following assertion fails with an error message similar to: - // execution timed out after 10 ms - assertTimeoutPreemptively(ofMillis(10), () -> { - // Simulate task that takes more than 10 ms. - Thread.sleep(100); - }); - } - - @Test - void timeoutNotExceeded() { - // The following assertion succeeds. - assertTimeout(ofMinutes(2), () -> { - // Perform task that takes less than 2 minutes. - }); - } - - @Test - void timeoutNotExceededWithMethod() { - // The following assertion invokes a method reference and returns an object. - String actualGreeting = assertTimeout(ofMinutes(2), AssertionsTests::greeting); - assertEquals("Hello, World!", actualGreeting); - } - - private static String greeting() { - return "Hello, World!"; - } - - @Test - void timeoutNotExceededWithResult() { - // The following assertion succeeds, and returns the supplied object. - String actualResult = assertTimeout(ofMinutes(2), () -> { - return "a result"; - }); - assertEquals("a result", actualResult); - } - - static class Person { - - private String firstName; - - private String lastName; - - Person(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } - - String getFirstName() { - return firstName; - } - - void setFirstName(String firstName) { - this.firstName = firstName; - } - - String getLastName() { - return lastName; - } - - void setLastName(String lastName) { - this.lastName = lastName; - } - - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssumptionsTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssumptionsTests.java deleted file mode 100644 index 09ae1875..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/AssumptionsTests.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assumptions.assumeTrue; -import static org.junit.jupiter.api.Assumptions.assumingThat; - -/** - * Junit5 断言示例 - * - * @author Zhang Peng - * @since 2018-11-29 - */ -@Disabled -class AssumptionsTests { - - @Test - void testInAllEnvironments() { - assumingThat("CI".equals(System.getenv("ENV")), () -> { - // perform these assertions only on the CI server - assertEquals(2, 2); - }); - - // perform these assertions in all environments - assertEquals("a string", "a string"); - } - - @Test - void testOnlyOnCiServer() { - assumeTrue("CI".equals(System.getenv("ENV"))); - // remainder of test - } - - @Test - void testOnlyOnDeveloperWorkstation() { - assumeTrue("DEV".equals(System.getenv("ENV")), - () -> "Aborting test: not on developer workstation"); - // remainder of test - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DisplayNameTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DisplayNameTests.java deleted file mode 100644 index 20ee7959..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DisplayNameTests.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -/** - * Junit5 定制测试类和方法的显示名称 - * - * @author Zhang Peng - * @since 2018-11-29 - */ -@Disabled -@DisplayName("A special test case") -class DisplayNameTests { - - @Test - @DisplayName("😱") - void testWithDisplayNameContainingEmoji() { - } - - @Test - @DisplayName("Custom test name containing spaces") - void testWithDisplayNameContainingSpaces() { - } - - @Test - @DisplayName("╯°□°)╯") - void testWithDisplayNameContainingSpecialCharacters() { - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DynamicTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DynamicTests.java deleted file mode 100644 index 7ce4813e..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/DynamicTests.java +++ /dev/null @@ -1,117 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DynamicNode; -import org.junit.jupiter.api.DynamicTest; -import org.junit.jupiter.api.TestFactory; -import org.junit.jupiter.api.function.ThrowingConsumer; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.DynamicContainer.dynamicContainer; -import static org.junit.jupiter.api.DynamicTest.dynamicTest; - -@Disabled -class DynamicTests { - - @TestFactory - DynamicTest[] dynamicTestsFromArray() { - return new DynamicTest[] { - dynamicTest("7th dynamic test", () -> assertTrue(true)), - dynamicTest("8th dynamic test", () -> assertEquals(4, 2 * 2)) }; - } - - @TestFactory - Collection dynamicTestsFromCollection() { - return Arrays.asList(dynamicTest("1st dynamic test", () -> assertTrue(true)), - dynamicTest("2nd dynamic test", () -> assertEquals(4, 2 * 2))); - } - - @TestFactory - Stream dynamicTestsFromIntStream() { - // Generates tests for the first 10 even integers. - return IntStream.iterate(0, n -> n + 2).limit(10) - .mapToObj(n -> dynamicTest("test" + n, () -> assertTrue(n % 2 == 0))); - } - - @TestFactory - Iterable dynamicTestsFromIterable() { - return Arrays.asList(dynamicTest("3rd dynamic test", () -> assertTrue(true)), - dynamicTest("4th dynamic test", () -> assertEquals(4, 2 * 2))); - } - - @TestFactory - Iterator dynamicTestsFromIterator() { - return Arrays - .asList(dynamicTest("5th dynamic test", () -> assertTrue(true)), - dynamicTest("6th dynamic test", () -> assertEquals(4, 2 * 2))) - .iterator(); - } - - @TestFactory - Stream dynamicTestsFromStream() { - return Stream.of("A", "B", "C").map(str -> dynamicTest("test" + str, () -> { - /* ... */ - })); - } - - @TestFactory - Stream dynamicTestsWithContainers() { - return Stream - .of("A", "B", "C").map( - input -> dynamicContainer("Container " + input, Stream - .of(dynamicTest("not null", () -> assertNotNull(input)), - dynamicContainer("properties", - Stream.of( - dynamicTest("length > 0", - () -> assertTrue(input - .length() > 0)), - dynamicTest("not empty", - () -> assertFalse(input - .isEmpty()))))))); - } - - // This will result in a JUnitException! - @TestFactory - List dynamicTestsWithInvalidReturnType() { - return Arrays.asList("Hello"); - } - - @TestFactory - Stream generateRandomNumberOfTests() { - - // Generates random positive integers between 0 and 100 until - // a number evenly divisible by 7 is encountered. - Iterator inputGenerator = new Iterator() { - - Random random = new Random(); - - int current; - - @Override - public boolean hasNext() { - current = random.nextInt(100); - return current % 7 != 0; - } - - @Override - public Integer next() { - return current; - } - }; - - // Generates display names like: input:5, input:37, input:85, etc. - Function displayNameGenerator = (input) -> "input:" + input; - - // Executes tests based on the current input value. - ThrowingConsumer testExecutor = (input) -> assertTrue(input % 7 != 0); - - // Returns a stream of dynamic tests. - return DynamicTest.stream(inputGenerator, displayNameGenerator, testExecutor); - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/NestedTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/NestedTests.java deleted file mode 100644 index 140f2382..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/NestedTests.java +++ /dev/null @@ -1,84 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.*; - -import java.util.EmptyStackException; -import java.util.Stack; - -import static org.junit.jupiter.api.Assertions.*; - -@Disabled -@DisplayName("A stack") -class NestedTests { - - Stack stack; - - @Test - @DisplayName("is instantiated with new Stack()") - void isInstantiatedWithNew() { - new Stack<>(); - } - - @Nested - @DisplayName("when new") - class WhenNew { - - @BeforeEach - void createNewStack() { - stack = new Stack<>(); - } - - @Test - @DisplayName("is empty") - void isEmpty() { - assertTrue(stack.isEmpty()); - } - - @Test - @DisplayName("throws EmptyStackException when peeked") - void throwsExceptionWhenPeeked() { - assertThrows(EmptyStackException.class, () -> stack.peek()); - } - - @Test - @DisplayName("throws EmptyStackException when popped") - void throwsExceptionWhenPopped() { - assertThrows(EmptyStackException.class, () -> stack.pop()); - } - - @Nested - @DisplayName("after pushing an element") - class AfterPushing { - - String anElement = "an element"; - - @Test - @DisplayName("it is no longer empty") - void isNotEmpty() { - assertFalse(stack.isEmpty()); - } - - @BeforeEach - void pushAnElement() { - stack.push(anElement); - } - - @Test - @DisplayName("returns the element when peeked but remains not empty") - void returnElementWhenPeeked() { - assertEquals(anElement, stack.peek()); - assertFalse(stack.isEmpty()); - } - - @Test - @DisplayName("returns the element when popped and is empty") - void returnElementWhenPopped() { - assertEquals(anElement, stack.pop()); - assertTrue(stack.isEmpty()); - } - - } - - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/ParameterizedTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/ParameterizedTests.java deleted file mode 100644 index 72d7e19c..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/ParameterizedTests.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author Zhang Peng - * @since 2018-11-29 - */ -@Disabled -class ParameterizedTests { - - @ParameterizedTest(name = "{0} + {1} = {2}") - @CsvSource({ "0, 1, 1", "1, 2, 3", "49, 51, 100", "1, 100, 101" }) - void add(int first, int second, int expectedResult) { - Calculator calculator = new Calculator(); - assertEquals(expectedResult, calculator.add(first, second), - () -> first + " + " + second + " should equal " + expectedResult); - } - - class Calculator { - - public int add(int a, int b) { - return a + b; - } - - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/RepeatedTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/RepeatedTests.java deleted file mode 100644 index 21014f7c..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/RepeatedTests.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.*; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@Disabled -class RepeatedTests { - - @BeforeEach - void beforeEach(TestInfo testInfo, RepetitionInfo repetitionInfo) { - int currentRepetition = repetitionInfo.getCurrentRepetition(); - int totalRepetitions = repetitionInfo.getTotalRepetitions(); - String methodName = testInfo.getTestMethod().get().getName(); - System.out.println(String.format("About to execute repetition %d of %d for %s", // - currentRepetition, totalRepetitions, methodName)); - } - - @RepeatedTest(value = 1, name = "{displayName} {currentRepetition}/{totalRepetitions}") - @DisplayName("Repeat!") - void customDisplayName(TestInfo testInfo) { - assertEquals(testInfo.getDisplayName(), "Repeat! 1/1"); - } - - @RepeatedTest(value = 1, name = RepeatedTest.LONG_DISPLAY_NAME) - @DisplayName("Details...") - void customDisplayNameWithLongPattern(TestInfo testInfo) { - assertEquals(testInfo.getDisplayName(), "Details... :: repetition 1 of 1"); - } - - @RepeatedTest(10) - void repeatedTest() { - // ... - } - - @RepeatedTest(value = 5, name = "Wiederholung {currentRepetition} von {totalRepetitions}") - void repeatedTestInGerman() { - // ... - } - - @RepeatedTest(5) - void repeatedTestWithRepetitionInfo(RepetitionInfo repetitionInfo) { - assertEquals(5, repetitionInfo.getTotalRepetitions()); - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/StandardTests.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/StandardTests.java deleted file mode 100644 index 009e9f60..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/junit5/StandardTests.java +++ /dev/null @@ -1,52 +0,0 @@ -package io.github.dunwu.javalib.junit5; - -import org.junit.jupiter.api.*; - -/** - * Junit5 标准测试 - * - * @author Zhang Peng - * @since 2018-11-29 - */ -@Disabled -class StandardTests { - - @AfterAll - static void afterAll() { - System.out.println("call afterAll()"); - } - - @BeforeAll - static void beforeAll() { - System.out.println("call beforeAll()"); - } - - @AfterEach - void afterEach() { - System.out.println("call afterEach()"); - } - - @BeforeEach - void beforeEach() { - System.out.println("call beforeEach()"); - } - - @Test - void failingTest() { - System.out.println("call failingTest()"); - // fail("a failing test"); - } - - @Test - @Disabled("for demonstration purposes") - void skippedTest() { - System.out.println("call skippedTest()"); - // not executed - } - - @Test - void succeedingTest() { - System.out.println("call succeedingTest()"); - } - -} diff --git a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/mockito/MockitoTest.java b/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/mockito/MockitoTest.java deleted file mode 100644 index 9cb7f841..00000000 --- a/codes/javalib/javalib-test/src/test/java/io/github/dunwu/javalib/mockito/MockitoTest.java +++ /dev/null @@ -1,225 +0,0 @@ -package io.github.dunwu.javalib.mockito; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InOrder; - -import java.util.LinkedList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; - -class MockitoTest { - - // 模拟 LinkedList 的一个对象 - LinkedList mockedList = mock(LinkedList.class); - - @BeforeEach - void beforeEach() { - mockedList.clear(); - } - - @Test - void test() { - // using mock object - it does not throw any "unexpected interaction" exception - mockedList.add("one"); - // selective, explicit, highly readable verification - verify(mockedList).add("one"); - } - - /** - * 模拟对象 - */ - @Test - void test01() { - // 此时调用get方法,会返回null,因为还没有对方法调用的返回值做模拟 - System.out.println(mockedList.get(0)); - } - - /** - * 模拟方法调用的返回值 - */ - @Test - void test02() { - // 模拟获取第一个元素时,返回字符串first。给特定的方法调用返回固定值在官方说法中称为stub。 - when(mockedList.get(0)).thenReturn("first"); - // 此时打印输出first - System.out.println(mockedList.get(0)); - } - - /** - * 模拟方法调用抛出异常 - */ - @Test - void test03() { - // 模拟获取第二个元素时,抛出RuntimeException - when(mockedList.get(1)).thenThrow(new RuntimeException()); - try { - // 此时将会抛出RuntimeException - System.out.println(mockedList.get(1)); - } catch (RuntimeException e) { - System.err.println(e.getMessage()); - assertThat(e.getMessage()).isEqualTo(null); - } - } - - /** - * 模拟方法调用抛出异常2 - */ - @Test - void test04() { - doThrow(new RuntimeException("clear exception")).when(mockedList).clear(); - try { - mockedList.clear(); - } catch (RuntimeException e) { - System.err.println(e.getMessage()); - assertThat(e.getMessage()).contains("clear exception"); - } - } - - /** - * 模拟调用方法时的参数匹配 - */ - @Test - void test05() { - // anyInt()匹配任何int参数,这意味着参数为任意值,其返回值均是element - when(mockedList.get(anyInt())).thenReturn("element"); - // 此时打印是element - System.out.println(mockedList.get(999)); - } - - /** - * 模拟方法调用次数 - */ - @Test - void test06() { - // 调用add一次 - mockedList.add("once"); - // 下面两个写法验证效果一样,均验证add方法是否被调用了一次 - verify(mockedList).add("once"); - verify(mockedList, times(1)).add("once"); - } - - /** - * 校验行为 - */ - @Test - void test07() { - // using mock object - mockedList.add("one"); - // verification - verify(mockedList).add("one"); - verify(mockedList).clear(); - } - - /** - * 模拟方法调用(Stubbing) - */ - @Test - void test08() { - // stubbing - when(mockedList.get(0)).thenReturn("first"); - when(mockedList.get(1)).thenThrow(new RuntimeException()); - // following prints "first" - System.out.println(mockedList.get(0)); - try { - // following throws runtime exception - System.out.println(mockedList.get(1)); - } catch (RuntimeException e) { - System.out.println(e.getMessage()); - } - // following prints "null" because get(999) was not stubbed - System.out.println(mockedList.get(999)); - - verify(mockedList).get(0); - } - - /** - * 校验方法调用次数 - */ - @Test - void test09() { - // using mock - mockedList.add("once"); - - mockedList.add("twice"); - mockedList.add("twice"); - - mockedList.add("three"); - mockedList.add("three"); - mockedList.add("three"); - // following two verifications work exactly the same - times(1) is used by default - verify(mockedList).add("once"); - verify(mockedList, times(1)).add("once"); - // exact number of invocations verification - verify(mockedList, times(2)).add("twice"); - verify(mockedList, times(3)).add("three"); - // verification using never(). never() is an alias to times(0) - verify(mockedList, never()).add("never happened"); - // verification using atLeast()/atMost() - verify(mockedList, atLeastOnce()).add("three"); - verify(mockedList, atLeast(2)).add("twice"); - verify(mockedList, atMost(5)).add("three"); - } - - /** - * 校验方法调用顺序 - */ - @Test - void test10() { - // A. Single mock whose methods must be invoked in a particular order - List singleMock = mock(List.class); - // using a single mock - singleMock.add("was added first"); - singleMock.add("was added second"); - // create an inOrder verifier for a single mock - InOrder inOrder = inOrder(singleMock); - // following will make sure that add is first called with "was added first, then - // with "was added second" - inOrder.verify(singleMock).add("was added first"); - inOrder.verify(singleMock).add("was added second"); - - // B. Multiple mocks that must be used in a particular order - List firstMock = mock(List.class); - List secondMock = mock(List.class); - // using mocks - firstMock.add("was called first"); - secondMock.add("was called second"); - // create inOrder object passing any mocks that need to be verified in order - inOrder = inOrder(firstMock, secondMock); - // following will make sure that firstMock was called before secondMock - inOrder.verify(firstMock).add("was called first"); - inOrder.verify(secondMock).add("was called second"); - // Oh, and A + B can be mixed together at will - } - - /** - * 校验方法是否从未调用 - */ - @Test - void test11() { - List mockOne = mock(List.class); - List mockTwo = mock(List.class); - List mockThree = mock(List.class); - // using mocks - only mockOne is interacted - mockOne.add("one"); - // ordinary verification - verify(mockOne).add("one"); - // verify that method was never called on a mock - verify(mockOne, never()).add("two"); - // verify that other mocks were not interacted - verifyZeroInteractions(mockTwo, mockThree); - } - - /** - * 重置Mock - */ - void test12() { - List mock = mock(List.class); - when(mock.size()).thenReturn(10); - mock.add(1); - reset(mock); - } - -} diff --git a/codes/javalib/javalib-text/pom.xml b/codes/javalib/javalib-text/pom.xml deleted file mode 100644 index aa36b436..00000000 --- a/codes/javalib/javalib-text/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib-text - 1.0.0 - pom - javalib-text - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 4.0.0 - - - - - - org.apache.poi - poi - ${poi.version} - - - org.apache.poi - poi-ooxml - ${poi.version} - - - org.apache.poi - poi-scratchpad - ${poi.version} - - - - - io.github.biezhi - TinyPinyin - 2.0.3.RELEASE - - - - junit - junit - 4.12 - test - - - diff --git a/codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/PinyinDemo.java b/codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/PinyinDemo.java deleted file mode 100644 index 545529aa..00000000 --- a/codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/PinyinDemo.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.github.dunwu.javalib.office; - -import com.github.promeg.pinyinhelper.Pinyin; - -/** - * @author Zhang Peng - * @since 2019-12-09 - */ -public class PinyinDemo { - - public static void main(String[] args) { - System.out.println("args = " + Pinyin.toPinyin('中')); - } - -} diff --git a/codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/WordUtil.java b/codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/WordUtil.java deleted file mode 100644 index 57ccbf89..00000000 --- a/codes/javalib/javalib-text/src/main/java/io/github/dunwu/javalib/office/WordUtil.java +++ /dev/null @@ -1,263 +0,0 @@ -package io.github.dunwu.javalib.office; - -import org.apache.poi.hpsf.DocumentSummaryInformation; -import org.apache.poi.hpsf.SummaryInformation; -import org.apache.poi.hwpf.HWPFDocument; -import org.apache.poi.ooxml.POIXMLProperties; -import org.apache.poi.xwpf.extractor.XWPFWordExtractor; -import org.apache.poi.xwpf.usermodel.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; - -/** - * @author Zhang Peng - * @see https://poi.apache.org/ - * @see https://www.w3cschool.cn/apache_poi_word/apache_poi_word_overview.html - * @since 2018-11-08 - */ -public class WordUtil { - - /** - * 创建空白文档 - * - * @param filename - * @throws IOException - */ - public static void create(String filename) throws IOException { - // Blank Document - XWPFDocument document = new XWPFDocument(); - // Write the Document in file system - FileOutputStream out = new FileOutputStream(new File(filename)); - document.write(out); - out.close(); - System.out.printf("create %s written successully\n", filename); - } - - /** - * 创建 *.docx 文档,包含 content 内容 - * - * @param filename - * @throws IOException - */ - public static void create(String filename, String content) throws IOException { - // Blank Document - XWPFDocument document = new XWPFDocument(); - // Write the Document in file system - FileOutputStream out = new FileOutputStream(new File(filename)); - - // create Paragraph - XWPFParagraph paragraph = document.createParagraph(); - XWPFRun run = paragraph.createRun(); - run.setText(content); - document.write(out); - out.close(); - System.out.printf("create %s written successully\n", filename); - } - - /** - * 创建 *.docx 文档,包含 content 内容,content 内容置于边框中 - * - * @param filename - * @throws IOException - */ - public static void createWithBorders(String filename, String content) throws IOException { - // Blank Document - XWPFDocument document = new XWPFDocument(); - - // Write the Document in file system - FileOutputStream out = new FileOutputStream(new File(filename)); - - // create paragraph - XWPFParagraph paragraph = document.createParagraph(); - - // Set bottom border to paragraph - paragraph.setBorderBottom(Borders.BASIC_BLACK_DASHES); - - // Set left border to paragraph - paragraph.setBorderLeft(Borders.BASIC_BLACK_DASHES); - - // Set right border to paragraph - paragraph.setBorderRight(Borders.BASIC_BLACK_DASHES); - - // Set top border to paragraph - paragraph.setBorderTop(Borders.BASIC_BLACK_DASHES); - - XWPFRun run = paragraph.createRun(); - run.setText(content); - - document.write(out); - out.close(); - System.out.printf("create %s written successully\n", filename); - } - - /** - * 表格 - * - * @param filename - * @throws IOException - */ - public static void createWithTable(String filename) throws IOException { - // Blank Document - XWPFDocument document = new XWPFDocument(); - - // Write the Document in file system - FileOutputStream out = new FileOutputStream(new File(filename)); - - // create table - XWPFTable table = document.createTable(); - // create first row - XWPFTableRow tableRowOne = table.getRow(0); - tableRowOne.getCell(0).setText("col one, row one"); - tableRowOne.addNewTableCell().setText("col two, row one"); - tableRowOne.addNewTableCell().setText("col three, row one"); - // create second row - XWPFTableRow tableRowTwo = table.createRow(); - tableRowTwo.getCell(0).setText("col one, row two"); - tableRowTwo.getCell(1).setText("col two, row two"); - tableRowTwo.getCell(2).setText("col three, row two"); - // create third row - XWPFTableRow tableRowThree = table.createRow(); - tableRowThree.getCell(0).setText("col one, row three"); - tableRowThree.getCell(1).setText("col two, row three"); - tableRowThree.getCell(2).setText("col three, row three"); - - document.write(out); - out.close(); - System.out.printf("create %s written successully\n", filename); - } - - /** - * 字体样式 - * - * @param filename - * @throws IOException - */ - public static void createWithFontStyle(String filename) throws IOException { - // Blank Document - XWPFDocument document = new XWPFDocument(); - - // Write the Document in file system - FileOutputStream out = new FileOutputStream(new File(filename)); - - // create paragraph - XWPFParagraph paragraph = document.createParagraph(); - - // Set Bold an Italic - XWPFRun paragraphOneRunOne = paragraph.createRun(); - paragraphOneRunOne.setBold(true); - paragraphOneRunOne.setItalic(true); - paragraphOneRunOne.setText("Font Style"); - paragraphOneRunOne.addBreak(); - - // Set text Position - XWPFRun paragraphOneRunTwo = paragraph.createRun(); - paragraphOneRunTwo.setText("Font Style two"); - paragraphOneRunTwo.setTextPosition(100); - - // Set Strike through and Font Size and Subscript - XWPFRun paragraphOneRunThree = paragraph.createRun(); - paragraphOneRunThree.setStrike(true); - paragraphOneRunThree.setFontSize(20); - paragraphOneRunThree.setSubscript(VerticalAlign.SUBSCRIPT); - paragraphOneRunThree.setText(" Different Font Styles"); - - document.write(out); - out.close(); - System.out.printf("create %s written successully\n", filename); - } - - /** - * 对齐方式 - * - * @param filename - * @throws IOException - */ - public static void createWithAlign(String filename) throws IOException { - // Blank Document - XWPFDocument document = new XWPFDocument(); - - // Write the Document in file system - FileOutputStream out = new FileOutputStream(new File(filename)); - - // create paragraph - XWPFParagraph paragraph = document.createParagraph(); - - // Set alignment paragraph to RIGHT - paragraph.setAlignment(ParagraphAlignment.RIGHT); - XWPFRun run = paragraph.createRun(); - run.setText("At tutorialspoint.com, we strive hard to " + "provide quality tutorials for self-learning " - + "purpose in the domains of Academics, Information " - + "Technology, Management and Computer Programming " + "Languages."); - - // Create Another paragraph - paragraph = document.createParagraph(); - - // Set alignment paragraph to CENTER - paragraph.setAlignment(ParagraphAlignment.CENTER); - run = paragraph.createRun(); - run.setText("The endeavour started by Mohtashim, an AMU " - + "alumni, who is the founder and the managing director " - + "of Tutorials Point (I) Pvt. Ltd. He came up with the " - + "website tutorialspoint.com in year 2006 with the help" - + "of handpicked freelancers, with an array of tutorials" + " for computer programming languages. "); - document.write(out); - out.close(); - System.out.printf("create %s written successully\n", filename); - } - - /** - * 文本提取 - * - * @param filename - * @throws IOException - */ - public static void extractor(String filename) throws IOException { - XWPFDocument docx = new XWPFDocument(new FileInputStream(filename)); - // using XWPFWordExtractor Class - XWPFWordExtractor we = new XWPFWordExtractor(docx); - System.out.println(we.getText()); - } - - public static void setDocxProperties(String filename) throws IOException { - FileInputStream fis = new FileInputStream(new File(filename)); - XWPFDocument doc = new XWPFDocument(fis); - - POIXMLProperties properties = doc.getProperties(); - POIXMLProperties.CoreProperties coreProperties = properties.getCoreProperties(); - coreProperties.setCreator("星环信息科技有限公司"); - coreProperties.setLastModifiedByUser("星环信息科技有限公司"); - POIXMLProperties.ExtendedProperties extendedProperties = properties.getExtendedProperties(); - extendedProperties.getUnderlyingProperties().setCompany("星环信息科技有限公司"); - - FileOutputStream fos = new FileOutputStream(new File(filename)); - doc.write(fos); - - fos.close(); - doc.close(); - fis.close(); - } - - public static void setDocProperties(String filename) throws IOException { - System.out.println("filename = [" + filename + "]"); - FileInputStream fis = new FileInputStream(new File(filename)); - HWPFDocument doc = new HWPFDocument(fis); - - SummaryInformation summaryInformation = doc.getSummaryInformation(); - summaryInformation.setAuthor("张鹏"); - summaryInformation.setLastAuthor("张鹏"); - DocumentSummaryInformation documentSummaryInformation = doc.getDocumentSummaryInformation(); - documentSummaryInformation.setCompany("张鹏"); - documentSummaryInformation.setDocumentVersion("1"); - - FileOutputStream fos = new FileOutputStream(new File(filename)); - doc.write(fos); - - fos.close(); - doc.close(); - fis.close(); - } - -} diff --git a/codes/javalib/javalib-text/src/test/java/io/github/dunwu/javalib/office/WordUtilTest.java b/codes/javalib/javalib-text/src/test/java/io/github/dunwu/javalib/office/WordUtilTest.java deleted file mode 100644 index a8cb21d4..00000000 --- a/codes/javalib/javalib-text/src/test/java/io/github/dunwu/javalib/office/WordUtilTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package io.github.dunwu.javalib.office; - -import org.junit.Test; - -import java.io.IOException; - -/** - * @author Zhang Peng - * @since 2018-11-08 - */ -public class WordUtilTest { - - @Test - public void testCreateDocx() { - try { - WordUtil.create("d://temp.docx"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testCreateDocxWithContent() { - StringBuilder sb = new StringBuilder(); - sb.append("At tutorialspoint.com, we strive hard to "); - sb.append("provide quality tutorials for self-learning "); - sb.append("purpose in the domains of Academics, Information "); - sb.append("Technology, Management and Computer Programming Languages."); - - try { - WordUtil.create("d://temp2.docx", sb.toString()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testCreateDocxWithBorder() { - StringBuilder sb = new StringBuilder(); - sb.append("At tutorialspoint.com, we strive hard to "); - sb.append("provide quality tutorials for self-learning "); - sb.append("purpose in the domains of Academics, Information "); - sb.append("Technology, Management and Computer Programming Languages."); - - try { - WordUtil.createWithBorders("d://temp3.docx", sb.toString()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testCreateDocxWithTable() { - try { - WordUtil.createWithTable("d://temp4.docx"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testCreateDocxWithFontStyle() { - try { - WordUtil.createWithFontStyle("d://temp5.docx"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testCreateDocxWithAlign() { - try { - WordUtil.createWithAlign("d://temp6.docx"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testExtractor() { - try { - WordUtil.extractor("d://temp6.docx"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void test() { - try { - WordUtil.setDocxProperties("d://temp6.docx"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - // @Test - // public void test2() { - // File dir = new File("D:\\Docs\\ZP\\notes\\软件工程\\软件工程文档标准模板"); - // File[] files = dir.listFiles(); - // for (File file : files) { - // if (!file.isDirectory()) { - // try { - // WordUtil.setDocProperties(file.getAbsolutePath()); - // } catch (IOException e) { - // e.printStackTrace(); - // } - // } - // } - // } -} diff --git a/codes/javalib/pom.xml b/codes/javalib/pom.xml deleted file mode 100644 index 275eb291..00000000 --- a/codes/javalib/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javalib - 1.0.0 - pom - - javalib - Java 常用 Lib 使用示例 - - - javalib-bean - javalib-cli - javalib-io - javalib-io-binary - javalib-io-json - javalib-log - javalib-mvel - javalib-text - javalib-test - - diff --git a/codes/javatool/javatool-embedded-server/README.md b/codes/javatool/javatool-embedded-server/README.md deleted file mode 100644 index af31139e..00000000 --- a/codes/javatool/javatool-embedded-server/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# javatool-server - -> 本示例代码主要展示嵌入式服务器和 web 项目的集成。 -> -> 你可以在本项目中体验嵌入式 Tomcat 和嵌入式 Jetty 的启动方式。 -> - -**版本** - -* JDK:1.8 -* Tomcat:8.5.24 - -## Tomcat - -### Windows 启动 - -执行 `io.github.dunwu.javatool.server.SimpleTomcatServer#main` 方法。 - -或执行 `io.github.dunwu.javatool.server.TomcatServer.main` 方法。 - -启动后,访问 http://localhost:8080/javatool-server/ - -### 插件启动嵌入式 Tomcat - -由于插件很久没有更新(最新版本发布时间:2013-11-11),目前只能找到 Tomcat6 、Tomcat7 插件,所以弃用。 - -### 脚本启动 - -> 本项目添加了脚本启动范例。 -> -> 脚本代码全在 [`scripts`](https://github.com/dunwu/JavaStack/tree/master/scripts) 目录下。 - -* 初始化 - -```bash -wget https://raw.githubusercontent.com/dunwu/JavaStack/master/scripts/init.sh -chmod 777 init.sh -./init.sh -``` - -* 发布 - -``` -cd /home/zp/source/JavaStack/scripts -./javatool-server-release.sh master develop -``` - -## Jetty - -待添加。。。 diff --git a/codes/javatool/javatool-embedded-server/pom.xml b/codes/javatool/javatool-embedded-server/pom.xml deleted file mode 100644 index e322c7a2..00000000 --- a/codes/javatool/javatool-embedded-server/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javatool-embedded-server - 1.0.0 - war - Java工具-服务器 示例 - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - [8.5.40,) - - - - - - ch.qos.logback - logback-classic - - - org.logback-extensions - logback-ext-spring - 0.1.2 - - - org.slf4j - jcl-over-slf4j - - - - - - javax.servlet - javax.servlet-api - provided - - - javax.servlet.jsp - jsp-api - 2.2 - provided - - - - - - org.apache.tomcat.embed - tomcat-embed-core - ${tomcat.version} - - - org.apache.tomcat.embed - tomcat-embed-el - ${tomcat.version} - - - org.apache.tomcat.embed - tomcat-embed-jasper - ${tomcat.version} - - - - - - org.springframework - spring-context-support - - - org.springframework - spring-webmvc - - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - diff --git a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/HelloController.java b/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/HelloController.java deleted file mode 100644 index 8b7cce7e..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/HelloController.java +++ /dev/null @@ -1,56 +0,0 @@ -package io.github.dunwu.javatool.controller; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; - -/** - * spring mvc 的第一个程序 - * - * @author Zhang Peng - * @since 2016.07.29 - */ -@Controller -@RequestMapping(value = "/hello") -public class HelloController { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - /** - *

    - * 在本例中,Spring将会将数据传给 hello.jsp - *

    - * 访问形式:http://localhost:8080/hello?name=张三 - */ - @RequestMapping(value = "/name", method = RequestMethod.GET) - public ModelAndView hello(@RequestParam("name") String name) { - ModelAndView mav = new ModelAndView(); - mav.addObject("message", "你好," + name); - mav.setViewName("hello"); - return mav; - } - - /** - *

    - * 测试 logback 分级日志。配置项见src/main/resouces/logback.xml - *

    - * 访问形式:http://localhost:8080/log - */ - @ResponseBody - @RequestMapping(value = "/log", method = RequestMethod.GET) - public String log() { - String msg = "print log, current level: {}"; - log.trace(msg, "trace"); - log.debug(msg, "debug"); - log.info(msg, "info"); - log.warn(msg, "warn"); - log.error(msg, "error"); - return msg; - } - -} diff --git a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/IndexController.java b/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/IndexController.java deleted file mode 100644 index e2a2a090..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/controller/IndexController.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * The Apache License 2.0 Copyright (c) 2016 Zhang Peng - */ -package io.github.dunwu.javatool.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; - -/** - * @author Zhang Peng - * @since 2017/4/12. - */ -@Controller -public class IndexController { - - /** - *

    - * 返回 ModelAndView 对象到视图层。在本例中,视图解析器解析视图名为 index,会自动关联到 index.jsp。 - *

    - * 访问形式:http://localhost:8080/ - */ - @RequestMapping(value = "/", method = RequestMethod.GET) - public ModelAndView index() { - ModelAndView mav = new ModelAndView(); - mav.setViewName("index"); - return mav; - } - -} diff --git a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/SimpleTomcatServer.java b/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/SimpleTomcatServer.java deleted file mode 100644 index 577dcc70..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/SimpleTomcatServer.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.github.dunwu.javatool.server; - -import org.apache.catalina.startup.Tomcat; - -import java.util.Optional; - -/** - * 简单的嵌入式 Tomcat 启动类 启动后可访问 http://localhost:8080/javatool-server/ - * - * @author Zhang Peng - */ -public class SimpleTomcatServer { - - private static final int PORT = 8080; - - private static final String CONTEXT_PATH = "/javatool-server"; - - public static void main(String[] args) throws Exception { - // 设定 profile - Optional profile = Optional.ofNullable(System.getProperty("spring.profiles.active")); - System.setProperty("spring.profiles.active", profile.orElse("develop")); - - Tomcat tomcat = new Tomcat(); - tomcat.setPort(PORT); - tomcat.getHost().setAppBase("."); - tomcat.addWebapp(CONTEXT_PATH, getAbsolutePath() + "src/main/webapp"); - tomcat.start(); - tomcat.getServer().await(); - } - - private static String getAbsolutePath() { - String path = null; - String folderPath = SimpleTomcatServer.class.getProtectionDomain().getCodeSource().getLocation().getPath() - .substring(1); - if (folderPath.indexOf("target") > 0) { - path = folderPath.substring(0, folderPath.indexOf("target")); - } - return path; - } - -} diff --git a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/TomcatServer.java b/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/TomcatServer.java deleted file mode 100644 index cb7773cb..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/java/io/github/dunwu/javatool/server/TomcatServer.java +++ /dev/null @@ -1,133 +0,0 @@ -package io.github.dunwu.javatool.server; - -import org.apache.catalina.Server; -import org.apache.catalina.startup.Catalina; -import org.apache.catalina.startup.Tomcat; -import org.apache.tomcat.util.digester.Digester; -import org.apache.tomcat.util.scan.Constants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; - -import java.io.File; - -public class TomcatServer { - - private static final Logger log = LoggerFactory.getLogger(TomcatServer.class); - - private static final String CONNECTOR_PORT = "8080"; - - private static final String RELATIVE_DEV_DUBBO_RESOVE_FILE = - "src/main/resources/properties/dubbo-resolve.properties"; - - private static final String RELATIVE_DUBBO_RESOVE_FILE = "WEB-INF/classes/properties/dubbo-resolve.properties"; - - // 以下设置轻易不要改动 - private static final String RELATIVE_DEV_BASE_DIR = "src/main/resources/tomcat/"; - - private static final String RELATIVE_BASE_DIR = "WEB-INF/classes/tomcat/"; - - private static final String RELATIVE_DEV_DOCBASE_DIR = "src/main/webapp"; - - private static final String RELATIVE_DOCBASE_DIR = "./"; - - public static void main(String[] args) throws Exception { - // 设定Spring的profile - if (StringUtils.isEmpty(System.getProperty("spring.profiles.active"))) { - System.setProperty("spring.profiles.active", "develop"); - } - - System.setProperty("tomcat.host.appBase", getAbsolutePath()); - File checkFile = new File(System.getProperty("tomcat.host.appBase") + "/WEB-INF"); - if (!checkFile.exists()) { - System.setProperty("catalina.base", getAbsolutePath() + RELATIVE_DEV_BASE_DIR); - System.setProperty("tomcat.context.docBase", RELATIVE_DEV_DOCBASE_DIR); - System.setProperty("dubbo.resolve.file", getAbsolutePath() + RELATIVE_DEV_DUBBO_RESOVE_FILE); - } else { - System.setProperty("catalina.base", getAbsolutePath() + RELATIVE_BASE_DIR); - System.setProperty("tomcat.context.docBase", RELATIVE_DOCBASE_DIR); - if ("develop".equalsIgnoreCase(System.getProperty("spring.profiles.active")) - || "test".equalsIgnoreCase("spring.profiles.active")) { - System.setProperty("dubbo.resolve.file", getAbsolutePath() + RELATIVE_DUBBO_RESOVE_FILE); - } - } - - if (StringUtils.isEmpty(System.getProperty("tomcat.connector.port"))) { - System.setProperty("tomcat.connector.port", CONNECTOR_PORT); - } - if (StringUtils.isEmpty(System.getProperty("tomcat.server.shutdownPort"))) { - System.setProperty("tomcat.server.shutdownPort", - String.valueOf(Integer.valueOf(System.getProperty("tomcat.connector.port")) + 10000)); - } - - log.info("====================ENV setting===================="); - log.info("spring.profiles.active:" + System.getProperty("spring.profiles.active")); - log.info("dubbo.resolve.file:" + System.getProperty("dubbo.resolve.file")); - log.info("catalina.base:" + System.getProperty("catalina.base")); - log.info("tomcat.host.appBase:" + System.getProperty("tomcat.host.appBase")); - log.info("tomcat.context.docBase:" + System.getProperty("tomcat.context.docBase")); - log.info("tomcat.connector.port:" + System.getProperty("tomcat.connector.port")); - log.info("tomcat.server.shutdownPort:" + System.getProperty("tomcat.server.shutdownPort")); - - ExtendedTomcat tomcat = new ExtendedTomcat(); - tomcat.start(); - tomcat.getServer().await(); - } - - private static String getAbsolutePath() { - String path = null; - String folderPath = TomcatServer.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - if (folderPath.indexOf("WEB-INF") > 0) { - path = folderPath.substring(0, folderPath.indexOf("WEB-INF")); - } else if (folderPath.indexOf("target") > 0) { - path = folderPath.substring(0, folderPath.indexOf("target")); - } - return path; - } - -} - -class ExtendedTomcat extends Tomcat { - - private static final String RELATIVE_SERVERXML_PATH = "/conf/server.xml"; - - private Logger log = LoggerFactory.getLogger(this.getClass()); - - @Override - public Server getServer() { - if (server != null) { - return server; - } - // 默认不开启JNDI. 开启时, 注意maven必须添加tomcat-dbcp依赖 - System.setProperty("catalina.useNaming", "false"); - ExtendedCatalina extendedCatalina = new ExtendedCatalina(); - - // 覆盖默认的skip和scan jar包配置 - System.setProperty(Constants.SKIP_JARS_PROPERTY, ""); - System.setProperty(Constants.SCAN_JARS_PROPERTY, ""); - - Digester digester = extendedCatalina.createStartDigester(); - digester.push(extendedCatalina); - try { - server = ((ExtendedCatalina) digester - .parse(new File(System.getProperty("catalina.base") + RELATIVE_SERVERXML_PATH))).getServer(); - // 设置catalina.base和catalna.home - this.initBaseDir(); - return server; - } catch (Exception e) { - log.error("Error while parsing server.xml", e); - throw new RuntimeException("server未创建,请检查server.xml(路径:" + System.getProperty("catalina.base") - + RELATIVE_SERVERXML_PATH + ")配置是否正确"); - } - } - - private static class ExtendedCatalina extends Catalina { - - @Override - public Digester createStartDigester() { - return super.createStartDigester(); - } - - } - -} diff --git a/codes/javatool/javatool-embedded-server/src/main/resources/logback.xml b/codes/javatool/javatool-embedded-server/src/main/resources/logback.xml deleted file mode 100644 index 3603a214..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/resources/logback.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n - - - - - - - - ${user.dir}/logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log - 30 - - - - - 30MB - - - - %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n - - - - - - - - - - - - - - - - - - diff --git a/codes/javatool/javatool-embedded-server/src/main/resources/properties/application-develop.properties b/codes/javatool/javatool-embedded-server/src/main/resources/properties/application-develop.properties deleted file mode 100644 index 25f09a35..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/resources/properties/application-develop.properties +++ /dev/null @@ -1,11 +0,0 @@ -# jdbc -jdbc.driver = -jdbc.url = -jdbc.username = -jdbc.password = -# redis -redis.name = -redis.host = -redis.port = -redis.password = -redis.database = diff --git a/codes/javatool/javatool-embedded-server/src/main/resources/properties/application-test.properties b/codes/javatool/javatool-embedded-server/src/main/resources/properties/application-test.properties deleted file mode 100644 index 25f09a35..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/resources/properties/application-test.properties +++ /dev/null @@ -1,11 +0,0 @@ -# jdbc -jdbc.driver = -jdbc.url = -jdbc.username = -jdbc.password = -# redis -redis.name = -redis.host = -redis.port = -redis.password = -redis.database = diff --git a/codes/javatool/javatool-embedded-server/src/main/resources/spring/spring-servlet.xml b/codes/javatool/javatool-embedded-server/src/main/resources/spring/spring-servlet.xml deleted file mode 100644 index 6c05fe85..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/resources/spring/spring-servlet.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - diff --git a/codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/server.xml b/codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/server.xml deleted file mode 100644 index 77316698..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/server.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/web.xml b/codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/web.xml deleted file mode 100644 index 7dc916a5..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/resources/tomcat/conf/web.xml +++ /dev/null @@ -1,4703 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - org.apache.catalina.servlets.DefaultServlet - - debug - 0 - - - listings - false - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - jsp - org.apache.jasper.servlet.JspServlet - - fork - false - - - xpoweredBy - false - - - keepgenerated - false - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - / - - - - - jsp - *.jsp - *.jspx - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 30 - - - - - - - - - - - - - 123 - application/vnd.lotus-1-2-3 - - - 3dml - text/vnd.in3d.3dml - - - 3ds - image/x-3ds - - - 3g2 - video/3gpp2 - - - 3gp - video/3gpp - - - 7z - application/x-7z-compressed - - - aab - application/x-authorware-bin - - - aac - audio/x-aac - - - aam - application/x-authorware-map - - - aas - application/x-authorware-seg - - - abs - audio/x-mpeg - - - abw - application/x-abiword - - - ac - application/pkix-attr-cert - - - acc - application/vnd.americandynamics.acc - - - ace - application/x-ace-compressed - - - acu - application/vnd.acucobol - - - acutc - application/vnd.acucorp - - - adp - audio/adpcm - - - aep - application/vnd.audiograph - - - afm - application/x-font-type1 - - - afp - application/vnd.ibm.modcap - - - ahead - application/vnd.ahead.space - - - ai - application/postscript - - - aif - audio/x-aiff - - - aifc - audio/x-aiff - - - aiff - audio/x-aiff - - - aim - application/x-aim - - - air - application/vnd.adobe.air-application-installer-package+zip - - - ait - application/vnd.dvb.ait - - - ami - application/vnd.amiga.ami - - - anx - application/annodex - - - apk - application/vnd.android.package-archive - - - appcache - text/cache-manifest - - - application - application/x-ms-application - - - apr - application/vnd.lotus-approach - - - arc - application/x-freearc - - - art - image/x-jg - - - asc - application/pgp-signature - - - asf - video/x-ms-asf - - - asm - text/x-asm - - - aso - application/vnd.accpac.simply.aso - - - asx - video/x-ms-asf - - - atc - application/vnd.acucorp - - - atom - application/atom+xml - - - atomcat - application/atomcat+xml - - - atomsvc - application/atomsvc+xml - - - atx - application/vnd.antix.game-component - - - au - audio/basic - - - avi - video/x-msvideo - - - avx - video/x-rad-screenplay - - - aw - application/applixware - - - axa - audio/annodex - - - axv - video/annodex - - - azf - application/vnd.airzip.filesecure.azf - - - azs - application/vnd.airzip.filesecure.azs - - - azw - application/vnd.amazon.ebook - - - bat - application/x-msdownload - - - bcpio - application/x-bcpio - - - bdf - application/x-font-bdf - - - bdm - application/vnd.syncml.dm+wbxml - - - bed - application/vnd.realvnc.bed - - - bh2 - application/vnd.fujitsu.oasysprs - - - bin - application/octet-stream - - - blb - application/x-blorb - - - blorb - application/x-blorb - - - bmi - application/vnd.bmi - - - bmp - image/bmp - - - body - text/html - - - book - application/vnd.framemaker - - - box - application/vnd.previewsystems.box - - - boz - application/x-bzip2 - - - bpk - application/octet-stream - - - btif - image/prs.btif - - - bz - application/x-bzip - - - bz2 - application/x-bzip2 - - - c - text/x-c - - - c11amc - application/vnd.cluetrust.cartomobile-config - - - c11amz - application/vnd.cluetrust.cartomobile-config-pkg - - - c4d - application/vnd.clonk.c4group - - - c4f - application/vnd.clonk.c4group - - - c4g - application/vnd.clonk.c4group - - - c4p - application/vnd.clonk.c4group - - - c4u - application/vnd.clonk.c4group - - - cab - application/vnd.ms-cab-compressed - - - caf - audio/x-caf - - - cap - application/vnd.tcpdump.pcap - - - car - application/vnd.curl.car - - - cat - application/vnd.ms-pki.seccat - - - cb7 - application/x-cbr - - - cba - application/x-cbr - - - cbr - application/x-cbr - - - cbt - application/x-cbr - - - cbz - application/x-cbr - - - cc - text/x-c - - - cct - application/x-director - - - ccxml - application/ccxml+xml - - - cdbcmsg - application/vnd.contact.cmsg - - - cdf - application/x-cdf - - - cdkey - application/vnd.mediastation.cdkey - - - cdmia - application/cdmi-capability - - - cdmic - application/cdmi-container - - - cdmid - application/cdmi-domain - - - cdmio - application/cdmi-object - - - cdmiq - application/cdmi-queue - - - cdx - chemical/x-cdx - - - cdxml - application/vnd.chemdraw+xml - - - cdy - application/vnd.cinderella - - - cer - application/pkix-cert - - - cfs - application/x-cfs-compressed - - - cgm - image/cgm - - - chat - application/x-chat - - - chm - application/vnd.ms-htmlhelp - - - chrt - application/vnd.kde.kchart - - - cif - chemical/x-cif - - - cii - application/vnd.anser-web-certificate-issue-initiation - - - cil - application/vnd.ms-artgalry - - - cla - application/vnd.claymore - - - class - application/java - - - clkk - application/vnd.crick.clicker.keyboard - - - clkp - application/vnd.crick.clicker.palette - - - clkt - application/vnd.crick.clicker.template - - - clkw - application/vnd.crick.clicker.wordbank - - - clkx - application/vnd.crick.clicker - - - clp - application/x-msclip - - - cmc - application/vnd.cosmocaller - - - cmdf - chemical/x-cmdf - - - cml - chemical/x-cml - - - cmp - application/vnd.yellowriver-custom-menu - - - cmx - image/x-cmx - - - cod - application/vnd.rim.cod - - - com - application/x-msdownload - - - conf - text/plain - - - cpio - application/x-cpio - - - cpp - text/x-c - - - cpt - application/mac-compactpro - - - crd - application/x-mscardfile - - - crl - application/pkix-crl - - - crt - application/x-x509-ca-cert - - - cryptonote - application/vnd.rig.cryptonote - - - csh - application/x-csh - - - csml - chemical/x-csml - - - csp - application/vnd.commonspace - - - css - text/css - - - cst - application/x-director - - - csv - text/csv - - - cu - application/cu-seeme - - - curl - text/vnd.curl - - - cww - application/prs.cww - - - cxt - application/x-director - - - cxx - text/x-c - - - dae - model/vnd.collada+xml - - - daf - application/vnd.mobius.daf - - - dart - application/vnd.dart - - - dataless - application/vnd.fdsn.seed - - - davmount - application/davmount+xml - - - dbk - application/docbook+xml - - - dcr - application/x-director - - - dcurl - text/vnd.curl.dcurl - - - dd2 - application/vnd.oma.dd2+xml - - - ddd - application/vnd.fujixerox.ddd - - - deb - application/x-debian-package - - - def - text/plain - - - deploy - application/octet-stream - - - der - application/x-x509-ca-cert - - - dfac - application/vnd.dreamfactory - - - dgc - application/x-dgc-compressed - - - dib - image/bmp - - - dic - text/x-c - - - dir - application/x-director - - - dis - application/vnd.mobius.dis - - - dist - application/octet-stream - - - distz - application/octet-stream - - - djv - image/vnd.djvu - - - djvu - image/vnd.djvu - - - dll - application/x-msdownload - - - dmg - application/x-apple-diskimage - - - dmp - application/vnd.tcpdump.pcap - - - dms - application/octet-stream - - - dna - application/vnd.dna - - - doc - application/msword - - - docm - application/vnd.ms-word.document.macroenabled.12 - - - docx - application/vnd.openxmlformats-officedocument.wordprocessingml.document - - - dot - application/msword - - - dotm - application/vnd.ms-word.template.macroenabled.12 - - - dotx - application/vnd.openxmlformats-officedocument.wordprocessingml.template - - - dp - application/vnd.osgi.dp - - - dpg - application/vnd.dpgraph - - - dra - audio/vnd.dra - - - dsc - text/prs.lines.tag - - - dssc - application/dssc+der - - - dtb - application/x-dtbook+xml - - - dtd - application/xml-dtd - - - dts - audio/vnd.dts - - - dtshd - audio/vnd.dts.hd - - - dump - application/octet-stream - - - dv - video/x-dv - - - dvb - video/vnd.dvb.file - - - dvi - application/x-dvi - - - dwf - model/vnd.dwf - - - dwg - image/vnd.dwg - - - dxf - image/vnd.dxf - - - dxp - application/vnd.spotfire.dxp - - - dxr - application/x-director - - - ecelp4800 - audio/vnd.nuera.ecelp4800 - - - ecelp7470 - audio/vnd.nuera.ecelp7470 - - - ecelp9600 - audio/vnd.nuera.ecelp9600 - - - ecma - application/ecmascript - - - edm - application/vnd.novadigm.edm - - - edx - application/vnd.novadigm.edx - - - efif - application/vnd.picsel - - - ei6 - application/vnd.pg.osasli - - - elc - application/octet-stream - - - emf - application/x-msmetafile - - - eml - message/rfc822 - - - emma - application/emma+xml - - - emz - application/x-msmetafile - - - eol - audio/vnd.digital-winds - - - eot - application/vnd.ms-fontobject - - - eps - application/postscript - - - epub - application/epub+zip - - - es3 - application/vnd.eszigno3+xml - - - esa - application/vnd.osgi.subsystem - - - esf - application/vnd.epson.esf - - - et3 - application/vnd.eszigno3+xml - - - etx - text/x-setext - - - eva - application/x-eva - - - evy - application/x-envoy - - - exe - application/octet-stream - - - exi - application/exi - - - ext - application/vnd.novadigm.ext - - - ez - application/andrew-inset - - - ez2 - application/vnd.ezpix-album - - - ez3 - application/vnd.ezpix-package - - - f - text/x-fortran - - - f4v - video/x-f4v - - - f77 - text/x-fortran - - - f90 - text/x-fortran - - - fbs - image/vnd.fastbidsheet - - - fcdt - application/vnd.adobe.formscentral.fcdt - - - fcs - application/vnd.isac.fcs - - - fdf - application/vnd.fdf - - - fe_launch - application/vnd.denovo.fcselayout-link - - - fg5 - application/vnd.fujitsu.oasysgp - - - fgd - application/x-director - - - fh - image/x-freehand - - - fh4 - image/x-freehand - - - fh5 - image/x-freehand - - - fh7 - image/x-freehand - - - fhc - image/x-freehand - - - fig - application/x-xfig - - - flac - audio/flac - - - fli - video/x-fli - - - flo - application/vnd.micrografx.flo - - - flv - video/x-flv - - - flw - application/vnd.kde.kivio - - - flx - text/vnd.fmi.flexstor - - - fly - text/vnd.fly - - - fm - application/vnd.framemaker - - - fnc - application/vnd.frogans.fnc - - - for - text/x-fortran - - - fpx - image/vnd.fpx - - - frame - application/vnd.framemaker - - - fsc - application/vnd.fsc.weblaunch - - - fst - image/vnd.fst - - - ftc - application/vnd.fluxtime.clip - - - fti - application/vnd.anser-web-funds-transfer-initiation - - - fvt - video/vnd.fvt - - - fxp - application/vnd.adobe.fxp - - - fxpl - application/vnd.adobe.fxp - - - fzs - application/vnd.fuzzysheet - - - g2w - application/vnd.geoplan - - - g3 - image/g3fax - - - g3w - application/vnd.geospace - - - gac - application/vnd.groove-account - - - gam - application/x-tads - - - gbr - application/rpki-ghostbusters - - - gca - application/x-gca-compressed - - - gdl - model/vnd.gdl - - - geo - application/vnd.dynageo - - - gex - application/vnd.geometry-explorer - - - ggb - application/vnd.geogebra.file - - - ggt - application/vnd.geogebra.tool - - - ghf - application/vnd.groove-help - - - gif - image/gif - - - gim - application/vnd.groove-identity-message - - - gml - application/gml+xml - - - gmx - application/vnd.gmx - - - gnumeric - application/x-gnumeric - - - gph - application/vnd.flographit - - - gpx - application/gpx+xml - - - gqf - application/vnd.grafeq - - - gqs - application/vnd.grafeq - - - gram - application/srgs - - - gramps - application/x-gramps-xml - - - gre - application/vnd.geometry-explorer - - - grv - application/vnd.groove-injector - - - grxml - application/srgs+xml - - - gsf - application/x-font-ghostscript - - - gtar - application/x-gtar - - - gtm - application/vnd.groove-tool-message - - - gtw - model/vnd.gtw - - - gv - text/vnd.graphviz - - - gxf - application/gxf - - - gxt - application/vnd.geonext - - - gz - application/x-gzip - - - h - text/x-c - - - h261 - video/h261 - - - h263 - video/h263 - - - h264 - video/h264 - - - hal - application/vnd.hal+xml - - - hbci - application/vnd.hbci - - - hdf - application/x-hdf - - - hh - text/x-c - - - hlp - application/winhlp - - - hpgl - application/vnd.hp-hpgl - - - hpid - application/vnd.hp-hpid - - - hps - application/vnd.hp-hps - - - hqx - application/mac-binhex40 - - - htc - text/x-component - - - htke - application/vnd.kenameaapp - - - htm - text/html - - - html - text/html - - - hvd - application/vnd.yamaha.hv-dic - - - hvp - application/vnd.yamaha.hv-voice - - - hvs - application/vnd.yamaha.hv-script - - - i2g - application/vnd.intergeo - - - icc - application/vnd.iccprofile - - - ice - x-conference/x-cooltalk - - - icm - application/vnd.iccprofile - - - ico - image/x-icon - - - ics - text/calendar - - - ief - image/ief - - - ifb - text/calendar - - - ifm - application/vnd.shana.informed.formdata - - - iges - model/iges - - - igl - application/vnd.igloader - - - igm - application/vnd.insors.igm - - - igs - model/iges - - - igx - application/vnd.micrografx.igx - - - iif - application/vnd.shana.informed.interchange - - - imp - application/vnd.accpac.simply.imp - - - ims - application/vnd.ms-ims - - - in - text/plain - - - ink - application/inkml+xml - - - inkml - application/inkml+xml - - - install - application/x-install-instructions - - - iota - application/vnd.astraea-software.iota - - - ipfix - application/ipfix - - - ipk - application/vnd.shana.informed.package - - - irm - application/vnd.ibm.rights-management - - - irp - application/vnd.irepository.package+xml - - - iso - application/x-iso9660-image - - - itp - application/vnd.shana.informed.formtemplate - - - ivp - application/vnd.immervision-ivp - - - ivu - application/vnd.immervision-ivu - - - jad - text/vnd.sun.j2me.app-descriptor - - - jam - application/vnd.jam - - - jar - application/java-archive - - - java - text/x-java-source - - - jisp - application/vnd.jisp - - - jlt - application/vnd.hp-jlyt - - - jnlp - application/x-java-jnlp-file - - - joda - application/vnd.joost.joda-archive - - - jpe - image/jpeg - - - jpeg - image/jpeg - - - jpg - image/jpeg - - - jpgm - video/jpm - - - jpgv - video/jpeg - - - jpm - video/jpm - - - js - application/javascript - - - jsf - text/plain - - - json - application/json - - - jsonml - application/jsonml+json - - - jspf - text/plain - - - kar - audio/midi - - - karbon - application/vnd.kde.karbon - - - kfo - application/vnd.kde.kformula - - - kia - application/vnd.kidspiration - - - kml - application/vnd.google-earth.kml+xml - - - kmz - application/vnd.google-earth.kmz - - - kne - application/vnd.kinar - - - knp - application/vnd.kinar - - - kon - application/vnd.kde.kontour - - - kpr - application/vnd.kde.kpresenter - - - kpt - application/vnd.kde.kpresenter - - - kpxx - application/vnd.ds-keypoint - - - ksp - application/vnd.kde.kspread - - - ktr - application/vnd.kahootz - - - ktx - image/ktx - - - ktz - application/vnd.kahootz - - - kwd - application/vnd.kde.kword - - - kwt - application/vnd.kde.kword - - - lasxml - application/vnd.las.las+xml - - - latex - application/x-latex - - - lbd - application/vnd.llamagraphics.life-balance.desktop - - - lbe - application/vnd.llamagraphics.life-balance.exchange+xml - - - les - application/vnd.hhe.lesson-player - - - lha - application/x-lzh-compressed - - - link66 - application/vnd.route66.link66+xml - - - list - text/plain - - - list3820 - application/vnd.ibm.modcap - - - listafp - application/vnd.ibm.modcap - - - lnk - application/x-ms-shortcut - - - log - text/plain - - - lostxml - application/lost+xml - - - lrf - application/octet-stream - - - lrm - application/vnd.ms-lrm - - - ltf - application/vnd.frogans.ltf - - - lvp - audio/vnd.lucent.voice - - - lwp - application/vnd.lotus-wordpro - - - lzh - application/x-lzh-compressed - - - m13 - application/x-msmediaview - - - m14 - application/x-msmediaview - - - m1v - video/mpeg - - - m21 - application/mp21 - - - m2a - audio/mpeg - - - m2v - video/mpeg - - - m3a - audio/mpeg - - - m3u - audio/x-mpegurl - - - m3u8 - application/vnd.apple.mpegurl - - - m4a - audio/mp4 - - - m4b - audio/mp4 - - - m4r - audio/mp4 - - - m4u - video/vnd.mpegurl - - - m4v - video/mp4 - - - ma - application/mathematica - - - mac - image/x-macpaint - - - mads - application/mads+xml - - - mag - application/vnd.ecowin.chart - - - maker - application/vnd.framemaker - - - man - text/troff - - - mar - application/octet-stream - - - mathml - application/mathml+xml - - - mb - application/mathematica - - - mbk - application/vnd.mobius.mbk - - - mbox - application/mbox - - - mc1 - application/vnd.medcalcdata - - - mcd - application/vnd.mcd - - - mcurl - text/vnd.curl.mcurl - - - mdb - application/x-msaccess - - - mdi - image/vnd.ms-modi - - - me - text/troff - - - mesh - model/mesh - - - meta4 - application/metalink4+xml - - - metalink - application/metalink+xml - - - mets - application/mets+xml - - - mfm - application/vnd.mfmp - - - mft - application/rpki-manifest - - - mgp - application/vnd.osgeo.mapguide.package - - - mgz - application/vnd.proteus.magazine - - - mid - audio/midi - - - midi - audio/midi - - - mie - application/x-mie - - - mif - application/x-mif - - - mime - message/rfc822 - - - mj2 - video/mj2 - - - mjp2 - video/mj2 - - - mk3d - video/x-matroska - - - mka - audio/x-matroska - - - mks - video/x-matroska - - - mkv - video/x-matroska - - - mlp - application/vnd.dolby.mlp - - - mmd - application/vnd.chipnuts.karaoke-mmd - - - mmf - application/vnd.smaf - - - mmr - image/vnd.fujixerox.edmics-mmr - - - mng - video/x-mng - - - mny - application/x-msmoney - - - mobi - application/x-mobipocket-ebook - - - mods - application/mods+xml - - - mov - video/quicktime - - - movie - video/x-sgi-movie - - - mp1 - audio/mpeg - - - mp2 - audio/mpeg - - - mp21 - application/mp21 - - - mp2a - audio/mpeg - - - mp3 - audio/mpeg - - - mp4 - video/mp4 - - - mp4a - audio/mp4 - - - mp4s - application/mp4 - - - mp4v - video/mp4 - - - mpa - audio/mpeg - - - mpc - application/vnd.mophun.certificate - - - mpe - video/mpeg - - - mpeg - video/mpeg - - - mpega - audio/x-mpeg - - - mpg - video/mpeg - - - mpg4 - video/mp4 - - - mpga - audio/mpeg - - - mpkg - application/vnd.apple.installer+xml - - - mpm - application/vnd.blueice.multipass - - - mpn - application/vnd.mophun.application - - - mpp - application/vnd.ms-project - - - mpt - application/vnd.ms-project - - - mpv2 - video/mpeg2 - - - mpy - application/vnd.ibm.minipay - - - mqy - application/vnd.mobius.mqy - - - mrc - application/marc - - - mrcx - application/marcxml+xml - - - ms - text/troff - - - mscml - application/mediaservercontrol+xml - - - mseed - application/vnd.fdsn.mseed - - - mseq - application/vnd.mseq - - - msf - application/vnd.epson.msf - - - msh - model/mesh - - - msi - application/x-msdownload - - - msl - application/vnd.mobius.msl - - - msty - application/vnd.muvee.style - - - mts - model/vnd.mts - - - mus - application/vnd.musician - - - musicxml - application/vnd.recordare.musicxml+xml - - - mvb - application/x-msmediaview - - - mwf - application/vnd.mfer - - - mxf - application/mxf - - - mxl - application/vnd.recordare.musicxml - - - mxml - application/xv+xml - - - mxs - application/vnd.triscape.mxs - - - mxu - video/vnd.mpegurl - - - n-gage - application/vnd.nokia.n-gage.symbian.install - - - n3 - text/n3 - - - nb - application/mathematica - - - nbp - application/vnd.wolfram.player - - - nc - application/x-netcdf - - - ncx - application/x-dtbncx+xml - - - nfo - text/x-nfo - - - ngdat - application/vnd.nokia.n-gage.data - - - nitf - application/vnd.nitf - - - nlu - application/vnd.neurolanguage.nlu - - - nml - application/vnd.enliven - - - nnd - application/vnd.noblenet-directory - - - nns - application/vnd.noblenet-sealer - - - nnw - application/vnd.noblenet-web - - - npx - image/vnd.net-fpx - - - nsc - application/x-conference - - - nsf - application/vnd.lotus-notes - - - ntf - application/vnd.nitf - - - nzb - application/x-nzb - - - oa2 - application/vnd.fujitsu.oasys2 - - - oa3 - application/vnd.fujitsu.oasys3 - - - oas - application/vnd.fujitsu.oasys - - - obd - application/x-msbinder - - - obj - application/x-tgif - - - oda - application/oda - - - - odb - application/vnd.oasis.opendocument.database - - - - odc - application/vnd.oasis.opendocument.chart - - - - odf - application/vnd.oasis.opendocument.formula - - - odft - application/vnd.oasis.opendocument.formula-template - - - - odg - application/vnd.oasis.opendocument.graphics - - - - odi - application/vnd.oasis.opendocument.image - - - - odm - application/vnd.oasis.opendocument.text-master - - - - odp - application/vnd.oasis.opendocument.presentation - - - - ods - application/vnd.oasis.opendocument.spreadsheet - - - - odt - application/vnd.oasis.opendocument.text - - - oga - audio/ogg - - - ogg - audio/ogg - - - ogv - video/ogg - - - - ogx - application/ogg - - - omdoc - application/omdoc+xml - - - onepkg - application/onenote - - - onetmp - application/onenote - - - onetoc - application/onenote - - - onetoc2 - application/onenote - - - opf - application/oebps-package+xml - - - opml - text/x-opml - - - oprc - application/vnd.palm - - - org - application/vnd.lotus-organizer - - - osf - application/vnd.yamaha.openscoreformat - - - osfpvg - application/vnd.yamaha.openscoreformat.osfpvg+xml - - - otc - application/vnd.oasis.opendocument.chart-template - - - otf - font/otf - - - - otg - application/vnd.oasis.opendocument.graphics-template - - - - oth - application/vnd.oasis.opendocument.text-web - - - oti - application/vnd.oasis.opendocument.image-template - - - - otp - application/vnd.oasis.opendocument.presentation-template - - - - ots - application/vnd.oasis.opendocument.spreadsheet-template - - - - ott - application/vnd.oasis.opendocument.text-template - - - oxps - application/oxps - - - oxt - application/vnd.openofficeorg.extension - - - p - text/x-pascal - - - p10 - application/pkcs10 - - - p12 - application/x-pkcs12 - - - p7b - application/x-pkcs7-certificates - - - p7c - application/pkcs7-mime - - - p7m - application/pkcs7-mime - - - p7r - application/x-pkcs7-certreqresp - - - p7s - application/pkcs7-signature - - - p8 - application/pkcs8 - - - pas - text/x-pascal - - - paw - application/vnd.pawaafile - - - pbd - application/vnd.powerbuilder6 - - - pbm - image/x-portable-bitmap - - - pcap - application/vnd.tcpdump.pcap - - - pcf - application/x-font-pcf - - - pcl - application/vnd.hp-pcl - - - pclxl - application/vnd.hp-pclxl - - - pct - image/pict - - - pcurl - application/vnd.curl.pcurl - - - pcx - image/x-pcx - - - pdb - application/vnd.palm - - - pdf - application/pdf - - - pfa - application/x-font-type1 - - - pfb - application/x-font-type1 - - - pfm - application/x-font-type1 - - - pfr - application/font-tdpfr - - - pfx - application/x-pkcs12 - - - pgm - image/x-portable-graymap - - - pgn - application/x-chess-pgn - - - pgp - application/pgp-encrypted - - - pic - image/pict - - - pict - image/pict - - - pkg - application/octet-stream - - - pki - application/pkixcmp - - - pkipath - application/pkix-pkipath - - - plb - application/vnd.3gpp.pic-bw-large - - - plc - application/vnd.mobius.plc - - - plf - application/vnd.pocketlearn - - - pls - audio/x-scpls - - - pml - application/vnd.ctc-posml - - - png - image/png - - - pnm - image/x-portable-anymap - - - pnt - image/x-macpaint - - - portpkg - application/vnd.macports.portpkg - - - pot - application/vnd.ms-powerpoint - - - potm - application/vnd.ms-powerpoint.template.macroenabled.12 - - - potx - application/vnd.openxmlformats-officedocument.presentationml.template - - - ppam - application/vnd.ms-powerpoint.addin.macroenabled.12 - - - ppd - application/vnd.cups-ppd - - - ppm - image/x-portable-pixmap - - - pps - application/vnd.ms-powerpoint - - - ppsm - application/vnd.ms-powerpoint.slideshow.macroenabled.12 - - - ppsx - application/vnd.openxmlformats-officedocument.presentationml.slideshow - - - ppt - application/vnd.ms-powerpoint - - - pptm - application/vnd.ms-powerpoint.presentation.macroenabled.12 - - - pptx - application/vnd.openxmlformats-officedocument.presentationml.presentation - - - pqa - application/vnd.palm - - - prc - application/x-mobipocket-ebook - - - pre - application/vnd.lotus-freelance - - - prf - application/pics-rules - - - ps - application/postscript - - - psb - application/vnd.3gpp.pic-bw-small - - - psd - image/vnd.adobe.photoshop - - - psf - application/x-font-linux-psf - - - pskcxml - application/pskc+xml - - - ptid - application/vnd.pvi.ptid1 - - - pub - application/x-mspublisher - - - pvb - application/vnd.3gpp.pic-bw-var - - - pwn - application/vnd.3m.post-it-notes - - - pya - audio/vnd.ms-playready.media.pya - - - pyv - video/vnd.ms-playready.media.pyv - - - qam - application/vnd.epson.quickanime - - - qbo - application/vnd.intu.qbo - - - qfx - application/vnd.intu.qfx - - - qps - application/vnd.publishare-delta-tree - - - qt - video/quicktime - - - qti - image/x-quicktime - - - qtif - image/x-quicktime - - - qwd - application/vnd.quark.quarkxpress - - - qwt - application/vnd.quark.quarkxpress - - - qxb - application/vnd.quark.quarkxpress - - - qxd - application/vnd.quark.quarkxpress - - - qxl - application/vnd.quark.quarkxpress - - - qxt - application/vnd.quark.quarkxpress - - - ra - audio/x-pn-realaudio - - - ram - audio/x-pn-realaudio - - - rar - application/x-rar-compressed - - - ras - image/x-cmu-raster - - - rcprofile - application/vnd.ipunplugged.rcprofile - - - rdf - application/rdf+xml - - - rdz - application/vnd.data-vision.rdz - - - rep - application/vnd.businessobjects - - - res - application/x-dtbresource+xml - - - rgb - image/x-rgb - - - rif - application/reginfo+xml - - - rip - audio/vnd.rip - - - ris - application/x-research-info-systems - - - rl - application/resource-lists+xml - - - rlc - image/vnd.fujixerox.edmics-rlc - - - rld - application/resource-lists-diff+xml - - - rm - application/vnd.rn-realmedia - - - rmi - audio/midi - - - rmp - audio/x-pn-realaudio-plugin - - - rms - application/vnd.jcp.javame.midlet-rms - - - rmvb - application/vnd.rn-realmedia-vbr - - - rnc - application/relax-ng-compact-syntax - - - roa - application/rpki-roa - - - roff - text/troff - - - rp9 - application/vnd.cloanto.rp9 - - - rpss - application/vnd.nokia.radio-presets - - - rpst - application/vnd.nokia.radio-preset - - - rq - application/sparql-query - - - rs - application/rls-services+xml - - - rsd - application/rsd+xml - - - rss - application/rss+xml - - - rtf - application/rtf - - - rtx - text/richtext - - - s - text/x-asm - - - s3m - audio/s3m - - - saf - application/vnd.yamaha.smaf-audio - - - sbml - application/sbml+xml - - - sc - application/vnd.ibm.secure-container - - - scd - application/x-msschedule - - - scm - application/vnd.lotus-screencam - - - scq - application/scvp-cv-request - - - scs - application/scvp-cv-response - - - scurl - text/vnd.curl.scurl - - - sda - application/vnd.stardivision.draw - - - sdc - application/vnd.stardivision.calc - - - sdd - application/vnd.stardivision.impress - - - sdkd - application/vnd.solent.sdkm+xml - - - sdkm - application/vnd.solent.sdkm+xml - - - sdp - application/sdp - - - sdw - application/vnd.stardivision.writer - - - see - application/vnd.seemail - - - seed - application/vnd.fdsn.seed - - - sema - application/vnd.sema - - - semd - application/vnd.semd - - - semf - application/vnd.semf - - - ser - application/java-serialized-object - - - setpay - application/set-payment-initiation - - - setreg - application/set-registration-initiation - - - sfd-hdstx - application/vnd.hydrostatix.sof-data - - - sfs - application/vnd.spotfire.sfs - - - sfv - text/x-sfv - - - sgi - image/sgi - - - sgl - application/vnd.stardivision.writer-global - - - sgm - text/sgml - - - sgml - text/sgml - - - sh - application/x-sh - - - shar - application/x-shar - - - shf - application/shf+xml - - - - sid - image/x-mrsid-image - - - sig - application/pgp-signature - - - sil - audio/silk - - - silo - model/mesh - - - sis - application/vnd.symbian.install - - - sisx - application/vnd.symbian.install - - - sit - application/x-stuffit - - - sitx - application/x-stuffitx - - - skd - application/vnd.koan - - - skm - application/vnd.koan - - - skp - application/vnd.koan - - - skt - application/vnd.koan - - - sldm - application/vnd.ms-powerpoint.slide.macroenabled.12 - - - sldx - application/vnd.openxmlformats-officedocument.presentationml.slide - - - slt - application/vnd.epson.salt - - - sm - application/vnd.stepmania.stepchart - - - smf - application/vnd.stardivision.math - - - smi - application/smil+xml - - - smil - application/smil+xml - - - smv - video/x-smv - - - smzip - application/vnd.stepmania.package - - - snd - audio/basic - - - snf - application/x-font-snf - - - so - application/octet-stream - - - spc - application/x-pkcs7-certificates - - - spf - application/vnd.yamaha.smaf-phrase - - - spl - application/x-futuresplash - - - spot - text/vnd.in3d.spot - - - spp - application/scvp-vp-response - - - spq - application/scvp-vp-request - - - spx - audio/ogg - - - sql - application/x-sql - - - src - application/x-wais-source - - - srt - application/x-subrip - - - sru - application/sru+xml - - - srx - application/sparql-results+xml - - - ssdl - application/ssdl+xml - - - sse - application/vnd.kodak-descriptor - - - ssf - application/vnd.epson.ssf - - - ssml - application/ssml+xml - - - st - application/vnd.sailingtracker.track - - - stc - application/vnd.sun.xml.calc.template - - - std - application/vnd.sun.xml.draw.template - - - stf - application/vnd.wt.stf - - - sti - application/vnd.sun.xml.impress.template - - - stk - application/hyperstudio - - - stl - application/vnd.ms-pki.stl - - - str - application/vnd.pg.format - - - stw - application/vnd.sun.xml.writer.template - - - sub - text/vnd.dvb.subtitle - - - sus - application/vnd.sus-calendar - - - susp - application/vnd.sus-calendar - - - sv4cpio - application/x-sv4cpio - - - sv4crc - application/x-sv4crc - - - svc - application/vnd.dvb.service - - - svd - application/vnd.svd - - - svg - image/svg+xml - - - svgz - image/svg+xml - - - swa - application/x-director - - - swf - application/x-shockwave-flash - - - swi - application/vnd.aristanetworks.swi - - - sxc - application/vnd.sun.xml.calc - - - sxd - application/vnd.sun.xml.draw - - - sxg - application/vnd.sun.xml.writer.global - - - sxi - application/vnd.sun.xml.impress - - - sxm - application/vnd.sun.xml.math - - - sxw - application/vnd.sun.xml.writer - - - t - text/troff - - - t3 - application/x-t3vm-image - - - taglet - application/vnd.mynfc - - - tao - application/vnd.tao.intent-module-archive - - - tar - application/x-tar - - - tcap - application/vnd.3gpp2.tcap - - - tcl - application/x-tcl - - - teacher - application/vnd.smart.teacher - - - tei - application/tei+xml - - - teicorpus - application/tei+xml - - - tex - application/x-tex - - - texi - application/x-texinfo - - - texinfo - application/x-texinfo - - - text - text/plain - - - tfi - application/thraud+xml - - - tfm - application/x-tex-tfm - - - tga - image/x-tga - - - thmx - application/vnd.ms-officetheme - - - tif - image/tiff - - - tiff - image/tiff - - - tmo - application/vnd.tmobile-livetv - - - torrent - application/x-bittorrent - - - tpl - application/vnd.groove-tool-template - - - tpt - application/vnd.trid.tpt - - - tr - text/troff - - - tra - application/vnd.trueapp - - - trm - application/x-msterminal - - - tsd - application/timestamped-data - - - tsv - text/tab-separated-values - - - ttc - font/collection - - - ttf - font/ttf - - - ttl - text/turtle - - - twd - application/vnd.simtech-mindmapper - - - twds - application/vnd.simtech-mindmapper - - - txd - application/vnd.genomatix.tuxedo - - - txf - application/vnd.mobius.txf - - - txt - text/plain - - - u32 - application/x-authorware-bin - - - udeb - application/x-debian-package - - - ufd - application/vnd.ufdl - - - ufdl - application/vnd.ufdl - - - ulw - audio/basic - - - ulx - application/x-glulx - - - umj - application/vnd.umajin - - - unityweb - application/vnd.unity - - - uoml - application/vnd.uoml+xml - - - uri - text/uri-list - - - uris - text/uri-list - - - urls - text/uri-list - - - ustar - application/x-ustar - - - utz - application/vnd.uiq.theme - - - uu - text/x-uuencode - - - uva - audio/vnd.dece.audio - - - uvd - application/vnd.dece.data - - - uvf - application/vnd.dece.data - - - uvg - image/vnd.dece.graphic - - - uvh - video/vnd.dece.hd - - - uvi - image/vnd.dece.graphic - - - uvm - video/vnd.dece.mobile - - - uvp - video/vnd.dece.pd - - - uvs - video/vnd.dece.sd - - - uvt - application/vnd.dece.ttml+xml - - - uvu - video/vnd.uvvu.mp4 - - - uvv - video/vnd.dece.video - - - uvva - audio/vnd.dece.audio - - - uvvd - application/vnd.dece.data - - - uvvf - application/vnd.dece.data - - - uvvg - image/vnd.dece.graphic - - - uvvh - video/vnd.dece.hd - - - uvvi - image/vnd.dece.graphic - - - uvvm - video/vnd.dece.mobile - - - uvvp - video/vnd.dece.pd - - - uvvs - video/vnd.dece.sd - - - uvvt - application/vnd.dece.ttml+xml - - - uvvu - video/vnd.uvvu.mp4 - - - uvvv - video/vnd.dece.video - - - uvvx - application/vnd.dece.unspecified - - - uvvz - application/vnd.dece.zip - - - uvx - application/vnd.dece.unspecified - - - uvz - application/vnd.dece.zip - - - vcard - text/vcard - - - vcd - application/x-cdlink - - - vcf - text/x-vcard - - - vcg - application/vnd.groove-vcard - - - vcs - text/x-vcalendar - - - vcx - application/vnd.vcx - - - vis - application/vnd.visionary - - - viv - video/vnd.vivo - - - vob - video/x-ms-vob - - - vor - application/vnd.stardivision.writer - - - vox - application/x-authorware-bin - - - vrml - model/vrml - - - vsd - application/vnd.visio - - - vsf - application/vnd.vsf - - - vss - application/vnd.visio - - - vst - application/vnd.visio - - - vsw - application/vnd.visio - - - vtu - model/vnd.vtu - - - vxml - application/voicexml+xml - - - w3d - application/x-director - - - wad - application/x-doom - - - wav - audio/x-wav - - - wax - audio/x-ms-wax - - - - wbmp - image/vnd.wap.wbmp - - - wbs - application/vnd.criticaltools.wbs+xml - - - wbxml - application/vnd.wap.wbxml - - - wcm - application/vnd.ms-works - - - wdb - application/vnd.ms-works - - - wdp - image/vnd.ms-photo - - - weba - audio/webm - - - webm - video/webm - - - webp - image/webp - - - wg - application/vnd.pmi.widget - - - wgt - application/widget - - - wks - application/vnd.ms-works - - - wm - video/x-ms-wm - - - wma - audio/x-ms-wma - - - wmd - application/x-ms-wmd - - - wmf - application/x-msmetafile - - - - wml - text/vnd.wap.wml - - - - wmlc - application/vnd.wap.wmlc - - - - wmls - text/vnd.wap.wmlscript - - - - wmlsc - application/vnd.wap.wmlscriptc - - - wmv - video/x-ms-wmv - - - wmx - video/x-ms-wmx - - - wmz - application/x-msmetafile - - - woff - font/woff - - - woff2 - font/woff2 - - - wpd - application/vnd.wordperfect - - - wpl - application/vnd.ms-wpl - - - wps - application/vnd.ms-works - - - wqd - application/vnd.wqd - - - wri - application/x-mswrite - - - wrl - model/vrml - - - wsdl - application/wsdl+xml - - - wspolicy - application/wspolicy+xml - - - wtb - application/vnd.webturbo - - - wvx - video/x-ms-wvx - - - x32 - application/x-authorware-bin - - - x3d - model/x3d+xml - - - x3db - model/x3d+binary - - - x3dbz - model/x3d+binary - - - x3dv - model/x3d+vrml - - - x3dvz - model/x3d+vrml - - - x3dz - model/x3d+xml - - - xaml - application/xaml+xml - - - xap - application/x-silverlight-app - - - xar - application/vnd.xara - - - xbap - application/x-ms-xbap - - - xbd - application/vnd.fujixerox.docuworks.binder - - - xbm - image/x-xbitmap - - - xdf - application/xcap-diff+xml - - - xdm - application/vnd.syncml.dm+xml - - - xdp - application/vnd.adobe.xdp+xml - - - xdssc - application/dssc+xml - - - xdw - application/vnd.fujixerox.docuworks - - - xenc - application/xenc+xml - - - xer - application/patch-ops-error+xml - - - xfdf - application/vnd.adobe.xfdf - - - xfdl - application/vnd.xfdl - - - xht - application/xhtml+xml - - - xhtml - application/xhtml+xml - - - xhvml - application/xv+xml - - - xif - image/vnd.xiff - - - xla - application/vnd.ms-excel - - - xlam - application/vnd.ms-excel.addin.macroenabled.12 - - - xlc - application/vnd.ms-excel - - - xlf - application/x-xliff+xml - - - xlm - application/vnd.ms-excel - - - xls - application/vnd.ms-excel - - - xlsb - application/vnd.ms-excel.sheet.binary.macroenabled.12 - - - xlsm - application/vnd.ms-excel.sheet.macroenabled.12 - - - xlsx - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - - - xlt - application/vnd.ms-excel - - - xltm - application/vnd.ms-excel.template.macroenabled.12 - - - xltx - application/vnd.openxmlformats-officedocument.spreadsheetml.template - - - xlw - application/vnd.ms-excel - - - xm - audio/xm - - - xml - application/xml - - - xo - application/vnd.olpc-sugar - - - xop - application/xop+xml - - - xpi - application/x-xpinstall - - - xpl - application/xproc+xml - - - xpm - image/x-xpixmap - - - xpr - application/vnd.is-xpr - - - xps - application/vnd.ms-xpsdocument - - - xpw - application/vnd.intercon.formnet - - - xpx - application/vnd.intercon.formnet - - - xsl - application/xml - - - xslt - application/xslt+xml - - - xsm - application/vnd.syncml+xml - - - xspf - application/xspf+xml - - - xul - application/vnd.mozilla.xul+xml - - - xvm - application/xv+xml - - - xvml - application/xv+xml - - - xwd - image/x-xwindowdump - - - xyz - chemical/x-xyz - - - xz - application/x-xz - - - yang - application/yang - - - yin - application/yin+xml - - - z - application/x-compress - - - Z - application/x-compress - - - z1 - application/x-zmachine - - - z2 - application/x-zmachine - - - z3 - application/x-zmachine - - - z4 - application/x-zmachine - - - z5 - application/x-zmachine - - - z6 - application/x-zmachine - - - z7 - application/x-zmachine - - - z8 - application/x-zmachine - - - zaz - application/vnd.zzazz.deck+xml - - - zip - application/zip - - - zir - application/vnd.zul - - - zirz - application/vnd.zul - - - zmm - application/vnd.handheld-entertainment+xml - - - - - - - - - - - - - - - - - - index.html - index.htm - index.jsp - - - diff --git a/codes/javatool/javatool-embedded-server/src/main/webapp/WEB-INF/web.xml b/codes/javatool/javatool-embedded-server/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 974a088b..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - javatool - - - - spring-servlet - org.springframework.web.servlet.DispatcherServlet - 1 - - contextConfigLocation - classpath:spring/spring-servlet.xml - - - - spring-servlet - / - - - - - - - encodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - forceEncoding - true - - - - encodingFilter - /* - REQUEST - FORWARD - - - - - /views/jsp/index.jsp - - diff --git a/codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/hello.jsp b/codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/hello.jsp deleted file mode 100644 index 774fc949..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/hello.jsp +++ /dev/null @@ -1,16 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> -<% - String path = request.getContextPath(); - String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; -%> - - - - - HelloController - - -

    ${message}

    -回到首页
    - - diff --git a/codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/index.jsp b/codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/index.jsp deleted file mode 100644 index 763fee86..00000000 --- a/codes/javatool/javatool-embedded-server/src/main/webapp/views/jsp/index.jsp +++ /dev/null @@ -1,28 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> -<% - String path = request.getContextPath(); - String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; -%> - - - - - javatool - - - -

    javatool

    -

    <%out.print("Server Ip:" + basePath);%>

    -
    -

    示例列表

    - -
    - - diff --git a/codes/javatool/javatool-examples/pom.xml b/codes/javatool/javatool-examples/pom.xml deleted file mode 100644 index fcca7c05..00000000 --- a/codes/javatool/javatool-examples/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - 4.0.0 - - - io.github.dunwu - javatool-examples - 1.0.0 - Java 工具使用示例 - - - UTF-8 - 1.8 - ${java.version} - ${java.version} - 0.4.8 - 1.2.3 - - - - - log4j - log4j - 1.2.17 - - - ch.qos.logback - logback-classic - ${logback.version} - - - - - - - io.github.dunwu - dunwu-dependencies - ${dunwu.version} - pom - import - - - - - - ${artifactId} - - - true - src/main/resources - - logback.xml - log4j.xml - - - - - diff --git a/codes/javatool/javatool-examples/src/main/java/io/github/dunwu/javatool/ElasticDemo.java b/codes/javatool/javatool-examples/src/main/java/io/github/dunwu/javatool/ElasticDemo.java deleted file mode 100644 index c72bf5da..00000000 --- a/codes/javatool/javatool-examples/src/main/java/io/github/dunwu/javatool/ElasticDemo.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.github.dunwu.javatool; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * 向 Elastic 日志中心传输日志 Logback logstash-logback-encoder jar 包会根据 logback 中的配置,将日志数据定向传输到 logstash 详见 - * src/main/resources/logback.xml appender 配置 使用 udp 方式传输时,有丢失日志的情况(ELK-UDP) 使用 tcp 方式传输时,不会丢失日志(ELK-TCP) Log4j 通过 - * org.apache.log4j.net.SocketAppender 发送 TCP 数据,Logstash 服务器使用 log4j input 插件 接收 - * - * @author Zhang Peng - */ -public class ElasticDemo { - - private static final Logger logger = LoggerFactory.getLogger(ElasticDemo.class); - - private static final org.apache.log4j.Logger log4jLog = org.apache.log4j.Logger.getLogger(ElasticDemo.class); - - private static volatile int index = 0; - - public static void main(String[] args) { - // sendLog4jLog(); - sendLogbackLog(); - } - - private static void sendLogbackLog() { - ExecutorService executorService = Executors.newFixedThreadPool(100); - for (int i = 0; i < 10000; i++) { - executorService.submit(new Runnable() { - @Override - public void run() { - logger.info("这是第 {} 条日志", ++index); - } - }); - } - } - - private static void sendLog4jLog() { - for (int i = 0; i < 100; i++) { - log4jLog.info(String.format("这是第 %d 条日志", ++index)); - } - } - -} diff --git a/codes/javatool/javatool-examples/src/main/resources/log4j.xml b/codes/javatool/javatool-examples/src/main/resources/log4j.xml deleted file mode 100644 index e60d4b99..00000000 --- a/codes/javatool/javatool-examples/src/main/resources/log4j.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/codes/javatool/javatool-examples/src/main/resources/logback.xml b/codes/javatool/javatool-examples/src/main/resources/logback.xml deleted file mode 100644 index 2492bfb1..00000000 --- a/codes/javatool/javatool-examples/src/main/resources/logback.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n - - - - - - - - ${user.dir}/logs/${FILE_NAME}-all.%d{yyyy-MM-dd}.log - 30 - - - - - 30MB - - - - %d{HH:mm:ss.SSS} [%thread] [%-5p] %c{36}.%M - %m%n - - - - 192.168.28.32 - 9250 - - - - 192.168.28.32:9251 - 5 minutes - 6 second - 16384 - - {"appname":"metis"} - {"subappname":"metis-vdisk"} - - - - - - - - - - - - - - - - - - - diff --git a/codes/javatool/pom.xml b/codes/javatool/pom.xml deleted file mode 100644 index f17a7cc1..00000000 --- a/codes/javatool/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - 4.0.0 - - io.github.dunwu - javatool - 1.0.0 - pom - - javatool - Java 常用 Tool 使用示例 - - - javatool-embedded-server - javatool-examples - - diff --git a/docs/.remarkrc b/docs/.remarkrc new file mode 100644 index 00000000..5accdbba --- /dev/null +++ b/docs/.remarkrc @@ -0,0 +1,9 @@ +{ + "plugins": [ + "preset-lint-recommended", + "preset-lint-consistent", + + ["lint-list-item-indent", "space"], + ["lint-heading-style", false] + ] +} diff --git a/docs/.textlint.terms.json b/docs/.textlint.terms.json new file mode 100644 index 00000000..7ea8ecd7 --- /dev/null +++ b/docs/.textlint.terms.json @@ -0,0 +1,8 @@ +[ + "Stylus", + "VuePress", + [ + "front[- ]matter", + "frontmatter" + ] +] diff --git a/docs/.textlintrc.js b/docs/.textlintrc.js new file mode 100644 index 00000000..068b522b --- /dev/null +++ b/docs/.textlintrc.js @@ -0,0 +1,23 @@ +module.exports = { + rules: { + '@textlint-rule/no-unmatched-pair': true, + apostrophe: true, + 'common-misspellings': true, + diacritics: true, + 'en-capitalization': { + allowHeading: false + }, + 'stop-words': { + severity: 'warning' + }, + terminology: { + terms: `${__dirname}/.textlint.terms.json` + }, + 'write-good': { + severity: 'warning' + } + }, + filters: { + comments: true + } +} diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 00000000..cfa0d65b --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,128 @@ +/** + * @see https://vuepress.vuejs.org/zh/ + */ +module.exports = { + port: "4000", + dest: "dist", + base: "/java-tutorial/", + title: "JAVA-TUTORIAL", + description: "Java 教程", + head: [["link", { rel: "icon", href: `/favicon.ico` }]], + markdown: { + externalLinks: { + target: "_blank", + rel: "noopener noreferrer" + } + }, + themeConfig: { + logo: "https://raw.githubusercontent.com/dunwu/images/master/common/dunwu-logo-200.png", + repo: "dunwu/java-tutorial", + repoLabel: "Github", + editLinks: true, + smoothScroll: true, + locales: { + "/": { + label: "简体中文", + selectText: "Languages", + editLinkText: "帮助我们改善此页面!", + lastUpdated: "上次更新", + nav: [ + { + text: "工具", + link: "/javatool/", + items: [ + { + text: "构建", + link: "/javatool/build/" + }, + { + text: "IDE", + link: "/javatool/ide/" + }, + { + text: "监控", + link: "/monitor/" + } + ] + }, + { + text: "JavaEE", + link: "/javaee/" + }, + { + text: "Java系列", + ariaLabel: "Java", + items: [ + { + text: "Java 教程 📚", + link: "https://dunwu.github.io/java-tutorial/", + target: "_blank", + rel: "" + }, + { + text: "JavaCore 教程 📚", + link: "https://dunwu.github.io/javacore/", + target: "_blank", + rel: "" + }, + { + text: "JavaTech 教程 📚", + link: "https://dunwu.github.io/javatech/", + target: "_blank", + rel: "" + }, + { + text: "Spring 教程 📚", + link: "https://dunwu.github.io/spring-tutorial/", + target: "_blank", + rel: "" + }, + { + text: "Spring Boot 教程 📚", + link: "https://dunwu.github.io/spring-boot-tutorial/", + target: "_blank", + rel: "" + } + ] + }, + { + text: "博客", + link: "https://github.com/dunwu/blog", + target: "_blank", + rel: "" + } + ], + sidebar: "auto", + sidebarDepth: 2 + } + } + }, + plugins: [ + ["@vuepress/back-to-top", true], + [ + "@vuepress/pwa", + { + serviceWorker: true, + updatePopup: true + } + ], + ["@vuepress/medium-zoom", true], + [ + "container", + { + type: "vue", + before: '
    ',
    +        after: "
    " + } + ], + [ + "container", + { + type: "upgrade", + before: info => ``, + after: "" + } + ], + ["flowchart"] + ] +}; diff --git a/docs/.vuepress/enhanceApp.js b/docs/.vuepress/enhanceApp.js new file mode 100644 index 00000000..7b3605fc --- /dev/null +++ b/docs/.vuepress/enhanceApp.js @@ -0,0 +1,7 @@ +export default ({ Vue, isServer }) => { + if (!isServer) { + import('vue-toasted' /* webpackChunkName: "notification" */).then(module => { + Vue.use(module.default) + }) + } +} diff --git a/docs/.vuepress/public/favicon.ico b/docs/.vuepress/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..51e9bfa0baf0e75bbf1c8ccc49bc0ec656e60a7c GIT binary patch literal 16958 zcmeHP`Cpb*7H9s6W@_3qwMMP1oN|dBUiMWM1w>pxL_`r@WLLsmKuAGE6vG8X#uXKF zbkcGm5G8R5(Z)|%f*_E}j(q2w^ZGo#IH>&)1T*jTb9tZVZs&Zz_ug~Qz4!TOWb`Nc zXJTSRe_u5kX=Y^foRN{yNQ#tXlt_`&pA=vS1_lfa7#J`xU|_(&fPn!60|o}3!9dT0 zo@bOWWE&Xx-)Eq{t^ws|Do}c=3{_QCXl!gmPmgYHw70k8!nun${dFlWQeJa&v*g{n zS&Qq}ucN!WTL`NCr4CoGUPVVohrBm8{)&ok&*Spt%c#9ohl;ZEsJ>baZck}jKDUa+f-qQLeBU<|NOK<2;bNF&C|^ zt;kEyhs7JZbYqh3{IM4b3JTEG)it0LR99WYq`%t0VuT}N7beQH*_#f?&fb6s-#B^q zH1~yedb~V4P4vW`qJ1!V*&acDbCDXiR(Rt!T#dbO{MZTDzC9VHuiIn3e*`{x(H53( zJ7Jbfh^{Rw9~?XKFX7MlWm{;2V=?(7f61FSD-2CdO@9pjk&ejUo)3r7UV>wJqr<;6E(!jYbDoIb^c4re z#<*?AxWRI`GxfhW(vveW@dXWR$GRfzvo(T?F|Q!}6P~x0akhFz`k=#aPGf%Fw1uKC z&)LHzhcVMOR1be~ul{HJ3igtNhvD|2pWs*epYdm;==$G!j59JMI z;{!0&bS93J91)up>aNAY0Ik@0_i=s*_6)e8!;u`h5@%_B(TsG*e7^{sKU;|@ zlV-xlVkSyUOYwR9dXdBPg>BQ$gL!CdXp;3yS)aN(yTI!h+hk7TXXb^U@84}f z%l#HSc)CHvNbkoD;%*{?E21@E(dxvcr? zPRLlY0qh?Q#c=0#ql|3@H~&tgeT?n9zVLI2LP%gL!oxR63<+8dKi9>u8|x=!^y|#D z2}S*_h9N}(WA`zht&VHWXm3QvZ^M@3KVe^W7m90oDB`i$gZ-4Z?dzWryQBa%@A%NZ zNh59Wo`L=Bp%BEPqb#e|~hQ)AqX)`S*Q*0v3;yo41Zfk8H za7uVSrpIN;{+G}1%wKnepIH#rFUtk*hk4vC&pgr#M`3v*9REH8kx`qm`(kUaJe~`C zF12DY%@KzW{84b`cCY-DO(&#HmX#ix1z(duk;(6_@B4}_w{H#1`OlTgYPf#jEB*1f z9cR16(f<8u*n7D{4?_>;1*Ky_SQe%AHTM-;&?Ec=O<&oo+`jKS;q>uLX^j*iN@Klzog#4Hnt};n{e2vwkbk;PkCR9F z`nHhA$rRg2?7gDLAGHZyiTx8KbIJozUHLz;y!K~8c4_f3Yke8Rarbv^S=5w ziWw)x6sGNc7yG`~!}DLZzc&|LR-eCOvWp%T^8`Pi5vFYXN|pP? zv1_oS@y2qQ|IDR1{Q{rQTKr6dbUM&Fp0T4s#mD^@5t*y@KkKof_zHHEH9#A^nffUf z(>)TfWYunU?z5enJ1Z4A2d}8@?E3B=5RTe+Jc9ZX+y#O|uQk945^ojq-ts-L@Q2-f}MEG$Rp z?6#se^Wrigkk)}Zq~)E0n@I=~mhF;uwtaIGj^hH<@ujT&no-`gj#R?wqZul{a{^ZA z`v2iL+FkW4ovZ84m03sD_4f{Z*5~++w~BFRMWY`69-8x7$z!aUMP<;8nWAEuAF_td z{2$fjdCT+Tz;)fYXP?N^YJrN+TN94d+!M6+>&}WDh?liHzE$)6-J*Np-%)m3&dymj z>&UwP-huZq^V}j;{86!63BO{?d*E%eNb;P=&qng+eCMI_-MG)Ue04+e`B{luPyD3L z;f;r?d-=US4qC!nF20Y99cpXEy2G@t_=^l5he)dXNOok@W|f-|*NA@GHO-`)eL;ThRB6LY6GpyJ zqC^jKoxkXAG8bPQtAX8nzH;Xg7Mg*K!ZJ+wv!(b-Ue@6v+rwf$3dlKdj#Jfccwlw6;cLaoiSZYiY_}xJ=a9UzTe^Hi%{G>k>CR8LVS}hE_VG zPmRuydpt$9jM0ZHS?sdM6S+{!zb=X=AT>C0)%)Whrz@+BE7 z?Ex~2%4MxrWa-!8JH?c!wP?9FFn1tq3u-Q1#|A#f30fwR&veYFPgq}G^A?1yQ}ME& zZ#P!AMk{(h?bn`si?Gm48rQbMACH0gA#`8NTu`6O`H>=bWghABL%+@W-#V7~o1iey z#iApR%Vld1AwIbfR&RUK{I!xX%=$kKH|KGgiFDt`cYYe$6MdRijKt+dQjhay(cL27 z{S3xXcDzEx$GQf1B_e(6N%Dm*B5U_K+ShNVIUOr|JzlSQZgAvh-V^#c#~?akE7t9* zkUD93C&&+qmT{zT^9`L54%Wc^!e^OEKTBT{zVXjlh>iBPi9m#QBUWY~M&{0PWbLVx zn7Q*TR&Dr_){|UJwbP1S8~>c8aHHQ=INkSlb#)I`_@dXXpX%WBuFm&)(pVQ>$cN@N zf+L@cDLDJ8!+B2cO#y#%GZeyw@=LHD;rdieec|jYjj{7LLwt`ultN``mH47h>({>U z>ZfsCyT5th+^O$|5_DD9Uw*8`0lb#tj+eP+ef4qKEZEq+(us>E(bdr2o6N+XvUN%K}AH7Wylo9>C2IZoliN2Ff@+S_#B zzxJ2>!O-r5ZrwLeiY_HPkHVMEs|MS>hN548|MEWSM$M1?EymEkfdK;p1_lfa^ufTB N{$Bt?`u_(5{{a1f&I5^61MLB65ACvP>r~!lv4{r*WJuV~@7`z(Tp&6#?EAE#Euv|Uw$c?XX4IeIFnR zHSS~G*PAg34G$NdOlL)%xiQff3Sj(Px54hwUhR@J2sYSdT4YJWo6Z|l%cHX z!_cbhXYY~PqSJv#lI zAE8(%4l!MAs6o%41^+Bwgc;wkm!X%1B^lF(`S)b|ntK^s5oKh^kN<=`3U`VCg(c8A zeI*j>4+0`yUS_4^6m!{dY>4}KQ9<66(9~F7N6NE#@nEVa-=}ev87V_0GLeVVunAV{ z{^qc@&ZRrECTLB;6N>TX|%FTZD^~lW3jP$%=1*ObrFS>lm$iPy{O9Jlo4_!tm z(cgp2wh#CAfTE(A?kQq>KW9f5G19C3`Uf`29&khmG7HM(KSU6H0qi6v*M+C2hhu%! zH^?2DoqY+mrv{k?Exb41T}h$DWYv^GXnl<^a8U{EN{lotjty)2)-gVNkaTq`k9l@h z^RwOHo#&YrwQ7!DsLR}BNRN0@Har-tO{|w|re-KTHkfhqZndI=BqH{ZYU}6Q*LGYV zYP%|fVsVv(cx^;mwb3*Mou3jYN=$owTlXLei)ic0+3;4MMGERg5SZ ze^p#Ldv&pNVno`-95=e%xYER68RnPerfd4?mmpMUDx6|@tX`bRVW!zIa2LIX1=P{7 z3Fq`Mn56>+;_qU`Bc1Eri|He>b5*X5MmsPvS{k*bo_bYN%UgroSy{vtaYAxhfic2Ck&Pm2~9EWDb_LB?LLDM5Q#|p~)8^CXzJ2flZ9{a=Hxah%x zoZE~|mlF)^6BS+p(XF2|U_SeBe1Sd4D1wEFk>=>`)Di;kX%VC+#qZB-Vl5K6`2i(v z_dgi&R=p936AM$bd$#7J$EW8pNY^178|Tq+$NJm>lm}BVbez4?^9h5c%6$kcgKT3sbDupTH(pQ-M6xp?q2kQqjzDPSclVbbAa{j7m@%UEa>! zI&GXJSdZAfD9%Y~8qPM{H z-V@T?70Y%HcBNZ^&R6eZUJ7_|2kz*$r$Y7v#UcluTMUGysx$lqG3nI(u1t{&hn75; z`j9YaY63q&jRnlt-)$&}G9^CYsG_!{Jl|gXAy9nEi<#fp7}FkIZFiy+D*!E@qn><< zLoLA{JlW_`^3T$CAFa>Qc3h)2?vB+$%M+y(Xir61=8(}{eUr-x^&vP2 zO*Hc&G6G5N%hTxN)XcTqnH zHAZD(>Ou$;o}(7uW_a-A;~kP% zSnt>@#l!OO_x_4-IkQ3x@&iv8A*8sX_G^L}HhSh1uER|CNFW12p_nyh-h@gcP5VGJ z3+b|wT93(BGTTocA}mqaNmHe6fPJbikH2y-Efm1Qj}SgiTRq%StTlS^T>daRfs2)Z zdZOBD;Cmi)fWlBU%%3)Av39)Pb!?^kl@h6-BlcS%b@CUIY1I$$ry*}8Yo{kOhSICa za+Jk3V^*FjU&`eq;|4GMQMV6G67?rR0^z@VO7qS>My}jL&OWvw^v6 zlPjnXXk3qcPafB76|;TG_;a2kDAA4mx_ja|4CvThJ$1fG@e`}GV_WU@((A}Ez{@4P z{POFG2=WAcUXHQF&7~9wXE)Ltn++sr+#lD$6Jp9!L1D#94F2e%M=&70y+`LsyM3GQ z1C=uMHes|G3{P27oa>6Fo*hbFrMe3IbvW|I5hpXAuAQmS9-g?pmqd3VvS&&Nv{EvF zw=Hart)&mddSFL=G)XU5>d~VEpQw_CQo>eJfoRwm44?wmusH}S-t&VC3wQzt(;nrL zsfoQO|5_{a5Au@5t+kpp8#nONi{@vQrnuzeA=^c$VB}kFSfp5#}NNkNE>nAH}l|@Pc?Ku`a@)9{x zC{?7fM!7HZ)qe6KLG%k&Jk+0%Kmi%(f^$ZHoHCRv0dI*&$v6*`eqdx5KCzlWG9Iog zxghxuh&LediO|0FH-cld0P#f%s_!{1+w5%l-Kwiag0ky&#>P&V{BnRgv4yFzC4(>` zltN_f=E47 z+Q4bH-Ds*vYwpq7^B2Z<{7aA%I@ot0cjsp(ob&Mu4;B5MUs4E89!;ODa&HC)Tmxa# zJz}(2)CBxMou#%L_#Q8y@2O>79Y7=yIoeX3K@y^{+b?%cH~Tpwl-rC@=Dp5+DsIw% zxC%jjm@$Tx0hhc~Se3>vRh0-THb-v&D2}|5^uR<74J{{LF!Eb6iU(0XZec{$5g2Gc zzl^i&b%2MGsS^*MFY)}T#9%bkZC>|@mAp@Q})Enk=+;CXs#u&8Y<3Vq=x|FZ9x zy_Q^vC1VdXzrserCVh~VVU`>oe?pgtx>#KV12LPikNhq|(vkL~C0US7ekcIIi! zr&sEzT+i_=DZhAl6!p(V7e{LDAuLFW$vp7hEVO4M2e)NoCsT-zJIIB1vRxP0a#=hT z(!r}&a>Gd_2L<-pBb4~(8icxL7*C#h`1DM%HOUlGBw?3hLyz>H?AiQ`L#Y9AUhB=WK*XLHd_7BMM0xs&f+&oh;mn|wH>$l$32X+=4LgX-|zPb_^=2$mBL*~Wci zr>qAYw9HixKUVJ}=3>b4IVpF1arMd1=g3Dd)aZ2t-(?C z2l0q8byg$?^jGRtUu1l`iM!VUhL`spvASIC&Uy7O-qX%dQyg1#N4SdL5D=; z-ckTh$_{?n`DmCX$p5$FTMSnFil}fUgV=12GSD^w%fOXRC~yCzm?r1TTJyvoackso zhcs=HFeCy{>))qE53XQc(>vd8o#^ZrhgBPT?&RwJVl#0k-e9*?HbsU|lb54PeGrVK> z6jSXTqT@dWn5CiGyYfPV;lJXubAD zlsBrd*NHaAoK8inC40NNje4T4%{*mD2r|@$s(zSZ6$l{I71Z%i%wX@tWq%A9%>lS^ zU9ge8eXSA;vQ$oZcy>{z+tJG6fa5~4OEmfjs4)`7A`ZJKQO?h9mwrO6Tyl@#+;eUJ z9^5@`Re;kDB3t@8KtUn$nUXaFM<#u=l+wOfAC8uNUz&oU2m}_37e$Y(AJc|#6|DCE zH@m5+?SuUUAn%85oyB)5`U0PNqTDncc_V^RUXqNBDn4A*ZL#8{`|l1kr;#sf$XRm5 z(b6;%yKlosJeWpimD11GUNEUw@X_<`Nh77v-4cSV4^Pq~(U!^MzAp`JS-T|ilSdW@ zJ+HzcqssU1C3l>x2870`7$vdH%gODUof)+Ikk~N4UKYuro4?#GJi@^12-(TIPxw?9 z%MDgYFGf$NGKM&idox}+vWDPWmVmZv`Z`n)4ZEHZuF!Sz!@*+Z$0g!=fPFZX?3#vx ziZ67#l!#iznlpyBSGvBYc*^}IfJicx|6-TrNV34a0$=XmOGmQgMZ)nKBwel|jJkF9 z5)X9Za#mB%C$L#l2fqs`rd-wpFbx*drr?5nBgV5SxDt_)?2i<-Gz@-=Boqi`7VUS2 z_gTE2(DASh$+FlfR@tuC2}^9;ru(^04A7&Q$2m%(3C@^8AhFKIY!DthDjEu&V)j4U zF5WcP*D=v{4yLsO_vDIFE^4isTsq+u-ybPsq z`l1vqxunHHveH7=_SC2IJ0s~(>tlT_=Z5hpBRAF^7vri4aa`VSANpdOYeBg()QzE+ zlFzyYj|+fJw|6UjSF)ISmDkjV0`Fed!JEc~)O#tP8!Qjmaw`ml(XH@n>?We~CAtnM zm^D*F9s)(SOPtb@a&T1=a7QP4#<+XexP&@7`$sP(E{U5S8v3>y>EFi8P^W%nh*?() zTB2-~TU&t@6S%!^@w>$;GdssT%~GITLJx()W;{5r?WTD>-)g51{!$)AZq9>e-pgGJEIgpe4QpPhCzD3bEFjk;(DO;Pue5IMM;?Inn$MK~NFct!Un7*+=q z=l#SEZ$b58cX6M5d@}GQxj@vjUd5>#i-QOD)f4XvAUXee9FYJeDt>-z^@-IpF)qyf z1)AlvUi7Eby7ZlKEH(TNKwxZS1Soi!T%i|-P9?&^@qE8a~gj+0VMw_g-dKQa6-M9Jhy(YKjQq$+`Jp?O1(l&ibg`*$6@lMwR9v{4-!4sw`<ZBYBb(HZA%1lMwT2oA)4)(oP_i(f@|IF; znBy6?Ytgdji|gP|4ju!Wy|&D_?d-7V8=h`9?N~mM{rZx;)duc}YkSJ(d<}ZT z?j9cDHLxTSot$uJy-6DVR*x@j6aixi^(JF zhWCqB$XTc_XH6{|!g?m#|Au5;G1hPmQtDw$2oyfn8_RWL_b&rVaL!MnNK{ zX;~N>sUzc)p8)s(77(OA9TS!2e`V*1&1;bpz^unbKdMmX6Mf{zdWW-+?fYXU6q-* zM5Uz>QfvmomL0bm@h?tL4rt zlPTVkI*ZfKG82N#=Yj*$Nq` z=90E}Gp&SPn(dSq@C(45@xLg4r}QmHk$fY(`I>_nF@=Pu&!w`xbq2l6a2eh+DQUdv zVbCfcYw5K-cAi-jjr5W9piZ zo)XC8s6!Jni?h~mDZNxtX=OfXr+JHD=`ImkP1U3;!8W+Olp{GM_3QFBgJl-m>efs1 zR{f0^J>1>Xj_VULy~Jr{2GbcV4<`OR7CPxBTwo;KTXq46?jB@CA6WZ>x{MY{sj>2E zR4&8~qhn(}Dic}-JmNJ`yw2hp@Qi-;HHwa(XFipD(PGz3<3&|_-{-tp=6swW{BR4j z($9TU^0Ut|td{Ku_^0m^NNTmk?EL$-E7dwrhsEMD7%T^(43sP!!)k)>rYRWS^T{k$ z5wKDx=5wCDlHVomC-DDfwLwsu>;x7Z$-*-Eu(utrHe0c+z9ScjO^&u6%@AA%y>+9M ze1I6>zPjZ$>u+de_Lys{`vD- zOw8i2^f?V*w(zI#$Ey?uy4)A)#N=x<5BN%)2*u3Edg9dwA594aSKH?xmbGthsAAp3 zC~wi?Z#zhUAu)`%J)du#3sxK7x0qmB6Ng8?-RiZzQ%9GEVhy#5`X6P81>cqyQUuci zJA~!)eS3(o8*GOi-91x(9p5|KS2^P*j(x?tUYy^~67>;ToPI?xY zJto-0P|%!&DI2LcU~dc>^$o0sC7C;1KR}8x5DvXXrhFc`v(lN7&>Fo=3E;DD4d}@^ zb#$nIULQk!W!hdWJ8hc2Hxl+@p={RLjGl+|y-5+tO+Jl{o@hLi1eg{SnqO6jlH3^J zK{PKAeyUO<=4OJVdkiKNzH793(x_@JQAK`ve|ilX`>Tmt1pH{TryYAYK0P~`@*V5@ z^WsHy-LdQI%g6nBiTquTvFL2nuTvNu5efMVtyR5zdr{y$Vs#* zyxzk=*!clMcY&l*Dp9Kar61*itc0kVtNwW=f^U>M z;qd!J*QHSkn+dFu!B+|dayb?ATD38NjNDqWAeHr;f2iCDARaSJY_#hVVw1uK>1x}$ z6@KhoPi=ji%FMgCdi!@_y6Lb5VLlR=cFQ`dNJNHmbaZ3{XhAfjrH7%~{Ev^9MKsWf zi3yJp^YV?p=!rTyTIDc=Mn|JK!pzRr`c;wf@o~*yOGppH{$Dp9=;dj;glC^;Z=lS4 zC(sim3hl_yU03f$GVyszOv<}8$Y%)s!Up=ofAw(FyIb8Q?QD{iRCa5S#}FD&W4r+S z!fGw#`QkM=I5uz$$(rk$eP)@(-baih$_~u)7dtPp>Pr6(mnEcMqE?D2&>>KBK0WDb zdBw2W%=eDn=CAuXeu~;qCgct8PZ#NKboMNu^0yr|i3it(Z$x@IUs1g4vpYjXo$HWT zV$tnZ4#Noc_UU8s&UzS629F)`Yuf!lU+Hb5En~gWB=B3zAh+y^KOcQC{ntmqw;~xkeX@n_B(fRImX@}j`86c| zCF|k(&fuNdrpLYU=HlJs&3+jr1uC~f*S7gZ@d?gE>{Z^0jfZJWa)=$@)|eGZ6p zyOTUHRAFNTwfqzTfyi$hZk5$Ep>2gp)yi~7PoAkY)&7o}n}LlSA|VfyPfyPlTgSR| zj!59tQWYB5stX&rluA+K9LZeFS+6>2Uij&2q?_TlNe?^IJ0{IixJwNpJyB+kM#3dg z8CPswTKYMFm3VHmH1CA{u|K@?zWe5pS?{ zI+N6h1%rC7s=m}3P2x~FF1mLUqdYYJGX0e+CxK^TrJs|aJuGwwWaQ6fSYWFuv|uva zl9W_I{TL2tTOU&6Ynw`E%0utF#)l|Htz(=4)FD(inDIkKAd{+bcNVbmH| ze{uJZC4f^!E<-5FaT@X|`zJ{AnO{f?RWxScyQ=1Xq{0i-YwdOqyD`X-F~40CC?nuO z;s&7kaV03NyAuTi+5<3h8 zV#+puGvv#EwDG%NnWj*>f!k&DZoF<~S~|m_Rb+kq{rbaIPHXohCZd(2jqYEIx_M>g zTbo)BjbdMQ9t_QnLbeYtY#j8T4*Xa2)Eq^HU^z=>5?)`9`ht*7Y}@#738(haXlT6Y z%N=3oHPR^TIac7ln-3V04w{o=>VegmQtFoO(g;``h3I~ZP zj*Cd<*g@c2$=gie^YQ{_OSHZbd`Fi4Wrc^n4>L>j?DrC?HH|hI#7?fQG9#BV_oo(K zc)kQ$HZ@c@F_L&q(Qxa6gU9(!0QEvJVt=1eg&nsg^rpu21+1A?ardL4JD*ZN`#CEK zd~QEUKl0q-dS||>x-d{dH}1bu@Jn+&2TJ?Pvod+g(51itrdkZLM1E1+@p7vWK?H!O zz5P?XHv(d-=Kvy>@d3HK5R6;U2u=|F3jV02d$_v2lS6R3?(pCm%2hmCVkkFfCBwJw z&R8AaSIBM+_*vg-%@c}dVE32Fewig$6y8*YF@K@;m-*S>mwk=`>Y|@7F~4Wq#-p@P z8V5Pc$yheuzb`UF=Bs)#7X2c6RYv>=puV><%Q1>UTMRRaImwB`hBA|0WV)}kAd z(E3ueNZzzZ-sxIxxf6vvWcQDLm6eel6LWU%0>r+&i0zMTQ5_@}iWNFIIRTd*unw-S z??oEcIf|UIzyCIchrbJ~r^VR!sKF}r1Xu4#V#a*%pQ&If9#yW?a0%(SSu<<9DA14W=)qlS4u>!|z3K#L{mx9RW*qGF(#eMqD=60+ zH>f-*aPqzvWnA0p%SXr93I#7PJkW6;Kh;Wv5d+lD6<|1E*M<;)C&jDXN!wJ<$hhx` z9{Q1%1O6~!?2FMTlILye_VP=?CG%BH*R6PGw|OTaVDdMGWQOWbIvT`1&0AJImxk6I zgY>Pcy;eOCFn=(&NmoR=$7WukKELj7ME3o|H=Yhi4t&VH5E>$x<<6#;&Q58v2c904 zHmpW1-Vul0ix~xA;4&sgN!4FobgS|88xG4V^Jg23_4Uj|ClI=xmW8v2#pz9tp{jk1 zfNJi*_g2G7nc*rFJMpzuIT|xBf61`2z~@|TD{PU9V0XA$9y-IxO&?1(AmdtqNNso% zJ>o+hTre!?qAI%~!7{{BQPjC=EjX?j1xW0_80deYCKAi7?{&-k-GUTJrV__4g2q#`GBlqA`L#H@~3#q_xk_eesVu*2`H;7Ad&++9u@` zs^ve10h}cLO8qD$W?|DaE;;U#%7c&uM2 zk#KEkaO9|sBF8qbBB|Az#w7U2`*Z)@=V{{qvgP0_UqoJI3Xxzv>ccXKO;ndY} z9O3R#5TUD!1jxjo^9C%ot=DeVjnZ@xs21x=7l6|RZN$fNpijs9zCa2oC3#zD8$M5O z31f21`*PK^IZbA*}$m|~3=<9(Eb|{kBgOy`phr~)LG-a@7RO((* zNsmyG);A%@jmkGFV=XUS7E)W!x1r+I*+$WzCbF~h0}8|tXCetXLrlOl4du0NJlL

    ~k$!O4qv?+8^ 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 literal 0 HcmV?d00001 diff --git a/docs/README.md b/docs/README.md index f559567e..6de1ddb5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,82 +1,76 @@ -

    - - logo - -

    - -

    - license -

    - -

    JavaTutorial

    +--- +home: true +heroImage: http://dunwu.test.upcdn.net/common/logo/java-logo.png +heroText: JAVA-TUTORIAL +tagline: ☕ java-tutorial 是一个 Java 教程,汇集一个老司机在 Java 领域的十年积累。 +actionLink: / +footer: CC-BY-SA-4.0 Licensed | Copyright © 2018-Now Dunwu +--- -> ☕ **JavaTutorial** 是一个 Java 教程,汇集一个老司机在 Java 领域的十年积累。 +> ☕ **java-tutorial** 是一个 Java 教程,汇集一个老司机在 Java 领域的十年积累。 > > - 🔁 项目同步维护:[Github](https://github.com/dunwu/java-tutorial/) | [Gitee](https://gitee.com/turnon/java-tutorial/) > - 📖 电子书阅读:[Github Pages](https://dunwu.github.io/java-tutorial/) | [Gitee Pages](https://turnon.gitee.io/java-tutorial/) -## [JavaLib](javalib/README.md) +## javacore + +> 📚 [javacore](https://dunwu.github.io/javacore/) 是一个 Java 核心技术教程。内容包含:Java 基础特性、Java 高级特性、Java 并发、JVM、Java IO 等。 + +## javaee -> 各种主流 Java 库的应用。 +> [☕ JavaEE](javaee/README.md) 技术是 Java Web 的基石 -- [Dozer 应用指南](javalib/dozer.md) -- [Freemark 应用指南](javalib/freemark.md) -- [Java 与 JSON](javalib/javalib-json.md) -- [细说 Java 主流日志工具库](javalib/javalib-log.md) -- [细说 Java 主流工具包](javalib/javalib-util.md) -- [JavaMail 应用指南](javalib/javamail.md) -- [Jsoup 应用指南](javalib/jsoup.md) -- [JUnit5 应用指南](javalib/junit.md) -- [Lombok 应用指南](javalib/lombok.md) -- [Mockito 应用指南](javalib/mockito.md) -- [Reflections 应用指南](javalib/reflections.md) -- [Thumbnailator 应用指南](javalib/thumbnailator.md) -- [ZXing 应用指南](javalib/zxing.md) +- [JavaEE 面经](javaee/javaee-interview.md) +- [Servlet](javaee/javaee-servlet.md) +- [Jsp](javaee/javaee-jsp.md) +- [Filter 和 Listener](javaee/javaee-filter-listener.md) +- [Cookie 和 Session](javaee/javaee-cookie-sesion.md) -## [JavaTool](javatool/README.md) +## javatech -> 各种主流 Java 工具的应用。 +> 📚 [javatech](https://dunwu.github.io/javatech/) 是一个 Java 应用技术教程。内容包含 Java 开发中常见应用技术,如:框架、缓存、消息队列、存储、安全、微服务、测试、服务器等。 -- [构建工具](javatool/build/README.md) - - [Maven 教程 📚](javatool/build/maven/README.md) - - [Maven 快速指南](javatool/build/maven/maven-quickstart.md) - - [Maven 教程之 pom.xml 详解](javatool/build/maven/maven-pom.md) - - [Maven 教程之 settings.xml 详解](javatool/build/maven/maven-settings.md) - - [Maven 实战问题和最佳实践](javatool/build/maven/maven-action.md) - - [Maven 教程之发布 jar 到私服或中央仓库](javatool/build/maven/maven-deploy.md) - - [Maven 插件之代码检查](javatool/build/maven/maven-checkstyle-plugin.md) - - [Ant 简易教程](javatool/build/ant.md) -- [搜索引擎 Elastic](javatool/elastic/README.md) - - [Elastic 技术栈快速入门](javatool/elastic/elastic-quickstart.md) - - [Elasticsearch 运维](javatool/elastic/elastic-elasticsearch-ops.md) - - [Beats 运维](javatool/elastic/elastic-beats-ops.md) - - [Kibana 运维](javatool/elastic/elastic-kibana-ops.md) - - [Logstash 运维](javatool/elastic/elastic-logstash-ops.md) -- [Java IDE](javatool/ide/README.md) - - [Intellij IDEA 应用指南](javatool/ide/intellij.md) - - [Eclipse 应用指南](javatool/ide/eclipse.md) -- **测试工具** - - [Jmeter 应用指南](javatool/test/jmeter.md) +## spring-tutorial -## [JavaCore 教程](https://dunwu.github.io/javacore/) +> 📚 [spring-tutorial](https://dunwu.github.io/spring-tutorial/) 是一个 Spring 实战教程。 -> Java 核心技术教程。内容包含:Java 基础特性、Java 高级特性、Java 并发、JVM、Java IO 等。 +## spring-boot-tutorial -## [JavaWeb 教程](https://dunwu.github.io/javaweb/) +> 📚 [Spring Boot 教程](https://dunwu.github.io/spring-boot-tutorial/) 是一个 Spring Boot 实战教程。 -> Java Web 技术教程。内容包含:JavaEE、分布式应用技术等。 +## javatool -## [Spring 教程](https://dunwu.github.io/spring-tutorial/) +### 构建 + +> Java 项目需要通过 [**构建工具**](javatool/build) 来管理项目依赖,完成编译、打包、发布、生成 JavaDoc 等任务。 +> +> - 目前最主流的构建工具是 Maven,它的功能非常强大。 +> - Gradle 号称是要替代 Maven 等构件工具,它的版本管理确实简洁,但是需要学习 Groovy,学习成本比 Maven 高。 +> - Ant 功能比 Maven 和 Gradle 要弱,现代 Java 项目基本不用了,但也有一些传统的 Java 项目还在使用。 + +- [Maven](javatool/build/maven) 📚 +- [Ant](javatool/build/ant.md) + +### IDE + +> 自动有了 [**IDE**](javatool/ide),写代码从此就告别了刀耕火种的蛮荒时代。 +> +> - [Eclipse](javatool/ide/eclipse.md) 是久负盛名的开源 Java IDE,我的学生时代一直使用它写 Java。 +> - 曾经抗拒从转 [Intellij Idea](javatool/ide/intellij-idea.md) ,但后来发现真香,不得不说,确实是目前最优秀的 Java IDE。 +> - 你可以在 [vscode](javatool/ide/vscode.md) 中写各种语言,只要安装相应插件即可。如果你的项目中使用了很多种编程语言,又懒得在多个 IDE 之间切换,那么就用 vscode 来一网打尽吧。 -> Spring 教程。 +- [Intellij Idea](javatool/ide/intellij-idea.md) +- [Eclipse](javatool/ide/eclipse.md) +- [vscode](javatool/ide/vscode.md) -## [Spring Boot 教程](https://dunwu.github.io/spring-boot-tutorial/) +### 监控 -> Spring Boot 教程 +- [Arthas](javatool/monitor/arthas.md) +- [SkyWalking](javatool/monitor/skywalking.md) --- -## 相关技术栈 +## 其他技术栈 - [db-tutorial](https://dunwu.github.io/db-tutorial/) - 是对数据库领域开发经验的总结。内容包含:关系型数据库和 Nosql 理论、Mysql、Redis 等。 - [algorithm-tutorial](https://dunwu.github.io/algorithm-tutorial/) - 是对数据结构和算法的总结。内容包含:一些基本的数据结构、算法。 diff --git a/docs/appendix/README.md b/docs/appendix/README.md deleted file mode 100644 index b2fcd334..00000000 --- a/docs/appendix/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# 附录 - -## [Java 资源](resources.html) diff --git a/docs/appendix/resources.md b/docs/appendix/resources.md deleted file mode 100644 index 62d6f20b..00000000 --- a/docs/appendix/resources.md +++ /dev/null @@ -1,66 +0,0 @@ -## 学习资源 - -## 经典书籍 - -### javase - -#### [《Effective Java 中文版》](https://union-click.jd.com/jdc?d=S003h8) - -- 豆瓣评分:9.1【1235 人评价】 -- 推荐理由:本书介绍了在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。 -- 友情提示:同推荐《重构 : 改善既有代码的设计》、《代码整洁之道》、《代码大全》,有一定的内容重叠。 - -#### [《Java并发编程实战》](https://union-click.jd.com/jdc?d=x2yrwq) - -- 豆瓣评分:9.0 【651 人评价】 -- 推荐理由:本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。 - -#### [《深入理解Java虚拟机:JVM高级特性与最佳实践》](https://union-click.jd.com/jdc?d=Wa6dWb) - -- 豆瓣评分:8.9 【657 人评价】 -- 推荐理由:不去了解 JVM 的工程师,和咸鱼有什么区别? - -### javaee - -### javatool - -#### [《Maven 实战》](https://union-click.jd.com/jdc?d=hNj9Lu) - -- 豆瓣评分:8.1【563 人评价】 -- 推荐理由:国内最权威的Maven专家的力作,唯一一本哦! - -### database - -#### [《Redis设计与实现》](https://union-click.jd.com/jdc?d=6L6sMX) - -- 豆瓣评分:8.5 【427 人评价】 -- 推荐理由:系统而全面地描述了 Redis 内部运行机制。图示丰富,描述清晰,并给出大量参考信息,是NoSQL数据库开发人员案头必备。 - -### others - -#### [《鸟哥的Linux私房菜 (基础学习篇)》](https://union-click.jd.com/jdc?d=yB7dwu) - -- 豆瓣评分:9.1【2269 人评价】 -- 推荐理由:本书是最具知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的最新版,全面而详细地介绍了Linux操作系统。 -- 友情提示:内容非常全面,建议挑选和自己实际工作相关度较高的,其他部分有需要再阅读。 - -### [《Head First 设计模式》](https://union-click.jd.com/jdc?d=HYyuyM) - -- 豆瓣评分:9.2【2394 人评价】 -- 推荐理由:《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。 - -### [《HTTP权威指南》](https://union-click.jd.com/jdc?d=TgCRBb) - -- 豆瓣评分:8.7 【1126 人评价】 -- 推荐理由:本书尝试着将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节,对HTTP各方面的特性进行了介绍。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。 - -### [《TCP/IP详解 系列》](https://union-click.jd.com/jdc?d=5uHlXS) - -- 豆瓣评分:9.3 【1883 人评价】 -- 推荐理由:完整而详细的TCP/IP协议指南。针对任何希望理解TCP/IP协议是如何实现的读者设计。 - -### [《剑指Offer:名企面试官精讲典型编程题》](https://union-click.jd.com/jdc?d=wnrKQh) - -- 豆瓣评分:8.5【508 人评价】 -- 推荐理由:剖析了80个典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。 -- 推荐网站:[牛客网-专业IT笔试面试备考平台](https://www.nowcoder.com/) diff --git a/docs/book.json b/docs/book.json deleted file mode 100644 index c2b6a210..00000000 --- a/docs/book.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "gitbook": "3.2.2", - "title": "java-tutorial", - "language": "zh-hans", - "root": "./", - "structure": { - "summary": "sidebar.md" - }, - "links": { - "sidebar": { - "java-tutorial": "https://github.com/dunwu/java-tutorial" - } - }, - "plugins": [ - "-lunr", - "-search", - "advanced-emoji@^0.2.2", - "anchor-navigation-ex@1.0.10", - "anchors@^0.7.1", - "edit-link@^2.0.2", - "expandable-chapters-small@^0.1.7", - "github@^2.0.0", - "search-plus@^0.0.11", - "simple-page-toc@^0.1.1", - "splitter@^0.0.8", - "tbfed-pagefooter@^0.0.1" - ], - "pluginsConfig": { - "anchor-navigation-ex": { - "showLevel": false, - "associatedWithSummary": true, - "multipleH1": true, - "mode": "float", - "isRewritePageTitle": false, - "float": { - "showLevelIcon": false, - "level1Icon": "fa fa-hand-o-right", - "level2Icon": "fa fa-hand-o-right", - "level3Icon": "fa fa-hand-o-right" - }, - "pageTop": { - "showLevelIcon": false, - "level1Icon": "fa fa-hand-o-right", - "level2Icon": "fa fa-hand-o-right", - "level3Icon": "fa fa-hand-o-right" - } - }, - "edit-link": { - "base": "https://github.com/dunwu/java-tutorial/blob/master/docs", - "label": "编辑此页面" - }, - "github": { - "url": "https://github.com/dunwu" - }, - "simple-page-toc": { - "maxDepth": 4, - "skipFirstH1": true - }, - "sharing": { - "weibo": true, - "all": ["weibo"] - }, - "tbfed-pagefooter": { - "copyright": "Copyright © Zhang Peng 2017", - "modify_label": "该文件上次修订时间:", - "modify_format": "YYYY-MM-DD HH:mm:ss" - } - } -} diff --git a/docs/cover.jpg b/docs/cover.jpg deleted file mode 100644 index d859125628b0cfd75dc162521f1e1a1725ac3e1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117622 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