From 0e9227e4585fc1b4ab37c78ae603a409557921b7 Mon Sep 17 00:00:00 2001 From: remm Date: Mon, 29 May 2006 11:51:34 +0000 Subject: [PATCH] - Add examples webapp. - New chat example, which doesn't work properly yet (I suck at HTML). For some reason, it works with a telnet, but not with a browser, which doesn't do any rendering until the whole page is received. git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@410080 13f79535-47bb-0310-9956-ffa450edef68 --- .../examples/WEB-INF/classes/CookieExample.java | 121 +++++++ .../WEB-INF/classes/HelloWorldExample.java | 75 +++++ .../WEB-INF/classes/LocalStrings.properties | 52 +++ .../WEB-INF/classes/LocalStrings_en.properties | 52 +++ .../WEB-INF/classes/LocalStrings_es.properties | 52 +++ .../WEB-INF/classes/LocalStrings_fr.properties | 52 +++ .../WEB-INF/classes/LocalStrings_pt.properties | 52 +++ .../WEB-INF/classes/RequestHeaderExample.java | 90 +++++ .../WEB-INF/classes/RequestInfoExample.java | 114 +++++++ .../WEB-INF/classes/RequestParamExample.java | 106 ++++++ .../examples/WEB-INF/classes/SessionExample.java | 140 ++++++++ webapps/examples/WEB-INF/classes/cal/Entries.java | 72 ++++ webapps/examples/WEB-INF/classes/cal/Entry.java | 54 +++ .../examples/WEB-INF/classes/cal/JspCalendar.java | 154 +++++++++ .../examples/WEB-INF/classes/cal/TableBean.java | 101 ++++++ .../examples/WEB-INF/classes/chat/ChatServlet.java | 212 ++++++++++++ .../WEB-INF/classes/checkbox/CheckTest.java | 30 ++ .../WEB-INF/classes/colors/ColorGameBean.java | 114 +++++++ .../compressionFilters/CompressionFilter.java | 218 ++++++++++++ .../CompressionFilterTestServlet.java | 57 ++++ .../CompressionResponseStream.java | 317 +++++++++++++++++ .../CompressionServletResponseWrapper.java | 276 +++++++++++++++ .../WEB-INF/classes/dates/JspCalendar.java | 152 +++++++++ webapps/examples/WEB-INF/classes/error/Smart.java | 34 ++ .../WEB-INF/classes/examples/ExampleTagBase.java | 66 ++++ .../examples/WEB-INF/classes/examples/FooTag.java | 82 +++++ .../WEB-INF/classes/examples/FooTagExtraInfo.java | 32 ++ .../examples/WEB-INF/classes/examples/LogTag.java | 60 ++++ .../WEB-INF/classes/examples/ShowSource.java | 72 ++++ .../WEB-INF/classes/filters/ExampleFilter.java | 139 ++++++++ .../classes/filters/RequestDumperFilter.java | 200 +++++++++++ .../filters/SetCharacterEncodingFilter.java | 171 ++++++++++ .../WEB-INF/classes/jsp2/examples/BookBean.java | 43 +++ .../WEB-INF/classes/jsp2/examples/FooBean.java | 35 ++ .../classes/jsp2/examples/el/Functions.java | 44 +++ .../jsp2/examples/simpletag/EchoAttributesTag.java | 54 +++ .../jsp2/examples/simpletag/FindBookSimpleTag.java | 44 +++ .../examples/simpletag/HelloWorldSimpleTag.java | 31 ++ .../jsp2/examples/simpletag/RepeatSimpleTag.java | 42 +++ .../jsp2/examples/simpletag/ShuffleSimpleTag.java | 81 +++++ .../jsp2/examples/simpletag/TileSimpleTag.java | 46 +++ .../WEB-INF/classes/listeners/ContextListener.java | 155 +++++++++ .../WEB-INF/classes/listeners/SessionListener.java | 182 ++++++++++ .../WEB-INF/classes/num/NumberGuessBean.java | 78 +++++ webapps/examples/WEB-INF/classes/servletToJsp.java | 32 ++ .../WEB-INF/classes/sessions/DummyCart.java | 69 ++++ .../examples/WEB-INF/classes/util/HTMLFilter.java | 68 ++++ .../WEB-INF/classes/validators/DebugValidator.java | 83 +++++ webapps/examples/WEB-INF/jsp/applet/Clock2.java | 211 ++++++++++++ webapps/examples/WEB-INF/jsp/debug-taglib.tld | 53 +++ webapps/examples/WEB-INF/jsp/example-taglib.tld | 82 +++++ .../examples/WEB-INF/jsp2/jsp2-example-taglib.tld | 123 +++++++ webapps/examples/WEB-INF/lib/jstl.jar | Bin 0 -> 16905 bytes webapps/examples/WEB-INF/lib/standard.jar | Bin 0 -> 293750 bytes webapps/examples/WEB-INF/tags/displayProducts.tag | 54 +++ webapps/examples/WEB-INF/tags/helloWorld.tag | 16 + webapps/examples/WEB-INF/tags/panel.tag | 28 ++ webapps/examples/WEB-INF/tags/xhtmlbasic.tag | 20 ++ webapps/examples/WEB-INF/web.xml | 306 +++++++++++++++++ webapps/examples/jsp/cal/cal1.jsp | 94 ++++++ webapps/examples/jsp/cal/cal2.jsp | 44 +++ webapps/examples/jsp/cal/calendar.html | 42 +++ webapps/examples/jsp/cal/login.html | 46 +++ webapps/examples/jsp/chat/chat.jsp | 32 ++ webapps/examples/jsp/chat/login.jsp | 30 ++ webapps/examples/jsp/chat/post.jsp | 35 ++ webapps/examples/jsp/checkbox/CheckTest.html | 55 +++ webapps/examples/jsp/checkbox/check.html | 37 ++ webapps/examples/jsp/checkbox/checkresult.jsp | 63 ++++ webapps/examples/jsp/checkbox/cresult.html | 33 ++ webapps/examples/jsp/colors/ColorGameBean.html | 115 +++++++ webapps/examples/jsp/colors/clr.html | 33 ++ webapps/examples/jsp/colors/colors.html | 46 +++ webapps/examples/jsp/colors/colrs.jsp | 69 ++++ webapps/examples/jsp/dates/date.html | 30 ++ webapps/examples/jsp/dates/date.jsp | 40 +++ webapps/examples/jsp/error/er.html | 30 ++ webapps/examples/jsp/error/err.jsp | 43 +++ webapps/examples/jsp/error/error.html | 36 ++ webapps/examples/jsp/error/errorpge.jsp | 24 ++ webapps/examples/jsp/forward/forward.jsp | 22 ++ webapps/examples/jsp/forward/fwd.html | 18 + webapps/examples/jsp/forward/one.jsp | 11 + webapps/examples/jsp/forward/two.html | 11 + webapps/examples/jsp/images/code.gif | Bin 0 -> 292 bytes webapps/examples/jsp/images/execute.gif | Bin 0 -> 1242 bytes webapps/examples/jsp/images/read.gif | Bin 0 -> 1125 bytes webapps/examples/jsp/images/return.gif | Bin 0 -> 1231 bytes webapps/examples/jsp/include/foo.html | 16 + webapps/examples/jsp/include/foo.jsp | 20 ++ webapps/examples/jsp/include/inc.html | 29 ++ webapps/examples/jsp/include/include.jsp | 34 ++ webapps/examples/jsp/index.html | 373 +++++++++++++++++++++ webapps/examples/jsp/jsp2/el/basic-arithmetic.html | 29 ++ webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp | 87 +++++ .../examples/jsp/jsp2/el/basic-comparisons.html | 29 ++ webapps/examples/jsp/jsp2/el/basic-comparisons.jsp | 115 +++++++ webapps/examples/jsp/jsp2/el/functions.html | 31 ++ webapps/examples/jsp/jsp2/el/functions.jsp | 65 ++++ webapps/examples/jsp/jsp2/el/implicit-objects.html | 19 ++ webapps/examples/jsp/jsp2/el/implicit-objects.jsp | 88 +++++ .../jsp/jsp2/jspattribute/jspattribute.html | 36 ++ .../jsp/jsp2/jspattribute/jspattribute.jsp | 45 +++ .../examples/jsp/jsp2/jspattribute/shuffle.html | 36 ++ webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp | 89 +++++ webapps/examples/jsp/jsp2/jspx/basic.html | 30 ++ webapps/examples/jsp/jsp2/jspx/basic.jspx | 30 ++ webapps/examples/jsp/jsp2/jspx/svgexample.html | 51 +++ webapps/examples/jsp/jsp2/jspx/textRotate.html | 31 ++ webapps/examples/jsp/jsp2/jspx/textRotate.jpg | Bin 0 -> 26729 bytes webapps/examples/jsp/jsp2/jspx/textRotate.jspx | 36 ++ webapps/examples/jsp/jsp2/misc/coda.jspf | 5 + webapps/examples/jsp/jsp2/misc/config.html | 34 ++ webapps/examples/jsp/jsp2/misc/config.jsp | 31 ++ webapps/examples/jsp/jsp2/misc/dynamicattrs.html | 32 ++ webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp | 43 +++ webapps/examples/jsp/jsp2/misc/prelude.jspf | 5 + webapps/examples/jsp/jsp2/simpletag/book.html | 36 ++ webapps/examples/jsp/jsp2/simpletag/book.jsp | 54 +++ webapps/examples/jsp/jsp2/simpletag/hello.html | 32 ++ webapps/examples/jsp/jsp2/simpletag/hello.jsp | 30 ++ webapps/examples/jsp/jsp2/simpletag/repeat.html | 32 ++ webapps/examples/jsp/jsp2/simpletag/repeat.jsp | 38 +++ webapps/examples/jsp/jsp2/tagfiles/hello.html | 32 ++ webapps/examples/jsp/jsp2/tagfiles/hello.jsp | 34 ++ webapps/examples/jsp/jsp2/tagfiles/panel.html | 32 ++ webapps/examples/jsp/jsp2/tagfiles/panel.jsp | 57 ++++ webapps/examples/jsp/jsp2/tagfiles/products.html | 21 ++ webapps/examples/jsp/jsp2/tagfiles/products.jsp | 53 +++ webapps/examples/jsp/jsptoserv/hello.jsp | 25 ++ webapps/examples/jsp/jsptoserv/jsptoservlet.jsp | 22 ++ webapps/examples/jsp/jsptoserv/jts.html | 33 ++ webapps/examples/jsp/num/numguess.html | 33 ++ webapps/examples/jsp/num/numguess.jsp | 68 ++++ webapps/examples/jsp/plugin/applet/Clock2.java | 212 ++++++++++++ webapps/examples/jsp/plugin/plugin.html | 29 ++ webapps/examples/jsp/plugin/plugin.jsp | 33 ++ webapps/examples/jsp/security/protected/error.jsp | 24 ++ webapps/examples/jsp/security/protected/index.jsp | 78 +++++ webapps/examples/jsp/security/protected/login.jsp | 37 ++ webapps/examples/jsp/sessions/DummyCart.html | 55 +++ webapps/examples/jsp/sessions/carts.html | 52 +++ webapps/examples/jsp/sessions/carts.jsp | 43 +++ webapps/examples/jsp/sessions/crt.html | 33 ++ webapps/examples/jsp/simpletag/foo.html | 29 ++ webapps/examples/jsp/simpletag/foo.jsp | 37 ++ webapps/examples/jsp/snp/snoop.html | 30 ++ webapps/examples/jsp/snp/snoop.jsp | 55 +++ webapps/examples/jsp/source.jsp | 19 ++ webapps/examples/jsp/tagplugin/choose.html | 35 ++ webapps/examples/jsp/tagplugin/choose.jsp | 57 ++++ webapps/examples/jsp/tagplugin/foreach.html | 35 ++ webapps/examples/jsp/tagplugin/foreach.jsp | 56 ++++ webapps/examples/jsp/tagplugin/howto.html | 42 +++ webapps/examples/jsp/tagplugin/if.html | 35 ++ webapps/examples/jsp/tagplugin/if.jsp | 44 +++ webapps/examples/jsp/tagplugin/notes.html | 38 +++ webapps/examples/jsp/xml/xml.html | 30 ++ webapps/examples/jsp/xml/xml.jsp | 69 ++++ webapps/examples/servlets/images/code.gif | Bin 0 -> 292 bytes webapps/examples/servlets/images/execute.gif | Bin 0 -> 1242 bytes webapps/examples/servlets/images/return.gif | Bin 0 -> 1231 bytes 162 files changed, 9846 insertions(+) create mode 100644 webapps/examples/WEB-INF/classes/CookieExample.java create mode 100644 webapps/examples/WEB-INF/classes/HelloWorldExample.java create mode 100644 webapps/examples/WEB-INF/classes/LocalStrings.properties create mode 100644 webapps/examples/WEB-INF/classes/LocalStrings_en.properties create mode 100644 webapps/examples/WEB-INF/classes/LocalStrings_es.properties create mode 100644 webapps/examples/WEB-INF/classes/LocalStrings_fr.properties create mode 100644 webapps/examples/WEB-INF/classes/LocalStrings_pt.properties create mode 100644 webapps/examples/WEB-INF/classes/RequestHeaderExample.java create mode 100644 webapps/examples/WEB-INF/classes/RequestInfoExample.java create mode 100644 webapps/examples/WEB-INF/classes/RequestParamExample.java create mode 100644 webapps/examples/WEB-INF/classes/SessionExample.java create mode 100644 webapps/examples/WEB-INF/classes/cal/Entries.java create mode 100644 webapps/examples/WEB-INF/classes/cal/Entry.java create mode 100644 webapps/examples/WEB-INF/classes/cal/JspCalendar.java create mode 100644 webapps/examples/WEB-INF/classes/cal/TableBean.java create mode 100644 webapps/examples/WEB-INF/classes/chat/ChatServlet.java create mode 100644 webapps/examples/WEB-INF/classes/checkbox/CheckTest.java create mode 100644 webapps/examples/WEB-INF/classes/colors/ColorGameBean.java create mode 100644 webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java create mode 100644 webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java create mode 100644 webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java create mode 100644 webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java create mode 100644 webapps/examples/WEB-INF/classes/dates/JspCalendar.java create mode 100644 webapps/examples/WEB-INF/classes/error/Smart.java create mode 100644 webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java create mode 100644 webapps/examples/WEB-INF/classes/examples/FooTag.java create mode 100644 webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java create mode 100644 webapps/examples/WEB-INF/classes/examples/LogTag.java create mode 100644 webapps/examples/WEB-INF/classes/examples/ShowSource.java create mode 100644 webapps/examples/WEB-INF/classes/filters/ExampleFilter.java create mode 100644 webapps/examples/WEB-INF/classes/filters/RequestDumperFilter.java create mode 100644 webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/ShuffleSimpleTag.java create mode 100644 webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/TileSimpleTag.java create mode 100644 webapps/examples/WEB-INF/classes/listeners/ContextListener.java create mode 100644 webapps/examples/WEB-INF/classes/listeners/SessionListener.java create mode 100644 webapps/examples/WEB-INF/classes/num/NumberGuessBean.java create mode 100644 webapps/examples/WEB-INF/classes/servletToJsp.java create mode 100644 webapps/examples/WEB-INF/classes/sessions/DummyCart.java create mode 100644 webapps/examples/WEB-INF/classes/util/HTMLFilter.java create mode 100644 webapps/examples/WEB-INF/classes/validators/DebugValidator.java create mode 100644 webapps/examples/WEB-INF/jsp/applet/Clock2.java create mode 100644 webapps/examples/WEB-INF/jsp/debug-taglib.tld create mode 100644 webapps/examples/WEB-INF/jsp/example-taglib.tld create mode 100644 webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld create mode 100644 webapps/examples/WEB-INF/lib/jstl.jar create mode 100644 webapps/examples/WEB-INF/lib/standard.jar create mode 100644 webapps/examples/WEB-INF/tags/displayProducts.tag create mode 100644 webapps/examples/WEB-INF/tags/helloWorld.tag create mode 100644 webapps/examples/WEB-INF/tags/panel.tag create mode 100644 webapps/examples/WEB-INF/tags/xhtmlbasic.tag create mode 100644 webapps/examples/WEB-INF/web.xml create mode 100644 webapps/examples/jsp/cal/cal1.jsp create mode 100644 webapps/examples/jsp/cal/cal2.jsp create mode 100644 webapps/examples/jsp/cal/calendar.html create mode 100644 webapps/examples/jsp/cal/login.html create mode 100644 webapps/examples/jsp/chat/chat.jsp create mode 100644 webapps/examples/jsp/chat/login.jsp create mode 100644 webapps/examples/jsp/chat/post.jsp create mode 100644 webapps/examples/jsp/checkbox/CheckTest.html create mode 100644 webapps/examples/jsp/checkbox/check.html create mode 100644 webapps/examples/jsp/checkbox/checkresult.jsp create mode 100644 webapps/examples/jsp/checkbox/cresult.html create mode 100644 webapps/examples/jsp/colors/ColorGameBean.html create mode 100644 webapps/examples/jsp/colors/clr.html create mode 100644 webapps/examples/jsp/colors/colors.html create mode 100644 webapps/examples/jsp/colors/colrs.jsp create mode 100644 webapps/examples/jsp/dates/date.html create mode 100644 webapps/examples/jsp/dates/date.jsp create mode 100644 webapps/examples/jsp/error/er.html create mode 100644 webapps/examples/jsp/error/err.jsp create mode 100644 webapps/examples/jsp/error/error.html create mode 100644 webapps/examples/jsp/error/errorpge.jsp create mode 100644 webapps/examples/jsp/forward/forward.jsp create mode 100644 webapps/examples/jsp/forward/fwd.html create mode 100644 webapps/examples/jsp/forward/one.jsp create mode 100644 webapps/examples/jsp/forward/two.html create mode 100644 webapps/examples/jsp/images/code.gif create mode 100644 webapps/examples/jsp/images/execute.gif create mode 100644 webapps/examples/jsp/images/read.gif create mode 100644 webapps/examples/jsp/images/return.gif create mode 100644 webapps/examples/jsp/include/foo.html create mode 100644 webapps/examples/jsp/include/foo.jsp create mode 100644 webapps/examples/jsp/include/inc.html create mode 100644 webapps/examples/jsp/include/include.jsp create mode 100644 webapps/examples/jsp/index.html create mode 100644 webapps/examples/jsp/jsp2/el/basic-arithmetic.html create mode 100644 webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp create mode 100644 webapps/examples/jsp/jsp2/el/basic-comparisons.html create mode 100644 webapps/examples/jsp/jsp2/el/basic-comparisons.jsp create mode 100644 webapps/examples/jsp/jsp2/el/functions.html create mode 100644 webapps/examples/jsp/jsp2/el/functions.jsp create mode 100644 webapps/examples/jsp/jsp2/el/implicit-objects.html create mode 100644 webapps/examples/jsp/jsp2/el/implicit-objects.jsp create mode 100644 webapps/examples/jsp/jsp2/jspattribute/jspattribute.html create mode 100644 webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp create mode 100644 webapps/examples/jsp/jsp2/jspattribute/shuffle.html create mode 100644 webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp create mode 100644 webapps/examples/jsp/jsp2/jspx/basic.html create mode 100644 webapps/examples/jsp/jsp2/jspx/basic.jspx create mode 100644 webapps/examples/jsp/jsp2/jspx/svgexample.html create mode 100644 webapps/examples/jsp/jsp2/jspx/textRotate.html create mode 100644 webapps/examples/jsp/jsp2/jspx/textRotate.jpg create mode 100644 webapps/examples/jsp/jsp2/jspx/textRotate.jspx create mode 100644 webapps/examples/jsp/jsp2/misc/coda.jspf create mode 100644 webapps/examples/jsp/jsp2/misc/config.html create mode 100644 webapps/examples/jsp/jsp2/misc/config.jsp create mode 100644 webapps/examples/jsp/jsp2/misc/dynamicattrs.html create mode 100644 webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp create mode 100644 webapps/examples/jsp/jsp2/misc/prelude.jspf create mode 100644 webapps/examples/jsp/jsp2/simpletag/book.html create mode 100644 webapps/examples/jsp/jsp2/simpletag/book.jsp create mode 100644 webapps/examples/jsp/jsp2/simpletag/hello.html create mode 100644 webapps/examples/jsp/jsp2/simpletag/hello.jsp create mode 100644 webapps/examples/jsp/jsp2/simpletag/repeat.html create mode 100644 webapps/examples/jsp/jsp2/simpletag/repeat.jsp create mode 100644 webapps/examples/jsp/jsp2/tagfiles/hello.html create mode 100644 webapps/examples/jsp/jsp2/tagfiles/hello.jsp create mode 100644 webapps/examples/jsp/jsp2/tagfiles/panel.html create mode 100644 webapps/examples/jsp/jsp2/tagfiles/panel.jsp create mode 100644 webapps/examples/jsp/jsp2/tagfiles/products.html create mode 100644 webapps/examples/jsp/jsp2/tagfiles/products.jsp create mode 100644 webapps/examples/jsp/jsptoserv/hello.jsp create mode 100644 webapps/examples/jsp/jsptoserv/jsptoservlet.jsp create mode 100644 webapps/examples/jsp/jsptoserv/jts.html create mode 100644 webapps/examples/jsp/num/numguess.html create mode 100644 webapps/examples/jsp/num/numguess.jsp create mode 100644 webapps/examples/jsp/plugin/applet/Clock2.java create mode 100644 webapps/examples/jsp/plugin/plugin.html create mode 100644 webapps/examples/jsp/plugin/plugin.jsp create mode 100644 webapps/examples/jsp/security/protected/error.jsp create mode 100644 webapps/examples/jsp/security/protected/index.jsp create mode 100644 webapps/examples/jsp/security/protected/login.jsp create mode 100644 webapps/examples/jsp/sessions/DummyCart.html create mode 100644 webapps/examples/jsp/sessions/carts.html create mode 100644 webapps/examples/jsp/sessions/carts.jsp create mode 100644 webapps/examples/jsp/sessions/crt.html create mode 100644 webapps/examples/jsp/simpletag/foo.html create mode 100644 webapps/examples/jsp/simpletag/foo.jsp create mode 100644 webapps/examples/jsp/snp/snoop.html create mode 100644 webapps/examples/jsp/snp/snoop.jsp create mode 100644 webapps/examples/jsp/source.jsp create mode 100644 webapps/examples/jsp/tagplugin/choose.html create mode 100644 webapps/examples/jsp/tagplugin/choose.jsp create mode 100644 webapps/examples/jsp/tagplugin/foreach.html create mode 100644 webapps/examples/jsp/tagplugin/foreach.jsp create mode 100644 webapps/examples/jsp/tagplugin/howto.html create mode 100644 webapps/examples/jsp/tagplugin/if.html create mode 100644 webapps/examples/jsp/tagplugin/if.jsp create mode 100644 webapps/examples/jsp/tagplugin/notes.html create mode 100644 webapps/examples/jsp/xml/xml.html create mode 100644 webapps/examples/jsp/xml/xml.jsp create mode 100644 webapps/examples/servlets/images/code.gif create mode 100644 webapps/examples/servlets/images/execute.gif create mode 100644 webapps/examples/servlets/images/return.gif diff --git a/webapps/examples/WEB-INF/classes/CookieExample.java b/webapps/examples/WEB-INF/classes/CookieExample.java new file mode 100644 index 000000000..a301ed9b2 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/CookieExample.java @@ -0,0 +1,121 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* $Id: CookieExample.java 267129 2004-03-18 16:40:35Z jfarcand $ + * + */ + +import java.io.*; +import java.text.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; + +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson + */ + +public class CookieExample extends HttpServlet { + + ResourceBundle rb = ResourceBundle.getBundle("LocalStrings"); + + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(""); + + String title = rb.getString("cookies.title"); + out.println("" + title + ""); + out.println(""); + out.println(""); + + // relative links + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println(""); + out.println("\"view"); + out.println(""); + out.println("\"return\""); + + out.println("

" + title + "

"); + + Cookie[] cookies = request.getCookies(); + if ((cookies != null) && (cookies.length > 0)) { + out.println(rb.getString("cookies.cookies") + "
"); + for (int i = 0; i < cookies.length; i++) { + Cookie cookie = cookies[i]; + out.print("Cookie Name: " + HTMLFilter.filter(cookie.getName()) + + "
"); + out.println(" Cookie Value: " + + HTMLFilter.filter(cookie.getValue()) + + "

"); + } + } else { + out.println(rb.getString("cookies.no-cookies")); + } + + String cookieName = request.getParameter("cookiename"); + String cookieValue = request.getParameter("cookievalue"); + if (cookieName != null && cookieValue != null) { + Cookie cookie = new Cookie(cookieName, cookieValue); + response.addCookie(cookie); + out.println("

"); + out.println(rb.getString("cookies.set") + "
"); + out.print(rb.getString("cookies.name") + " " + + HTMLFilter.filter(cookieName) + "
"); + out.print(rb.getString("cookies.value") + " " + + HTMLFilter.filter(cookieValue)); + } + + out.println("

"); + out.println(rb.getString("cookies.make-cookie") + "
"); + out.print("

"); + out.print(rb.getString("cookies.name") + " "); + out.println("
"); + out.print(rb.getString("cookies.value") + " "); + out.println("
"); + out.println("
"); + + + out.println(""); + out.println(""); + } + + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} + + diff --git a/webapps/examples/WEB-INF/classes/HelloWorldExample.java b/webapps/examples/WEB-INF/classes/HelloWorldExample.java new file mode 100644 index 000000000..7467297e2 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/HelloWorldExample.java @@ -0,0 +1,75 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* $Id: HelloWorldExample.java 267129 2004-03-18 16:40:35Z jfarcand $ + * + */ + +import java.io.*; +import java.text.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; + +/** + * The simplest possible servlet. + * + * @author James Duncan Davidson + */ + +public class HelloWorldExample extends HttpServlet { + + + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + ResourceBundle rb = + ResourceBundle.getBundle("LocalStrings",request.getLocale()); + response.setContentType("text/html"); + PrintWriter out = response.getWriter(); + + out.println(""); + out.println(""); + + String title = rb.getString("helloworld.title"); + + out.println("" + title + ""); + out.println(""); + out.println(""); + + // note that all links are created to be relative. this + // ensures that we can move the web application that this + // servlet belongs to to a different place in the url + // tree and not have any harmful side effects. + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println(""); + out.println("\"view"); + out.println(""); + out.println("\"return\""); + out.println("

" + title + "

"); + out.println(""); + out.println(""); + } +} + + + diff --git a/webapps/examples/WEB-INF/classes/LocalStrings.properties b/webapps/examples/WEB-INF/classes/LocalStrings.properties new file mode 100644 index 000000000..f41c061cd --- /dev/null +++ b/webapps/examples/WEB-INF/classes/LocalStrings.properties @@ -0,0 +1,52 @@ +# Copyright 2004 The Apache Software Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# $Id: LocalStrings.properties 267129 2004-03-18 16:40:35Z jfarcand $ + +# Default localized resources for example servlets +# This locale is en_US + +helloworld.title=Hello World! + +requestinfo.title=Request Information Example +requestinfo.label.method=Method: +requestinfo.label.requesturi=Request URI: +requestinfo.label.protocol=Protocol: +requestinfo.label.pathinfo=Path Info: +requestinfo.label.remoteaddr=Remote Address: + +requestheader.title=Request Header Example + +requestparams.title=Request Parameters Example +requestparams.params-in-req=Parameters in this request: +requestparams.no-params=No Parameters, Please enter some +requestparams.firstname=First Name: +requestparams.lastname=Last Name: + +cookies.title=Cookies Example +cookies.cookies=Your browser is sending the following cookies: +cookies.no-cookies=Your browser isn't sending any cookies +cookies.make-cookie=Create a cookie to send to your browser +cookies.name=Name: +cookies.value=Value: +cookies.set=You just sent the following cookie to your browser: + +sessions.title=Sessions Example +sessions.id=Session ID: +sessions.created=Created: +sessions.lastaccessed=Last Accessed: +sessions.data=The following data is in your session: +sessions.adddata=Add data to your session +sessions.dataname=Name of Session Attribute: +sessions.datavalue=Value of Session Attribute: diff --git a/webapps/examples/WEB-INF/classes/LocalStrings_en.properties b/webapps/examples/WEB-INF/classes/LocalStrings_en.properties new file mode 100644 index 000000000..9087bddd9 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/LocalStrings_en.properties @@ -0,0 +1,52 @@ +# Copyright 2004 The Apache Software Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# $Id: LocalStrings_en.properties 267129 2004-03-18 16:40:35Z jfarcand $ + +# Default localized resources for example servlets +# This locale is en_US + +helloworld.title=Hello World! + +requestinfo.title=Request Information Example +requestinfo.label.method=Method: +requestinfo.label.requesturi=Request URI: +requestinfo.label.protocol=Protocol: +requestinfo.label.pathinfo=Path Info: +requestinfo.label.remoteaddr=Remote Address: + +requestheader.title=Request Header Example + +requestparams.title=Request Parameters Example +requestparams.params-in-req=Parameters in this request: +requestparams.no-params=No Parameters, Please enter some +requestparams.firstname=First Name: +requestparams.lastname=Last Name: + +cookies.title=Cookies Example +cookies.cookies=Your browser is sending the following cookies: +cookies.no-cookies=Your browser isn't sending any cookies +cookies.make-cookie=Create a cookie to send to your browser +cookies.name=Name: +cookies.value=Value: +cookies.set=You just sent the following cookie to your browser: + +sessions.title=Sessions Example +sessions.id=Session ID: +sessions.created=Created: +sessions.lastaccessed=Last Accessed: +sessions.data=The following data is in your session: +sessions.adddata=Add data to your session +sessions.dataname=Name of Session Attribute: +sessions.datavalue=Value of Session Attribute: diff --git a/webapps/examples/WEB-INF/classes/LocalStrings_es.properties b/webapps/examples/WEB-INF/classes/LocalStrings_es.properties new file mode 100644 index 000000000..78b897c68 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/LocalStrings_es.properties @@ -0,0 +1,52 @@ +# Copyright 2004 The Apache Software Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# $Id: LocalStrings_es.properties 267129 2004-03-18 16:40:35Z jfarcand $ +# +# Default localized string information +# Localized para Locale es_ES + +helloworld.title=Hola Mundo! + +requestinfo.title=Ejemplo de Informacion de Request +requestinfo.label.method=Metodo: +requestinfo.label.requesturi=Request URI: +requestinfo.label.protocol=Protocolo: +requestinfo.label.pathinfo=Path Info: +requestinfo.label.remoteaddr=Direccion Remota: + +requestheader.title=Ejemplo de Cabecera de Request + +requestparams.title=Ejemplo de parametros de Request +requestparams.params-in-req=Parametros en este Request: +requestparams.no-params=No hay parametro. por favor usa alguno +requestparams.firstname=Nombre: +requestparams.lastname=Apellidos: + +cookies.title=Ejemplo de Cookies +cookies.cookies=Tu navegador esta enviando los siguientes cookies: +cookies.no-cookies=Tu navegador no esta enviando cookies +cookies.make-cookie=Crea un cookie para enviarlo a tu navegador +cookies.name=Nombre: +cookies.value=Valor: +cookies.set=Acabas de enviar a tu navegador estos cookies: + +sessions.title=ejemplo de Sesiones +sessions.id=ID de Sesion: +sessions.created=Creado: +sessions.lastaccessed=Ultimo Acceso: +sessions.data=Lo siguientes datos estan en tu sesion: +sessions.adddata=Añade datos a tu sesion: +sessions.dataname=Nombre del atributo de sesion: +sessions.datavalue=Valor del atributo de sesion: diff --git a/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties b/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties new file mode 100644 index 000000000..569443a3b --- /dev/null +++ b/webapps/examples/WEB-INF/classes/LocalStrings_fr.properties @@ -0,0 +1,52 @@ +# Copyright 2004 The Apache Software Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# $Id: LocalStrings_fr.properties 267129 2004-03-18 16:40:35Z jfarcand $ + +# Default localized resources for example servlets +# This locale is fr_FR + +helloworld.title=Salut le Monde! + +requestinfo.title=Exemple d''information sur la requête +requestinfo.label.method=Méthode: +requestinfo.label.requesturi=URI de requête: +requestinfo.label.protocol=Protocole: +requestinfo.label.pathinfo=Info de chemin: +requestinfo.label.remoteaddr=Adresse distante: + +requestheader.title=Exemple d''information sur les entête de requête + +requestparams.title=Exemple de requête avec paramêtres +requestparams.params-in-req=Paramêtres dans la requête: +requestparams.no-params=Pas de paramêtre, merci dans saisir quelqu'uns +requestparams.firstname=Prénom: +requestparams.lastname=Nom: + +cookies.title=Exemple d''utilisation de Cookies +cookies.cookies=Votre navigateur retourne les cookies suivant: +cookies.no-cookies=Votre navigateur ne retourne aucun cookie +cookies.make-cookie=Création d''un cookie à retourner à votre navigateur +cookies.name=Nom: +cookies.value=Valeur: +cookies.set=Vous venez d''envoyer le cookie suivant à votre navigateur: + +sessions.title=Exemple de Sessions +sessions.id=ID de Session: +sessions.created=Crée le: +sessions.lastaccessed=Dernier accès: +sessions.data=Les données existantes dans votre session: +sessions.adddata=Ajouter des données à votre session +sessions.dataname=Nom de l''Attribut de Session: +sessions.datavalue=Valeur de l''Attribut de Session: diff --git a/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties b/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties new file mode 100644 index 000000000..9417ed7c9 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/LocalStrings_pt.properties @@ -0,0 +1,52 @@ +# Copyright 2004 The Apache Software Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# $Id: LocalStrings_pt.properties 267143 2004-08-24 18:38:35Z jfarcand $ + +# Default localized resources for example servlets +# This locale is pt_PT + +helloworld.title=Ola Mundo! + +requestinfo.title=Exemplo da Informacao do Pedido +requestinfo.label.method=Metodo: +requestinfo.label.requesturi=URI do Pedido: +requestinfo.label.protocol=Protocolo: +requestinfo.label.pathinfo=Informacao do Caminho: +requestinfo.label.remoteaddr=Endereco Remoto: + +requestheader.title=Exemplo da Cebeceira do Pedido + +requestparams.title=Examplo de Parametros do Pedido +requestparams.params-in-req=Parametros neste pedido: +requestparams.no-params=Sem Parametros, Por favor entre alguns +requestparams.firstname=Primeiro Nome: +requestparams.lastname=Apelido: + +cookies.title=CExamplo de Cookies +cookies.cookies=O se browser esta a enviar os seguintes cookies: +cookies.no-cookies=O seu browser nao esta a enviar nenhuns cookies +cookies.make-cookie=Crie um cookie para enviar para o seu browser +cookies.name=Nome: +cookies.value=Valor: +cookies.set=Acabou de enviar o seguinte cookie para o seu browser: + +sessions.title=Examplo de sessoes +sessions.id=Identificador da Sessao: +sessions.created=Criada: +sessions.lastaccessed=Ultima vez acedida: +sessions.data=Os seguintes dados fazem parte da sua sessao: +sessions.adddata=Adicione data a sua sessao +sessions.dataname=Nome do atributo da sessao: +sessions.datavalue=Valor do atributo da Sessao: diff --git a/webapps/examples/WEB-INF/classes/RequestHeaderExample.java b/webapps/examples/WEB-INF/classes/RequestHeaderExample.java new file mode 100644 index 000000000..36e967179 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/RequestHeaderExample.java @@ -0,0 +1,90 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* $Id: RequestHeaderExample.java 267129 2004-03-18 16:40:35Z jfarcand $ + * + */ + +import java.io.*; +import java.text.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; + +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson + */ + +public class RequestHeaderExample extends HttpServlet { + + ResourceBundle rb = ResourceBundle.getBundle("LocalStrings"); + + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(""); + + String title = rb.getString("requestheader.title"); + out.println("" + title + ""); + out.println(""); + out.println(""); + + // all links relative + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println(""); + out.println("\"view"); + out.println(""); + out.println("\"return\""); + + out.println("

" + title + "

"); + out.println(""); + Enumeration e = request.getHeaderNames(); + while (e.hasMoreElements()) { + String headerName = (String)e.nextElement(); + String headerValue = request.getHeader(headerName); + out.println(""); + } + out.println("
"); + out.println(HTMLFilter.filter(headerName)); + out.println(""); + out.println(HTMLFilter.filter(headerValue)); + out.println("
"); + } + + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} + diff --git a/webapps/examples/WEB-INF/classes/RequestInfoExample.java b/webapps/examples/WEB-INF/classes/RequestInfoExample.java new file mode 100644 index 000000000..966af3c9b --- /dev/null +++ b/webapps/examples/WEB-INF/classes/RequestInfoExample.java @@ -0,0 +1,114 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* $Id: RequestInfoExample.java 267129 2004-03-18 16:40:35Z jfarcand $ + * + */ + +import java.io.*; +import java.text.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; + +import util.HTMLFilter; + +/** + * Example servlet showing request information. + * + * @author James Duncan Davidson + */ + +public class RequestInfoExample extends HttpServlet { + + + ResourceBundle rb = ResourceBundle.getBundle("LocalStrings"); + + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(""); + + String title = rb.getString("requestinfo.title"); + out.println("" + title + ""); + out.println(""); + out.println(""); + + // img stuff not req'd for source code html showing + // all links relative! + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println(""); + out.println("\"view"); + out.println(""); + out.println("\"return\""); + + out.println("

" + title + "

"); + out.println("
"); + out.println(rb.getString("requestinfo.label.method")); + out.println(""); + out.println(request.getMethod()); + out.println("
"); + out.println(rb.getString("requestinfo.label.requesturi")); + out.println(""); + out.println(HTMLFilter.filter(request.getRequestURI())); + out.println("
"); + out.println(rb.getString("requestinfo.label.protocol")); + out.println(""); + out.println(request.getProtocol()); + out.println("
"); + out.println(rb.getString("requestinfo.label.pathinfo")); + out.println(""); + out.println(HTMLFilter.filter(request.getPathInfo())); + out.println("
"); + out.println(rb.getString("requestinfo.label.remoteaddr")); + + String cipherSuite= + (String)request.getAttribute("javax.servlet.request.cipher_suite"); + out.println(""); + out.println(request.getRemoteAddr()); + out.println("
"); + + if(cipherSuite!=null){ + out.println(""); + out.println("SSLCipherSuite:"); + out.println(""); + out.println(""); + out.println(request.getAttribute("javax.servlet.request.cipher_suite")); + out.println(""); + } + + } + + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} + diff --git a/webapps/examples/WEB-INF/classes/RequestParamExample.java b/webapps/examples/WEB-INF/classes/RequestParamExample.java new file mode 100644 index 000000000..b909e62b8 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/RequestParamExample.java @@ -0,0 +1,106 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* $Id: RequestParamExample.java 267129 2004-03-18 16:40:35Z jfarcand $ + * + */ + +import java.io.*; +import java.text.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; + +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson + */ + +public class RequestParamExample extends HttpServlet { + + + ResourceBundle rb = ResourceBundle.getBundle("LocalStrings"); + + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(""); + + String title = rb.getString("requestparams.title"); + out.println("" + title + ""); + out.println(""); + out.println(""); + + // img stuff not req'd for source code html showing + + // all links relative + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println(""); + out.println("\"view"); + out.println(""); + out.println("\"return\""); + + out.println("

" + title + "

"); + String firstName = request.getParameter("firstname"); + String lastName = request.getParameter("lastname"); + out.println(rb.getString("requestparams.params-in-req") + "
"); + if (firstName != null || lastName != null) { + out.println(rb.getString("requestparams.firstname")); + out.println(" = " + HTMLFilter.filter(firstName) + "
"); + out.println(rb.getString("requestparams.lastname")); + out.println(" = " + HTMLFilter.filter(lastName)); + } else { + out.println(rb.getString("requestparams.no-params")); + } + out.println("

"); + out.print("

"); + out.println(rb.getString("requestparams.firstname")); + out.println(""); + out.println("
"); + out.println(rb.getString("requestparams.lastname")); + out.println(""); + out.println("
"); + out.println(""); + out.println("
"); + + out.println(""); + out.println(""); + } + + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} diff --git a/webapps/examples/WEB-INF/classes/SessionExample.java b/webapps/examples/WEB-INF/classes/SessionExample.java new file mode 100644 index 000000000..6d8c23ef5 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/SessionExample.java @@ -0,0 +1,140 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +/* $Id: SessionExample.java 267129 2004-03-18 16:40:35Z jfarcand $ + * + */ + +import java.io.*; +import java.text.*; +import java.util.*; +import javax.servlet.*; +import javax.servlet.http.*; + +import util.HTMLFilter; + +/** + * Example servlet showing request headers + * + * @author James Duncan Davidson + */ + +public class SessionExample extends HttpServlet { + + ResourceBundle rb = ResourceBundle.getBundle("LocalStrings"); + + public void doGet(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + response.setContentType("text/html"); + + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(""); + + String title = rb.getString("sessions.title"); + out.println("" + title + ""); + out.println(""); + out.println(""); + + // img stuff not req'd for source code html showing + // relative links everywhere! + + // XXX + // making these absolute till we work out the + // addition of a PathInfo issue + + out.println(""); + out.println("\"view"); + out.println(""); + out.println("\"return\""); + + out.println("

" + title + "

"); + + HttpSession session = request.getSession(true); + out.println(rb.getString("sessions.id") + " " + session.getId()); + out.println("
"); + out.println(rb.getString("sessions.created") + " "); + out.println(new Date(session.getCreationTime()) + "
"); + out.println(rb.getString("sessions.lastaccessed") + " "); + out.println(new Date(session.getLastAccessedTime())); + + String dataName = request.getParameter("dataname"); + String dataValue = request.getParameter("datavalue"); + if (dataName != null && dataValue != null) { + session.setAttribute(dataName, dataValue); + } + + out.println("

"); + out.println(rb.getString("sessions.data") + "
"); + Enumeration names = session.getAttributeNames(); + while (names.hasMoreElements()) { + String name = (String) names.nextElement(); + String value = session.getAttribute(name).toString(); + out.println(HTMLFilter.filter(name) + " = " + + HTMLFilter.filter(value) + "
"); + } + + out.println("

"); + out.print("

"); + out.println(rb.getString("sessions.dataname")); + out.println(""); + out.println("
"); + out.println(rb.getString("sessions.datavalue")); + out.println(""); + out.println("
"); + out.println(""); + out.println("
"); + + out.println("

GET based form:
"); + out.print("

"); + out.println(rb.getString("sessions.dataname")); + out.println(""); + out.println("
"); + out.println(rb.getString("sessions.datavalue")); + out.println(""); + out.println("
"); + out.println(""); + out.println("
"); + + out.print("

URL encoded "); + + out.println(""); + out.println(""); + + out.println(""); + out.println(""); + } + + public void doPost(HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException + { + doGet(request, response); + } + +} diff --git a/webapps/examples/WEB-INF/classes/cal/Entries.java b/webapps/examples/WEB-INF/classes/cal/Entries.java new file mode 100644 index 000000000..f76259028 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/cal/Entries.java @@ -0,0 +1,72 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package cal; + +import java.util.Enumeration; +import java.util.Hashtable; +import javax.servlet.http.*; + +public class Entries { + + private Hashtable entries; + private static final String[] time = {"8am", "9am", "10am", "11am", "12pm", + "1pm", "2pm", "3pm", "4pm", "5pm", "6pm", + "7pm", "8pm" }; + public static final int rows = 12; + + public Entries () { + entries = new Hashtable (rows); + for (int i=0; i < rows; i++) { + entries.put (time[i], new Entry(time[i])); + } + } + + public int getRows () { + return rows; + } + + public Entry getEntry (int index) { + return (Entry)this.entries.get(time[index]); + } + + public int getIndex (String tm) { + for (int i=0; i= 0) { + String descr = request.getParameter ("description"); + ((Entry)entries.get(time[index])).setDescription (descr); + } + } + +} + + + + + + + + + + + + + diff --git a/webapps/examples/WEB-INF/classes/cal/Entry.java b/webapps/examples/WEB-INF/classes/cal/Entry.java new file mode 100644 index 000000000..035eda075 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/cal/Entry.java @@ -0,0 +1,54 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package cal; + +public class Entry { + + String hour; + String description; + String color; + + public Entry (String hour) { + this.hour = hour; + this.description = ""; + + } + + public String getHour () { + return this.hour; + } + + public String getColor () { + if (description.equals("")) return "lightblue"; + else return "red"; + } + + public String getDescription () { + if (description.equals("")) return "None"; + else return this.description; + } + + public void setDescription (String descr) { + description = descr; + } + +} + + + + + diff --git a/webapps/examples/WEB-INF/classes/cal/JspCalendar.java b/webapps/examples/WEB-INF/classes/cal/JspCalendar.java new file mode 100644 index 000000000..14063fdba --- /dev/null +++ b/webapps/examples/WEB-INF/classes/cal/JspCalendar.java @@ -0,0 +1,154 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package cal; + +import java.text.DateFormat; +import java.util.*; + +public class JspCalendar { + Calendar calendar = null; + Date currentDate; + + public JspCalendar() { + calendar = Calendar.getInstance(); + Date trialTime = new Date(); + calendar.setTime(trialTime); + } + + + public int getYear() { + return calendar.get(Calendar.YEAR); + } + + public String getMonth() { + int m = getMonthInt(); + String[] months = new String [] { "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" }; + if (m > 12) + return "Unknown to Man"; + + return months[m - 1]; + + } + + public String getDay() { + int x = getDayOfWeek(); + String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday"}; + + if (x > 7) + return "Unknown to Man"; + + return days[x - 1]; + + } + + public int getMonthInt() { + return 1 + calendar.get(Calendar.MONTH); + } + + public String getDate() { + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + } + + public String getCurrentDate() { + Date dt = new Date (); + calendar.setTime (dt); + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + + } + + public String getNextDate() { + calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() + 1); + return getDate (); + } + + public String getPrevDate() { + calendar.set (Calendar.DAY_OF_MONTH, getDayOfMonth() - 1); + return getDate (); + } + + public String getTime() { + return getHour() + ":" + getMinute() + ":" + getSecond(); + } + + public int getDayOfMonth() { + return calendar.get(Calendar.DAY_OF_MONTH); + } + + public int getDayOfYear() { + return calendar.get(Calendar.DAY_OF_YEAR); + } + + public int getWeekOfYear() { + return calendar.get(Calendar.WEEK_OF_YEAR); + } + + public int getWeekOfMonth() { + return calendar.get(Calendar.WEEK_OF_MONTH); + } + + public int getDayOfWeek() { + return calendar.get(Calendar.DAY_OF_WEEK); + } + + public int getHour() { + return calendar.get(Calendar.HOUR_OF_DAY); + } + + public int getMinute() { + return calendar.get(Calendar.MINUTE); + } + + + public int getSecond() { + return calendar.get(Calendar.SECOND); + } + + + public int getEra() { + return calendar.get(Calendar.ERA); + } + + public String getUSTimeZone() { + String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific", + "Mountain", "Central", "Eastern"}; + + return zones[10 + getZoneOffset()]; + } + + public int getZoneOffset() { + return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000); + } + + + public int getDSTOffset() { + return calendar.get(Calendar.DST_OFFSET)/(60*60*1000); + } + + + public int getAMPM() { + return calendar.get(Calendar.AM_PM); + } +} + + + + + diff --git a/webapps/examples/WEB-INF/classes/cal/TableBean.java b/webapps/examples/WEB-INF/classes/cal/TableBean.java new file mode 100644 index 000000000..75cd59947 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/cal/TableBean.java @@ -0,0 +1,101 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package cal; + +import java.beans.*; +import javax.servlet.http.*; +import javax.servlet.*; +import java.util.Hashtable; + +public class TableBean { + + Hashtable table; + JspCalendar JspCal; + Entries entries; + String date; + String name = null; + String email = null; + boolean processError = false; + + public TableBean () { + this.table = new Hashtable (10); + this.JspCal = new JspCalendar (); + this.date = JspCal.getCurrentDate (); + } + + public void setName (String nm) { + this.name = nm; + } + + public String getName () { + return this.name; + } + + public void setEmail (String mail) { + this.email = mail; + } + + public String getEmail () { + return this.email; + } + + public String getDate () { + return this.date; + } + + public Entries getEntries () { + return this.entries; + } + + public void processRequest (HttpServletRequest request) { + + // Get the name and e-mail. + this.processError = false; + if (name == null || name.equals("")) setName(request.getParameter ("name")); + if (email == null || email.equals("")) setEmail(request.getParameter ("email")); + if (name == null || email == null || + name.equals("") || email.equals("")) { + this.processError = true; + return; + } + + // Get the date. + String dateR = request.getParameter ("date"); + if (dateR == null) date = JspCal.getCurrentDate (); + else if (dateR.equalsIgnoreCase("next")) date = JspCal.getNextDate (); + else if (dateR.equalsIgnoreCase("prev")) date = JspCal.getPrevDate (); + + entries = (Entries) table.get (date); + if (entries == null) { + entries = new Entries (); + table.put (date, entries); + } + + // If time is provided add the event. + String time = request.getParameter("time"); + if (time != null) entries.processRequest (request, time); + } + + public boolean getProcessError () { + return this.processError; + } +} + + + + + + diff --git a/webapps/examples/WEB-INF/classes/chat/ChatServlet.java b/webapps/examples/WEB-INF/classes/chat/ChatServlet.java new file mode 100644 index 000000000..1cd26293c --- /dev/null +++ b/webapps/examples/WEB-INF/classes/chat/ChatServlet.java @@ -0,0 +1,212 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package chat; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.ArrayList; + +import org.apache.catalina.servlets.CometServlet; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * Helper class to implement Comet functionality. + */ +public class ChatServlet + extends CometServlet { + + protected ArrayList connections = + new ArrayList(); + protected MessageSender messageSender = null; + + public void init() throws ServletException { + messageSender = new MessageSender(); + Thread messageSenderThread = + new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]"); + messageSenderThread.setDaemon(true); + messageSenderThread.start(); + } + + public void destroy() { + connections.clear(); + messageSender.stop(); + messageSender = null; + } + + public void begin(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + super.begin(request, response); + log("Begin for session: " + request.getSession(true).getId()); + + PrintWriter writer = response.getWriter(); + writer.println(""); + writer.println("JSP Chat"); + writer.flush(); + + synchronized(connections) { + connections.add(response); + } + } + + public void end(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + super.end(request, response); + log("End for session: " + request.getSession(true).getId()); + synchronized(connections) { + connections.remove(response); + } + + PrintWriter writer = response.getWriter(); + writer.println(""); + + } + + public void error(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + log("Error for session: " + request.getSession(true).getId()); + end(request, response); + } + + public boolean read(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + InputStream is = request.getInputStream(); + byte[] buf = new byte[512]; + do { + int n = is.read(buf); + if (n > 0) { + log("Read " + n + " bytes: " + new String(buf, 0, n) + + " for session: " + request.getSession(true).getId()); + } else if (n < 0) { + return false; + } + } while (is.available() > 0); + return true; + } + + protected void service(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + String action = request.getParameter("action"); + if (action != null) { + if ("login".equals(action)) { + String nickname = request.getParameter("nickname"); + request.getSession(true).setAttribute("nickname", nickname); + response.sendRedirect("post.jsp"); + } else { + String nickname = (String) request.getSession(true).getAttribute("nickname"); + String message = request.getParameter("message"); + messageSender.send(nickname, message); + response.sendRedirect("post.jsp"); + } + } else { + if (request.getSession(true).getAttribute("nickname") == null) { + // Redirect to "login" + response.sendRedirect("login.jsp"); + } else { + // Request to view the chet, so use Comet + super.service(request, response); + } + } + } + + + /** + * Poller class. + */ + public class MessageSender implements Runnable { + + protected boolean running = true; + protected ArrayList messages = new ArrayList(); + + public MessageSender() { + } + + public void stop() { + running = false; + } + + /** + * Add specified socket and associated pool to the poller. The socket will + * be added to a temporary array, and polled first after a maximum amount + * of time equal to pollTime (in most cases, latency will be much lower, + * however). + * + * @param socket to add to the poller + */ + public void send(String user, String message) { + synchronized (messages) { + messages.add("[" + user + "]: " + message); + messages.notify(); + } + } + + /** + * The background thread that listens for incoming TCP/IP connections and + * hands them off to an appropriate processor. + */ + public void run() { + + // Loop until we receive a shutdown command + while (running) { + // Loop if endpoint is paused + + if (messages.size() == 0) { + try { + synchronized (messages) { + messages.wait(); + } + } catch (InterruptedException e) { + // Ignore + } + } + + synchronized (connections) { + String[] pendingMessages = null; + synchronized (messages) { + pendingMessages = messages.toArray(new String[0]); + messages.clear(); + } + for (int i = 0; i < connections.size(); i++) { + try { + PrintWriter writer = connections.get(i).getWriter(); + for (int j = 0; j < pendingMessages.length; j++) { + // FIXME: Add HTML filtering + writer.println(pendingMessages[j] + "
"); + } + writer.flush(); + } catch (IOException e) { + log("IOExeption sending message", e); + } + } + } + + } + + } + + } + + + + +} diff --git a/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java b/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java new file mode 100644 index 000000000..ad6d2ed64 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/checkbox/CheckTest.java @@ -0,0 +1,30 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package checkbox; + +public class CheckTest { + + String b[] = new String[] { "1", "2", "3", "4" }; + + public String[] getFruit() { + return b; + } + + public void setFruit(String [] b) { + this.b = b; + } +} diff --git a/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java b/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java new file mode 100644 index 000000000..1235b98b1 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/colors/ColorGameBean.java @@ -0,0 +1,114 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package colors; + +import javax.servlet.http.*; + +public class ColorGameBean { + + private String background = "yellow"; + private String foreground = "red"; + private String color1 = foreground; + private String color2 = background; + private String hint = "no"; + private int attempts = 0; + private int intval = 0; + private boolean tookHints = false; + + public void processRequest(HttpServletRequest request) { + + // background = "yellow"; + // foreground = "red"; + + if (! color1.equals(foreground)) { + if (color1.equalsIgnoreCase("black") || + color1.equalsIgnoreCase("cyan")) { + background = color1; + } + } + + if (! color2.equals(background)) { + if (color2.equalsIgnoreCase("black") || + color2.equalsIgnoreCase("cyan")) { + foreground = color2; + } + } + + attempts++; + } + + public void setColor2(String x) { + color2 = x; + } + + public void setColor1(String x) { + color1 = x; + } + + public void setAction(String x) { + if (!tookHints) + tookHints = x.equalsIgnoreCase("Hint"); + hint = x; + } + + public String getColor2() { + return background; + } + + public String getColor1() { + return foreground; + } + + public int getAttempts() { + return attempts; + } + + public boolean getHint() { + return hint.equalsIgnoreCase("Hint"); + } + + public boolean getSuccess() { + if (background.equalsIgnoreCase("black") || + background.equalsIgnoreCase("cyan")) { + + if (foreground.equalsIgnoreCase("black") || + foreground.equalsIgnoreCase("cyan")) + return true; + else + return false; + } + + return false; + } + + public boolean getHintTaken() { + return tookHints; + } + + public void reset() { + foreground = "red"; + background = "yellow"; + } + + public void setIntval(int value) { + intval = value; + } + + public int getIntval() { + return intval; + } +} + diff --git a/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java new file mode 100644 index 000000000..718865900 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilter.java @@ -0,0 +1,218 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package compressionFilters; + +import java.io.IOException; +import java.util.Enumeration; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * Implementation of javax.servlet.Filter used to compress + * the ServletResponse if it is bigger than a threshold. + * + * @author Amy Roh + * @author Dmitri Valdin + * @version $Revision: 267129 $, $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public class CompressionFilter implements Filter{ + + /** + * The filter configuration object we are associated with. If this value + * is null, this filter instance is not currently configured. + */ + private FilterConfig config = null; + + /** + * Minimal reasonable threshold + */ + private int minThreshold = 128; + + + /** + * The threshold number to compress + */ + protected int compressionThreshold; + + /** + * Debug level for this filter + */ + private int debug = 0; + + /** + * Place this filter into service. + * + * @param filterConfig The filter configuration object + */ + + public void init(FilterConfig filterConfig) { + + config = filterConfig; + if (filterConfig != null) { + String value = filterConfig.getInitParameter("debug"); + if (value!=null) { + debug = Integer.parseInt(value); + } else { + debug = 0; + } + String str = filterConfig.getInitParameter("compressionThreshold"); + if (str!=null) { + compressionThreshold = Integer.parseInt(str); + if (compressionThreshold != 0 && compressionThreshold < minThreshold) { + if (debug > 0) { + System.out.println("compressionThreshold should be either 0 - no compression or >= " + minThreshold); + System.out.println("compressionThreshold set to " + minThreshold); + } + compressionThreshold = minThreshold; + } + } else { + compressionThreshold = 0; + } + + } else { + compressionThreshold = 0; + } + + } + + /** + * Take this filter out of service. + */ + public void destroy() { + + this.config = null; + + } + + /** + * The doFilter method of the Filter is called by the container + * each time a request/response pair is passed through the chain due + * to a client request for a resource at the end of the chain. + * The FilterChain passed into this method allows the Filter to pass on the + * request and response to the next entity in the chain.

+ * This method first examines the request to check whether the client support + * compression.
+ * It simply just pass the request and response if there is no support for + * compression.
+ * If the compression support is available, it creates a + * CompressionServletResponseWrapper object which compresses the content and + * modifies the header if the content length is big enough. + * It then invokes the next entity in the chain using the FilterChain object + * (chain.doFilter()),
+ **/ + + public void doFilter ( ServletRequest request, ServletResponse response, + FilterChain chain ) throws IOException, ServletException { + + if (debug > 0) { + System.out.println("@doFilter"); + } + + if (compressionThreshold == 0) { + if (debug > 0) { + System.out.println("doFilter gets called, but compressionTreshold is set to 0 - no compression"); + } + chain.doFilter(request, response); + return; + } + + boolean supportCompression = false; + if (request instanceof HttpServletRequest) { + if (debug > 1) { + System.out.println("requestURI = " + ((HttpServletRequest)request).getRequestURI()); + } + + // Are we allowed to compress ? + String s = (String) ((HttpServletRequest)request).getParameter("gzip"); + if ("false".equals(s)) { + if (debug > 0) { + System.out.println("got parameter gzip=false --> don't compress, just chain filter"); + } + chain.doFilter(request, response); + return; + } + + Enumeration e = + ((HttpServletRequest)request).getHeaders("Accept-Encoding"); + while (e.hasMoreElements()) { + String name = (String)e.nextElement(); + if (name.indexOf("gzip") != -1) { + if (debug > 0) { + System.out.println("supports compression"); + } + supportCompression = true; + } else { + if (debug > 0) { + System.out.println("no support for compresion"); + } + } + } + } + + if (!supportCompression) { + if (debug > 0) { + System.out.println("doFilter gets called wo compression"); + } + chain.doFilter(request, response); + return; + } else { + if (response instanceof HttpServletResponse) { + CompressionServletResponseWrapper wrappedResponse = + new CompressionServletResponseWrapper((HttpServletResponse)response); + wrappedResponse.setDebugLevel(debug); + wrappedResponse.setCompressionThreshold(compressionThreshold); + if (debug > 0) { + System.out.println("doFilter gets called with compression"); + } + try { + chain.doFilter(request, wrappedResponse); + } finally { + wrappedResponse.finishResponse(); + } + return; + } + } + } + + /** + * Set filter config + * This function is equivalent to init. Required by Weblogic 6.1 + * + * @param filterConfig The filter configuration object + */ + public void setFilterConfig(FilterConfig filterConfig) { + init(filterConfig); + } + + /** + * Return filter config + * Required by Weblogic 6.1 + */ + public FilterConfig getFilterConfig() { + return config; + } + +} + diff --git a/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java new file mode 100644 index 000000000..d52f58cc2 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionFilterTestServlet.java @@ -0,0 +1,57 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package compressionFilters; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Enumeration; +import javax.servlet.*; +import javax.servlet.http.*; + +/** + * Very Simple test servlet to test compression filter + * @author Amy Roh + * @version $Revision: 267129 $, $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public class CompressionFilterTestServlet extends HttpServlet { + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + ServletOutputStream out = response.getOutputStream(); + response.setContentType("text/plain"); + + Enumeration e = ((HttpServletRequest)request).getHeaders("Accept-Encoding"); + while (e.hasMoreElements()) { + String name = (String)e.nextElement(); + out.println(name); + if (name.indexOf("gzip") != -1) { + out.println("gzip supported -- able to compress"); + } + else { + out.println("gzip not supported"); + } + } + + + out.println("Compression Filter Test Servlet"); + out.close(); + } + +} + diff --git a/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java new file mode 100644 index 000000000..70632f621 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionResponseStream.java @@ -0,0 +1,317 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package compressionFilters; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.zip.GZIPOutputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + + +/** + * Implementation of ServletOutputStream that works with + * the CompressionServletResponseWrapper implementation. + * + * @author Amy Roh + * @author Dmitri Valdin + * @version $Revision: 267129 $, $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public class CompressionResponseStream + extends ServletOutputStream { + + + // ----------------------------------------------------------- Constructors + + + /** + * Construct a servlet output stream associated with the specified Response. + * + * @param response The associated response + */ + public CompressionResponseStream(HttpServletResponse response) throws IOException{ + + super(); + closed = false; + this.response = response; + this.output = response.getOutputStream(); + + } + + + // ----------------------------------------------------- Instance Variables + + + /** + * The threshold number which decides to compress or not. + * Users can configure in web.xml to set it to fit their needs. + */ + protected int compressionThreshold = 0; + + /** + * Debug level + */ + private int debug = 0; + + /** + * The buffer through which all of our output bytes are passed. + */ + protected byte[] buffer = null; + + /** + * The number of data bytes currently in the buffer. + */ + protected int bufferCount = 0; + + /** + * The underlying gzip output stream to which we should write data. + */ + protected GZIPOutputStream gzipstream = null; + + /** + * Has this stream been closed? + */ + protected boolean closed = false; + + /** + * The content length past which we will not write, or -1 if there is + * no defined content length. + */ + protected int length = -1; + + /** + * The response with which this servlet output stream is associated. + */ + protected HttpServletResponse response = null; + + /** + * The underlying servket output stream to which we should write data. + */ + protected ServletOutputStream output = null; + + + // --------------------------------------------------------- Public Methods + + /** + * Set debug level + */ + public void setDebugLevel(int debug) { + this.debug = debug; + } + + + /** + * Set the compressionThreshold number and create buffer for this size + */ + protected void setBuffer(int threshold) { + compressionThreshold = threshold; + buffer = new byte[compressionThreshold]; + if (debug > 1) { + System.out.println("buffer is set to "+compressionThreshold); + } + } + + /** + * Close this output stream, causing any buffered data to be flushed and + * any further output data to throw an IOException. + */ + public void close() throws IOException { + + if (debug > 1) { + System.out.println("close() @ CompressionResponseStream"); + } + if (closed) + throw new IOException("This output stream has already been closed"); + + if (gzipstream != null) { + flushToGZip(); + gzipstream.close(); + gzipstream = null; + } else { + if (bufferCount > 0) { + if (debug > 2) { + System.out.print("output.write("); + System.out.write(buffer, 0, bufferCount); + System.out.println(")"); + } + output.write(buffer, 0, bufferCount); + bufferCount = 0; + } + } + + output.close(); + closed = true; + + } + + + /** + * Flush any buffered data for this output stream, which also causes the + * response to be committed. + */ + public void flush() throws IOException { + + if (debug > 1) { + System.out.println("flush() @ CompressionResponseStream"); + } + if (closed) { + throw new IOException("Cannot flush a closed output stream"); + } + + if (gzipstream != null) { + gzipstream.flush(); + } + + } + + public void flushToGZip() throws IOException { + + if (debug > 1) { + System.out.println("flushToGZip() @ CompressionResponseStream"); + } + if (bufferCount > 0) { + if (debug > 1) { + System.out.println("flushing out to GZipStream, bufferCount = " + bufferCount); + } + writeToGZip(buffer, 0, bufferCount); + bufferCount = 0; + } + + } + + /** + * Write the specified byte to our output stream. + * + * @param b The byte to be written + * + * @exception IOException if an input/output error occurs + */ + public void write(int b) throws IOException { + + if (debug > 1) { + System.out.println("write "+b+" in CompressionResponseStream "); + } + if (closed) + throw new IOException("Cannot write to a closed output stream"); + + if (bufferCount >= buffer.length) { + flushToGZip(); + } + + buffer[bufferCount++] = (byte) b; + + } + + + /** + * Write b.length bytes from the specified byte array + * to our output stream. + * + * @param b The byte array to be written + * + * @exception IOException if an input/output error occurs + */ + public void write(byte b[]) throws IOException { + + write(b, 0, b.length); + + } + + + /** + * Write len bytes from the specified byte array, starting + * at the specified offset, to our output stream. + * + * @param b The byte array containing the bytes to be written + * @param off Zero-relative starting offset of the bytes to be written + * @param len The number of bytes to be written + * + * @exception IOException if an input/output error occurs + */ + public void write(byte b[], int off, int len) throws IOException { + + if (debug > 1) { + System.out.println("write, bufferCount = " + bufferCount + " len = " + len + " off = " + off); + } + if (debug > 2) { + System.out.print("write("); + System.out.write(b, off, len); + System.out.println(")"); + } + + if (closed) + throw new IOException("Cannot write to a closed output stream"); + + if (len == 0) + return; + + // Can we write into buffer ? + if (len <= (buffer.length - bufferCount)) { + System.arraycopy(b, off, buffer, bufferCount, len); + bufferCount += len; + return; + } + + // There is not enough space in buffer. Flush it ... + flushToGZip(); + + // ... and try again. Note, that bufferCount = 0 here ! + if (len <= (buffer.length - bufferCount)) { + System.arraycopy(b, off, buffer, bufferCount, len); + bufferCount += len; + return; + } + + // write direct to gzip + writeToGZip(b, off, len); + } + + public void writeToGZip(byte b[], int off, int len) throws IOException { + + if (debug > 1) { + System.out.println("writeToGZip, len = " + len); + } + if (debug > 2) { + System.out.print("writeToGZip("); + System.out.write(b, off, len); + System.out.println(")"); + } + if (gzipstream == null) { + if (debug > 1) { + System.out.println("new GZIPOutputStream"); + } + response.addHeader("Content-Encoding", "gzip"); + gzipstream = new GZIPOutputStream(output); + } + gzipstream.write(b, off, len); + + } + + + // -------------------------------------------------------- Package Methods + + + /** + * Has this response stream been closed? + */ + public boolean closed() { + + return (this.closed); + + } + +} diff --git a/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java new file mode 100644 index 000000000..6dcd8d1f9 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/compressionFilters/CompressionServletResponseWrapper.java @@ -0,0 +1,276 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package compressionFilters; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.util.Locale; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.ServletResponse; +import javax.servlet.ServletResponseWrapper; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; + +/** + * Implementation of HttpServletResponseWrapper that works with + * the CompressionServletResponseStream implementation.. + * + * @author Amy Roh + * @author Dmitri Valdin + * @version $Revision: 267129 $, $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public class CompressionServletResponseWrapper extends HttpServletResponseWrapper { + + // ----------------------------------------------------- Constructor + + /** + * Calls the parent constructor which creates a ServletResponse adaptor + * wrapping the given response object. + */ + + public CompressionServletResponseWrapper(HttpServletResponse response) { + super(response); + origResponse = response; + if (debug > 1) { + System.out.println("CompressionServletResponseWrapper constructor gets called"); + } + } + + + // ----------------------------------------------------- Instance Variables + + /** + * Original response + */ + + protected HttpServletResponse origResponse = null; + + /** + * Descriptive information about this Response implementation. + */ + + protected static final String info = "CompressionServletResponseWrapper"; + + /** + * The ServletOutputStream that has been returned by + * getOutputStream(), if any. + */ + + protected ServletOutputStream stream = null; + + + /** + * The PrintWriter that has been returned by + * getWriter(), if any. + */ + + protected PrintWriter writer = null; + + /** + * The threshold number to compress + */ + protected int threshold = 0; + + /** + * Debug level + */ + private int debug = 0; + + /** + * Content type + */ + protected String contentType = null; + + // --------------------------------------------------------- Public Methods + + + /** + * Set content type + */ + public void setContentType(String contentType) { + if (debug > 1) { + System.out.println("setContentType to "+contentType); + } + this.contentType = contentType; + origResponse.setContentType(contentType); + } + + + /** + * Set threshold number + */ + public void setCompressionThreshold(int threshold) { + if (debug > 1) { + System.out.println("setCompressionThreshold to " + threshold); + } + this.threshold = threshold; + } + + + /** + * Set debug level + */ + public void setDebugLevel(int debug) { + this.debug = debug; + } + + + /** + * Create and return a ServletOutputStream to write the content + * associated with this Response. + * + * @exception IOException if an input/output error occurs + */ + public ServletOutputStream createOutputStream() throws IOException { + if (debug > 1) { + System.out.println("createOutputStream gets called"); + } + + CompressionResponseStream stream = new CompressionResponseStream(origResponse); + stream.setDebugLevel(debug); + stream.setBuffer(threshold); + + return stream; + + } + + + /** + * Finish a response. + */ + public void finishResponse() { + try { + if (writer != null) { + writer.close(); + } else { + if (stream != null) + stream.close(); + } + } catch (IOException e) { + } + } + + + // ------------------------------------------------ ServletResponse Methods + + + /** + * Flush the buffer and commit this response. + * + * @exception IOException if an input/output error occurs + */ + public void flushBuffer() throws IOException { + if (debug > 1) { + System.out.println("flush buffer @ CompressionServletResponseWrapper"); + } + ((CompressionResponseStream)stream).flush(); + + } + + /** + * Return the servlet output stream associated with this Response. + * + * @exception IllegalStateException if getWriter has + * already been called for this response + * @exception IOException if an input/output error occurs + */ + public ServletOutputStream getOutputStream() throws IOException { + + if (writer != null) + throw new IllegalStateException("getWriter() has already been called for this response"); + + if (stream == null) + stream = createOutputStream(); + if (debug > 1) { + System.out.println("stream is set to "+stream+" in getOutputStream"); + } + + return (stream); + + } + + /** + * Return the writer associated with this Response. + * + * @exception IllegalStateException if getOutputStream has + * already been called for this response + * @exception IOException if an input/output error occurs + */ + public PrintWriter getWriter() throws IOException { + + if (writer != null) + return (writer); + + if (stream != null) + throw new IllegalStateException("getOutputStream() has already been called for this response"); + + stream = createOutputStream(); + if (debug > 1) { + System.out.println("stream is set to "+stream+" in getWriter"); + } + //String charset = getCharsetFromContentType(contentType); + String charEnc = origResponse.getCharacterEncoding(); + if (debug > 1) { + System.out.println("character encoding is " + charEnc); + } + // HttpServletResponse.getCharacterEncoding() shouldn't return null + // according the spec, so feel free to remove that "if" + if (charEnc != null) { + writer = new PrintWriter(new OutputStreamWriter(stream, charEnc)); + } else { + writer = new PrintWriter(stream); + } + + return (writer); + + } + + + public void setContentLength(int length) { + } + + + /** + * Returns character from content type. This method was taken from tomcat. + * @author rajo + */ + private static String getCharsetFromContentType(String type) { + + if (type == null) { + return null; + } + int semi = type.indexOf(";"); + if (semi == -1) { + return null; + } + String afterSemi = type.substring(semi + 1); + int charsetLocation = afterSemi.indexOf("charset="); + if(charsetLocation == -1) { + return null; + } else { + String afterCharset = afterSemi.substring(charsetLocation + 8); + String encoding = afterCharset.trim(); + return encoding; + } + } + +} diff --git a/webapps/examples/WEB-INF/classes/dates/JspCalendar.java b/webapps/examples/WEB-INF/classes/dates/JspCalendar.java new file mode 100644 index 000000000..b0194755a --- /dev/null +++ b/webapps/examples/WEB-INF/classes/dates/JspCalendar.java @@ -0,0 +1,152 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package dates; + +import java.text.DateFormat; +import java.util.*; + +public class JspCalendar { + Calendar calendar = null; + + public JspCalendar() { + calendar = Calendar.getInstance(); + Date trialTime = new Date(); + calendar.setTime(trialTime); + } + + public int getYear() { + return calendar.get(Calendar.YEAR); + } + + public String getMonth() { + int m = getMonthInt(); + String[] months = new String [] { "January", "February", "March", + "April", "May", "June", + "July", "August", "September", + "October", "November", "December" }; + if (m > 12) + return "Unknown to Man"; + + return months[m - 1]; + + } + + public String getDay() { + int x = getDayOfWeek(); + String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday"}; + + if (x > 7) + return "Unknown to Man"; + + return days[x - 1]; + + } + + public int getMonthInt() { + return 1 + calendar.get(Calendar.MONTH); + } + + public String getDate() { + return getMonthInt() + "/" + getDayOfMonth() + "/" + getYear(); + + } + + public String getTime() { + return getHour() + ":" + getMinute() + ":" + getSecond(); + } + + public int getDayOfMonth() { + return calendar.get(Calendar.DAY_OF_MONTH); + } + + public int getDayOfYear() { + return calendar.get(Calendar.DAY_OF_YEAR); + } + + public int getWeekOfYear() { + return calendar.get(Calendar.WEEK_OF_YEAR); + } + + public int getWeekOfMonth() { + return calendar.get(Calendar.WEEK_OF_MONTH); + } + + public int getDayOfWeek() { + return calendar.get(Calendar.DAY_OF_WEEK); + } + + public int getHour() { + return calendar.get(Calendar.HOUR_OF_DAY); + } + + public int getMinute() { + return calendar.get(Calendar.MINUTE); + } + + + public int getSecond() { + return calendar.get(Calendar.SECOND); + } + + public static void main(String args[]) { + JspCalendar db = new JspCalendar(); + p("date: " + db.getDayOfMonth()); + p("year: " + db.getYear()); + p("month: " + db.getMonth()); + p("time: " + db.getTime()); + p("date: " + db.getDate()); + p("Day: " + db.getDay()); + p("DayOfYear: " + db.getDayOfYear()); + p("WeekOfYear: " + db.getWeekOfYear()); + p("era: " + db.getEra()); + p("ampm: " + db.getAMPM()); + p("DST: " + db.getDSTOffset()); + p("ZONE Offset: " + db.getZoneOffset()); + p("TIMEZONE: " + db.getUSTimeZone()); + } + + private static void p(String x) { + System.out.println(x); + } + + + public int getEra() { + return calendar.get(Calendar.ERA); + } + + public String getUSTimeZone() { + String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific", + "Mountain", "Central", "Eastern"}; + + return zones[10 + getZoneOffset()]; + } + + public int getZoneOffset() { + return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000); + } + + + public int getDSTOffset() { + return calendar.get(Calendar.DST_OFFSET)/(60*60*1000); + } + + + public int getAMPM() { + return calendar.get(Calendar.AM_PM); + } +} + diff --git a/webapps/examples/WEB-INF/classes/error/Smart.java b/webapps/examples/WEB-INF/classes/error/Smart.java new file mode 100644 index 000000000..e5158e7a2 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/error/Smart.java @@ -0,0 +1,34 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package error; + +import java.io.*; +import java.lang.*; + +public class Smart { + + String name = "JSP"; + + public String getName () { + return name; + } + + public void setName (String name) { + this.name = name; + } +} diff --git a/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java b/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java new file mode 100644 index 000000000..4b64e9581 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/examples/ExampleTagBase.java @@ -0,0 +1,66 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import javax.servlet.jsp.*; +import javax.servlet.jsp.tagext.*; + +public abstract class ExampleTagBase extends BodyTagSupport { + + public void setParent(Tag parent) { + this.parent = parent; + } + + public void setBodyContent(BodyContent bodyOut) { + this.bodyOut = bodyOut; + } + + public void setPageContext(PageContext pageContext) { + this.pageContext = pageContext; + } + + public Tag getParent() { + return this.parent; + } + + public int doStartTag() throws JspException { + return SKIP_BODY; + } + + public int doEndTag() throws JspException { + return EVAL_PAGE; + } + + + // Default implementations for BodyTag methods as well + // just in case a tag decides to implement BodyTag. + public void doInitBody() throws JspException { + } + + public int doAfterBody() throws JspException { + return SKIP_BODY; + } + + public void release() { + bodyOut = null; + pageContext = null; + parent = null; + } + + protected BodyContent bodyOut; + protected PageContext pageContext; + protected Tag parent; +} diff --git a/webapps/examples/WEB-INF/classes/examples/FooTag.java b/webapps/examples/WEB-INF/classes/examples/FooTag.java new file mode 100644 index 000000000..e03dc191c --- /dev/null +++ b/webapps/examples/WEB-INF/classes/examples/FooTag.java @@ -0,0 +1,82 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import javax.servlet.jsp.*; +import javax.servlet.jsp.tagext.*; +import java.util.Hashtable; +import java.io.Writer; +import java.io.IOException; + +/** + * Example1: the simplest tag + * Collect attributes and call into some actions + * + * + */ + +public class FooTag + extends ExampleTagBase +{ + private String atts[] = new String[3]; + int i = 0; + + private final void setAtt(int index, String value) { + atts[index] = value; + } + + public void setAtt1(String value) { + setAtt(0, value); + } + + public void setAtt2(String value) { + setAtt(1, value); + } + + public void setAtt3(String value) { + setAtt(2, value); + } + + /** + * Process start tag + * + * @return EVAL_BODY_INCLUDE + */ + public int doStartTag() throws JspException { + i = 0; + return EVAL_BODY_TAG; + } + + public void doInitBody() throws JspException { + pageContext.setAttribute("member", atts[i]); + i++; + } + + public int doAfterBody() throws JspException { + try { + if (i == 3) { + bodyOut.writeOut(bodyOut.getEnclosingWriter()); + return SKIP_BODY; + } else + pageContext.setAttribute("member", atts[i]); + i++; + return EVAL_BODY_TAG; + } catch (IOException ex) { + throw new JspTagException(ex.toString()); + } + } +} + diff --git a/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java b/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java new file mode 100644 index 000000000..c32c28d1a --- /dev/null +++ b/webapps/examples/WEB-INF/classes/examples/FooTagExtraInfo.java @@ -0,0 +1,32 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + +import javax.servlet.jsp.tagext.*; + +public class FooTagExtraInfo extends TagExtraInfo { + public VariableInfo[] getVariableInfo(TagData data) { + return new VariableInfo[] + { + new VariableInfo("member", + "String", + true, + VariableInfo.NESTED) + }; + } +} + + diff --git a/webapps/examples/WEB-INF/classes/examples/LogTag.java b/webapps/examples/WEB-INF/classes/examples/LogTag.java new file mode 100644 index 000000000..392a3d587 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/examples/LogTag.java @@ -0,0 +1,60 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + + +import javax.servlet.jsp.*; +import javax.servlet.jsp.tagext.*; + +import java.io.IOException; + +/** + * Log the contents of the body. Could be used to handle errors etc. + */ +public class LogTag + extends ExampleTagBase +{ + boolean toBrowser = false; + + public void setToBrowser(String value) { + if (value == null) + toBrowser = false; + else if (value.equalsIgnoreCase("true")) + toBrowser = true; + else + toBrowser = false; + } + + public int doStartTag() throws JspException { + return EVAL_BODY_TAG; + } + + public int doAfterBody() throws JspException { + try { + String s = bodyOut.getString(); + System.err.println(s); + if (toBrowser) + bodyOut.writeOut(bodyOut.getEnclosingWriter()); + return SKIP_BODY; + } catch (IOException ex) { + throw new JspTagException(ex.toString()); + } + } +} + + + + diff --git a/webapps/examples/WEB-INF/classes/examples/ShowSource.java b/webapps/examples/WEB-INF/classes/examples/ShowSource.java new file mode 100644 index 000000000..6daf0cff0 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/examples/ShowSource.java @@ -0,0 +1,72 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package examples; + + +import javax.servlet.*; +import javax.servlet.jsp.*; +import javax.servlet.jsp.tagext.*; + +import java.io.*; + +/** + * Display the sources of the JSP file. + */ +public class ShowSource + extends TagSupport +{ + String jspFile; + + public void setJspFile(String jspFile) { + this.jspFile = jspFile; + } + + public int doEndTag() throws JspException { + if ((jspFile.indexOf( ".." ) >= 0) || + (jspFile.toUpperCase().indexOf("/WEB-INF/") != 0) || + (jspFile.toUpperCase().indexOf("/META-INF/") != 0)) + throw new JspTagException("Invalid JSP file " + jspFile); + + InputStream in + = pageContext.getServletContext().getResourceAsStream(jspFile); + + if (in == null) + throw new JspTagException("Unable to find JSP file: "+jspFile); + + InputStreamReader reader = new InputStreamReader(in); + JspWriter out = pageContext.getOut(); + + + try { + out.println(""); + out.println("

");
+            for(int ch = in.read(); ch != -1; ch = in.read())
+                if (ch == '<')
+                    out.print("<");
+                else
+                    out.print((char) ch);
+            out.println("
"); + out.println(""); + } catch (IOException ex) { + throw new JspTagException("IOException: "+ex.toString()); + } + return super.doEndTag(); + } +} + + + + diff --git a/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java b/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java new file mode 100644 index 000000000..6981b8bcb --- /dev/null +++ b/webapps/examples/WEB-INF/classes/filters/ExampleFilter.java @@ -0,0 +1,139 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package filters; + + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; + + +/** + * Example filter that can be attached to either an individual servlet + * or to a URL pattern. This filter performs the following functions: + *
    + *
  • Attaches itself as a request attribute, under the attribute name + * defined by the value of the attribute initialization + * parameter.
  • + *
  • Calculates the number of milliseconds required to perform the + * servlet processing required by this request, including any + * subsequently defined filters, and logs the result to the servlet + * context log for this application. + *
+ * + * @author Craig McClanahan + * @version $Revision: 267129 $ $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public final class ExampleFilter implements Filter { + + + // ----------------------------------------------------- Instance Variables + + + /** + * The request attribute name under which we store a reference to ourself. + */ + private String attribute = null; + + + /** + * The filter configuration object we are associated with. If this value + * is null, this filter instance is not currently configured. + */ + private FilterConfig filterConfig = null; + + + // --------------------------------------------------------- Public Methods + + + /** + * Take this filter out of service. + */ + public void destroy() { + + this.attribute = null; + this.filterConfig = null; + + } + + + /** + * Time the processing that is performed by all subsequent filters in the + * current filter stack, including the ultimately invoked servlet. + * + * @param request The servlet request we are processing + * @param result The servlet response we are creating + * @param chain The filter chain we are processing + * + * @exception IOException if an input/output error occurs + * @exception ServletException if a servlet error occurs + */ + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) + throws IOException, ServletException { + + // Store ourselves as a request attribute (if requested) + if (attribute != null) + request.setAttribute(attribute, this); + + // Time and log the subsequent processing + long startTime = System.currentTimeMillis(); + chain.doFilter(request, response); + long stopTime = System.currentTimeMillis(); + filterConfig.getServletContext().log + (this.toString() + ": " + (stopTime - startTime) + + " milliseconds"); + + } + + + /** + * Place this filter into service. + * + * @param filterConfig The filter configuration object + */ + public void init(FilterConfig filterConfig) throws ServletException { + + this.filterConfig = filterConfig; + this.attribute = filterConfig.getInitParameter("attribute"); + + } + + + /** + * Return a String representation of this object. + */ + public String toString() { + + if (filterConfig == null) + return ("InvokerFilter()"); + StringBuffer sb = new StringBuffer("InvokerFilter("); + sb.append(filterConfig); + sb.append(")"); + return (sb.toString()); + + } + + +} + diff --git a/webapps/examples/WEB-INF/classes/filters/RequestDumperFilter.java b/webapps/examples/WEB-INF/classes/filters/RequestDumperFilter.java new file mode 100644 index 000000000..d9d2c409d --- /dev/null +++ b/webapps/examples/WEB-INF/classes/filters/RequestDumperFilter.java @@ -0,0 +1,200 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package filters; + + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.sql.Timestamp; +import java.util.Enumeration; +import java.util.Locale; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + + +/** + * Example filter that dumps interesting state information about a request + * to the associated servlet context log file, before allowing the servlet + * to process the request in the usual way. This can be installed as needed + * to assist in debugging problems. + * + * @author Craig McClanahan + * @version $Revision: 267129 $ $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public final class RequestDumperFilter implements Filter { + + + // ----------------------------------------------------- Instance Variables + + + /** + * The filter configuration object we are associated with. If this value + * is null, this filter instance is not currently configured. + */ + private FilterConfig filterConfig = null; + + + // --------------------------------------------------------- Public Methods + + + /** + * Take this filter out of service. + */ + public void destroy() { + + this.filterConfig = null; + + } + + + /** + * Time the processing that is performed by all subsequent filters in the + * current filter stack, including the ultimately invoked servlet. + * + * @param request The servlet request we are processing + * @param result The servlet response we are creating + * @param chain The filter chain we are processing + * + * @exception IOException if an input/output error occurs + * @exception ServletException if a servlet error occurs + */ + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) + throws IOException, ServletException { + + if (filterConfig == null) + return; + + // Render the generic servlet request properties + StringWriter sw = new StringWriter(); + PrintWriter writer = new PrintWriter(sw); + writer.println("Request Received at " + + (new Timestamp(System.currentTimeMillis()))); + writer.println(" characterEncoding=" + request.getCharacterEncoding()); + writer.println(" contentLength=" + request.getContentLength()); + writer.println(" contentType=" + request.getContentType()); + writer.println(" locale=" + request.getLocale()); + writer.print(" locales="); + Enumeration locales = request.getLocales(); + boolean first = true; + while (locales.hasMoreElements()) { + Locale locale = (Locale) locales.nextElement(); + if (first) + first = false; + else + writer.print(", "); + writer.print(locale.toString()); + } + writer.println(); + Enumeration names = request.getParameterNames(); + while (names.hasMoreElements()) { + String name = (String) names.nextElement(); + writer.print(" parameter=" + name + "="); + String values[] = request.getParameterValues(name); + for (int i = 0; i < values.length; i++) { + if (i > 0) + writer.print(", "); + writer.print(values[i]); + } + writer.println(); + } + writer.println(" protocol=" + request.getProtocol()); + writer.println(" remoteAddr=" + request.getRemoteAddr()); + writer.println(" remoteHost=" + request.getRemoteHost()); + writer.println(" scheme=" + request.getScheme()); + writer.println(" serverName=" + request.getServerName()); + writer.println(" serverPort=" + request.getServerPort()); + writer.println(" isSecure=" + request.isSecure()); + + // Render the HTTP servlet request properties + if (request instanceof HttpServletRequest) { + writer.println("---------------------------------------------"); + HttpServletRequest hrequest = (HttpServletRequest) request; + writer.println(" contextPath=" + hrequest.getContextPath()); + Cookie cookies[] = hrequest.getCookies(); + if (cookies == null) + cookies = new Cookie[0]; + for (int i = 0; i < cookies.length; i++) { + writer.println(" cookie=" + cookies[i].getName() + + "=" + cookies[i].getValue()); + } + names = hrequest.getHeaderNames(); + while (names.hasMoreElements()) { + String name = (String) names.nextElement(); + String value = hrequest.getHeader(name); + writer.println(" header=" + name + "=" + value); + } + writer.println(" method=" + hrequest.getMethod()); + writer.println(" pathInfo=" + hrequest.getPathInfo()); + writer.println(" queryString=" + hrequest.getQueryString()); + writer.println(" remoteUser=" + hrequest.getRemoteUser()); + writer.println("requestedSessionId=" + + hrequest.getRequestedSessionId()); + writer.println(" requestURI=" + hrequest.getRequestURI()); + writer.println(" servletPath=" + hrequest.getServletPath()); + } + writer.println("============================================="); + + // Log the resulting string + writer.flush(); + filterConfig.getServletContext().log(sw.getBuffer().toString()); + + // Pass control on to the next filter + chain.doFilter(request, response); + + } + + + /** + * Place this filter into service. + * + * @param filterConfig The filter configuration object + */ + public void init(FilterConfig filterConfig) throws ServletException { + + this.filterConfig = filterConfig; + + } + + + /** + * Return a String representation of this object. + */ + public String toString() { + + if (filterConfig == null) + return ("RequestDumperFilter()"); + StringBuffer sb = new StringBuffer("RequestDumperFilter("); + sb.append(filterConfig); + sb.append(")"); + return (sb.toString()); + + } + + +} + diff --git a/webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java b/webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java new file mode 100644 index 000000000..ef77c7e62 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java @@ -0,0 +1,171 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package filters; + + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.UnavailableException; + + +/** + *

Example filter that sets the character encoding to be used in parsing the + * incoming request, either unconditionally or only if the client did not + * specify a character encoding. Configuration of this filter is based on + * the following initialization parameters:

+ *
    + *
  • encoding - The character encoding to be configured + * for this request, either conditionally or unconditionally based on + * the ignore initialization parameter. This parameter + * is required, so there is no default.
  • + *
  • ignore - If set to "true", any character encoding + * specified by the client is ignored, and the value returned by the + * selectEncoding() method is set. If set to "false, + * selectEncoding() is called only if the + * client has not already specified an encoding. By default, this + * parameter is set to "true".
  • + *
+ * + *

Although this filter can be used unchanged, it is also easy to + * subclass it and make the selectEncoding() method more + * intelligent about what encoding to choose, based on characteristics of + * the incoming request (such as the values of the Accept-Language + * and User-Agent headers, or a value stashed in the current + * user's session.

+ * + * @author Craig McClanahan + * @version $Revision: 267129 $ $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public class SetCharacterEncodingFilter implements Filter { + + + // ----------------------------------------------------- Instance Variables + + + /** + * The default character encoding to set for requests that pass through + * this filter. + */ + protected String encoding = null; + + + /** + * The filter configuration object we are associated with. If this value + * is null, this filter instance is not currently configured. + */ + protected FilterConfig filterConfig = null; + + + /** + * Should a character encoding specified by the client be ignored? + */ + protected boolean ignore = true; + + + // --------------------------------------------------------- Public Methods + + + /** + * Take this filter out of service. + */ + public void destroy() { + + this.encoding = null; + this.filterConfig = null; + + } + + + /** + * Select and set (if specified) the character encoding to be used to + * interpret request parameters for this request. + * + * @param request The servlet request we are processing + * @param result The servlet response we are creating + * @param chain The filter chain we are processing + * + * @exception IOException if an input/output error occurs + * @exception ServletException if a servlet error occurs + */ + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) + throws IOException, ServletException { + + // Conditionally select and set the character encoding to be used + if (ignore || (request.getCharacterEncoding() == null)) { + String encoding = selectEncoding(request); + if (encoding != null) + request.setCharacterEncoding(encoding); + } + + // Pass control on to the next filter + chain.doFilter(request, response); + + } + + + /** + * Place this filter into service. + * + * @param filterConfig The filter configuration object + */ + public void init(FilterConfig filterConfig) throws ServletException { + + this.filterConfig = filterConfig; + this.encoding = filterConfig.getInitParameter("encoding"); + String value = filterConfig.getInitParameter("ignore"); + if (value == null) + this.ignore = true; + else if (value.equalsIgnoreCase("true")) + this.ignore = true; + else if (value.equalsIgnoreCase("yes")) + this.ignore = true; + else + this.ignore = false; + + } + + + // ------------------------------------------------------ Protected Methods + + + /** + * Select an appropriate character encoding to be used, based on the + * characteristics of the current request and/or filter initialization + * parameters. If no character encoding should be set, return + * null. + *

+ * The default implementation unconditionally returns the value configured + * by the encoding initialization parameter for this + * filter. + * + * @param request The servlet request we are processing + */ + protected String selectEncoding(ServletRequest request) { + + return (this.encoding); + + } + + +} diff --git a/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java b/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java new file mode 100644 index 000000000..4e2f18d4d --- /dev/null +++ b/webapps/examples/WEB-INF/classes/jsp2/examples/BookBean.java @@ -0,0 +1,43 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +public class BookBean { + private String title; + private String author; + private String isbn; + + public BookBean( String title, String author, String isbn ) { + this.title = title; + this.author = author; + this.isbn = isbn; + } + + public String getTitle() { + return this.title; + } + + public String getAuthor() { + return this.author; + } + + public String getIsbn() { + return this.isbn; + } + +} diff --git a/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java b/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java new file mode 100644 index 000000000..c0bd10723 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/jsp2/examples/FooBean.java @@ -0,0 +1,35 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples; + +public class FooBean { + private String bar; + + public FooBean() { + bar = "Initial value"; + } + + public String getBar() { + return this.bar; + } + + public void setBar(String bar) { + this.bar = bar; + } + +} diff --git a/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java b/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java new file mode 100644 index 000000000..34732e232 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/jsp2/examples/el/Functions.java @@ -0,0 +1,44 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package jsp2.examples.el; + +import java.util.*; + +/** + * Defines the functions for the jsp2 example tag library. + * + *

Each function is defined as a static method.

+ */ +public class Functions { + public static String reverse( String text ) { + return new StringBuffer( text ).reverse().toString(); + } + + public static int numVowels( String text ) { + String vowels = "aeiouAEIOU"; + int result = 0; + for( int i = 0; i < text.length(); i++ ) { + if( vowels.indexOf( text.charAt( i ) ) != -1 ) { + result++; + } + } + return result; + } + + public static String caps( String text ) { + return text.toUpperCase(); + } +} diff --git a/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java new file mode 100644 index 000000000..8c55db9ad --- /dev/null +++ b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/EchoAttributesTag.java @@ -0,0 +1,54 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.JspWriter; +import javax.servlet.jsp.tagext.SimpleTagSupport; +import javax.servlet.jsp.tagext.DynamicAttributes; +import java.util.ArrayList; +import java.util.Iterator; +import java.io.IOException; + +/** + * SimpleTag handler that echoes all its attributes + */ +public class EchoAttributesTag + extends SimpleTagSupport + implements DynamicAttributes +{ + private ArrayList keys = new ArrayList(); + private ArrayList values = new ArrayList(); + + public void doTag() throws JspException, IOException { + JspWriter out = getJspContext().getOut(); + for( int i = 0; i < keys.size(); i++ ) { + String key = (String)keys.get( i ); + Object value = values.get( i ); + out.println( "
  • " + key + " = " + value + "
  • " ); + } + } + + public void setDynamicAttribute( String uri, String localName, + Object value ) + throws JspException + { + keys.add( localName ); + values.add( value ); + } +} diff --git a/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java new file mode 100644 index 000000000..52a5e15e7 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/FindBookSimpleTag.java @@ -0,0 +1,44 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; +import java.util.HashMap; +import jsp2.examples.BookBean; + +/** + * SimpleTag handler that pretends to search for a book, and stores + * the result in a scoped variable. + */ +public class FindBookSimpleTag extends SimpleTagSupport { + private String var; + + private static final String BOOK_TITLE = "The Lord of the Rings"; + private static final String BOOK_AUTHOR = "J. R. R. Tolkein"; + private static final String BOOK_ISBN = "0618002251"; + + public void doTag() throws JspException { + BookBean book = new BookBean( BOOK_TITLE, BOOK_AUTHOR, BOOK_ISBN ); + getJspContext().setAttribute( this.var, book ); + } + + public void setVar( String var ) { + this.var = var; + } +} diff --git a/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java new file mode 100644 index 000000000..7a4196c66 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/HelloWorldSimpleTag.java @@ -0,0 +1,31 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; +import java.io.IOException; + +/** + * SimpleTag handler that prints "Hello, world!" + */ +public class HelloWorldSimpleTag extends SimpleTagSupport { + public void doTag() throws JspException, IOException { + getJspContext().getOut().write( "Hello, world!" ); + } +} diff --git a/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java new file mode 100644 index 000000000..0f4b1e524 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/jsp2/examples/simpletag/RepeatSimpleTag.java @@ -0,0 +1,42 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package jsp2.examples.simpletag; + +import javax.servlet.jsp.JspException; +import javax.servlet.jsp.tagext.SimpleTagSupport; +import java.util.HashMap; +import java.io.IOException; + +/** + * SimpleTag handler that accepts a num attribute and + * invokes its body 'num' times. + */ +public class RepeatSimpleTag extends SimpleTagSupport { + private int num; + + public void doTag() throws JspException, IOException { + for (int i=0; i
    " + this.label + + "
    " ); + } + + public void setColor( String color ) { + this.color = color; + } + + public void setLabel( String label ) { + this.label = label; + } +} diff --git a/webapps/examples/WEB-INF/classes/listeners/ContextListener.java b/webapps/examples/WEB-INF/classes/listeners/ContextListener.java new file mode 100644 index 000000000..6f5636380 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/listeners/ContextListener.java @@ -0,0 +1,155 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package listeners; + + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextAttributeEvent; +import javax.servlet.ServletContextAttributeListener; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + + +/** + * Example listener for context-related application events, which were + * introduced in the 2.3 version of the Servlet API. This listener + * merely documents the occurrence of such events in the application log + * associated with our servlet context. + * + * @author Craig R. McClanahan + * @version $Revision: 267129 $ $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public final class ContextListener + implements ServletContextAttributeListener, ServletContextListener { + + + // ----------------------------------------------------- Instance Variables + + + /** + * The servlet context with which we are associated. + */ + private ServletContext context = null; + + + // --------------------------------------------------------- Public Methods + + + /** + * Record the fact that a servlet context attribute was added. + * + * @param event The servlet context attribute event + */ + public void attributeAdded(ServletContextAttributeEvent event) { + + log("attributeAdded('" + event.getName() + "', '" + + event.getValue() + "')"); + + } + + + /** + * Record the fact that a servlet context attribute was removed. + * + * @param event The servlet context attribute event + */ + public void attributeRemoved(ServletContextAttributeEvent event) { + + log("attributeRemoved('" + event.getName() + "', '" + + event.getValue() + "')"); + + } + + + /** + * Record the fact that a servlet context attribute was replaced. + * + * @param event The servlet context attribute event + */ + public void attributeReplaced(ServletContextAttributeEvent event) { + + log("attributeReplaced('" + event.getName() + "', '" + + event.getValue() + "')"); + + } + + + /** + * Record the fact that this web application has been destroyed. + * + * @param event The servlet context event + */ + public void contextDestroyed(ServletContextEvent event) { + + log("contextDestroyed()"); + this.context = null; + + } + + + /** + * Record the fact that this web application has been initialized. + * + * @param event The servlet context event + */ + public void contextInitialized(ServletContextEvent event) { + + this.context = event.getServletContext(); + log("contextInitialized()"); + + } + + + // -------------------------------------------------------- Private Methods + + + /** + * Log a message to the servlet context application log. + * + * @param message Message to be logged + */ + private void log(String message) { + + if (context != null) + context.log("ContextListener: " + message); + else + System.out.println("ContextListener: " + message); + + } + + + /** + * Log a message and associated exception to the servlet context + * application log. + * + * @param message Message to be logged + * @param throwable Exception to be logged + */ + private void log(String message, Throwable throwable) { + + if (context != null) + context.log("ContextListener: " + message, throwable); + else { + System.out.println("ContextListener: " + message); + throwable.printStackTrace(System.out); + } + + } + + +} diff --git a/webapps/examples/WEB-INF/classes/listeners/SessionListener.java b/webapps/examples/WEB-INF/classes/listeners/SessionListener.java new file mode 100644 index 000000000..540547dcf --- /dev/null +++ b/webapps/examples/WEB-INF/classes/listeners/SessionListener.java @@ -0,0 +1,182 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package listeners; + + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.http.HttpSessionAttributeListener; +import javax.servlet.http.HttpSessionBindingEvent; +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; + + +/** + * Example listener for context-related application events, which were + * introduced in the 2.3 version of the Servlet API. This listener + * merely documents the occurrence of such events in the application log + * associated with our servlet context. + * + * @author Craig R. McClanahan + * @version $Revision: 267129 $ $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public final class SessionListener + implements ServletContextListener, + HttpSessionAttributeListener, HttpSessionListener { + + + // ----------------------------------------------------- Instance Variables + + + /** + * The servlet context with which we are associated. + */ + private ServletContext context = null; + + + // --------------------------------------------------------- Public Methods + + + /** + * Record the fact that a servlet context attribute was added. + * + * @param event The session attribute event + */ + public void attributeAdded(HttpSessionBindingEvent event) { + + log("attributeAdded('" + event.getSession().getId() + "', '" + + event.getName() + "', '" + event.getValue() + "')"); + + } + + + /** + * Record the fact that a servlet context attribute was removed. + * + * @param event The session attribute event + */ + public void attributeRemoved(HttpSessionBindingEvent event) { + + log("attributeRemoved('" + event.getSession().getId() + "', '" + + event.getName() + "', '" + event.getValue() + "')"); + + } + + + /** + * Record the fact that a servlet context attribute was replaced. + * + * @param event The session attribute event + */ + public void attributeReplaced(HttpSessionBindingEvent event) { + + log("attributeReplaced('" + event.getSession().getId() + "', '" + + event.getName() + "', '" + event.getValue() + "')"); + + } + + + /** + * Record the fact that this web application has been destroyed. + * + * @param event The servlet context event + */ + public void contextDestroyed(ServletContextEvent event) { + + log("contextDestroyed()"); + this.context = null; + + } + + + /** + * Record the fact that this web application has been initialized. + * + * @param event The servlet context event + */ + public void contextInitialized(ServletContextEvent event) { + + this.context = event.getServletContext(); + log("contextInitialized()"); + + } + + + /** + * Record the fact that a session has been created. + * + * @param event The session event + */ + public void sessionCreated(HttpSessionEvent event) { + + log("sessionCreated('" + event.getSession().getId() + "')"); + + } + + + /** + * Record the fact that a session has been destroyed. + * + * @param event The session event + */ + public void sessionDestroyed(HttpSessionEvent event) { + + log("sessionDestroyed('" + event.getSession().getId() + "')"); + + } + + + // -------------------------------------------------------- Private Methods + + + /** + * Log a message to the servlet context application log. + * + * @param message Message to be logged + */ + private void log(String message) { + + if (context != null) + context.log("SessionListener: " + message); + else + System.out.println("SessionListener: " + message); + + } + + + /** + * Log a message and associated exception to the servlet context + * application log. + * + * @param message Message to be logged + * @param throwable Exception to be logged + */ + private void log(String message, Throwable throwable) { + + if (context != null) + context.log("SessionListener: " + message, throwable); + else { + System.out.println("SessionListener: " + message); + throwable.printStackTrace(System.out); + } + + } + + +} diff --git a/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java b/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java new file mode 100644 index 000000000..b5afeaba3 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/num/NumberGuessBean.java @@ -0,0 +1,78 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +/* + * Originally written by Jason Hunter, http://www.servlets.com. + */ + +package num; + +import java.util.*; + +public class NumberGuessBean { + + int answer; + boolean success; + String hint; + int numGuesses; + + public NumberGuessBean() { + reset(); + } + + public void setGuess(String guess) { + numGuesses++; + + int g; + try { + g = Integer.parseInt(guess); + } + catch (NumberFormatException e) { + g = -1; + } + + if (g == answer) { + success = true; + } + else if (g == -1) { + hint = "a number next time"; + } + else if (g < answer) { + hint = "higher"; + } + else if (g > answer) { + hint = "lower"; + } + } + + public boolean getSuccess() { + return success; + } + + public String getHint() { + return "" + hint; + } + + public int getNumGuesses() { + return numGuesses; + } + + public void reset() { + answer = Math.abs(new Random().nextInt() % 100) + 1; + success = false; + numGuesses = 0; + } +} diff --git a/webapps/examples/WEB-INF/classes/servletToJsp.java b/webapps/examples/WEB-INF/classes/servletToJsp.java new file mode 100644 index 000000000..38a2c726b --- /dev/null +++ b/webapps/examples/WEB-INF/classes/servletToJsp.java @@ -0,0 +1,32 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import javax.servlet.*; +import javax.servlet.http.*; + +public class servletToJsp extends HttpServlet { + + public void doGet (HttpServletRequest request, + HttpServletResponse response) { + + try { + // Set the attribute and Forward to hello.jsp + request.setAttribute ("servletName", "servletToJsp"); + getServletConfig().getServletContext().getRequestDispatcher("/jsptoserv/hello.jsp").forward(request, response); + } catch (Exception ex) { + ex.printStackTrace (); + } + } +} diff --git a/webapps/examples/WEB-INF/classes/sessions/DummyCart.java b/webapps/examples/WEB-INF/classes/sessions/DummyCart.java new file mode 100644 index 000000000..17ccd80b8 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/sessions/DummyCart.java @@ -0,0 +1,69 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package sessions; + +import javax.servlet.http.*; +import java.util.Vector; +import java.util.Enumeration; + +public class DummyCart { + Vector v = new Vector(); + String submit = null; + String item = null; + + private void addItem(String name) { + v.addElement(name); + } + + private void removeItem(String name) { + v.removeElement(name); + } + + public void setItem(String name) { + item = name; + } + + public void setSubmit(String s) { + submit = s; + } + + public String[] getItems() { + String[] s = new String[v.size()]; + v.copyInto(s); + return s; + } + + public void processRequest(HttpServletRequest request) { + // null value for submit - user hit enter instead of clicking on + // "add" or "remove" + if (submit == null) + addItem(item); + + if (submit.equals("add")) + addItem(item); + else if (submit.equals("remove")) + removeItem(item); + + // reset at the end of the request + reset(); + } + + // reset + private void reset() { + submit = null; + item = null; + } +} diff --git a/webapps/examples/WEB-INF/classes/util/HTMLFilter.java b/webapps/examples/WEB-INF/classes/util/HTMLFilter.java new file mode 100644 index 000000000..3b6b9276c --- /dev/null +++ b/webapps/examples/WEB-INF/classes/util/HTMLFilter.java @@ -0,0 +1,68 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +package util; + +/** + * HTML filter utility. + * + * @author Craig R. McClanahan + * @author Tim Tye + * @version $Revision: 267129 $ $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public final class HTMLFilter { + + + /** + * Filter the specified message string for characters that are sensitive + * in HTML. This avoids potential attacks caused by including JavaScript + * codes in the request URL that is often reported in error messages. + * + * @param message The message string to be filtered + */ + public static String filter(String message) { + + if (message == null) + return (null); + + char content[] = new char[message.length()]; + message.getChars(0, message.length(), content, 0); + StringBuffer result = new StringBuffer(content.length + 50); + for (int i = 0; i < content.length; i++) { + switch (content[i]) { + case '<': + result.append("<"); + break; + case '>': + result.append(">"); + break; + case '&': + result.append("&"); + break; + case '"': + result.append("""); + break; + default: + result.append(content[i]); + } + } + return (result.toString()); + + } + + +} + diff --git a/webapps/examples/WEB-INF/classes/validators/DebugValidator.java b/webapps/examples/WEB-INF/classes/validators/DebugValidator.java new file mode 100644 index 000000000..bb55026c8 --- /dev/null +++ b/webapps/examples/WEB-INF/classes/validators/DebugValidator.java @@ -0,0 +1,83 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +package validators; + + +import java.io.InputStream; +import java.io.IOException; +import javax.servlet.jsp.tagext.PageData; +import javax.servlet.jsp.tagext.TagLibraryValidator; +import javax.servlet.jsp.tagext.ValidationMessage; + + +/** + * Example tag library validator that simply dumps the XML version of each + * page to standard output (which will typically be sent to the file + * $CATALINA_HOME/logs/catalina.out). To utilize it, simply + * include a taglib directive for this tag library at the top + * of your JSP page. + * + * @author Craig McClanahan + * @version $Revision: 267129 $ $Date: 2004-03-18 17:40:35 +0100 (jeu., 18 mars 2004) $ + */ + +public class DebugValidator extends TagLibraryValidator { + + + // ----------------------------------------------------- Instance Variables + + + // --------------------------------------------------------- Public Methods + + + /** + * Validate a JSP page. This will get invoked once per directive in the + * JSP page. This method will return null if the page is + * valid; otherwise the method should return an array of + * ValidationMessage objects. An array of length zero is + * also interpreted as no errors. + * + * @param prefix The value of the prefix argument in this directive + * @param uri The value of the URI argument in this directive + * @param page The page data for this page + */ + public ValidationMessage[] validate(String prefix, String uri, + PageData page) { + + System.out.println("---------- Prefix=" + prefix + " URI=" + uri + + "----------"); + + InputStream is = page.getInputStream(); + while (true) { + try { + int ch = is.read(); + if (ch < 0) + break; + System.out.print((char) ch); + } catch (IOException e) { + break; + } + } + System.out.println(); + System.out.println("-----------------------------------------------"); + return (null); + + } + + +} diff --git a/webapps/examples/WEB-INF/jsp/applet/Clock2.java b/webapps/examples/WEB-INF/jsp/applet/Clock2.java new file mode 100644 index 000000000..edbf29287 --- /dev/null +++ b/webapps/examples/WEB-INF/jsp/applet/Clock2.java @@ -0,0 +1,211 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import java.util.*; +import java.awt.*; +import java.applet.*; +import java.text.*; + +/** + * Time! + * + * @author Rachel Gollub + */ + +public class Clock2 extends Applet implements Runnable { + Thread timer; // The thread that displays clock + int lastxs, lastys, lastxm, + lastym, lastxh, lastyh; // Dimensions used to draw hands + SimpleDateFormat formatter; // Formats the date displayed + String lastdate; // String to hold date displayed + Font clockFaceFont; // Font for number display on clock + Date currentDate; // Used to get date to display + Color handColor; // Color of main hands and dial + Color numberColor; // Color of second hand and numbers + + public void init() { + int x,y; + lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0; + formatter = new SimpleDateFormat ("EEE MMM dd hh:mm:ss yyyy", Locale.getDefault()); + currentDate = new Date(); + lastdate = formatter.format(currentDate); + clockFaceFont = new Font("Serif", Font.PLAIN, 14); + handColor = Color.blue; + numberColor = Color.darkGray; + + try { + setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16))); + } catch (Exception E) { } + try { + handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16)); + } catch (Exception E) { } + try { + numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16)); + } catch (Exception E) { } + resize(300,300); // Set clock window size + } + + // Plotpoints allows calculation to only cover 45 degrees of the circle, + // and then mirror + public void plotpoints(int x0, int y0, int x, int y, Graphics g) { + g.drawLine(x0+x,y0+y,x0+x,y0+y); + g.drawLine(x0+y,y0+x,x0+y,y0+x); + g.drawLine(x0+y,y0-x,x0+y,y0-x); + g.drawLine(x0+x,y0-y,x0+x,y0-y); + g.drawLine(x0-x,y0-y,x0-x,y0-y); + g.drawLine(x0-y,y0-x,x0-y,y0-x); + g.drawLine(x0-y,y0+x,x0-y,y0+x); + g.drawLine(x0-x,y0+y,x0-x,y0+y); + } + + // Circle is just Bresenham's algorithm for a scan converted circle + public void circle(int x0, int y0, int r, Graphics g) { + int x,y; + float d; + x=0; + y=r; + d=5/4-r; + plotpoints(x0,y0,x,y,g); + + while (y>x){ + if (d<0) { + d=d+2*x+3; + x++; + } + else { + d=d+2*(x-y)+5; + x++; + y--; + } + plotpoints(x0,y0,x,y,g); + } + } + + // Paint is the main part of the program + public void paint(Graphics g) { + int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter; + String today; + + currentDate = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault()); + try { + s = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + s = 0; + } + formatter.applyPattern("m"); + try { + m = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + m = 10; + } + formatter.applyPattern("h"); + try { + h = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + h = 10; + } + formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy"); + today = formatter.format(currentDate); + xcenter=80; + ycenter=55; + + // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00) + // x = r(cos a) + xcenter, y = r(sin a) + ycenter + + xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter); + ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter); + xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter); + ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter); + xh = (int)(Math.cos((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + xcenter); + yh = (int)(Math.sin((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + ycenter); + + // Draw the circle and numbers + + g.setFont(clockFaceFont); + g.setColor(handColor); + circle(xcenter,ycenter,50,g); + g.setColor(numberColor); + g.drawString("9",xcenter-45,ycenter+3); + g.drawString("3",xcenter+40,ycenter+3); + g.drawString("12",xcenter-5,ycenter-37); + g.drawString("6",xcenter-3,ycenter+45); + + // Erase if necessary, and redraw + + g.setColor(getBackground()); + if (xs != lastxs || ys != lastys) { + g.drawLine(xcenter, ycenter, lastxs, lastys); + g.drawString(lastdate, 5, 125); + } + if (xm != lastxm || ym != lastym) { + g.drawLine(xcenter, ycenter-1, lastxm, lastym); + g.drawLine(xcenter-1, ycenter, lastxm, lastym); } + if (xh != lastxh || yh != lastyh) { + g.drawLine(xcenter, ycenter-1, lastxh, lastyh); + g.drawLine(xcenter-1, ycenter, lastxh, lastyh); } + g.setColor(numberColor); + g.drawString("", 5, 125); + g.drawString(today, 5, 125); + g.drawLine(xcenter, ycenter, xs, ys); + g.setColor(handColor); + g.drawLine(xcenter, ycenter-1, xm, ym); + g.drawLine(xcenter-1, ycenter, xm, ym); + g.drawLine(xcenter, ycenter-1, xh, yh); + g.drawLine(xcenter-1, ycenter, xh, yh); + lastxs=xs; lastys=ys; + lastxm=xm; lastym=ym; + lastxh=xh; lastyh=yh; + lastdate = today; + currentDate=null; + } + + public void start() { + timer = new Thread(this); + timer.start(); + } + + public void stop() { + timer = null; + } + + public void run() { + Thread me = Thread.currentThread(); + while (timer == me) { + try { + Thread.currentThread().sleep(100); + } catch (InterruptedException e) { + } + repaint(); + } + } + + public void update(Graphics g) { + paint(g); + } + + public String getAppletInfo() { + return "Title: A Clock \nAuthor: Rachel Gollub, 1995 \nAn analog clock."; + } + + public String[][] getParameterInfo() { + String[][] info = { + {"bgcolor", "hexadecimal RGB number", "The background color. Default is the color of your browser."}, + {"fgcolor1", "hexadecimal RGB number", "The color of the hands and dial. Default is blue."}, + {"fgcolor2", "hexadecimal RGB number", "The color of the seconds hand and numbers. Default is dark gray."} + }; + return info; + } +} diff --git a/webapps/examples/WEB-INF/jsp/debug-taglib.tld b/webapps/examples/WEB-INF/jsp/debug-taglib.tld new file mode 100644 index 000000000..dbf39b058 --- /dev/null +++ b/webapps/examples/WEB-INF/jsp/debug-taglib.tld @@ -0,0 +1,53 @@ + + + + + + + + 1.0 + 1.2 + debug + http://jakarta.apache.org/tomcat/debug-taglib + + This tag library defines no tags. Instead, its purpose is encapsulated + in the TagLibraryValidator implementation that simply outputs the XML + version of a JSP page to standard output, whenever this tag library is + referenced in a "taglib" directive in a JSP page. + + + validators.DebugValidator + + + + + log + examples.LogTag + TAGDEPENDENT + + Perform a server side action; Log the message. + + + toBrowser + false + + + + + diff --git a/webapps/examples/WEB-INF/jsp/example-taglib.tld b/webapps/examples/WEB-INF/jsp/example-taglib.tld new file mode 100644 index 000000000..5c0e30bda --- /dev/null +++ b/webapps/examples/WEB-INF/jsp/example-taglib.tld @@ -0,0 +1,82 @@ + + + + + + + 1.0 + 1.2 + simple + http://jakarta.apache.org/tomcat/example-taglib + + A simple tab library for the examples + + + + ShowSource + examples.ShowSource + Display JSP sources + + jspFile + true + true + + + + + + + foo + examples.FooTag + examples.FooTagExtraInfo + JSP + + Perform a server side action; uses 3 mandatory attributes + + + + att1 + true + + + att2 + true + + + att3 + true + + + + + + + log + examples.LogTag + TAGDEPENDENT + + Perform a server side action; Log the message. + + + toBrowser + false + + + + diff --git a/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld b/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld new file mode 100644 index 000000000..c22cd9e7e --- /dev/null +++ b/webapps/examples/WEB-INF/jsp2/jsp2-example-taglib.tld @@ -0,0 +1,123 @@ + + + + + A tag library exercising SimpleTag handlers. + 1.0 + SimpleTagLibrary + /SimpleTagLibrary + + Outputs Hello, World + helloWorld + jsp2.examples.simpletag.HelloWorldSimpleTag + empty + + + Repeats the body of the tag 'num' times + repeat + jsp2.examples.simpletag.RepeatSimpleTag + scriptless + + Current invocation count (1 to num) + count + + + num + true + true + + + + Populates the page context with a BookBean + findBook + jsp2.examples.simpletag.FindBookSimpleTag + empty + + var + true + true + + + + + Takes 3 fragments and invokes them in a random order + + shuffle + jsp2.examples.simpletag.ShuffleSimpleTag + empty + + fragment1 + true + true + + + fragment2 + true + true + + + fragment3 + true + true + + + + Outputs a colored tile + tile + jsp2.examples.simpletag.TileSimpleTag + empty + + color + true + + + label + true + + + + + Tag that echoes all its attributes and body content + + echoAttributes + jsp2.examples.simpletag.EchoAttributesTag + empty + true + + + Reverses the characters in the given String + reverse + jsp2.examples.el.Functions + java.lang.String reverse( java.lang.String ) + + + Counts the number of vowels (a,e,i,o,u) in the given String + countVowels + jsp2.examples.el.Functions + java.lang.String numVowels( java.lang.String ) + + + Converts the string to all caps + caps + jsp2.examples.el.Functions + java.lang.String caps( java.lang.String ) + + + diff --git a/webapps/examples/WEB-INF/lib/jstl.jar b/webapps/examples/WEB-INF/lib/jstl.jar new file mode 100644 index 0000000000000000000000000000000000000000..6b41358258f8a49f64eb1c0594428612ad1610f3 GIT binary patch literal 16905 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 XHGx0Hu7H4WpFVO=&()0YR`mY??F<|1 literal 0 HcmV?d00001 diff --git a/webapps/examples/WEB-INF/lib/standard.jar b/webapps/examples/WEB-INF/lib/standard.jar new file mode 100644 index 0000000000000000000000000000000000000000..258daaece7e8b447019e033fdcd60c518b867f5c GIT binary patch literal 293750 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

    +&%`61~X9p*v(m3!mI{5 z!OTb$V4!`J&;V-;=01A%Li$5TARerp{DF`?fi(j2oW<+GvW7E2qyq$W&O&8`H3GXi zi?Qq$>Z<^C0id9vVB#d!C~W2|-SzfusDTZ2#0zv_8#Klmw8@;MhW=YP>g|?2fC0?_ zY))gv*mTbF$>EkHCy+h>E~tM+nPN@A>|c>;xxL_hDZJZ%`PW_;E(i>BmJb!%-8jx@cl;Gaw!8 zu=+!KJXnmw7$AZ4pEIG2r01=i+M@=fuYpSd^6VyH4SqA}KPCw9^9Iz7q zpUZ57C?0YtkO!N$VRV0LfbX;k0-QOI+F&3D0~%-;pf74hSVv*Pm)lO#fzDe5GHYl< zUj^GXFnZ??GyTv5y_xO~TFar#R0S>}aQ*xx1rUZ}Ctk?`iNQ*4jyy%;pd`ZzHqAg& zjs@K0V>D9n7PXue;Hr+mNYL;Ta}5_Q(A&s##I@-fFwEaJngKN$Y??sN#U6u=%C8jN zHUKs%`pZTiz+x;8@-f;-r==|BB(Tv@FcW~Vd-Q4PNlhH$-f0CjNilQnTPYXe!8uK%%|{`{xNq zj_OS=#J~fa`S9?lAR{Ogw#Fb(zy{`#KW4VgaINfImQuS@-cbQLYvU zTW6#d0uDzf#Fvm-2n@k^1;Cr2Lik307vf@%p+yFB?a5?-LRGYXwn+cj-$Kwm#xbe~Li&2)}$%*}}5L&;=X~O$=;@_dmxziA?|i literal 0 HcmV?d00001 diff --git a/webapps/examples/WEB-INF/tags/displayProducts.tag b/webapps/examples/WEB-INF/tags/displayProducts.tag new file mode 100644 index 000000000..9a29d33bc --- /dev/null +++ b/webapps/examples/WEB-INF/tags/displayProducts.tag @@ -0,0 +1,54 @@ + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ attribute name="normalPrice" fragment="true" %> +<%@ attribute name="onSale" fragment="true" %> +<%@ variable name-given="name" %> +<%@ variable name-given="price" %> +<%@ variable name-given="origPrice" %> +<%@ variable name-given="salePrice" %> + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/webapps/examples/WEB-INF/tags/helloWorld.tag b/webapps/examples/WEB-INF/tags/helloWorld.tag new file mode 100644 index 000000000..6f02e6e69 --- /dev/null +++ b/webapps/examples/WEB-INF/tags/helloWorld.tag @@ -0,0 +1,16 @@ + +Hello, world! diff --git a/webapps/examples/WEB-INF/tags/panel.tag b/webapps/examples/WEB-INF/tags/panel.tag new file mode 100644 index 000000000..446b1ad13 --- /dev/null +++ b/webapps/examples/WEB-INF/tags/panel.tag @@ -0,0 +1,28 @@ + +<%@ attribute name="color" %> +<%@ attribute name="bgcolor" %> +<%@ attribute name="title" %> + + + + + + + +
    ${title}
    + +
    diff --git a/webapps/examples/WEB-INF/tags/xhtmlbasic.tag b/webapps/examples/WEB-INF/tags/xhtmlbasic.tag new file mode 100644 index 000000000..a910ad4ce --- /dev/null +++ b/webapps/examples/WEB-INF/tags/xhtmlbasic.tag @@ -0,0 +1,20 @@ + + + + + diff --git a/webapps/examples/WEB-INF/web.xml b/webapps/examples/WEB-INF/web.xml new file mode 100644 index 000000000..77e4262cc --- /dev/null +++ b/webapps/examples/WEB-INF/web.xml @@ -0,0 +1,306 @@ + + + + + + + Servlet and JSP Examples. + + Servlet and JSP Examples + + + + + Servlet Mapped Filter + filters.ExampleFilter + + attribute + filters.ExampleFilter.SERVLET_MAPPED + + + + Path Mapped Filter + filters.ExampleFilter + + attribute + filters.ExampleFilter.PATH_MAPPED + + + + Request Dumper Filter + filters.RequestDumperFilter + + + + + Set Character Encoding + filters.SetCharacterEncodingFilter + + encoding + EUC_JP + + + + + Compression Filter + compressionFilters.CompressionFilter + + + compressionThreshold + 10 + + + debug + 0 + + + + + + Servlet Mapped Filter + invoker + + + Path Mapped Filter + /servlet/* + + + + + + + + + + + + listeners.ContextListener + + + listeners.SessionListener + + + + + + servletToJsp + servletToJsp + + + ChatServlet + chat.ChatServlet + + + CompressionFilterTestServlet + compressionFilters.CompressionFilterTestServlet + + + HelloWorldExample + HelloWorldExample + + + RequestInfoExample + RequestInfoExample + + + RequestHeaderExample + RequestHeaderExample + + + RequestParamExample + RequestParamExample + + + CookieExample + CookieExample + + + SessionExample + SessionExample + + + + ChatServlet + /jsp/chat + + + CompressionFilterTestServlet + /CompressionTest + + + HelloWorldExample + /servlet/HelloWorldExample + + + RequestInfoExample + /servlet/RequestInfoExample/* + + + RequestHeaderExample + /servlet/RequestHeaderExample + + + RequestParamExample + /servlet/RequestParamExample + + + CookieExample + /servlet/CookieExample + + + SessionExample + /servlet/SessionExample + + + servletToJsp + /servletToJsp + + + + + + http://jakarta.apache.org/tomcat/debug-taglib + + + /WEB-INF/jsp/debug-taglib.tld + + + + + + http://jakarta.apache.org/tomcat/examples-taglib + + + /WEB-INF/jsp/example-taglib.tld + + + + + + http://jakarta.apache.org/tomcat/jsp2-example-taglib + + + /WEB-INF/jsp2/jsp2-example-taglib.tld + + + + + + Special property group for JSP Configuration JSP example. + + JSPConfiguration + /jsp2/misc/config.jsp + true + ISO-8859-1 + true + /jsp2/misc/prelude.jspf + /jsp2/misc/coda.jspf + + + + + Example Security Constraint + + Protected Area + + /security/protected/* + + DELETE + GET + POST + PUT + + + + tomcat + role1 + + + + + + FORM + Example Form-Based Authentication Area + + /jsp/security/protected/login.jsp + /jsp/security/protected/error.jsp + + + + + + role1 + + + tomcat + + + + + + minExemptions + java.lang.Integer + 1 + + + foo/name1 + java.lang.String + value1 + + + foo/bar/name2 + java.lang.Boolean + true + + + name3 + java.lang.Integer + 1 + + + foo/name4 + java.lang.Integer + 10 + + + diff --git a/webapps/examples/jsp/cal/cal1.jsp b/webapps/examples/jsp/cal/cal1.jsp new file mode 100644 index 000000000..b3a766d60 --- /dev/null +++ b/webapps/examples/jsp/cal/cal1.jsp @@ -0,0 +1,94 @@ + + + + Calendar: A JSP APPLICATION + + + + + +<%@ page language="java" import="cal.*" %> + + +<% + table.processRequest(request); + if (table.getProcessError() == false) { +%> + + +

    + + + + +
    prev + Calendar:<%= table.getDate() %> next +
    + + + + + + + + +<% + for(int i=0; i + + + + +<% + } +%> + +
    Time Appointment
    + > + <%= entr.getHour() %> + > + <% out.print(util.HTMLFilter.filter(entr.getDescription())); %> +
    +
    + + + + + + +
    <% out.print(util.HTMLFilter.filter(table.getName())); %> : + <% out.print(util.HTMLFilter.filter(table.getEmail())); %>
    +
    + +<% + } else { +%> + + You must enter your name and email address correctly. + +<% + } +%> + + + + + + + + diff --git a/webapps/examples/jsp/cal/cal2.jsp b/webapps/examples/jsp/cal/cal2.jsp new file mode 100644 index 000000000..f3a93eb51 --- /dev/null +++ b/webapps/examples/jsp/cal/cal2.jsp @@ -0,0 +1,44 @@ + + + + + Calendar: A JSP APPLICATION + + + + + + +<% + String time = request.getParameter ("time"); +%> + + Please add the following event: +

    Date <%= table.getDate() %> +
    Time <%= util.HTMLFilter.filter(time) %>

    +
    +
    +
    +
    +
    +

    Description of the event

    +
    +
    + + + + diff --git a/webapps/examples/jsp/cal/calendar.html b/webapps/examples/jsp/cal/calendar.html new file mode 100644 index 000000000..8b1a74cb4 --- /dev/null +++ b/webapps/examples/jsp/cal/calendar.html @@ -0,0 +1,42 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for Calendar Example.
    +

    cal1.jsp +

    +

    cal2.jsp +

    + +
    +

    Beans. +

    TableBean +

    +

    Entries +

    +

    Entry +

    + + + diff --git a/webapps/examples/jsp/cal/login.html b/webapps/examples/jsp/cal/login.html new file mode 100644 index 000000000..cb8ba4241 --- /dev/null +++ b/webapps/examples/jsp/cal/login.html @@ -0,0 +1,46 @@ + + + + + Login page for the calendar. + + + +
    + + Please Enter the following information: + +
    +
    + + Name + +
    + Email + +
    + + +
    +
    + Note: This application does not implement the complete +functionality of a typical calendar application. It demostartes a way JSP can be +used with html tables and forms. + +
    + + diff --git a/webapps/examples/jsp/chat/chat.jsp b/webapps/examples/jsp/chat/chat.jsp new file mode 100644 index 000000000..cc53bba49 --- /dev/null +++ b/webapps/examples/jsp/chat/chat.jsp @@ -0,0 +1,32 @@ + + + + + JSP Chat + + + + + + + + + + + + + diff --git a/webapps/examples/jsp/chat/login.jsp b/webapps/examples/jsp/chat/login.jsp new file mode 100644 index 000000000..492a25176 --- /dev/null +++ b/webapps/examples/jsp/chat/login.jsp @@ -0,0 +1,30 @@ + + + + + JSP Chat + + + + +
    + +Nickname: +
    + + + diff --git a/webapps/examples/jsp/chat/post.jsp b/webapps/examples/jsp/chat/post.jsp new file mode 100644 index 000000000..65b40c136 --- /dev/null +++ b/webapps/examples/jsp/chat/post.jsp @@ -0,0 +1,35 @@ + + + + + JSP Chat + + + + +
    + +Message: +
    + +
    +
    + +Click to open chat window + + + diff --git a/webapps/examples/jsp/checkbox/CheckTest.html b/webapps/examples/jsp/checkbox/CheckTest.html new file mode 100644 index 000000000..b26c367ad --- /dev/null +++ b/webapps/examples/jsp/checkbox/CheckTest.html @@ -0,0 +1,55 @@ + + + + + +checkbox.CheckTest Bean Properties + + +

    +checkbox.CheckTest Bean Properties +

    +
    +
    +
    public class CheckTest
    extends Object
    + +

    +


    + +

    + + + + + + + + + +
    +Properties Summary
    + +String +CheckTest:fruit +
    +
    + +Multi +
    +


    + + diff --git a/webapps/examples/jsp/checkbox/check.html b/webapps/examples/jsp/checkbox/check.html new file mode 100644 index 000000000..dabc610d4 --- /dev/null +++ b/webapps/examples/jsp/checkbox/check.html @@ -0,0 +1,37 @@ + + + + + + +
    +
    + +Check all Favorite fruits:
    + + Apples
    + Grapes
    + Oranges
    + Melons
    + + +
    + +
    +
    + + diff --git a/webapps/examples/jsp/checkbox/checkresult.jsp b/webapps/examples/jsp/checkbox/checkresult.jsp new file mode 100644 index 000000000..fb188bb22 --- /dev/null +++ b/webapps/examples/jsp/checkbox/checkresult.jsp @@ -0,0 +1,63 @@ + + + + + +<%! String[] fruits; %> + + + +
    +The checked fruits (got using request) are:
    +<% + fruits = request.getParameterValues("fruit"); +%> +
      +<% + if (fruits != null) { + for (int i = 0; i < fruits.length; i++) { +%> +
    • +<% + out.println (util.HTMLFilter.filter(fruits[i])); + } + } else out.println ("none selected"); +%> +
    +
    +
    + +The checked fruits (got using beans) are
    + +<% + fruits = foo.getFruit(); +%> +
      +<% + if (!fruits[0].equals("1")) { + for (int i = 0; i < fruits.length; i++) { +%> +
    • +<% + out.println (util.HTMLFilter.filter(fruits[i])); + } + } else out.println ("none selected"); +%> +
    +
    + + diff --git a/webapps/examples/jsp/checkbox/cresult.html b/webapps/examples/jsp/checkbox/cresult.html new file mode 100644 index 000000000..1668e5be7 --- /dev/null +++ b/webapps/examples/jsp/checkbox/cresult.html @@ -0,0 +1,33 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for Checkbox Example +

    + +

    Property Sheet for CheckTest +

    + + + diff --git a/webapps/examples/jsp/colors/ColorGameBean.html b/webapps/examples/jsp/colors/ColorGameBean.html new file mode 100644 index 000000000..11a33f172 --- /dev/null +++ b/webapps/examples/jsp/colors/ColorGameBean.html @@ -0,0 +1,115 @@ + + + + + +colors.ColorGameBean Bean Properties + + +

    +colors.ColorGameBean Bean Properties +

    +
    +
    +
    public class ColorGameBean
    extends Object
    + +

    +


    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Properties Summary
    + +String +ColorGameBean:color2 +
    +
    + +Single +
    + +String +ColorGameBean:color1 +
    +
    + +Single +
    + +int +ColorGameBean:attempts +
    +
    + +Single +
    + +boolean +ColorGameBean:hint +
    +
    + +Single +
    + +boolean +ColorGameBean:success +
    +
    + +Single +
    + +boolean +ColorGameBean:hintTaken +
    +
    + +Single +
    +


    + + diff --git a/webapps/examples/jsp/colors/clr.html b/webapps/examples/jsp/colors/clr.html new file mode 100644 index 000000000..69713e12a --- /dev/null +++ b/webapps/examples/jsp/colors/clr.html @@ -0,0 +1,33 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for Color Example +

    + +

    Property Sheet for ColorGameBean +

    + + + diff --git a/webapps/examples/jsp/colors/colors.html b/webapps/examples/jsp/colors/colors.html new file mode 100644 index 000000000..bf061fe99 --- /dev/null +++ b/webapps/examples/jsp/colors/colors.html @@ -0,0 +1,46 @@ + + + + + + +
    +This web page is an example using JSP and BEANs. +

    +Guess my favorite two colors + +

    If you fail to guess both of them - you get yellow on red. + +

    If you guess one of them right, either your foreground or + your background will change to the color that was guessed right. + +

    Guess them both right and your browser foreground/background + will change to my two favorite colors to display this page. + +


    +
    +Color #1: +
    +Color #2: +

    + + +

    + +
    + + diff --git a/webapps/examples/jsp/colors/colrs.jsp b/webapps/examples/jsp/colors/colrs.jsp new file mode 100644 index 000000000..8bb7c600d --- /dev/null +++ b/webapps/examples/jsp/colors/colrs.jsp @@ -0,0 +1,69 @@ + + + + + + +<% + cb.processRequest(request); +%> + +> +> +

    + +<% if (cb.getHint()==true) { %> + +

    Hint #1: Vampires prey at night! +

    Hint #2: Nancy without the n. + +<% } %> + +<% if (cb.getSuccess()==true) { %> + +

    CONGRATULATIONS!! + <% if (cb.getHintTaken()==true) { %> + +

    ( although I know you cheated and peeked into the hints) + + <% } %> + +<% } %> + +

    Total attempts so far: <%= cb.getAttempts() %> +

    + +

    + +

    + +Color #1: + +
    + +Color #2: + +

    + + + + +

    + +
    + + diff --git a/webapps/examples/jsp/dates/date.html b/webapps/examples/jsp/dates/date.html new file mode 100644 index 000000000..e8081caf6 --- /dev/null +++ b/webapps/examples/jsp/dates/date.html @@ -0,0 +1,30 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for Date Example +

    + + + diff --git a/webapps/examples/jsp/dates/date.jsp b/webapps/examples/jsp/dates/date.jsp new file mode 100644 index 000000000..7f3c3b403 --- /dev/null +++ b/webapps/examples/jsp/dates/date.jsp @@ -0,0 +1,40 @@ + + + +<%@ page session="false"%> + + + + + +
      +
    • Day of month: is +
    • Year: is +
    • Month: is +
    • Time: is +
    • Date: is +
    • Day: is +
    • Day Of Year: is +
    • Week Of Year: is +
    • era: is +
    • DST Offset: is +
    • Zone Offset: is +
    +
    + + + diff --git a/webapps/examples/jsp/error/er.html b/webapps/examples/jsp/error/er.html new file mode 100644 index 000000000..1bea6ee68 --- /dev/null +++ b/webapps/examples/jsp/error/er.html @@ -0,0 +1,30 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for Error Example +

    + + + diff --git a/webapps/examples/jsp/error/err.jsp b/webapps/examples/jsp/error/err.jsp new file mode 100644 index 000000000..3076380c4 --- /dev/null +++ b/webapps/examples/jsp/error/err.jsp @@ -0,0 +1,43 @@ + + + + + <%@ page errorPage="errorpge.jsp" %> + + <% + String name = null; + + if (request.getParameter("name") == null) { + %> + <%@ include file="/error/error.html" %> + <% + } else { + foo.setName(request.getParameter("name")); + if (foo.getName().equalsIgnoreCase("integra")) + name = "acura"; + if (name.equalsIgnoreCase("acura")) { + %> + +

    Yes!!! Acura is my favorite car. + + <% + } + } + %> + + + diff --git a/webapps/examples/jsp/error/error.html b/webapps/examples/jsp/error/error.html new file mode 100644 index 000000000..748718820 --- /dev/null +++ b/webapps/examples/jsp/error/error.html @@ -0,0 +1,36 @@ + + + + + +

    This example uses errorpage directive

    +
    +

    Select my favourite car.

    +
    + + +
    +
    + + + diff --git a/webapps/examples/jsp/error/errorpge.jsp b/webapps/examples/jsp/error/errorpge.jsp new file mode 100644 index 000000000..c91ce6130 --- /dev/null +++ b/webapps/examples/jsp/error/errorpge.jsp @@ -0,0 +1,24 @@ + + + + + + <%@ page isErrorPage="true" %> +

    The exception <%= exception.getMessage() %> tells me you + made a wrong choice. + + diff --git a/webapps/examples/jsp/forward/forward.jsp b/webapps/examples/jsp/forward/forward.jsp new file mode 100644 index 000000000..4a37fd060 --- /dev/null +++ b/webapps/examples/jsp/forward/forward.jsp @@ -0,0 +1,22 @@ + + + +<% + double freeMem = Runtime.getRuntime().freeMemory(); + double totlMem = Runtime.getRuntime().totalMemory(); + double percent = freeMem/totlMem; + if (percent < 0.5) { +%> + + + +<% } else { %> + + + +<% } %> + + diff --git a/webapps/examples/jsp/forward/fwd.html b/webapps/examples/jsp/forward/fwd.html new file mode 100644 index 000000000..980a53f56 --- /dev/null +++ b/webapps/examples/jsp/forward/fwd.html @@ -0,0 +1,18 @@ + + + +Untitled Document + + + + +

    + +

    Source Code for Forward Example +

    + + + diff --git a/webapps/examples/jsp/forward/one.jsp b/webapps/examples/jsp/forward/one.jsp new file mode 100644 index 000000000..4afe6f28c --- /dev/null +++ b/webapps/examples/jsp/forward/one.jsp @@ -0,0 +1,11 @@ + + + + + + +VM Memory usage < 50%. + \ No newline at end of file diff --git a/webapps/examples/jsp/forward/two.html b/webapps/examples/jsp/forward/two.html new file mode 100644 index 000000000..3bc29170d --- /dev/null +++ b/webapps/examples/jsp/forward/two.html @@ -0,0 +1,11 @@ + + + + + + +VM Memory usage > 50%. + \ No newline at end of file diff --git a/webapps/examples/jsp/images/code.gif b/webapps/examples/jsp/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..93af2cd130aa61cb2f235cdd6f0e75ab444819ef GIT binary patch literal 292 zcmZ?wbhEHblwgoxIP#z2z<~q*(`NopOZ#sOM8;>*(#{wIk?|P@o$6#>Qz3K*V4S1Pnk5hzS72pDc_ZB|0DiWTyk`LIs7s6iv0@q;(ETk{*X8*p&Sz zS?%Jy|7uNwX5dT_rVVU*FIJccbhvMP#4t}Kw7uYTuBh_VnCTjt97)}qgEke3iU+j# zdTyN*!`HsV>FFn-s95XDrdAynk)$>kVJ;@##Ikl#0e5yDZsrM%j-vc*EJY@UJi>F- w^aL|Jc?Bj;=4WLO5adbda@4El6|}Iev#dyLst@fxxV)*dq0M4 zuU27uS$av`))UvZFOHHZ*ItST2O0$7;7H? zm&+9jg_V_+QmIrfmut0JNgWD>N~y#dv!$ejV3mcCNeF_Fs91zF06g0g%rptkdaf-6 zF_0xVM$i_FQ|#InC0H;@)orLVf()pw6mqsDEh%itRj8`R2I3~Mg(*yIbHb?sbqyn3 zQYZyCsY->?M4l}qr>- z0I$VBAEL|c3!Aa23>>`6zgZI-x?7(TmI_v%;048`BL-aEhiAV!!lj_8tNy{ zuHVlON6V>(=ELvD+RJkuyyRyVcEVSxb@v=^_xJ8_AXukA`|R1H)q9Ptr@mW4Q_jP; zvV-p8YH%TPuI2Q*17~mjF+W7_4*dGfOe`P2(>42bIlAt3wjaL+tnW9`gI6%iQm3_`St79 z-o1NEOG}%Ynk*G1wxrosIqNvqnY}xbY&!4YDJiK~ zJ(;s9MkiB^52u^X3e}4;R!E2p+p%-!hY#;puU_5J(UF~5hI=BBG{#Lvgqddaj4L|MyUuVNmX8s!x@$*GmKAWm@dju`F)!E?FkWEJ!v~>q2rkrCo+srXPOl_ z%Qhqnd)o;{>dBr+GdY)Hd?eH4Y?_gmy6CENz$sYS8sNdpXzI(A}*9~tCVk}QfaGLWv5u{sM6}9(dD7r z@1sB4-)wP+NvOW!q(HrLD-Bs`DHBr@I~!{YGgDnHEd_CLQC?0yRu&^gNo_HaP3{as z4k`WCR@Sj14g@J)V0GL@AIQ}vG=ali- zu;5@51Cxx6M#6zZO)Ojz79R=}nphY`Bw`LEBrvn{E4WN>C}3*k64OgKu^^GTollOV zjzQ4r2#1iW&m4z|PDi^Mb)t4uFe(?^_7TL=o*=wO{(2ujnO+w8c$v4zM`LSsN<)3n~&tajt5>p6MrRUH;*T;EHtq`6t7F{rJhOalziPnL~6|&I^G> zE?r`Oldqh(n0cgM!F7^J=cWB#)AW3=U1Sbc^PO$+_w|#Pmx}^woI0gcCxoo@UUo=p z{;iFR1y+Tu3gb+Q#4vn(x+N>Q)$&RbyXeH}5khoAZ zgHYWn8m8H>&V#9A@nKri+6f7CAZX^n(t)JHP^8RL7z)bJ*uqp1CeXrcK^P~G{tuqV z^BsQQ$2pwh@zEn}1p^F%5QJd}Aw&paj0qu>(zUfUmSs7P<9S{Xgle@~tJOqNtk>(3 zB+0U@D2l48nx^TxZWsoa&$A3e34s7$jDj$XWIqfUmW{ZO5C9=SDAKGTH2r`GRm|~r z5L$j98>Zp~kYOR42b6JwQ1b%S^%chx9UoE#D+ZEvK&b8ovKvT_U$;Hc_5{o0Esv@u zV|vtZNi@a@L^X--U`fN84f8w{M0eXUG$N)K%8oDDURAev)u`Ei)$*#g&zml%+l*qc z5u_%u5lz+^!=({{P?YDX?hsigszo##*Hy@JNK{Z=MY4eu6Y@37k1~gfg@L4*NB(TMHD`z5Mi$4{3$K3Fd0=2+ z2&SJ^4mHd1^M91~z5jb@w)hR4@9nxce6>IZv*odP-zSex6`o(pw(oi7X69J;zL6Ew zmMCYwj%&NFbnm5LWxe~Y@k3x5DnB+pXsm90nHrr#zm +To get the current time in ms diff --git a/webapps/examples/jsp/include/foo.jsp b/webapps/examples/jsp/include/foo.jsp new file mode 100644 index 000000000..0130b0716 --- /dev/null +++ b/webapps/examples/jsp/include/foo.jsp @@ -0,0 +1,20 @@ + + + + + +<%= System.currentTimeMillis() %> diff --git a/webapps/examples/jsp/include/inc.html b/webapps/examples/jsp/include/inc.html new file mode 100644 index 000000000..1bb3fb3e5 --- /dev/null +++ b/webapps/examples/jsp/include/inc.html @@ -0,0 +1,29 @@ + + + +Untitled Document + + + + +

    + +

    Source Code for Include Example +

    + + + diff --git a/webapps/examples/jsp/include/include.jsp b/webapps/examples/jsp/include/include.jsp new file mode 100644 index 000000000..fef97361d --- /dev/null +++ b/webapps/examples/jsp/include/include.jsp @@ -0,0 +1,34 @@ + + + + + + + +<%@ page buffer="5kb" autoFlush="false" %> + +

    In place evaluation of another JSP which gives you the current time: + +<%@ include file="foo.jsp" %> + +

    by including the output of another JSP: + + + +:-) + + diff --git a/webapps/examples/jsp/index.html b/webapps/examples/jsp/index.html new file mode 100644 index 000000000..546c2b6f4 --- /dev/null +++ b/webapps/examples/jsp/index.html @@ -0,0 +1,373 @@ + + +\ + + + + + JSP Examples + + + +JSP +Samples +

    This is a collection of samples demonstrating the usage of different +parts of the Java Server Pages (JSP) specification. Both JSP 2.0 and +JSP 1.2 examples are presented below. +

    These examples will only work when these pages are being served by a +servlet engine; of course, we recommend +Tomcat. +They will not work if you are viewing these pages via a +"file://..." URL. +

    To navigate your way through the examples, the following icons will +help: +
      + + + + + + + + + + + + + + + + + + + + + +
    Execute the example
    Look at the source code for the example
    Return to this screen
    + +

    Tip: For session scoped beans to work, the cookies must be enabled. +This can be done using browser options. +
      +
    +JSP 2.0 Examples
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Expression Language
    Basic ArithmeticExecuteSource
    Basic ComparisonsExecuteSource
    Implicit ObjectsExecuteSource
    FunctionsExecuteSource

    SimpleTag Handlers and JSP Fragments
    Hello World TagExecuteSource
    Repeat TagExecuteSource
    Book ExampleExecuteSource

    Tag Files
    Hello World Tag FileExecuteSource
    Panel Tag FileExecuteSource
    Display Products ExampleExecuteSource

    New JSP XML Syntax (.jspx)
    XHTML Basic ExampleExecuteSource
    SVG (Scalable Vector Graphics)ExecuteSource

    Other JSP 2.0 Features
    <jsp:attribute> and <jsp:body>ExecuteSource
    Shuffle ExampleExecuteSource
    Attributes With Dynamic NamesExecuteSource
    JSP ConfigurationExecuteSource
    + +
    +JSP 1.2 Examples
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Numberguess ExecuteSource
    Date ExecuteSource
    SnoopExecuteSource
    ErrorPage ExecuteSource
    Carts ExecuteSource
    Checkbox ExecuteSource
    Color ExecuteSource
    Calendar ExecuteSource
    Include ExecuteSource
    Forward ExecuteSource
    Plugin ExecuteSource
    JSP-Servlet-JSP ExecuteSource
    Custom tag exampleExecuteSource
    XML syntax exampleExecuteSource
    + +
    +Tag Plugins
    + + + + + + + + + + + + + + + + + + + + +
    If  + + Execute + + + Source +
    ForEach  + + Execute + + + Source +
    Choose  + + Execute + + + Source +
    + + + diff --git a/webapps/examples/jsp/jsp2/el/basic-arithmetic.html b/webapps/examples/jsp/jsp2/el/basic-arithmetic.html new file mode 100644 index 000000000..fe9c71978 --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/basic-arithmetic.html @@ -0,0 +1,29 @@ + + + +View Source Code + + + + +

    + +

    Source Code for Basic Arithmetic Example +

    + + + diff --git a/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp b/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp new file mode 100644 index 000000000..86ffb1525 --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/basic-arithmetic.jsp @@ -0,0 +1,87 @@ + + + + JSP 2.0 Expression Language - Basic Arithmetic + + +

    JSP 2.0 Expression Language - Basic Arithmetic

    +
    + This example illustrates basic Expression Language arithmetic. + Addition (+), subtraction (-), multiplication (*), division (/ or div), + and modulus (% or mod) are all supported. Error conditions, like + division by zero, are handled gracefully. +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EL ExpressionResult
    \${1}${1}
    \${1 + 2}${1 + 2}
    \${1.2 + 2.3}${1.2 + 2.3}
    \${1.2E4 + 1.4}${1.2E4 + 1.4}
    \${-4 - 2}${-4 - 2}
    \${21 * 2}${21 * 2}
    \${3/4}${3/4}
    \${3 div 4}${3 div 4}
    \${3/0}${3/0}
    \${10%4}${10%4}
    \${10 mod 4}${10 mod 4}
    \${(1==2) ? 3 : 4}${(1==2) ? 3 : 4}
    +
    +
    + + diff --git a/webapps/examples/jsp/jsp2/el/basic-comparisons.html b/webapps/examples/jsp/jsp2/el/basic-comparisons.html new file mode 100644 index 000000000..22cd17490 --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/basic-comparisons.html @@ -0,0 +1,29 @@ + + + +View Source Code + + + + +

    + +

    Source Code for Basic Comparisons Example +

    + + + diff --git a/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp b/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp new file mode 100644 index 000000000..1e85dba30 --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/basic-comparisons.jsp @@ -0,0 +1,115 @@ + + + + JSP 2.0 Expression Language - Basic Comparisons + + +

    JSP 2.0 Expression Language - Basic Comparisons

    +
    + This example illustrates basic Expression Language comparisons. + The following comparison operators are supported: +
      +
    • Less-than (< or lt)
    • +
    • Greater-than (> or gt)
    • +
    • Less-than-or-equal (<= or le)
    • +
    • Greater-than-or-equal (>= or ge)
    • +
    • Equal (== or eq)
    • +
    • Not Equal (!= or ne)
    • +
    +
    + Numeric + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EL ExpressionResult
    \${1 < 2}${1 < 2}
    \${1 lt 2}${1 lt 2}
    \${1 > (4/2)}${1 > (4/2)}
    \${1 > (4/2)}${1 > (4/2)}
    \${4.0 >= 3}${4.0 >= 3}
    \${4.0 ge 3}${4.0 ge 3}
    \${4 <= 3}${4 <= 3}
    \${4 le 3}${4 le 3}
    \${100.0 == 100}${100.0 == 100}
    \${100.0 eq 100}${100.0 eq 100}
    \${(10*10) != 100}${(10*10) != 100}
    \${(10*10) ne 100}${(10*10) ne 100}
    +
    +
    + Alphabetic + + + + + + + + + + + + + + + + + + +
    EL ExpressionResult
    \${'a' < 'b'}${'a' < 'b'}
    \${'hip' > 'hit'}${'hip' > 'hit'}
    \${'4' > 3}${'4' > 3}
    +
    +
    + + diff --git a/webapps/examples/jsp/jsp2/el/functions.html b/webapps/examples/jsp/jsp2/el/functions.html new file mode 100644 index 000000000..59b035043 --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/functions.html @@ -0,0 +1,31 @@ + + + +View Source Code + + + + +

    + +

    Source Code for functions.jsp +

    +

    Source Code for Functions.java +

    + + + diff --git a/webapps/examples/jsp/jsp2/el/functions.jsp b/webapps/examples/jsp/jsp2/el/functions.jsp new file mode 100644 index 000000000..b6c53df1c --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/functions.jsp @@ -0,0 +1,65 @@ + +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="my" uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib"%> + + + + JSP 2.0 Expression Language - Functions + + +

    JSP 2.0 Expression Language - Functions

    +
    + An upgrade from the JSTL expression language, the JSP 2.0 EL also + allows for simple function invocation. Functions are defined + by tag libraries and are implemented by a Java programmer as + static methods. + +
    + Change Parameter +
    + foo = + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    EL ExpressionResult
    \${param["foo"]}${fn:escapeXml(param["foo"])} 
    \${my:reverse(param["foo"])}${my:reverse(fn:escapeXml(param["foo"]))} 
    \${my:reverse(my:reverse(param["foo"]))}${my:reverse(my:reverse(fn:escapeXml(param["foo"])))} 
    \${my:countVowels(param["foo"])}${my:countVowels(fn:escapeXml(param["foo"]))} 
    +
    +
    + + + diff --git a/webapps/examples/jsp/jsp2/el/implicit-objects.html b/webapps/examples/jsp/jsp2/el/implicit-objects.html new file mode 100644 index 000000000..391ecdbb7 --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/implicit-objects.html @@ -0,0 +1,19 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for Implicit Objects Example +

    + + + diff --git a/webapps/examples/jsp/jsp2/el/implicit-objects.jsp b/webapps/examples/jsp/jsp2/el/implicit-objects.jsp new file mode 100644 index 000000000..992aa1d4b --- /dev/null +++ b/webapps/examples/jsp/jsp2/el/implicit-objects.jsp @@ -0,0 +1,88 @@ + +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + JSP 2.0 Expression Language - Implicit Objects + + +

    JSP 2.0 Expression Language - Implicit Objects

    +
    + This example illustrates some of the implicit objects available + in the Expression Lanaguage. The following implicit objects are + available (not all illustrated here): +
      +
    • pageContext - the PageContext object
    • +
    • pageScope - a Map that maps page-scoped attribute names to + their values
    • +
    • requestScope - a Map that maps request-scoped attribute names + to their values
    • +
    • sessionScope - a Map that maps session-scoped attribute names + to their values
    • +
    • applicationScope - a Map that maps application-scoped attribute + names to their values
    • +
    • param - a Map that maps parameter names to a single String + parameter value
    • +
    • paramValues - a Map that maps parameter names to a String[] of + all values for that parameter
    • +
    • header - a Map that maps header names to a single String + header value
    • +
    • headerValues - a Map that maps header names to a String[] of + all values for that header
    • +
    • initParam - a Map that maps context initialization parameter + names to their String parameter value
    • +
    • cookie - a Map that maps cookie names to a single Cookie object.
    • +
    + +
    + Change Parameter +
    + foo = + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EL ExpressionResult
    \${param.foo}${fn:escapeXml(param["foo"])} 
    \${param["foo"]}${fn:escapeXml(param["foo"])} 
    \${header["host"]}${header["host"]}
    \${header["accept"]}${header["accept"]}
    \${header["user-agent"]}${header["user-agent"]}
    +
    +
    + + diff --git a/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html b/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html new file mode 100644 index 000000000..5faea3926 --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspattribute/jspattribute.html @@ -0,0 +1,36 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for jspattribute.jsp +

    + +

    Source Code for HelloWorldSimpleTag.java +

    + +

    Source Code for FooBean.java +

    + + + diff --git a/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp b/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp new file mode 100644 index 000000000..22b705e1b --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspattribute/jspattribute.jsp @@ -0,0 +1,45 @@ + +<%@ taglib prefix="my" uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib"%> + + + + JSP 2.0 Examples - jsp:attribute and jsp:body + + +

    JSP 2.0 Examples - jsp:attribute and jsp:body

    +
    +

    The new <jsp:attribute> and <jsp:body> + standard actions can be used to specify the value of any standard + action or custom action attribute.

    +

    This example uses the <jsp:attribute> + standard action to use the output of a custom action invocation + (one that simply outputs "Hello, World!") to set the value of a + bean property. This would normally require an intermediary + step, such as using JSTL's <c:set> action.

    +
    + + Bean created! Setting foo.bar...
    + + + + + +
    +
    + Result: ${foo.bar} + + diff --git a/webapps/examples/jsp/jsp2/jspattribute/shuffle.html b/webapps/examples/jsp/jsp2/jspattribute/shuffle.html new file mode 100644 index 000000000..907c5aa42 --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspattribute/shuffle.html @@ -0,0 +1,36 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for shuffle.jsp +

    + +

    Source Code for ShuffleSimpleTag.java +

    + +

    Source Code for TileSimpleTag.java +

    + + + diff --git a/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp b/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp new file mode 100644 index 000000000..4f139fdae --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspattribute/shuffle.jsp @@ -0,0 +1,89 @@ + +<%@ taglib prefix="my" uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib"%> + + + + JSP 2.0 Examples - Shuffle Example + + +

    JSP 2.0 Examples - Shuffle Example

    +
    +

    Try reloading the page a few times. Both the rows and the columns + are shuffled and appear different each time.

    +

    Here's how the code works. The SimpleTag handler called + <my:shuffle> accepts three attributes. Each attribute is a + JSP Fragment, meaning it is a fragment of JSP code that can be + dynamically executed by the shuffle tag handler on demand. The + shuffle tag handler executes the three fragments in a random order. + To shuffle both the rows and the columns, the shuffle tag is used + with itself as a parameter.

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + diff --git a/webapps/examples/jsp/jsp2/jspx/basic.html b/webapps/examples/jsp/jsp2/jspx/basic.html new file mode 100644 index 000000000..db2427b81 --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspx/basic.html @@ -0,0 +1,30 @@ + + + +View Source Code + + + + +

    + +

    Source Code for XHTML Basic Example +

    + + + diff --git a/webapps/examples/jsp/jsp2/jspx/basic.jspx b/webapps/examples/jsp/jsp2/jspx/basic.jspx new file mode 100644 index 000000000..75394fcbf --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspx/basic.jspx @@ -0,0 +1,30 @@ + + + + JSPX - XHTML Basic Example + + +

    JSPX - XHTML Basic Example

    +
    + This example illustrates how to use JSPX to produce an XHTML basic + document suitable for use with mobile phones, televisions, + PDAs, vending machines, pagers, car navigation systems, + mobile game machines, digital book readers, smart watches, etc. +

    + JSPX lets you create dynamic documents in a pure XML syntax compatible + with existing XML tools. The XML syntax in JSP 1.2 was awkward and + required &lt;jsp:root&gt; to be the root element of the document. + This is no longer the case in JSP 2.0. +

    + This particular example uses a tag file to produce the DOCTYPE and + namespace declarations to make the output of this page a valid XHTML + Basic document. +

    + Just to prove this is live, here's some dynamic content: + + + + diff --git a/webapps/examples/jsp/jsp2/jspx/svgexample.html b/webapps/examples/jsp/jsp2/jspx/svgexample.html new file mode 100644 index 000000000..7f954597b --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspx/svgexample.html @@ -0,0 +1,51 @@ + + + + JSP 2.0 SVG Example + + +

    JSP 2.0 SVG Example

    +
    + This example uses JSP 2.0's new, simplified JSPX syntax to render a + Scalable Vector Graphics (SVG) document. When you view the source, + notice the lack of a <jsp:root> element! The text to be rendered + can be modified by changing the value of the name parameter. +

    + SVG has many potential uses, such as searchable images, or images + customized with the name of your site's visitor (e.g. a "Susan's Store" + tab image). JSPX is a natural fit for generating dynamic XML content + such as SVG. +

    + To execute this example, follow these steps: +

      +
    1. Download Batik, + or any other SVG viewer.
    2. +
    3. Copy the following URL: + + http://localhost:8080/jsp-examples/jsp2/jspx/textRotate.jspx?name=JSPX +
    4. +
    5. Paste the URL into Batik's Location field and press Enter
    6. +
    7. Customize by changing the name=JSPX parameter
    8. +
    +
    + The following is a screenshot of the resulting image, for those that + don't have an SVG viewer: +
    + +
    + + diff --git a/webapps/examples/jsp/jsp2/jspx/textRotate.html b/webapps/examples/jsp/jsp2/jspx/textRotate.html new file mode 100644 index 000000000..1874ecbbf --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspx/textRotate.html @@ -0,0 +1,31 @@ + + + +View Source Code + + + + +

    + +

    Source Code for SVG (Scalable Vector Graphics) +Example +

    + + + diff --git a/webapps/examples/jsp/jsp2/jspx/textRotate.jpg b/webapps/examples/jsp/jsp2/jspx/textRotate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e987367bc83c25aedf1c7afd76f34de4a229f82 GIT binary patch literal 26729 zcmdS9bx>X35-xafhd>~~J;5QkTL>Q95AMPB;O-Dy6Wsma?(QxJI7o1J3(oMnck13Z zQ!`WVz5izK>Z-2VYp=b&TD^96f8DQ(uj_z!G7{1f02mk;fWg}hcwGjF0gw?9kq{A( zk&uv3P>@m4aWT-*(9j8R-ecjC5R#FS5E2uUQ!~?$Q!-K!6Vr0jF@9m?;NT#m;T7az z6JTcNVEbnh7!(u~bTo8)3=DiW3StVj|K;no3xJIba}Co22SW*f#fE{yhI#D+kO2TN z2yd(XXTksH1p^BQkAR4TjDm{xHlY3;02T%g4i+8`0RbNVZM65>a{xRx0uBYMDB^o1 zLnKNETsHr>9Av7m)!lf?)92LeMveg}s2@J!6A*s-OhZdY&%w#X&BMzl_Dx(uQc7Az zMO95*LsJWAY+`C={=>r3$rgMhd7!({58WtWApOBc8obu~;YHnVBL19sGNoh@O zU427iQ*%pCZ(skw;Lz~M%y5iBtwVylx+UUxL@OPs=HCB*p<)m zj2x#?KTvaQe7g7t+P{$f&jAbg-$M2uVE@Gh1)#&hyloyFHb5Bg_klLo5B2{KLSHq< z6t%4Fo-Na6@K-3HeA?hY%QmT%gbhiW$4xg$wdwD3srqedP5bO!mfX~wrPihjSJFdc zsD{6S*%A=~!K&4k#JqfzV6(K0{m=Wfc~m^vuo1NXdy>=C+E}M*l@^wx0g6J8#$~VW zQp(KF3@EH%+0=LnaMpjsT=d=F5Fx>v46BnBlow<>(x?h~`3kEoZU2+%{S*R?!0k=0 zKK75~htOLu=s*_9zCowCXCjWtCE|=zLY$6mc4G(p+zpAcrxYg(rsc;`kke;CQ%zh% zu{9~Rh|3l}!&yZ49LKn<-UU`422QVJL-WVR4;P##W2I$QY0mcz>(x}ngI-P|q}|lv zxHi<$C4{hJWA?b1`Kft@R#1sLQ$oEGQ!hiFSZ(xUB>JhpC(j%23O43iKZ7nxau z5XGiXwTscs724mz+eA07FXZYd|44`QmmjAQ=^e9|5wJp88+VW@q}Q=yF=To?$`PT88YS>u=b zIZKiaOtjL>ph`t7u*kzi3bxYc0<++vN4C=p3A0x~rg2v1%Or69g?8AfQ0JhfF|;qV zZa4Of_l5RGvhhhWyJ>ULzH2%iPN47>_?gL9q;^e(M)gSv?8; zsc3E~y&6Deo##wx89pf$j}S=>qLh~SZ0vnG_m1jKUCT|3uXNTYU`{Y6Ri=K;#%606 z>#(xK@w;+>K=eQjEzQ8Cz~rb8=vQS5z=m$sw$Z1lHrzK0)UnH6* z;f@y8=o;H0wrJYg0&Cy+tV-{b`+0o7Z1FEe+qarFC}uRg~J1!Vv4stAY8vo^%mVOap##&Prx)y@0P-HB^ndi))^XRx<}2M zNLYcZJgvw#mJFk(H~P481#Y8Sp?wl-f|!@v+S+JR5ku9K9fL;AxS%i<0>Hv1QXOMe40S9#V2JikfNkBUUK7JD>Mcq5e$J~lyH zE`n^V-`hKDXKkX!pI1Iq!NMfF!_v|eQExW0VE+WO=_9UiF6$hkl}MU1b&C`_$8+PD zssdo3L;!~>57jIjT(0nfGJxulIw0`R-y;!{&spUM9#u|-hw85WLKh7gCd)TaIUO_9 zf?s|}%AOjTcaz6_cHv&Eo&|%rz^XZc-|*yg$%}aec-3?0bbC1!j)VO|)C;HJN|&|z z@|xB=lQ|UDrqBjy#viy`H{a*JN9&j2+AFUbSV(CIYpj zfa^-Owt3KY6@-(gUZl*pgviZi3|VbqOszNF9N%_PXs=O;tG@h>?W|8d;ZKGd<2C0z z1&&DEaf(-jsx{#F9%eh?OpQVO2U4Mu4u@;%S}6F=l7HOcMiUg`W*#j?DM}QUDso}1 z#_yx^uD^*Y_0)>|zfR$Q!7uJ{c4Dp_K{I}}%#rJUh8!~VH^>@&wxHrwH2D+NTIEnH zSgT8d3o|*q-cIOw+wz;`6NWGpqb{YE15xL6b?3vmZ%skWVm3&~M4Png zuG=IupX#+hXyLIe#PF{4e3_tzqH7fK^G`a6wbjZoD!g+eBaWI)Haw zLt3XYZ10K%LhcsD=b7o-Q-OMnq02S`u}Y}mtf|OxK<&9aH4dAL#}nmIN=S$_xfz$V z*pT}$c$^Cz9o3dCVLq9Yc{EBE=^lw(hb8II3lxA+*;grtnpk3uld6SYg6V%Vd|^xL z^m#DqXIg|vK_@olwx@YP<4*R!)LVWp z4vA2>vJNjVFK04TX08$ax|PER{XLPn6tl3^la$Jda?}b_Qxufmr%x;|_q(EPBSVbY zSZovY2OLSBW%0uSvG~??3OZu+LOvju=)hTio)G7)x z-usN!e+A25>3dNsMAEv<0IlBWFnRd<3J{vNTZ`%vU01-WNW%!wUMXmAdj{M{j;$08!_-Ro*SRzmfqE28hW3PcXr9ueX^Mw;|F2BlI z?5!-A3+IRzb=oa$JDn~I{2TDTj;yC0vsutgm_;RJx~lgQOm}9$u;?XJ!|gE#ZAlC6 zoXb2hir7^P-=g3uuMWT)qIV;Yw#xHH`kwr7c&Ys@*|W^Sid{-J@ZIDP438QwF97}T zxK2aDczuMz8M$zQtd@T`R)`IG`^+lI%W%P0<%y-=S;ny%?q<~0$SyG=+7%K^M|__` zIt>`>Y4tSW!)Z|%`bG{N%L$Ol1K7L4sI+j&)#sm+3`+!8=qRXdG*Zn|McNlU<3%P5 zq#f2zKCD)-fU}zdl)sO~u8zbB_<8R}a`m|FQDxrD%zIu%39Y{ZX1T};G}x^%Km6%^ zFdgeE7@EoJySk4(8A7Tn6Z z+Uzop8`bH?lxaU@*7b8E=tcfD#Xr;hf5^xJ2L_F{zkErNwjMs-n1l&NEx9?F4%Wz< zMfTj@3gO>zVntj(vyE9{TObGB_Yl%K#oXAl#a|LFZz@RMYT{!ku? zv1!m-AI*xJlzi5FE`w5A+SWuH$8Tp{rCztjol)$|01ty|n?tr-g&VyM&IlFtOdabW zg?%A0UlzB3WA=Oh;Q{^yF+)?k!h>4~S9RFQ$);wW=#r`d){r6+d!7~F->`bwgX8Vl z6OJ^Jud-CQkTdGpdz%Icbds-5>0aP7o#>46yTGs27eYm5slK;1m0=a|C2Xy-Lih8U zbnx(9wkQ}0i>{{|=jkpUeSe`o;Nm55Cr9QA>m1f!W(koA&1lTWUdx(h@d}6*Ge24i z6U|yKIf)?czXO?fTw-}qUDlaZLGWAc03)|Q0~#Gf@td9uCtRj=nrpfO&{68KauNP~ z_2rL9RF3J8&jlq`sYO3;Fob2IXRYm-2GiKs-=P>r!m|IBEaW}XWeF2Nvnu{vPun>+ z!=%Wdv($A^BaQd9>@wINM#FEB-yN~wyfHK$dU>UiEWNh-17~{d7XeB_D*zow```p9 zy2OPAOOH zgvAz}PA*qhf-Pv#1y(>#%?yXO&F5bA<`ns$Wl1M<2h{IW0Cb_t9RESX0X}t& z5NF}q#cqpo_uCCl!xH3pk#XXPd&M!))nyl6p}N(=ibgmU)eGMUO5YDUT4DvCLPOK5 z*{P#G^@PQLP5*-GF3c?`Ioi!x`?(ct+3_h$W*Q^7MN6yO$?4O!0)p zmLH`zs8hV7${VV4$ji#p*yExVP6zFIIR}A1PE4kI&AmOJvuufmY8)fu zXoP8PT5luI(HyS9bSoITt^0ERLOUtq#S6`AErrs}d6+|T@$mC9e18zl{ZYk2kxd?@IKSoedEq^4o-hBWXa5e)DnVH)S&kL$G7&RW+m%W00XuK~5% z(;XNv3J8+IZTWVPeD&x)dHe0W0yd2G$uQk~q;b~%D9zI}he#(ww8L`Wu`@JTFy?5UfF$n|zmTtAA0((Q_cnAcxu~-$IDK5S z{nS*Sq2;xhDrx59vL4tLi5+QF$3*@pn8&zqxiUdkUYZ^E3V=}*mVta}D3`El=-eD; z;XFIeDSA$mf`i>5Y3trW;X3bv8zyQ#nyCX-60c%mXju`Oo@UulKN!p*MD>?9;xsX| zlC>IEd)kplKGPS5Zpeb=Ujco&-ZC!(6Azlbl9m^nZco|ZjFEnMQ34`)VRUD1AGq1Q z7I&sfyK;l%evbPS8(nzEuC#!Xm4XzQu#s4ME8bJKq(9;HN2^ZXW}Sar-$@h{)IY_q z<_&MJ4^A;KpLIq$9A$nnyg-Vqtc!WKEN16fxT?*SgOCn!fR4=cQBye1A}*Gr!PONH zfls)5lA)l}G&eiuQ)Z6Gk5%D?bXO8%MZ2hZan&MJ#Gv8b+DacXpdRNU;XoPu`?V-h zgQ(3Vj4p%a1zPECb1R&-Og;}diZ+hiUOriN_pEToN&4oM^ z7cp8|_^*sbqk|*t6Yfu?$+dYFQ4Z#AH15nyOoSsmf9cetB5*W~D~I^~hd0yJvmHB7 zFXZz|tz76SC1fAn30#)G=T0}+>Yn~#^xGn~*~33lIml#LaE=MJC_ijeZ~Xg_yVJOC z*@~QYcVp|bTzP*N9EB=e@F4YWrJJk5DWg zMsnST=f~ev+0`}KqDf(>%_ej9((o<;_qPo(xVCLurby#Lr?+q-D`l{yzcE-q*2g9% zb4v!Bvwn1O(gttH%f#K0q^o3z$B2*2a%L`XexiPTciyCqn?~(dVx79G_#<^6vu1ps z!PS5_f~B6D%A<;C=M1Num2yYGg_`UTg=8e%Nvno(XD4 zg%FdaBA(N2+85uMs_RGJy0w8IQ_+<_qQC(S4I@tH6MBv)vnJgMcT^8l2mr?K3vF(- zO?5D?lGOh!U5Bm?q0x0c7B{+V44%L|m4q~uML_c24;qD$g$^IoxRa%tqn1$MNs0(a6WN207G|=|m>sQhC_a>*5<)iV7UJ`XJ)&BFc4%0|M(Z~4iw!EVrE7em)w))Vbc-i2y zIojNu6gRJM6kEYh0C8r$h}92QrR7z=kqx|s01tEFmzI6g*2W;8OA~$Tt9uPxUv8P zVHla_%fYtJwPK!`nS>_88hj)de~%K;NysnGIc1L-ts@X&G~*skWyh3Kq%Bi%nUkXjI) zUi`u|@lEulKgsuT10sZf5-lxObFfuIdU+Yp#0CtsNMY@%eL@9-EXlR zm8nQ|!>Q~O#=xUMH6jpggg?v8_$x} z6Q=#S+2$1>u=5mpH~n7~f`EJfF6tHVpAW_SM=OEuUn<}XT_X3Q`$wj$<>ZJxsqj7+ zsMf=?e_aDL`K=$`Hr3%fLq*+f2 z6w+3=b?OA0zX0^PESna)d$*KxV|C^y&c`UorJ2&a0^nJYfr~`uQC^x!+VmuZIOn!R z-52>o{|z+j?k?eiw?sp|P5<7K=rFggPP>G~`u8cd7BMS+*AVHAr8b&Y2q7NQyad*P z@^(V47(3O13E2^a`YXVBv!1E+#NL6DsmK67hk2)X})c6A$(wV zuK$$MTf$SYEZY!^QG}V8aWDr^636|QlybjAke2|!<|;*7ED6>5L1sCHt8=2onFx4^ zJOY8j%gKMPCiI7Vqns!%pqVwOq3}0wc`qvsZ^W|Wi`ZNI@gLPH3!XG2IfW9=_tA0r z#eMW1>!O&2^Vd$j+om)e&wwUo#v_E`i;_ah$jH6CjtzV~Yv6$-C9F1qalnabl4j{8 z?Awu5{}dgA3khcglbi3MO3JU6+2-1CeR<2<0Q3cGIe2NMLlv^&R@P(WUi}Zqo*q=gxUT^DudBRK1xJT%*)0v$c@;=SJF%&oNItW zp;B?>M1Cw2QdEK3&d?u-Lr28cr}m|6a*hkGEFgZVRX*BlylU{6@)9M|Z!BTa7jXmi z#05pv1CBB!J4@o2H7PcQMnj!r>0O!d=Uv#AhNb{!!XFDHKVifrr%26WmD{iM+(OoYUHF z$*bApJ!~UA{{4%)TI!p(@E}mZgM|1$}%K z0{u-k`g9~Az*~^Y9iN`gOb|fuIkV~^)r+mYzDFj@9hqt^77i$f0xOlu=G(!lG?E6` zZT(@|FmD}*haOs*S!$I&&(Ui^3!m`bd*CG`m%X(XHbSBRcdMR?d3I1H79Ai+M{H{8 zci_BlQ(2d&5hV?0^^O;@y3z(XViwhmKa!=Syw9B}z85>Vo#KDIT4t`%aCJQDf7O45 zRpfhhqNSg#PB8qHo0q2k`_LD8x-OV0C7{l?R8X6S#!vM8U;}&At8}xXIp@L}Q~Jj( z+o0&snbIZc?LQ(f(d^gbpp+@^+zF|RgviP{RT;T2Jdm&1@jS&{!zD#D0OJTp30Q+@ zD-p`v%;7-MsDO}es2dWoA{=cVVg!J$d(o8xs>t>OMuge-ciD$2g1uBu zpiSt-C&MISvYh-|xH2`=9907tKROE-cvwu)eG98!hT^!2Z@>KoP!z$+hN?*_prl0i zIeG3xxXtI|@>=sgg=cs&HG!FMlC-rHTHbYgeTFTMq0MR(Djs+vU#e4OiC_FcZfN6C`(}|!L99Ce9UI*l` zN*DG56E3<`@Y%{`la`Z#Qp4J>gm$aCJiXv!F|kJgF5Chx+bQm@a$$Tqiu2<=$79CU zCoIg&+(yoD|Z z1oFtd@Gcb-13Pxs@p?jrA*9bo(GE#q1*|o94JPZsorI)Y%kZ)?e`U8wZk%tv!C}Qm zVp?*kKeNtg?GBz9gi>8azO8V&OiAx{6KAa{{`plwH^@1^f9alTB2<|at+HR0oY zxfdtg(&tl8qTv1tAgg@^EJ(b75R@0c*+E(aDRC2|)#Bh7s;RNhbhe%k59{9G}|nQGn((y zYGOpcQJ)m!0>=5kdW*xR%#a%gy%*Nq_OmbadXg zw~aEI@2aHkm*4zi{!-&}sBjyDbWv_jT5OhttD^TU9Brsu6-2#R3o{>Fu6O2JE8(N| zxa}&GZko)%_KjiBC>r$(S>ZyM28FG<42J?32x zQfvB4k_?l7vks)(chmHrLnOvr;L5%B+wWRWI7xjcrUXny1ZXYQ_OYdW1$g=Lh1$s3 z_4nzY#q6n5Rpdr6{4z7Ecc!fW!ty8aop(yRov^0!kql z>R&m8x+D@CMZEfJd{+-t%gP$Wxv(h!C6Ta#ZWS&Mb4x3@!uFR%bIOqw$B2w0xh`99 zf~74ou21=8aDxK#zwdvSrmrL6A4M#|7-@$W*vv{@zGF?HPW4MqpFu&RRe?mf07~*= zTuEAIsnFU!POMx-9GBZTTNSH{gzXWR7&m!anlmf%;$q+~i%=6*>wY@*M~XkQX*PkQ zaEkRVOE+bJ6iCY&;16Lz3Tr!?W_MQKdlj8g?9Y?H!}6A{pfL%!;_%a-tVk~(D8&V; zMZ9yYr<{xneZpXX`NX;)5M8gWH1}S<;eAUALVzFE{dIZ$1vU43$#;$RS^?W}YbE0C zibNN({?#omCG?+v{*^g;o{rPGZ7j#$wdf|%-{GH>&};L_0%OOpPhlpeqo>+#5QkGU zx^*LwU^twQmvy~kfx>cqA(18ndkA4{-u&B3BT3k5veV4?kP- z(U!t;KMu4U;Vm253Lm7t0_eAi&InH^bgLvfB9IQW=9bXi3GfB!;>3yRYN(Oh?Gc0` zhEVxhb1lxAU^V@kZz^ngNF94P8P!~gJ=6 zwZ#gJv#t@X+i8@{BQI~shRib7(P#bk1{@JSnv4JDHU6Dkz9pCheEt1%ScE-0O5Kln z=@8A@jwYJ{I?abpvWb>b`nhAjZS&fudcZh=q8rki6QU1jIch=}FOMV5cR2Rcpp?MG z0?x2C1*F$O)s9r*N~MIiHd+1-UKQ_Owrx_bs8$b1S^|#65DAo#Z*X~`k!yjR0|zZ_ zP>vd)&H(U}5o&a)cY7JgOT18~$zq9(HAL*0;Ui**f%5x^$VqG-9F{%Vb}1Trat}gi z4+oJ(^CO=a0d{GzPIO_}bLOdU)=292SHOoEC-rNzG}k6)6QXD?c1+QV)LO?K7b)}1 z6$a|l@&Zi|yg@`B-B{>y1O&3JQl^tc?zcE}3tJuYxiNYHQ1b4S!gChaWNuB=WQ9jC zSn+*W2D`lVgk^Kc8p!Y~ za@}Nr*R8G{`E$%d_8aVJpQ0W&5=xXpzJQ%AZtCv9=<4-7osrok-t*Z(7o68`g%-j< ztW@C*>#w0q&qvOig;y|ME6$o&-^~AAGPhA622xk|$i#bMn7R5v9tMY0T6m^82K%T; zqv>*Es6KK>^lGwRgs_CzF)T$~7;JS>r#E5Q_IvMY(_ip<*B=N^ z>*Snd=xm;IKs!N7yI4$V)Gq6!^-l71j{Z0A zS3~e80w`E-_LX^)F9nYU+_9~b25(+bIWP;IqXh^Lv|wRs>izjzCiKl1-*}EmHBq_6 zi1F7@`amx_kp<~}#Z1$kB8dbCL3bjiPyM2XpnM?eSCKcyfX*@+EF5QWC(Qm7cyaWg z`pE@JP$0_H?G)y-#JVqqt`0Ubxm2h)eubxG;6w+ep=+)wE8_0K@( z@o3D{D?nkSin3md0&DlFFIE*ZY5yY{k+w`N`hemo>0$*Y@)})+y^BYx>JG?&=$808 z;W~S<(;WC`)>{2?z$ZYi*W$YCjpvz1p>oUrv8`O*_Riw!$bgMYz*b^C-*tjs>V|*J zkcEbH&G3yt@rG_%-x{iZ7HKl<2iC$$GS%$~%&BG?zk}f|K;jf*)cTsRk}FN$7j$_t zrQVku*X581Iv#oSFW21q`JODNRGZjY7|e1edBMFW)1^f( z2?Tq)C4Y!P9%7rg~&G4Y)LRFQ48WW^W!QXYe= z>8~(W_SOL8ZB=PuY-N@-gj_27ewoB-0t_mP!JK4@I>|O}buh7ZS&vatJ|bm^xcbi3 z;A4cMaON8M4#{rtL478Fdp_CE$Wp`TN;UJ4bFpG45wo{(OJ%&w^5cha8-WvQu|}sG z!NVY{gv_2gYv-f1`+&DxfXp`V&{IRK2I#N*ULZ4xEyp&4!O}{OO#GgcZf*Cd?ZflO zL*L1n{KgCQlpp!a`^%bGaX(?5ZUi7+b*G@;kDk{<@q}-M^42DNA8#$W z7H+`m`_%78+ha!YI!9whvnIeK#(L8xU<>_atccY{@}J*M{^hsYMMdeQvpLeJ0?_u;nia+q=e7p5s1 zmoy7ft|RJ{YiSYwZkPZwUSc`%6_6!UqWp8_!T%^}@~HN#SxR)1HQ|O+?@u51$3m1X zxwsqFXs4s`uRCWf(qtYQTg#k52D5V*;~%i-N5`mkWB1NU7-Z52k+)R!Te4x~%a>c5 z5OCFP!JgaV+d0o$(cZx*x{K(~>Q^W1_dk5!%Bw36^GM+1S^>np$b2enro~ z%Qq`qeNJ70T8qQXCJtVLZS%6Dfe}tDjU3P_GTch^pVZcBDLHsEia~a=}Zg!$c*Me>lqkbSZZK0 z*4^FD=ZmL9Y)E0?i_pKLe!xD+oUZV@=(bV`K`5K%Q{wyozhJ??Or?zTwlMAiHX{Yuyp+6-2+2+2j@64pw;H?Z~vpj|l7@lcI241#Ul zDzwPY`>(5V+_7O$`JZ~)`tCxyfOTsw#B}_~ypsjEbA=V`DHqr&suw!v+ElU>v7&^u z!_*G`ce|} zb)MbfE;y?{bm z4QkKVgU&s46#M_SM))1FzAr*nYOlgD+p# zOq;A{-XX*z$bwPP_R+y!p*fO@NX6f}!ll0SV z1bB19rX~8)#>GSEalkrWCQ_kWrx-oH3tgX|>)~|_JI!?vlfjDtLn0H>Alpigx%%a! zvN9LXA`2U}JT0eCzzxBn=L_h746A;iV|H0CBRqN0j7xCq`iak*Roqlb;xDYO&ulOE z!%yJK>YzpOMG6_SG_ma@Qlr-b9@x#}N<7v(2XDja@_TxjuYX1DpbtTo600TGI|6g1 z8dbgW_OKhOqMZZHjt}!oJ9d~>^piH+r&~DN914q0L$}u)B@H>_AAR=Gb=f8rS~4In zcS{2w={MQ#h0---ys!!}1oRu48|Fhc7`_3hE;!%cQ67M{>xQ{(uI|_E-+?Cc)Pz4+ zG5E4+E=4tb$TP8Q$A2RekKa0L<>i%iA~7)724;poak)wy5)d&k_cV813*Cc9y#tq&+lsnS-M8#UUs=iscn_?rTRvo0e zRSLU$%=KWKI*baq^h%3S=AW0t!D2fppb8r#Q+bh7z0j+~D@$5IlW0<%R2QBt5Y4-* z8JU&Wual%}a!S@rA@=}L)+!|gPmvVh;nf|0Z1DQr-}q;p2W({sK-`H>TV$qFbjl-3 zW@ojawVCEjn#!IYQsVjM&nTW}>;)&mdeg^kb&uZzcMUJ$7Cj(ks~WH;8KqF|a^o|Q z@u6iuo|t;P8(3}KvB(7ziH9@u82#C3b~tTP^ismt-v37aF^DKW|~+ zX8L0r-;{^5&J#I0Nhu>BH`#a*Jyi!ao{o?}{Tq)dFP?~Is8m}@De_=hy4qbGF7Y_4 z&=4!oNA39YLM$T1p>aEe7M4B_hy}a8l z@h8sku^U;Gp^mPOo{)*rS_B_fPsJB&4DE4e^n&8aXAZ-sV54D%v7K$lG0%kWx%Eo2 zhNyhAC4qqog)r$(3bmQM6^c}_VljK)kF*xJz$jNa)U>=?rL!{Y9=I1M>+w|6a}k?` z&!aWGs3Z1{mVT|B%|iN6Tk7?60+e+hj-TdK#H}z{eKV1~uEvb@V=`D1D93#BQQUnv znzra6-)Q)qB8nTZW7@`iWuiA%4e3XO^nKh*>+}LRPusKws`*51t8L+Jnc{^q7}6bO zuH@X7q(OFGnDp!n*n#7!M#;S-8jN-ojI#Iyq7ES=Awy4=VGimBrptdryy@z*-;cV2 z_-)Mwd|PrP4-^w!c+H;1WyLA5!$O^uE&e(H-9qIfM8~e+MR=clC&74ecu8Asf2CW5 z+Zx_y>vneEkm+5|w4WlC98vMfb={JUX+*nC%#8d|U=LHX&5xxu<(YJpI-9+z)V|;t zw%b@9Hn9&YMKNC9#akDmgpjGXDWhB(;fr`aq-shvoQ8OO>>ig9uC?UTCYB-AA%8h1 zr+cdE%y1>#O~0yH=_&ZFVMTis1H7_>S?0toBDM2VdA5#ds0#uSl}O?P3n482^#B(96b6ab^^Jv2E8L%+!iqWxC zJ;{T2of58X7hLahUGwV|uoco_TWi2V71tTu_@V>BX9=z{8z}52Tkz|0-wAsBs9?7#*QvZ#Vpht{)*)RM z>XQ_Nux#Iz*=N#OI#jru_T-w}$G~Hud~H#Tqr|IWTGrc+=%#zj%cE z>^OUR4b`$XM8GB%kOSs&xN%R|sPhD$w=d~U-w~9th3VdZ;x66xthXVWp~HCyLJp4GR$!|e_K2}_H=fq2Mvx=posX!Du{BL%6~dj>Q`mHaEQJw{euav7aCVk$7u1lSPBX zsaMtWjN{tN{LFQ+4R{8E5Y7)0DuNW2?=bvBc;~~`fYRhHekPK!ov&>{>PwK(k*Ubf zMGG@By0(hTxFLlzJ9#hfN3txz+C>h89)f?8Sp6r5DYh0N&kot^+n|aph1N&iDkC4z zMn^||`qrFj3vF)gKSfeFLP1zoc8>V>q&{l;3QoYPZoC$o2u{&sdKtQA?k0Q>NG9M> zRW{~+AL*)`?_^1=L>*9qPyV+;RWT_x zPR}W9>EkedR3+P61H+nFnbh1~E9?VpXi^}s6;_PRfQwI^x_569Z1>S2k~p=Nq-G?K zV8xprY`rvUjFEg#{#}chWWP!W*Zj_zZ zLGeKf?Ard*D5F=|v*i7gRn<8Oq=fNf12mns@Wa=52{*4jVTBf9zJWTbi$3$XyV2f1 z=aF~O+B~B~F0h*TH;Yb#bMGWK)HoE>oy}MuLx>S+FW2qw_>XDkSb9y7(9H`abBHNPtGyd*7=qN>mXp$ElztpuL z!@$N}tj!reWmy%HO>H;-( zVz-IcsL=U!$5KWN3!7 z{4j_^nl^WBx9^jAvy;hn0p}K~f-`ujrTuaWWi+;Y*qYnA$D9}IB|Ls1U0^!PK}eGS zB;wGHrS#(IuPGB)g1B?x3q-&64JUMNajF2DzUPK&N|NhE?Bxgz-alKVpF20C3e_|| zWVEadt+?=E-y{HVZAwX)c7 zt?Xlvy(j$euEIX@+;Rhyw~w&;Ub}gk1-_bO`mI8$fGIq<)~=v12L{P`NN!ar7dV1NB!mKXT2sc@8W9&U@Di3qA>|uX`X?mJCvl5Q<9$+I&y9=r^M7VrR?Hyt}(a+^z!%hKj;IwoDTB!_9ngxZf}?6Pq!=YyB(n$dkW zHbU#wa_cNN`QM2FM27?dWwn5uyLT^Rd%JoXD<0}#gZYeqGotj3%O}En8^V0aberk# zaU<@I0_De0=%Y)_Z(GIcd@h7cUvevzzPij|l19uz%3mg(_Gq71(x0(BMh>lV-dI_W z%y~-QsQHD`Sn+Q>MS*c5Btm&)%N#{?6RLc#0KVyJ9l2}FlkxR z^e|UVAWebEKmUc<53m`b?N$&cWSdt~_QpEwB5PHdg5-Gx(#>+J@$|QK$GeKJz1bjJ zeGM8}X5#U@fk;Y$SzaJ8lc(g%cqZ8&jxx%Gp#fIt?~TRN0*Fl_SsdnV7cq<^cMFtY z{;m+&){EB_{-}i)HlTUH$52PSO-U5B7u|}Gyr(o0_29|0_@3*0sqas_%UW**uJhC6 zWrd7z-3Ro+owJ$TcrQN}D6z1``O{Qjz|I_*Jc1)MGd>>9rWhCkR~s`&c1Yi!S>$Tg z6kt@Ao+J=61o6AzT+*%Sg%4a+xSNqta{bEVzfr=ZlR>4_)WGOFkKHc);QMeiCBS0p zp7UdN#mY78a%eex5tq`xtBb_r1*GwUqh&mqU|~b#5nOJgqSV$wKRcd8)?*KNKyBuo zlz=Bpys#wPhQ{d(bx8!blw$gMcw~W9BDR#8E|{~7Eo_97_6E$7jCs&v6$C@**+26` z{4ZQ8;bp>IgB1a!KzpPOpcWX1U_W)dR_}*La4GX%DpYFDBR=03c>m{-?RJ^cQ+ku3 z`-+MoW}-!VlH{&}S9^3mOy^u^@*~;ZiH1JmU5ZkGmF&2bG}0!hYpAv}7*yL3NhZqBiYJQ~Y#ZC$#^;vu=rfuubttyRh%pAITGypI6tV2!ZD zaC4dMg(!XRQM;;S#>V_){k-yE;(U#!$+gA{arVSN23OotyQAQTV<}4?q8!R8V8uKs zy?&eKZp=Nl557lLRqE7m)0f9jDU4S9iel!o}LV9cd423I=Z2=D9(* z33bQVk#nB6+1TCzXp$xu;%+#n-3Ex7ISAI~2-H;XtKe7Ly+w}R-l}As6|mb}l{bw7 zfg+6=2iB-gW^F(ow*{LRi1+0B@4U-fY-w$B)fJqAD}@T^JY^4jkA}=Y7T$SkU6Aba zc^B7xxm!3R>F=QZ zAMKrGP+R}nu7gubkpe9gcX!u7DZw3r1d0TAr;tAoq?A&ELkq=+H7FfxS z`$b;3h?sb>4vu}42cSq4iplp-pcvoXhM1eKK*>lDSqijelfattj-9v%xz!EjOT&+M zr|60K(w%dfp{fYB-;0E{v^+uV?&C3UQ;OG*xncJFgfQb6vZgHHi)!N*3;DlSFmyVQ zn#oaN47ZWq8HP7uFlkuo6A@SxB~8LzNtuO?P;3jk!}Ie}asR{>2}c3UUjPqo*e%!a z!yELK(b0oQh^(a&=H4Ws!b^YxP>fXTg0=zFfduH_) zzdla8yO9LV{G!N!dcM8*)i~|u9YOCaO;Fj!S(mfkpw>;RYep4e(R918U6A_;&7enK z_OT$C$VPV`Rl-bmIl3b?00kz@TBn$kCgW3$F}=|tb?^to+v+E zs`aI7Ur+b!_%z^JZj?weFeLP546l+a&@cPVY$K_et4z?=rReNu2=#76yMbG!aFd7j zIu|Rq>?;p(u?G`Ww$J6SQen0&lvMOCAG10_DYq_;3*yA*ogM6ic*we}+^C#Vgf{*G znAXKaS{r`QXg$r@A0ZDGCI3+0h7h5lna%NeJ|eP3>V_!nM}fyyE4jsH!Rqss`NQPC zf7w?OIZ-0TN3@(wBg*mgz1Mm99!P1IlgIEFJi9I>DKvh^&S^HDQ}0zH z86i{T&dCO5CTrf(;I;-~wV&shTs<@phXyVU{z%I6Y}RkJqd7!!Iy2ukgzpakVY5H? z*#EEd;`fTs$4}qt2+jj=UOVP}e>C2}E#?DCi7wXNmB{6WeC2Tz=XYoOJw~OaJk`eE zo!*d*v)P#bDbb`77yIb^EncPa>!5%t{;(DK&Q5hndVe=(KQ^Sx=ff&{CKb?@N%9vg zy2#ox99B!Qi_JLo8TMyAqm4#HZ>fQdU6dD{q7%Q%bn0jLc#g}rOsrrYLp{rJcoU~n z&AifDGrowI+=k6z3;7a+-h019oo;*lAD(r@qO@s|UOD~*Vn>6_GUx&Z@#0qKnE5Prdi0^Ss{0S%0zEKKt8i-tmi#z+PI^`a?~Kz;-}cG#OTt1rlxq_m z2=7k}@AQ^VTDreRWL(~HyESj7`&s_Cboqa4VkC{eev3Pi{{w)JpB2-Z3VsAz6jy$) z^);7L-vY&I2%Xl)(VNa_H_`NuGFxJ5TXG(`N-_Gq?Ixy}%QrBvs6#poU&m9cP%k{%Qr0*RmsVla=O)9# zWy-9G-60_)`>gWyH(H|e(TF9<>-fK#k2~(2#)3Mx_D9?9`||aasqbR(xnTB9S7lP| z8MFR4liKk+TXOHFY8LCjiCEB{6KBFRb(!Kss1xqSzPF)_dH}Y+7YkpF$osMB_*Q6o z&$n!!=xRZhz`$EWM@CD6CdP4ZO~sXMDCK+?s*`SpXieMM3)f&1DO!W+u$gpRC|U7X zg{uFA$P)!NZJ35|dtyteB#q*(4L*KxLAPBf4{lHK4-mY(?O&bBHC${e1aeyu`rZ~=#iq2geIk*%gezb-}3znYFFaQ@u;{_!I zA^8+E8=@k|3>wwcaSEE1aFgZ!HnGx9h}~64+W=kixl|+pBxyqLE0GM6{Y!~>bj;U6 zY!@M}XMk9zmm3*|peEdnVP+Z|deeNkP3$8M`~fPanq$Uva-r`2VRoK2k07UIl=fE? z$YZdpzd(_E4&p^Y1-V^5P|6`;(PqLtZ`NPXrr?4s@v|}YFBhu^Ona(CJ{rUF;CwKg z-#M&QZWK9Y8gi=MJ4U#_=;C*L9uv&eJY15szOS0^I?ntIy06Vvcar#q`RtfC|LrGC z>}Zg3m1x@La|x~X6dhG3+^fi<=#_1;Om$GtHi2ZPByhGRQ)OR{$Amw(MunFbYF!@q zl_nu;CpHr&pgo%dB(Ly<>N@n-XdozjoqZa)XqLqKxdcG};|2yZlC_!MhQ#zvo8%&o zXeDgZ@bCJ3+Qt3=;zxiN#~n9hM#A|hCHHk%iDfHSjUMkC@t-?O68FyTea}Oj=j{5I zqwwFY&0Vn7CSFZY@+Ndvtm5xo8ZCY>Th)2h&V=bCr|yeuX$#W5>^T1xk%hvUGDkoSsC#cg&%(yiO9nJ=MlyC!haL z0z+04HUx2g<$4rBrq*k7hBqgQUB(>F^Db$zP|L>qMB8?yK-tsqD>efqR&{siY^f4Q z;$bsw>;z2jqkpKSjt3;^NF$Y>qpZlSZVD69Z`;V5Ve>-|w6reY`cv{kWO$aWRq)HT z=eNAKqvc%|$+E-+&nEEobji=ZYl%zloEGkru5%R7dMN;hJ`S1KXJnsbkX{rHC04Y6 zf*smIT8xmmc_^j$Ar}2E3T#^_PecmU4}m@KWH?9HsA{rjg8`vz-*ZwE$hYiX{j3LP zhclt!tT%h$?`f`rPo8vrkX1GdF&#nbsjF_*JLZ0Lyge1$Vm^4#Bp98y)qHsa>DN4~ z&9%2=5B)`3Jbl#HyN`&c3fnaFi#Z#TpbaWh)-nr_*f$H2n%u3!s%rYlTOLg9DvzoY zXK_QYcwq5wWn5MI`s}@gH+q%yOR!U*-nc7N&-4uXdvgy{ZIgKRL$mUO4ae2OB=ePa z%jGMLN0-Y&+3y(U=1lP}qn(OR4}~c62_?cnBPgUqc&_P^qU7k40F}CYe`Xg)-4`oj+Yr*Jh=fV|qk)gl7ye961DuHk)(-uK z(H(DyYvHmQA8l7Q)(HC+y~TKi*HB`ur=@?g9wt6EP54B#X(yU7`j^@;f{*DjVz0Q% zYDweC4Jqqud6AA=*oe>ANlDssR?Dt5d8J~+6SFwZl!fpkhtj~HGxN@7OI9qxj@ie<`VhF9d>%MeZ zs2QZHgi|hmWX8io=hOS&)b z;fe&qGosRn*E^$W@cAZrJj}#nJHIpL&7?74ib?DkYZNyJ6gB&vwMzF>yQ09bxF{Jj z<0cr@pn|I#b#tymO_lbDfGVgI2_Gy8o;Z9@-9oN$g#EMmAlk%Auvw4b>;4n@9eZqV z!=`78KCkd912IgW!2>iIX=R-sQ9B>YDmm}XUG6454i967QesJG(-6B`bQh{?0=^KR zzNmh_TFiJ`bfCXjqw3ix*^m1fGZ&Ghk`V z|Fsc=eEUqH{)T?4umhgk@6q<#eNQJm9=`~-kK;ngBG^RNKU)A^^uCU6-elcs;apeR z(k{^H>0^wv<=Uvuy}|@d_YT-LNSlQaLk-1+Bx7yS2m}RV3(Pql%S!F?qWIzodTDR{ zc1q@z)-2X`*HO0C?<-MNLGta)+_cMTuAVcw8I8n#QMn%WA*m^dQd;cV6%01}L7s2# z#;h^TcmR)Pr&$(9J0S1%@4#c0)meVSax`hj&k?aD*TsHP+vpl}J4N02dCg5A3s?y&^A2{f` zmQrREJAD9rO!(LX_`yPC<5Sxr6pX{PIxf)oWSw z)FHiIN9^(&ypQfmw3_}mv1zU)-ONq;XZN%EVf7ZEN$3>V44B69?qq}Vb$2pb9=(7_ z9)jsTGvZ|~pcK!N6RB$q{|EB-f7xQZzTuY}a=1+yxQSKrGF+T>zoac(S4~RFuz_A1 zc7stw-qHbMg1TIz{$k`Zu`nVn?i{3#r7OG^;g6L%Op{&YRGaUJmMJw1$E~Uk!(fKz zWo978iK@S{1(o#DD<=lUg~)dfz4lM%vCE!iJ_qq~)cab)}8)WtVA z(9{6s<9BAnCqdk4%_f_MBm*Q@l70FQBTXq?0eOQGJR@2_wGW@4dZ~OVkH^!!|d?% ztBkwc^WvCTHETFoh_rPF?;O8rW{9T)Oa$_!N&WzqMaSySDK$VQGPN`QG{J`8ZO6ok zh~(1n%;xn1g~d5iWpIj-PBLaCX#-{(HSK|9UP|nG{&t;ZU7~R#<`?6uqWa`$Nt?S- zAGXwR!Jz~ssVc;|aFhjB^Vu7&71CXM%o`(o?FL|;N>8*j5E3Gclq^~@3!r2m+>snr zV8j`dB1&E?!=FLAR~)wwO>%SRze)0-$?QEn3ggPSVqiF1+GZ;=a0_-XAmAk2<=Lsr z2uj_zePwABaMX{^+9J|)D4^3*rO(()^1pyOwV$j-s!~4HI*f(st?qkSTuV<<Oq>XQUL;Vt&vftsr3PkBVoP8=XM|tY$j{#%a%-E-1<#^|1=PIHu|g5Q z_kPjMj5n{>M!TL1P@<)@YS4>M;ox)-sL2t^ubWwx|Ion2L zg&p*5tbuhH39us#SE{KW{%?Xe_kYuVqz!pPR(SUUC40g7`v<=Ll^^Kn-Sf?K_ ztFKl#LadQnHvduV*|sX!=xoj>+KUpM!BPzUBS82MwtcDMeoDSP9dEFv;PfUpsoBn+ zgh?tbwB!vJ2mMtQ4q&@BU{b-io$dGt`Vll@;o0^JD}mM#IV2ptPjVw1?Y3_g4Op1G zaIX~z^SdA1T}8*KMxwL?+#};oLy6)N56`YHE8Qv<_Klut-Zl>TgEkE$T2>g0nx?CG zRnJ{f7Y5ot-G9AG zPW>tB_`sy$l(EC-`B~^>a}~pv%Dus>kSGyyy{9s^w24&qbHsj9qCp$5I}V z5{5R`MKxhV3%qA%*_58Z6S6#{XS#!r=El~jQytAs@Fd#+OL6u@xV6M}=D zIidU`p6E24(MZs)oJG}a6AaJz_~mH)d^ef7Ts=;N_z_)}aqj&(ggaZ|$aoHHw}ly+ zhPMoyD$M$TB&zNC7W2X!anyT+EPh367V{G*Xm+tY^6{e=O3mv`Y~$$2q|E2%qns98 z>8KikADanF2j=hIiNL5`>6Y|o>`+rr4ydyPvn2LWmdHVl*V@I;T6qhCGN}!|b@NSc zxou#z81b)ry9QMC1VCM@ABQq?-JcP!FxR^s1Rgl?ZYm_#zg~Wv9pdiP10Ca3kUkfn z)(Eb!T^AE$}{sE$0l;<=JvfLdrBD)vT!dTUMM4MLg=uu|RE~;%dG0GZ|Rq}n_P!`~HN@HJ|t!Ng`&75KtiH8lIs0Cxy zhOKjd>P?Wa1r~Teux0!F>?B^+>qigQFTmEdoI}-k^GHuc)~)s4jFt?W=@_14CIart z#tE18cP=H{&HKFx*ZQnKw?1#?sZw1^(pLZ-NhH;{okE_ViqNh^V#Txcv8?XnRW?Wf zInnQdyFR@{7>1F|dS;StcAIu7X2EEAqtH3ud`FA^{QP{Efb%EQHR%%Tj-mYA4=u(- z$&ON>0;earEIh4l2oGhXe|cHllhs$+$xm$$4bZ~U5+#v%6*_hst7R>2Eniy93FLTXEDXV3AH_Dn%)s`S<4O)oO>&%%TC2GwITlvsQECXVR^D9n&*)vXQ=`F(D+rJffthcdm!Mlk)uh?PJltpr z^d!V-$ydouGRJP;khj{2c{G07#q|%VMX!?(X0}vimsl@nS71}Qi&QM^8C<_^Zj8+H zeh14+JYH6q9?^Q4bXL?XJIa#98OgHXXb+ciW5D=L(A9=?^L-?aQjM45SW}(=yQiDF zz>78lT&gap1Ij0^E0Pm6EP)!HM+d+1?d=TpdLwkok|xl&dL_lcP0j-ly`6 z5){;!fiFBIMRxN73RLpU$2Pe_QR$Xaj~@>gXZ~nRG|-~V8RM#DW~T7v>M3T%Z3Ak2 z)s*U%_UU4$h(!f#p8G;dq8~%dNF6bl{u;zX5_)QDJidY&J zX14Np8-y+l9zYEAcm6g-R>2{MM^a&v9;wUIfa(A<#{f#|cV`sJo)=|{t9Oxna(UMT zU(9tE@Xfy?z9&ZKJomiF^DJysQ!p(Bl<4wBFPVb(a~ z?%EXVw{$uF@KhSz*X}rp?niMJ><8%Y;?_NIwue1SXssdld1Tg}?ehA^Ycr;f z(I#fXNV)t#@cZjXV&;|T;sS~sYUlM2Gk^dO(uX}Xj}#d~>O|&I!=w0+R`q+k=6#<) zJ)g=Y#+AON7h+rEaFc}Uy^Eo`x~DThBdkA_xlIFKq#ni%(5I^X_2n~A%@vEfDSQ;C zMxtVr_@%2-?{rv0Y4F?eoXe}S7ugY8AAA}JZME7V^q+!=1GC-~SxTnw%P<$dOE}ql zO|}^)*EasE(snY>E4ILxh6IFPr8q&yKFQmf12A0dxvxYwYk&w%BZpnw6np0vY16!5 zrKlFkMPkdK15i#|UF_wQdVrL~j~lx0%_&vIbTDskUeuAun8{L`PZniOYh$WveoX#T zJ^|EI7)@|Uro-MMML{GzolDPel+O*(Oo{1OuG0W|qEY@IX(IpIF~V$u%$mn%!ZD9j z-^jVF2&@XQr#Qrw!~=Hsl%{(+%F1u^_;Qw8gnttXwqd_Jhm=(=P+mRr2>E8PbH|<8 zQkOdBO`f+4BR$Xor~(L+AQB}`3`n-;fiX3?@wAZ`2h$Yw_G`uIIIyC4m4L;3!r+vT zwpfMD*m``FD*53{ZGLq{Y~}GIp=-k!i~1LV7QdCzx}jtArESn`Jw>)mOK1|>N4cGS zzW_Y>wz2d6Z$M=GnV|k}qdcSM>(U|YV0)~s6vYQwVzjb!u+a`zOOxEN%vJ2{1ee<1 z7T62I+jh1)WU3H-7r2}Av;1h}JRdp<+A#I_?XDg3*Zx_CuU-FHu`d&Ry@$|S1u|9c z^i10d#@e#8C8@tJ{i4j2SDvG&hp_Q!)EXjlTuC>5&*$WEC_0&DuSzbu&i+}Foa~SF z3F4R~o-UD@r`_7=QBTS;SCp^YPx7AGFow_-E5?Yv%7Ja9ex@|ZEx?w(3(Z=WAPkm2 zjRiOO@RHVZ{$yP9#CE*>tBavjJ?auK1?mWd9DZyl%t5ci@AVL~s^F`sj zGM>~W=PK?5c;HAy_s{uqXG$`iQ3$dr*im&+jHN8YtJaHMO$W^CH={!Uq zBisMU65!uG2D5D|!|3a$P5NW>V94m})R&s;@e|gEQ(C!{FG|ua#<rw}_vRGLIWvZi}aBfVpuC;+wI&iFWl2$}!fNWQm*L&N6#Y;TEu6VggC`R-J2a zUpc2)QQe@;zm=dV)UtUWKw_oKd(Yfjy zh4(3bU!~21o_I;w1iKZvMA!tt6AmRS*D0AAqm&4pqNKQD2udqluv4^kr#Fxlvz(O0 zU=;p=5l4B_SE|$-+-zLpq-}u{#__$WIz17D-}mSbyLp(IN>3WmeA|ESYx{Te)W7db zNHJIYN>~(zf1s`eu(o&;EGcyP4jSU|3#hHuSm4;*P1ry5 zt6RWSp<6A~&1EHDkk}=rM(P=~1*0k0x+RcnLrzEL@*6F+YS?=3urGqnFF0TgpICDgZd-D$qNSryzyOM}08_p}AZFQ?y2=%GcICu(Xl% zguqMA8m+r{=$a1MS^5KD68}AmAfI+10N-dL%7;Y+ToVFmM?A07Ta?JfR{q~f&i{me V=J@~b5&mDv+y9Wy0{Ca)e*sFkE8PG9 literal 0 HcmV?d00001 diff --git a/webapps/examples/jsp/jsp2/jspx/textRotate.jspx b/webapps/examples/jsp/jsp2/jspx/textRotate.jspx new file mode 100644 index 000000000..1d2c3e3ac --- /dev/null +++ b/webapps/examples/jsp/jsp2/jspx/textRotate.jspx @@ -0,0 +1,36 @@ + + + + JSP 2.0 JSPX + + + + + JSP 2.0 XML Syntax (.jspx) Demo + + Try changing the name parameter! + + + + <g opacity="0.95" transform="scale(1.05) rotate(15)"> + + ${name} + + + </g> + + ${name} + + + diff --git a/webapps/examples/jsp/jsp2/misc/coda.jspf b/webapps/examples/jsp/jsp2/misc/coda.jspf new file mode 100644 index 000000000..edbf9e983 --- /dev/null +++ b/webapps/examples/jsp/jsp2/misc/coda.jspf @@ -0,0 +1,5 @@ +
    +
    +This banner included with <include-coda> +
    +
    diff --git a/webapps/examples/jsp/jsp2/misc/config.html b/webapps/examples/jsp/jsp2/misc/config.html new file mode 100644 index 000000000..160d7785d --- /dev/null +++ b/webapps/examples/jsp/jsp2/misc/config.html @@ -0,0 +1,34 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for config.jsp +

    +

    Source Code for prelude.jspf +

    +

    Source Code for coda.jspf +

    + + + diff --git a/webapps/examples/jsp/jsp2/misc/config.jsp b/webapps/examples/jsp/jsp2/misc/config.jsp new file mode 100644 index 000000000..791a08712 --- /dev/null +++ b/webapps/examples/jsp/jsp2/misc/config.jsp @@ -0,0 +1,31 @@ + +<%@ taglib prefix="my" uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib"%> +

    JSP 2.0 Examples - JSP Configuration

    +
    +

    Using a <jsp-property-group> element in the web.xml + deployment descriptor, this JSP page has been configured in the + following ways:

    +
      +
    • Uses <include-prelude> to include the top banner.
    • +
    • Uses <include-coda> to include the bottom banner.
    • +
    • Uses <scripting-invalid> true to disable + <% scripting %> elements
    • +
    • Uses <el-ignored> true to disable ${EL} elements
    • +
    • Uses <page-encoding> ISO-8859-1 to set the page encoding (though this is the default anyway)
    • +
    + There are various other configuration options that can be used. + diff --git a/webapps/examples/jsp/jsp2/misc/dynamicattrs.html b/webapps/examples/jsp/jsp2/misc/dynamicattrs.html new file mode 100644 index 000000000..307072a2b --- /dev/null +++ b/webapps/examples/jsp/jsp2/misc/dynamicattrs.html @@ -0,0 +1,32 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for dynamicattrs.jsp +

    +

    Source Code for EchoAttributesTag.java +

    + + + diff --git a/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp b/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp new file mode 100644 index 000000000..8721108aa --- /dev/null +++ b/webapps/examples/jsp/jsp2/misc/dynamicattrs.jsp @@ -0,0 +1,43 @@ + +<%@ taglib prefix="my" uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib"%> + + + JSP 2.0 Examples - Dynamic Attributes + + +

    JSP 2.0 Examples - Dynamic Attributes

    +
    +

    This JSP page invokes a custom tag that accepts a dynamic set + of attributes. The tag echoes the name and value of all attributes + passed to it.

    +
    +

    Invocation 1 (six attributes)

    +
      + +
    +

    Invocation 2 (zero attributes)

    +
      + +
    +

    Invocation 3 (three attributes)

    +
      + +
    + + diff --git a/webapps/examples/jsp/jsp2/misc/prelude.jspf b/webapps/examples/jsp/jsp2/misc/prelude.jspf new file mode 100644 index 000000000..1ff2be7a7 --- /dev/null +++ b/webapps/examples/jsp/jsp2/misc/prelude.jspf @@ -0,0 +1,5 @@ +
    +
    +This banner included with <include-prelude> +
    +
    diff --git a/webapps/examples/jsp/jsp2/simpletag/book.html b/webapps/examples/jsp/jsp2/simpletag/book.html new file mode 100644 index 000000000..ec8a4c9e0 --- /dev/null +++ b/webapps/examples/jsp/jsp2/simpletag/book.html @@ -0,0 +1,36 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for the Book Example JSP +

    +

    Source Code for the FindBook SimpleTag Handler +

    +

    Source Code for BookBean +

    +

    Source Code for the EL Functions +

    + + + diff --git a/webapps/examples/jsp/jsp2/simpletag/book.jsp b/webapps/examples/jsp/jsp2/simpletag/book.jsp new file mode 100644 index 000000000..1f2c4c747 --- /dev/null +++ b/webapps/examples/jsp/jsp2/simpletag/book.jsp @@ -0,0 +1,54 @@ + +<%@ taglib prefix="my" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> + + + JSP 2.0 Examples - Book SimpleTag Handler + + +

    JSP 2.0 Examples - Book SimpleTag Handler

    +
    +

    Illustrates a semi-realistic use of SimpleTag and the Expression + Language. First, a <my:findBook> tag is invoked to populate + the page context with a BookBean. Then, the books fields are printed + in all caps.

    +
    + Result:
    + + + + + + + + + + + + + + + + + + + + + + +
    FieldValueCapitalized
    Title${book.title}${my:caps(book.title)}
    Author${book.author}${my:caps(book.author)}
    ISBN${book.isbn}${my:caps(book.isbn)}
    + + diff --git a/webapps/examples/jsp/jsp2/simpletag/hello.html b/webapps/examples/jsp/jsp2/simpletag/hello.html new file mode 100644 index 000000000..943b0aa21 --- /dev/null +++ b/webapps/examples/jsp/jsp2/simpletag/hello.html @@ -0,0 +1,32 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for the Hello World Tag Example JSP +

    +

    Source Code for the Hello World SimpleTag Handler +

    + + + diff --git a/webapps/examples/jsp/jsp2/simpletag/hello.jsp b/webapps/examples/jsp/jsp2/simpletag/hello.jsp new file mode 100644 index 000000000..e86a8c9f1 --- /dev/null +++ b/webapps/examples/jsp/jsp2/simpletag/hello.jsp @@ -0,0 +1,30 @@ + +<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> + + + JSP 2.0 Examples - Hello World SimpleTag Handler + + +

    JSP 2.0 Examples - Hello World SimpleTag Handler

    +
    +

    This tag handler simply echos "Hello, World!" It's an example of + a very basic SimpleTag handler with no body.

    +
    + Result: + + + diff --git a/webapps/examples/jsp/jsp2/simpletag/repeat.html b/webapps/examples/jsp/jsp2/simpletag/repeat.html new file mode 100644 index 000000000..6ddc39de0 --- /dev/null +++ b/webapps/examples/jsp/jsp2/simpletag/repeat.html @@ -0,0 +1,32 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for the Repeat Tag Example JSP +

    +

    Source Code for the Repeat SimpleTag Handler +

    + + + diff --git a/webapps/examples/jsp/jsp2/simpletag/repeat.jsp b/webapps/examples/jsp/jsp2/simpletag/repeat.jsp new file mode 100644 index 000000000..04d46301a --- /dev/null +++ b/webapps/examples/jsp/jsp2/simpletag/repeat.jsp @@ -0,0 +1,38 @@ + +<%@ taglib prefix="mytag" uri="/WEB-INF/jsp2/jsp2-example-taglib.tld" %> + + + JSP 2.0 Examples - Repeat SimpleTag Handler + + +

    JSP 2.0 Examples - Repeat SimpleTag Handler

    +
    +

    This tag handler accepts a "num" parameter and repeats the body of the + tag "num" times. It's a simple example, but the implementation of + such a tag in JSP 2.0 is substantially simpler than the equivalent + JSP 1.2-style classic tag handler.

    +

    The body of the tag is encapsulated in a "JSP Fragment" and passed + to the tag handler, which then executes it five times, inside a + for loop. The tag handler passes in the current invocation in a + scoped variable called count, which can be accessed using the EL.

    +
    + Result:
    + + Invocation ${count} of 5
    +
    + + diff --git a/webapps/examples/jsp/jsp2/tagfiles/hello.html b/webapps/examples/jsp/jsp2/tagfiles/hello.html new file mode 100644 index 000000000..f5dc2c2f8 --- /dev/null +++ b/webapps/examples/jsp/jsp2/tagfiles/hello.html @@ -0,0 +1,32 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for hello.jsp +

    +

    Source Code for helloWorld.tag +

    + + + diff --git a/webapps/examples/jsp/jsp2/tagfiles/hello.jsp b/webapps/examples/jsp/jsp2/tagfiles/hello.jsp new file mode 100644 index 000000000..4fd06b2f8 --- /dev/null +++ b/webapps/examples/jsp/jsp2/tagfiles/hello.jsp @@ -0,0 +1,34 @@ + +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> + + + JSP 2.0 Examples - Hello World Using a Tag File + + +

    JSP 2.0 Examples - Hello World Using a Tag File

    +
    +

    This JSP page invokes a custom tag that simply echos "Hello, World!" + The custom tag is generated from a tag file in the /WEB-INF/tags + directory.

    +

    Notice that we did not need to write a TLD for this tag. We just + created /WEB-INF/tags/helloWorld.tag, imported it using the taglib + directive, and used it!

    +
    + Result: + + + diff --git a/webapps/examples/jsp/jsp2/tagfiles/panel.html b/webapps/examples/jsp/jsp2/tagfiles/panel.html new file mode 100644 index 000000000..c3db5c797 --- /dev/null +++ b/webapps/examples/jsp/jsp2/tagfiles/panel.html @@ -0,0 +1,32 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for panel.jsp +

    +

    Source Code for panel.tag +

    + + + diff --git a/webapps/examples/jsp/jsp2/tagfiles/panel.jsp b/webapps/examples/jsp/jsp2/tagfiles/panel.jsp new file mode 100644 index 000000000..af04e43f1 --- /dev/null +++ b/webapps/examples/jsp/jsp2/tagfiles/panel.jsp @@ -0,0 +1,57 @@ + +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> + + + JSP 2.0 Examples - Panels using Tag Files + + +

    JSP 2.0 Examples - Panels using Tag Files

    +
    +

    This JSP page invokes a custom tag that draws a + panel around the contents of the tag body. Normally, such a tag + implementation would require a Java class with many println() statements, + outputting HTML. Instead, we can use a .tag file as a template, + and we don't need to write a single line of Java or even a TLD!

    +
    + + + + + + +
    + + First panel.
    +
    +
    + + Second panel.
    + Second panel.
    + Second panel.
    + Second panel.
    +
    +
    + + Third panel.
    + + A panel in a panel. + + Third panel.
    +
    +
    + + diff --git a/webapps/examples/jsp/jsp2/tagfiles/products.html b/webapps/examples/jsp/jsp2/tagfiles/products.html new file mode 100644 index 000000000..b03e84d9f --- /dev/null +++ b/webapps/examples/jsp/jsp2/tagfiles/products.html @@ -0,0 +1,21 @@ + + + +View Source Code + + + + +

    +

    + +

    Source Code for products.jsp +

    +

    Source Code for displayProducts.tag +

    + + + diff --git a/webapps/examples/jsp/jsp2/tagfiles/products.jsp b/webapps/examples/jsp/jsp2/tagfiles/products.jsp new file mode 100644 index 000000000..9fa7355d7 --- /dev/null +++ b/webapps/examples/jsp/jsp2/tagfiles/products.jsp @@ -0,0 +1,53 @@ + +<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> + + + JSP 2.0 Examples - Display Products Tag File + + +

    JSP 2.0 Examples - Display Products Tag File

    +
    +

    This JSP page invokes a tag file that displays a listing of + products. The custom tag accepts two fragments that enable + customization of appearance. One for when the product is on sale + and one for normal price.

    +

    The tag is invoked twice, using different styles

    +
    +

    Products

    + + + Item: ${name}
    + Price: ${price} +
    + + Item: ${name}
    + Was: ${origPrice}
    + Now: ${salePrice} +
    +
    +
    +

    Products (Same tag, alternate style)

    + + + ${name} @ ${price} ea. + + + ${name} @ ${salePrice} ea. (was: ${origPrice}) + + + + diff --git a/webapps/examples/jsp/jsptoserv/hello.jsp b/webapps/examples/jsp/jsptoserv/hello.jsp new file mode 100644 index 000000000..f1807f371 --- /dev/null +++ b/webapps/examples/jsp/jsptoserv/hello.jsp @@ -0,0 +1,25 @@ + + + + +

    +I have been invoked by +<% out.print (request.getAttribute("servletName").toString()); %> +Servlet. +

    + + \ No newline at end of file diff --git a/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp b/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp new file mode 100644 index 000000000..d05f9196c --- /dev/null +++ b/webapps/examples/jsp/jsptoserv/jsptoservlet.jsp @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/webapps/examples/jsp/jsptoserv/jts.html b/webapps/examples/jsp/jsptoserv/jts.html new file mode 100644 index 000000000..7f83a45dd --- /dev/null +++ b/webapps/examples/jsp/jsptoserv/jts.html @@ -0,0 +1,33 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for JSP calling servlet +

    + +

    Source Code for Servlet calling JSP +

    + + + diff --git a/webapps/examples/jsp/num/numguess.html b/webapps/examples/jsp/num/numguess.html new file mode 100644 index 000000000..348e773f9 --- /dev/null +++ b/webapps/examples/jsp/num/numguess.html @@ -0,0 +1,33 @@ + + + +Untitled Document + + + + +

    + +

    Source Code for Numguess Example +

    + + + diff --git a/webapps/examples/jsp/num/numguess.jsp b/webapps/examples/jsp/num/numguess.jsp new file mode 100644 index 000000000..f1b8e0276 --- /dev/null +++ b/webapps/examples/jsp/num/numguess.jsp @@ -0,0 +1,68 @@ + + +<%@ page import = "num.NumberGuessBean" %> + + + + + +Number Guess + + + +<% if (numguess.getSuccess()) { %> + + Congratulations! You got it. + And after just <%= numguess.getNumGuesses() %> tries.

    + + <% numguess.reset(); %> + + Care to try again? + +<% } else if (numguess.getNumGuesses() == 0) { %> + + Welcome to the Number Guess game.

    + + I'm thinking of a number between 1 and 100.

    + +

    + What's your guess? + +
    + +<% } else { %> + + Good guess, but nope. Try <%= numguess.getHint() %>. + + You have made <%= numguess.getNumGuesses() %> guesses.

    + + I'm thinking of a number between 1 and 100.

    + +

    + What's your guess? + +
    + +<% } %> + +
    + + diff --git a/webapps/examples/jsp/plugin/applet/Clock2.java b/webapps/examples/jsp/plugin/applet/Clock2.java new file mode 100644 index 000000000..32edb89d2 --- /dev/null +++ b/webapps/examples/jsp/plugin/applet/Clock2.java @@ -0,0 +1,212 @@ +/* +* Copyright 2004 The Apache Software Foundation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import java.util.*; +import java.awt.*; +import java.applet.*; +import java.text.*; + +/** + * Time! + * + * @author Rachel Gollub + */ + +public class Clock2 extends Applet implements Runnable { + Thread timer; // The thread that displays clock + int lastxs, lastys, lastxm, + lastym, lastxh, lastyh; // Dimensions used to draw hands + SimpleDateFormat formatter; // Formats the date displayed + String lastdate; // String to hold date displayed + Font clockFaceFont; // Font for number display on clock + Date currentDate; // Used to get date to display + Color handColor; // Color of main hands and dial + Color numberColor; // Color of second hand and numbers + + public void init() { + int x,y; + lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0; + formatter = new SimpleDateFormat ("EEE MMM dd hh:mm:ss yyyy", Locale.getDefault()); + currentDate = new Date(); + lastdate = formatter.format(currentDate); + clockFaceFont = new Font("Serif", Font.PLAIN, 14); + handColor = Color.blue; + numberColor = Color.darkGray; + + try { + setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16))); + } catch (Exception E) { } + try { + handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16)); + } catch (Exception E) { } + try { + numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16)); + } catch (Exception E) { } + resize(300,300); // Set clock window size + } + + // Plotpoints allows calculation to only cover 45 degrees of the circle, + // and then mirror + public void plotpoints(int x0, int y0, int x, int y, Graphics g) { + g.drawLine(x0+x,y0+y,x0+x,y0+y); + g.drawLine(x0+y,y0+x,x0+y,y0+x); + g.drawLine(x0+y,y0-x,x0+y,y0-x); + g.drawLine(x0+x,y0-y,x0+x,y0-y); + g.drawLine(x0-x,y0-y,x0-x,y0-y); + g.drawLine(x0-y,y0-x,x0-y,y0-x); + g.drawLine(x0-y,y0+x,x0-y,y0+x); + g.drawLine(x0-x,y0+y,x0-x,y0+y); + } + + // Circle is just Bresenham's algorithm for a scan converted circle + public void circle(int x0, int y0, int r, Graphics g) { + int x,y; + float d; + x=0; + y=r; + d=5/4-r; + plotpoints(x0,y0,x,y,g); + + while (y>x){ + if (d<0) { + d=d+2*x+3; + x++; + } + else { + d=d+2*(x-y)+5; + x++; + y--; + } + plotpoints(x0,y0,x,y,g); + } + } + + // Paint is the main part of the program + public void paint(Graphics g) { + int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter; + String today; + + currentDate = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault()); + try { + s = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + s = 0; + } + formatter.applyPattern("m"); + try { + m = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + m = 10; + } + formatter.applyPattern("h"); + try { + h = Integer.parseInt(formatter.format(currentDate)); + } catch (NumberFormatException n) { + h = 10; + } + formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy"); + today = formatter.format(currentDate); + xcenter=80; + ycenter=55; + + // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00) + // x = r(cos a) + xcenter, y = r(sin a) + ycenter + + xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter); + ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter); + xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter); + ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter); + xh = (int)(Math.cos((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + xcenter); + yh = (int)(Math.sin((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + ycenter); + + // Draw the circle and numbers + + g.setFont(clockFaceFont); + g.setColor(handColor); + circle(xcenter,ycenter,50,g); + g.setColor(numberColor); + g.drawString("9",xcenter-45,ycenter+3); + g.drawString("3",xcenter+40,ycenter+3); + g.drawString("12",xcenter-5,ycenter-37); + g.drawString("6",xcenter-3,ycenter+45); + + // Erase if necessary, and redraw + + g.setColor(getBackground()); + if (xs != lastxs || ys != lastys) { + g.drawLine(xcenter, ycenter, lastxs, lastys); + g.drawString(lastdate, 5, 125); + } + if (xm != lastxm || ym != lastym) { + g.drawLine(xcenter, ycenter-1, lastxm, lastym); + g.drawLine(xcenter-1, ycenter, lastxm, lastym); } + if (xh != lastxh || yh != lastyh) { + g.drawLine(xcenter, ycenter-1, lastxh, lastyh); + g.drawLine(xcenter-1, ycenter, lastxh, lastyh); } + g.setColor(numberColor); + g.drawString("", 5, 125); + g.drawString(today, 5, 125); + g.drawLine(xcenter, ycenter, xs, ys); + g.setColor(handColor); + g.drawLine(xcenter, ycenter-1, xm, ym); + g.drawLine(xcenter-1, ycenter, xm, ym); + g.drawLine(xcenter, ycenter-1, xh, yh); + g.drawLine(xcenter-1, ycenter, xh, yh); + lastxs=xs; lastys=ys; + lastxm=xm; lastym=ym; + lastxh=xh; lastyh=yh; + lastdate = today; + currentDate=null; + } + + public void start() { + timer = new Thread(this); + timer.start(); + } + + public void stop() { + timer = null; + } + + public void run() { + Thread me = Thread.currentThread(); + while (timer == me) { + try { + Thread.currentThread().sleep(100); + } catch (InterruptedException e) { + } + repaint(); + } + } + + public void update(Graphics g) { + paint(g); + } + + public String getAppletInfo() { + return "Title: A Clock \nAuthor: Rachel Gollub, 1995 \nAn analog clock."; + } + + public String[][] getParameterInfo() { + String[][] info = { + {"bgcolor", "hexadecimal RGB number", "The background color. Default is the color of your browser."}, + {"fgcolor1", "hexadecimal RGB number", "The color of the hands and dial. Default is blue."}, + {"fgcolor2", "hexadecimal RGB number", "The color of the seconds hand and numbers. Default is dark gray."} + }; + return info; + } +} diff --git a/webapps/examples/jsp/plugin/plugin.html b/webapps/examples/jsp/plugin/plugin.html new file mode 100644 index 000000000..eee55c607 --- /dev/null +++ b/webapps/examples/jsp/plugin/plugin.html @@ -0,0 +1,29 @@ + + + +Untitled Document + + + + +

    + +

    Source Code for Plugin Example +

    + + + diff --git a/webapps/examples/jsp/plugin/plugin.jsp b/webapps/examples/jsp/plugin/plugin.jsp new file mode 100644 index 000000000..fed5d4e6c --- /dev/null +++ b/webapps/examples/jsp/plugin/plugin.jsp @@ -0,0 +1,33 @@ + + + Plugin example + +

    Current time is :

    + + + Plugin tag OBJECT or EMBED not supported by browser. + + +

    +

    + +The above applet is loaded using the Java Plugin from a jsp page using the +plugin tag. + +

    + + diff --git a/webapps/examples/jsp/security/protected/error.jsp b/webapps/examples/jsp/security/protected/error.jsp new file mode 100644 index 000000000..ff24ca3b0 --- /dev/null +++ b/webapps/examples/jsp/security/protected/error.jsp @@ -0,0 +1,24 @@ + + + +Error Page For Examples + + +Invalid username and/or password, please try +again. + + diff --git a/webapps/examples/jsp/security/protected/index.jsp b/webapps/examples/jsp/security/protected/index.jsp new file mode 100644 index 000000000..56920cebd --- /dev/null +++ b/webapps/examples/jsp/security/protected/index.jsp @@ -0,0 +1,78 @@ + +<% + if (request.getParameter("logoff") != null) { + session.invalidate(); + response.sendRedirect("index.jsp"); + return; + } +%> + + +Protected Page for Examples + + + +You are logged in as remote user <%= request.getRemoteUser() %> +in session <%= session.getId() %>

    + +<% + if (request.getUserPrincipal() != null) { +%> + Your user principal name is + <%= request.getUserPrincipal().getName() %>

    +<% + } else { +%> + No user principal could be identified.

    +<% + } +%> + +<% + String role = request.getParameter("role"); + if (role == null) + role = ""; + if (role.length() > 0) { + if (request.isUserInRole(role)) { +%> + You have been granted role + <%= util.HTMLFilter.filter(role) %>

    +<% + } else { +%> + You have not been granted role + <%= util.HTMLFilter.filter(role) %>

    +<% + } + } +%> + +To check whether your username has been granted a particular role, +enter it here: +
    + +
    +

    + +If you have configured this app for form-based authentication, you can log +off by clicking +here. +This should cause you to be returned to the logon page after the redirect +that is performed. + + + diff --git a/webapps/examples/jsp/security/protected/login.jsp b/webapps/examples/jsp/security/protected/login.jsp new file mode 100644 index 000000000..af1e6c11e --- /dev/null +++ b/webapps/examples/jsp/security/protected/login.jsp @@ -0,0 +1,37 @@ + + + +Login Page for Examples + +
    + + + + + + + + + + + + + +
    Username:
    Password:
    +
    + + diff --git a/webapps/examples/jsp/sessions/DummyCart.html b/webapps/examples/jsp/sessions/DummyCart.html new file mode 100644 index 000000000..b6d64f9c2 --- /dev/null +++ b/webapps/examples/jsp/sessions/DummyCart.html @@ -0,0 +1,55 @@ + + + + + +sessions.DummyCart Bean Properties + + +

    +sessions.DummyCart Bean Properties +

    +
    +
    +
    public class DummyCart
    extends Object
    + +

    +


    + +

    + + + + + + + + + +
    +Properties Summary
    + +String +DummyCart:items +
    +
    + +Multi +
    +


    + + diff --git a/webapps/examples/jsp/sessions/carts.html b/webapps/examples/jsp/sessions/carts.html new file mode 100644 index 000000000..ad5c03d2c --- /dev/null +++ b/webapps/examples/jsp/sessions/carts.html @@ -0,0 +1,52 @@ + + + + + carts + + + + + +
    +
    +Please enter item to add or remove: +
    +Add Item: + + + + +

    + + + +
    + +
    + + diff --git a/webapps/examples/jsp/sessions/carts.jsp b/webapps/examples/jsp/sessions/carts.jsp new file mode 100644 index 000000000..d46ceedeb --- /dev/null +++ b/webapps/examples/jsp/sessions/carts.jsp @@ -0,0 +1,43 @@ + + + + + + +<% + cart.processRequest(request); +%> + + + +
    You have the following items in your cart: +
      +<% + String[] items = cart.getItems(); + for (int i=0; i +
    1. <% out.print(util.HTMLFilter.filter(items[i])); %> +<% + } +%> +
    + +
    + +
    +<%@ include file ="/sessions/carts.html" %> + diff --git a/webapps/examples/jsp/sessions/crt.html b/webapps/examples/jsp/sessions/crt.html new file mode 100644 index 000000000..4be80f435 --- /dev/null +++ b/webapps/examples/jsp/sessions/crt.html @@ -0,0 +1,33 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for Cart Example +

    + +

    Property Sheet for DummyCart +

    + + + diff --git a/webapps/examples/jsp/simpletag/foo.html b/webapps/examples/jsp/simpletag/foo.html new file mode 100644 index 000000000..25b322bfa --- /dev/null +++ b/webapps/examples/jsp/simpletag/foo.html @@ -0,0 +1,29 @@ + + + +Untitled Document + + + + +

    + +

    Source Code for the Simple Tag Example +

    + + + diff --git a/webapps/examples/jsp/simpletag/foo.jsp b/webapps/examples/jsp/simpletag/foo.jsp new file mode 100644 index 000000000..9e3008be8 --- /dev/null +++ b/webapps/examples/jsp/simpletag/foo.jsp @@ -0,0 +1,37 @@ + + + +<%@ taglib uri="http://jakarta.apache.org/tomcat/examples-taglib" prefix="eg"%> + +Radio stations that rock: + +
      + +
    • <%= member %>
    • +
      +
    + + +Did you see me on the stderr window? + + + +Did you see me on the browser window as well? + + + + diff --git a/webapps/examples/jsp/snp/snoop.html b/webapps/examples/jsp/snp/snoop.html new file mode 100644 index 000000000..fffeb093e --- /dev/null +++ b/webapps/examples/jsp/snp/snoop.html @@ -0,0 +1,30 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for Request Parameters Example +

    + + + diff --git a/webapps/examples/jsp/snp/snoop.jsp b/webapps/examples/jsp/snp/snoop.jsp new file mode 100644 index 000000000..bec02d284 --- /dev/null +++ b/webapps/examples/jsp/snp/snoop.jsp @@ -0,0 +1,55 @@ + + + + +

    Request Information

    + +JSP Request Method: <% out.print(util.HTMLFilter.filter(request.getMethod())); %> +
    +Request URI: <%= request.getRequestURI() %> +
    +Request Protocol: <%= request.getProtocol() %> +
    +Servlet path: <%= request.getServletPath() %> +
    +Path info: <% out.print(util.HTMLFilter.filter(request.getPathInfo())); %> +
    +Query string: <% out.print(util.HTMLFilter.filter(request.getQueryString())); %> +
    +Content length: <%= request.getContentLength() %> +
    +Content type: <% out.print(util.HTMLFilter.filter(request.getContentType())); %> +
    +Server name: <%= request.getServerName() %> +
    +Server port: <%= request.getServerPort() %> +
    +Remote user: <%= request.getRemoteUser() %> +
    +Remote address: <%= request.getRemoteAddr() %> +
    +Remote host: <%= request.getRemoteHost() %> +
    +Authorization scheme: <%= request.getAuthType() %> +
    +Locale: <%= request.getLocale() %> +
    +The browser you are using is <% out.print(util.HTMLFilter.filter(request.getHeader("User-Agent"))); %> +
    +
    + + diff --git a/webapps/examples/jsp/source.jsp b/webapps/examples/jsp/source.jsp new file mode 100644 index 000000000..3d9e9587c --- /dev/null +++ b/webapps/examples/jsp/source.jsp @@ -0,0 +1,19 @@ + +<%@ taglib uri="http://jakarta.apache.org/tomcat/examples-taglib" + prefix="eg" %> + + diff --git a/webapps/examples/jsp/tagplugin/choose.html b/webapps/examples/jsp/tagplugin/choose.html new file mode 100644 index 000000000..9b15c3fa2 --- /dev/null +++ b/webapps/examples/jsp/tagplugin/choose.html @@ -0,0 +1,35 @@ + + + +View Source Code + + + +

    + + + + + +

    + +

    + Source Code for choose.jsp +

    + + + diff --git a/webapps/examples/jsp/tagplugin/choose.jsp b/webapps/examples/jsp/tagplugin/choose.jsp new file mode 100644 index 000000000..8d3545195 --- /dev/null +++ b/webapps/examples/jsp/tagplugin/choose.jsp @@ -0,0 +1,57 @@ + + + + Tag Examples - choose + + +

    Tag Plugin Examples - <c:choose>

    + +
    +
    + Plugin Introductory Notes +
    +
    Brief Instructions for Writing Plugins +

    +
    + + +
    + + <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + # ${index}: + + + One!
    +
    + + Four!
    +
    + + Three!
    +
    + + Huh?
    +
    +
    +
    + + diff --git a/webapps/examples/jsp/tagplugin/foreach.html b/webapps/examples/jsp/tagplugin/foreach.html new file mode 100644 index 000000000..bc56a66b0 --- /dev/null +++ b/webapps/examples/jsp/tagplugin/foreach.html @@ -0,0 +1,35 @@ + + + +View Source Code + + + +

    + + + + + +

    + +

    + Source Code for foreach.jsp +

    + + + diff --git a/webapps/examples/jsp/tagplugin/foreach.jsp b/webapps/examples/jsp/tagplugin/foreach.jsp new file mode 100644 index 000000000..d38e18e2f --- /dev/null +++ b/webapps/examples/jsp/tagplugin/foreach.jsp @@ -0,0 +1,56 @@ + + + + Tag Plugin Examples: forEach + + +

    Tag Plugin Examples - <c:forEach>

    + +
    +
    + Plugin Introductory Notes +
    +
    Brief Instructions for Writing Plugins +

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

    Iterating over a range

    + + ${item} + + + <% Vector v = new Vector(); + v.add("One"); v.add("Two"); v.add("Three"); v.add("Four"); + + pageContext.setAttribute("vector", v); + %> + +

    Iterating over a Vector

    + + + ${item} + + + diff --git a/webapps/examples/jsp/tagplugin/howto.html b/webapps/examples/jsp/tagplugin/howto.html new file mode 100644 index 000000000..e875465ee --- /dev/null +++ b/webapps/examples/jsp/tagplugin/howto.html @@ -0,0 +1,42 @@ + + + + Tag Plugin Implementation +

    How to write tag plugins

    +

    + To write a plugin, you'll need to download the source for Tomcat 5. + There are two steps: +

      +
    1. + Implement the plugin class.

      + This class, which implements + org.apache.jasper.compiler.tagplugin.TagPlugin + instructs Jasper what Java codes to generate in place of the tag + handler calls. + See Javadoc for org.apache.jasper.compiler.tagplugin.TagPlugin + for details. +

    2. + +
    3. + Create the plugin descriptor file WEB-INF/tagPlugins.xml

      + This file + specifies the plugin classes and their corresponding tag handler + classes. +

    4. +
    + + diff --git a/webapps/examples/jsp/tagplugin/if.html b/webapps/examples/jsp/tagplugin/if.html new file mode 100644 index 000000000..385958ace --- /dev/null +++ b/webapps/examples/jsp/tagplugin/if.html @@ -0,0 +1,35 @@ + + + +View Source Code + + + +

    + + + + + +

    + +

    + Source Code for if.jsp +

    + + + diff --git a/webapps/examples/jsp/tagplugin/if.jsp b/webapps/examples/jsp/tagplugin/if.jsp new file mode 100644 index 000000000..56c264790 --- /dev/null +++ b/webapps/examples/jsp/tagplugin/if.jsp @@ -0,0 +1,44 @@ + + + + Tag Plugin Examples: if + + +

    Tag Plugin Examples - <c:if>

    + +
    +
    + Plugin Introductory Notes +
    + Brief Instructions for Wrieting Plugins +

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

    Set the test result to a variable

    + + The result of testing for (1==1) is: ${theTruth} + +

    Conditionally execute the body

    + + It's true that (2>0)! + + + diff --git a/webapps/examples/jsp/tagplugin/notes.html b/webapps/examples/jsp/tagplugin/notes.html new file mode 100644 index 000000000..61074502a --- /dev/null +++ b/webapps/examples/jsp/tagplugin/notes.html @@ -0,0 +1,38 @@ + + + + Tag Plugin Introduction +

    Tag Plugins: Introductory Notes

    +

    + Tomcat 5 provides a framework for implementing tag plugins. The + plugins instruct Jasper, at translation time, to replace tag handler + calls with Java scriptlets. + The framework allows tag library authors to implement plugins for + their tags. +

    +

    + Tomcat 5 is released with plugins for several JSTL tags. Note + that these plugins work with JSTL 1.1 as well as JSTL 1.0, though + the examples uses JSTL 1.1 and JSP 2.0. + These plugins are not complete (for instance, some item types not + handled in <c:if>). + They do serve as examples to show plugins in action (just + examine the generated Java files), and how they can be implemented. +

    + + + diff --git a/webapps/examples/jsp/xml/xml.html b/webapps/examples/jsp/xml/xml.html new file mode 100644 index 000000000..1c841289f --- /dev/null +++ b/webapps/examples/jsp/xml/xml.html @@ -0,0 +1,30 @@ + + + + +Untitled Document + + + + +

    + +

    Source Code for XML syntax Example +

    + + + diff --git a/webapps/examples/jsp/xml/xml.jsp b/webapps/examples/jsp/xml/xml.jsp new file mode 100644 index 000000000..d014ff85d --- /dev/null +++ b/webapps/examples/jsp/xml/xml.jsp @@ -0,0 +1,69 @@ + + + + + + + + + String getDateTimeStr(Locale l) { + DateFormat df = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, l); + return df.format(new Date()); + } + + + + + Example JSP in XML format + + + +This is the output of a simple JSP using XML format. +
    + +
    Use a jsp:scriptlet to loop from 1 to 10:
    + +// Note we need to declare CDATA because we don't escape the less than symbol + + + + +
    +]]> + +
    + Use a jsp:expression to write the date and time in the browser's locale: + getDateTimeStr(request.getLocale()) +
    + + + + <p>This sentence is enclosed in a jsp:text element.</p> + + + + +
    diff --git a/webapps/examples/servlets/images/code.gif b/webapps/examples/servlets/images/code.gif new file mode 100644 index 0000000000000000000000000000000000000000..93af2cd130aa61cb2f235cdd6f0e75ab444819ef GIT binary patch literal 292 zcmZ?wbhEHblwgoxIP#z2z<~q*(`NopOZ#sOM8;>*(#{wIk?|P@o$6#>Qz3K*V4S1Pnk5hzS72pDc_ZB|0DiWTyk`LIs7s6iv0@q;(ETk{*X8*p&Sz zS?%Jy|7uNwX5dT_rVVU*FIJccbhvMP#4t}Kw7uYTuBh_VnCTjt97)}qgEke3iU+j# zdTyN*!`HsV>FFn-s95XDrdAynk)$>kVJ;@##Ikl#0e5yDZsrM%j-vc*EJY@UJi>F- w^aL|Jc?Bj;=4WLO5adbda@4El6|}Iev#dyLst@fxxV)*dq0M4 zuU27uS$av`))UvZFOHHZ*ItST2O0$7;7H? zm&+9jg_V_+QmIrfmut0JNgWD>N~y#dv!$ejV3mcCNeF_Fs91zF06g0g%rptkdaf-6 zF_0xVM$i_FQ|#InC0H;@)orLVf()pw6mqsDEh%itRj8`R2I3~Mg(*yIbHb?sbqyn3 zQYZyCsY->?M4l}qr>- z0I$VBAEL|c3!Aa23>>`6zgZI-x?7(TmI_v%;048`BL-aEhiAV!!lj_8tNy{ zuHVlON6V>(=ELvD+RJkuyyRyVcEVSxb@v=^_xJ8_AXukA`|R1H)q9Ptr@mW4Q_jP; zvV-p8YH%TPuI2Q*17~mjF+W7_4*dGfOe`P2(>42bIlAt3wjaL+tnW9`gI6Q#4vn(x+N>Q)$&RbyXeH}5khoAZ zgHYWn8m8H>&V#9A@nKri+6f7CAZX^n(t)JHP^8RL7z)bJ*uqp1CeXrcK^P~G{tuqV z^BsQQ$2pwh@zEn}1p^F%5QJd}Aw&paj0qu>(zUfUmSs7P<9S{Xgle@~tJOqNtk>(3 zB+0U@D2l48nx^TxZWsoa&$A3e34s7$jDj$XWIqfUmW{ZO5C9=SDAKGTH2r`GRm|~r z5L$j98>Zp~kYOR42b6JwQ1b%S^%chx9UoE#D+ZEvK&b8ovKvT_U$;Hc_5{o0Esv@u zV|vtZNi@a@L^X--U`fN84f8w{M0eXUG$N)K%8oDDURAev)u`Ei)$*#g&zml%+l*qc z5u_%u5lz+^!=({{P?YDX?hsigszo##*Hy@JNK{Z=MY4eu6Y@37k1~gfg@L4*NB(TMHD`z5Mi$4{3$K3Fd0=2+ z2&SJ^4mHd1^M91~z5jb@w)hR4@9nxce6>IZv*odP-zSex6`o(pw(oi7X69J;zL6Ew zmMCYwj%&NFbnm5LWxe~Y@k3x5DnB+pXsm90nHrr#zm