| type=page |
| status=published |
| title=Developing Web Applications |
| next=ejb.html |
| prev=jpa.html |
| ~~~~~~ |
| |
| = Developing Web Applications |
| |
| [[GSDVG00009]][[beafs]] |
| |
| |
| [[developing-web-applications]] |
| == 7 Developing Web Applications |
| |
| This chapter describes how web applications are supported in the {productName}. |
| |
| The following topics are addressed here: |
| |
| * link:#beagj[Using Servlets] |
| * link:#beagu[Using JavaServer Pages] |
| * link:#beaha[Creating and Managing Sessions] |
| * link:#ggrgt[Using Comet] |
| * link:#beaft[Advanced Web Application Features] |
| |
| For general information about web applications, see |
| "https://eclipse-ee4j.github.io/jakartaee-tutorial/#getting-started-with-web-applications[ |
| The Web Tier]" in The Jakarta EE Tutorial. |
| |
| |
| [NOTE] |
| ==== |
| The Web Profile of the {productName} supports the EJB 3.1 Lite |
| specification, which allows enterprise beans within web applications, |
| among other features. The full {productName} supports the entire EJB |
| 3.1 specification. For details, see |
| http://jcp.org/en/jsr/detail?id=318[JSR 318] |
| (`http://jcp.org/en/jsr/detail?id=318`). |
| ==== |
| |
| |
| [[beagj]][[GSDVG00140]][[using-servlets]] |
| |
| === Using Servlets |
| |
| {productName} supports the Java Servlet Specification version 4.0. |
| |
| |
| [NOTE] |
| ==== |
| Servlet API version 4.0 is fully backward compatible with versions 3.0, |
| 2.3, 2.4, and 2.5, so all existing servlets should work without |
| modification or recompilation. |
| ==== |
| |
| |
| To develop servlets, use the Java Servlet API. For information about |
| using the Java Servlet API, see the documentation at |
| `http://www.oracle.com/technetwork/java/javaee/servlet/index.html`. |
| |
| The {productName} provides the `wscompile` and `wsdeploy` tools to |
| help you implement a web service endpoint as a servlet. For more |
| information about these tools, see the link:reference-manual.html#GSRFM[{productName} Reference Manual]. |
| |
| This section describes how to create effective servlets to control |
| application interactions running on a {productName}, including |
| standard-based servlets. In addition, this section describes the |
| {productName} features to use to augment the standards. |
| |
| The following topics are addressed here: |
| |
| * link:#beagm[Caching Servlet Results] |
| * link:#beagr[About the Servlet Engine] |
| |
| [[beagm]][[GSDVG00397]][[caching-servlet-results]] |
| |
| ==== Caching Servlet Results |
| |
| The {productName} can cache the results of invoking a servlet, a JSP, |
| or any URL pattern to make subsequent invocations of the same servlet, |
| JSP, or URL pattern faster. The {productName} caches the request |
| results for a specific amount of time. In this way, if another data call |
| occurs, the {productName} can return the cached data instead of |
| performing the operation again. For example, if your servlet returns a |
| stock quote that updates every 5 minutes, you set the cache to expire |
| after 300 seconds. |
| |
| Whether to cache results and how to cache them depends on the data |
| involved. For example, it makes no sense to cache the results of a quiz |
| submission, because the input to the servlet is different each time. |
| However, it makes sense to cache a high level report showing demographic |
| data taken from quiz results that is updated once an hour. |
| |
| To define how a {productName} web application handles response |
| caching, you edit specific fields in the `glassfish-web.xml` file. |
| |
| |
| [NOTE] |
| ==== |
| A servlet that uses caching is not portable. |
| ==== |
| |
| |
| For Javadoc tool pages relevant to caching servlet results, see the |
| `com.sun.appserv.web.cache` package. |
| |
| For information about JSP caching, see link:#beagw[JSP Caching]. |
| |
| The following topics are addressed here: |
| |
| * link:#beagn[Caching Features] |
| * link:#beago[Default Cache Configuration] |
| * link:#beagp[Caching Example] |
| * link:#beagq[The CacheKeyGenerator Interface] |
| |
| [[beagn]][[GSDVG00251]][[caching-features]] |
| |
| ===== Caching Features |
| |
| The {productName} has the following web application response caching |
| capabilities: |
| |
| * Caching is configurable based on the servlet name or the URI. |
| * When caching is based on the URI, this includes user specified |
| parameters in the query string. For example, a response from |
| `/garden/catalog?category=roses` is different from a response from |
| `/garden/catalog?category=lilies`. These responses are stored under |
| different keys in the cache. |
| * Cache size, entry timeout, and other caching behaviors are |
| configurable. |
| * Entry timeout is measured from the time an entry is created or |
| refreshed. To override this timeout for an individual cache mapping, |
| specify the `cache-mapping` subelement `timeout`. |
| * To determine caching criteria programmatically, write a class that |
| implements the com.sun.appserv.web.cache.CacheHelper interface. For |
| example, if only a servlet knows when a back end data source was last |
| modified, you can write a helper class to retrieve the last modified |
| timestamp from the data source and decide whether to cache the response |
| based on that timestamp. |
| * To determine cache key generation programmatically, write a class that |
| implements the com.sun.appserv.web.cache.CacheKeyGenerator interface. |
| See link:#beagq[The CacheKeyGenerator Interface]. |
| * All non-ASCII request parameter values specified in cache key elements |
| must be URL encoded. The caching subsystem attempts to match the raw |
| parameter values in the request query string. |
| * Since newly updated classes impact what gets cached, the web container |
| clears the cache during dynamic deployment or reloading of classes. |
| * The following `HttpServletRequest` request attributes are exposed. |
| |
| ** `com.sun.appserv.web.cachedServletName`, the cached servlet target |
| |
| ** `com.sun.appserv.web.cachedURLPattern`, the URL pattern being cached |
| * Results produced by resources that are the target of a |
| `RequestDispatcher.include()` or `RequestDispatcher.forward()` call are |
| cached if caching has been enabled for those resources. For details, see |
| "link:application-deployment-guide/dd-elements.html#GSDPG00101[cache-mapping]" in {productName} Application Deployment Guide and "link:../application-deployment-guide/dd-elements.html#GSDPG00140[dispatcher]" |
| in {productName} Application Deployment Guide. |
| These are elements in the `glassfish-web.xml` file. |
| |
| [[beago]][[GSDVG00252]][[default-cache-configuration]] |
| |
| ===== Default Cache Configuration |
| |
| If you enable caching but do not provide any special configuration for a |
| servlet or JSP, the default cache configuration is as follows: |
| |
| * The default cache timeout is 30 seconds. |
| * Only the HTTP GET method is eligible for caching. |
| * HTTP requests with cookies or sessions automatically disable caching. |
| * No special consideration is given to `Pragma:`, `Cache-control:`, or |
| `Vary:` headers. |
| * The default key consists of the Servlet Path (minus `pathInfo` and the |
| query string). |
| * A "least recently used" list is maintained to evict cache entries if |
| the maximum cache size is exceeded. |
| * Key generation concatenates the servlet path with key field values, if |
| any are specified. |
| * Results produced by resources that are the target of a |
| `RequestDispatcher.include()` or `RequestDispatcher.forward()` call are |
| never cached. |
| |
| [[beagp]][[GSDVG00253]][[caching-example]] |
| |
| ===== Caching Example |
| |
| Here is an example cache element in the `glassfish-web.xml` file: |
| |
| [source,xml] |
| ---- |
| <cache max-capacity="8192" timeout="60"> |
| <cache-helper name="myHelper" class-name="MyCacheHelper"/> |
| <cache-mapping> |
| <servlet-name>myservlet</servlet-name> |
| <timeout name="timefield">120</timeout> |
| <http-method>GET</http-method> |
| <http-method>POST</http-method> |
| </cache-mapping> |
| <cache-mapping> |
| <url-pattern> /catalog/* </url-pattern> |
| <!-- cache the best selling category; cache the responses to |
| -- this resource only when the given parameters exist. Cache |
| -- only when the catalog parameter has 'lilies' or 'roses' |
| -- but no other catalog varieties: |
| -- /orchard/catalog?best&category='lilies' |
| -- /orchard/catalog?best&category='roses' |
| -- but not the result of |
| -- /orchard/catalog?best&category='wild' |
| --> |
| <constraint-field name='best' scope='request.parameter'/> |
| <constraint-field name='category' scope='request.parameter'> |
| <value> roses </value> |
| <value> lilies </value> |
| </constraint-field> |
| <!-- Specify that a particular field is of given range but the |
| -- field doesn't need to be present in all the requests --> |
| <constraint-field name='SKUnum' scope='request.parameter'> |
| <value match-expr='in-range'> 1000 - 2000 </value> |
| </constraint-field> |
| <!-- cache when the category matches with any value other than |
| -- a specific value --> |
| <constraint-field name="category" scope="request.parameter> |
| <value match-expr="equals" cache-on-match-failure="true"> |
| bogus |
| </value> |
| </constraint-field> |
| </cache-mapping> |
| <cache-mapping> |
| <servlet-name> InfoServlet </servlet-name> |
| <cache-helper-ref>myHelper</cache-helper-ref> |
| </cache-mapping> |
| </cache> |
| ---- |
| |
| For more information about the `glassfish-web.xml` caching settings, see |
| "link:application-deployment-guide/dd-elements.html#GSDPG00097[cache]" in {productName} |
| Application Deployment Guide. |
| |
| [[beagq]][[GSDVG00254]][[the-cachekeygenerator-interface]] |
| |
| ===== The CacheKeyGenerator Interface |
| |
| The built-in default CacheHelper implementation allows web applications |
| to customize the key generation. An application component (in a servlet |
| or JSP) can set up a custom CacheKeyGenerator implementation as an |
| attribute in the `ServletContext`. |
| |
| The name of the context attribute is configurable as the `value` of the |
| `cacheKeyGeneratorAttrName` property in the `default-helper` element of |
| the `glassfish-web.xml` deployment descriptor. For more information, see |
| "link:application-deployment-guide/dd-elements.html#GSDPG00136[default-helper]" in {productName} Application Deployment Guide. |
| |
| [[beagr]][[GSDVG00398]][[about-the-servlet-engine]] |
| |
| ==== About the Servlet Engine |
| |
| Servlets exist in and are managed by the servlet engine in the {productName}. The servlet engine is an internal object that handles all |
| servlet meta functions. These functions include instantiation, |
| initialization, destruction, access from other components, and |
| configuration management. |
| |
| The following topics are addressed here: |
| |
| * link:#beags[Instantiating and Removing Servlets] |
| * link:#beagt[Request Handling] |
| |
| [[beags]][[GSDVG00255]][[instantiating-and-removing-servlets]] |
| |
| ===== Instantiating and Removing Servlets |
| |
| After the servlet engine instantiates the servlet, the servlet engine |
| calls the servlet's `init` method to perform any necessary |
| initialization. You can override this method to perform an |
| initialization function for the servlet's life, such as initializing a |
| counter. |
| |
| When a servlet is removed from service, the servlet engine calls the |
| `destroy` method in the servlet so that the servlet can perform any |
| final tasks and deallocate resources. You can override this method to |
| write log messages or clean up any lingering connections that won't be |
| caught in garbage collection. |
| |
| [[beagt]][[GSDVG00256]][[request-handling]] |
| |
| ===== Request Handling |
| |
| When a request is made, the {productName} hands the incoming data to |
| the servlet engine. The servlet engine processes the request's input |
| data, such as form data, cookies, session information, and URL |
| name-value pairs, into an `HttpServletRequest` request object type. |
| |
| The servlet engine also creates an `HttpServletResponse` response object |
| type. The engine then passes both as parameters to the servlet's |
| `service` method. |
| |
| In an HTTP servlet, the default `service` method routes requests to |
| another method based on the HTTP transfer method: `POST`, `GET`, |
| `DELETE`, `HEAD`, `OPTIONS`, `PUT`, or `TRACE`. For example, HTTP `POST` |
| requests are sent to the `doPost` method, HTTP `GET` requests are sent |
| to the `doGet` method, and so on. This enables the servlet to process |
| request data differently, depending on which transfer method is used. |
| Since the routing takes place in the service method, you generally do |
| not override `service` in an HTTP servlet. Instead, override `doGet`, |
| `doPost`, and so on, depending on the request type you expect. |
| |
| To perform the tasks to answer a request, override the `service` method |
| for generic servlets, and the `doGet` or `doPost` methods for HTTP |
| servlets. Very often, this means accessing EJB components to perform |
| business transactions, then collating the information in the request |
| object or in a JDBC `ResultSet` object. |
| |
| [[beagu]][[GSDVG00141]][[using-javaserver-pages]] |
| |
| === Using JavaServer Pages |
| |
| The {productName} supports the following JSP features: |
| |
| * JavaServer Pages (JSP) Specification |
| * Precompilation of JSP files, which is especially useful for production |
| servers |
| * JSP tag libraries and standard portable tags |
| |
| For information about creating JSP files, see the JavaServer Pages web |
| site at `http://www.oracle.com/technetwork/java/javaee/jsp/index.html`. |
| |
| For information about Java Beans, see the JavaBeans web page at |
| `http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138795.html`. |
| |
| This section describes how to use JavaServer Pages (JSP files) as page |
| templates in a {productName} web application. |
| |
| The following topics are addressed here: |
| |
| * link:#beagv[JSP Tag Libraries and Standard Portable Tags] |
| * link:#beagw[JSP Caching] |
| * link:#beagz[Options for Compiling JSP Files] |
| |
| [[beagv]][[GSDVG00399]][[jsp-tag-libraries-and-standard-portable-tags]] |
| |
| ==== JSP Tag Libraries and Standard Portable Tags |
| |
| {productName} supports tag libraries and standard portable tags. For |
| more information, see the JavaServer Pages Standard Tag Library (JSTL) |
| page at `http://www.oracle.com/technetwork/java/index-jsp-135995.html`. |
| |
| Web applications don't need to bundle copies of the `jsf-impl.jar` or |
| `appserv-jstl.jar` JSP tag libraries (in as-install``/lib``) to use |
| JavaServer Faces technology or JSTL, respectively. These tag libraries |
| are automatically available to all web applications. |
| |
| However, the as-install``/lib/jspcachtags.jar`` tag library for JSP |
| caching is not automatically available to web applications. See |
| link:#beagw[JSP Caching], next. |
| |
| [[beagw]][[GSDVG00400]][[jsp-caching]] |
| |
| ==== JSP Caching |
| |
| JSP caching lets you cache tag invocation results within the Java |
| engine. Each can be cached using different cache criteria. For example, |
| suppose you have invocations to view stock quotes, weather information, |
| and so on. The stock quote result can be cached for 10 minutes, the |
| weather report result for 30 minutes, and so on. |
| |
| The following topics are addressed here: |
| |
| * link:#gaxbq[Enabling JSP Caching] |
| * link:#gaxcr[Caching Scope] |
| * link:#beagx[The `cache` Tag] |
| * link:#beagy[The `flush` Tag] |
| |
| For more information about response caching as it pertains to servlets, |
| see link:#beagm[Caching Servlet Results]. |
| |
| [[gaxbq]][[GSDVG00257]][[enabling-jsp-caching]] |
| |
| ===== Enabling JSP Caching |
| |
| To globally enable JSP caching, set the `jspCachingEnabled` property to |
| `true`. The default is `false`. For example: |
| |
| [source] |
| ---- |
| asadmin set server-config.web-container.property.jspCachingEnabled="true" |
| ---- |
| |
| For more information about the `asadmin set` command, see the |
| link:reference-manual.html#GSRFM[{productName} Reference Manual]. |
| |
| To enable JSP caching for a single web application, follow these steps: |
| |
| 1. Extract the `META-INF/jspcachtags.tld` file from the |
| as-install``/modules/web-glue.jar`` file. |
| 2. Create a new JAR file (for example, `jspcachtags.jar`) containing |
| just the `META-INF/jspcachtags.tld` file previously extracted. |
| 3. Bundle this new JAR file in the `WEB-INF/lib` directory of your web |
| application. |
| |
| |
| [NOTE] |
| ==== |
| Web applications that use JSP caching without bundling the tag library |
| are not portable. |
| ==== |
| |
| |
| Refer to {productName} tags in JSP files as follows: |
| |
| [source,xml] |
| ---- |
| <%@ taglib prefix="prefix" uri="http://glassfish.org/taglibs/cache" %> |
| ---- |
| |
| Subsequently, the cache tags are available as `<`prefix`:cache>` and |
| `<`prefix`:flush>`. For example, if your prefix is `mypfx`, the cache |
| tags are available as `<mypfx:cache>` and `<mypfx:flush>`. |
| |
| [[gaxcr]][[GSDVG00258]][[caching-scope]] |
| |
| ===== Caching Scope |
| |
| JSP caching is available in three different scopes: `request`, |
| `session`, and `application`. The default is `application`. To use a |
| cache in `request` scope, a web application must specify the |
| `com.sun.appserv.web.taglibs.cache.CacheRequestListener` in its |
| `web.xml` deployment descriptor, as follows: |
| |
| [source,xml] |
| ---- |
| <listener> |
| <listener-class> |
| com.sun.appserv.web.taglibs.cache.CacheRequestListener |
| </listener-class> |
| </listener> |
| ---- |
| |
| Likewise, for a web application to utilize a cache in `session` scope, |
| it must specify the |
| `com.sun.appserv.web.taglibs.cache.CacheSessionListener` in its |
| `web.xml` deployment descriptor, as follows: |
| |
| [source,xml] |
| ---- |
| <listener> |
| <listener-class> |
| com.sun.appserv.web.taglibs.cache.CacheSessionListener |
| </listener-class> |
| </listener> |
| ---- |
| |
| To utilize a cache in `application` scope, a web application need not |
| specify any listener. The |
| `com.sun.appserv.web.taglibs.cache.CacheContextListener` is already |
| specified in the `jspcachtags.tld` file. |
| |
| [[beagx]][[GSDVG00259]][[the-cache-tag]] |
| |
| ===== The `cache` Tag |
| |
| The cache tag caches the body between the beginning and ending tags |
| according to the attributes specified. The first time the tag is |
| encountered, the body content is executed and cached. Each subsequent |
| time it is run, the cached content is checked to see if it needs to be |
| refreshed and if so, it is executed again, and the cached data is |
| refreshed. Otherwise, the cached data is served. |
| |
| [[fvyfx]][[GSDVG00023]][[attributes-of-cache]] |
| |
| Attributes of `cache` |
| |
| The following table describes attributes for the `cache` tag. |
| |
| [[GSDVG541]][[sthref13]][[fvygg]] |
| |
| |
| Table 7-1 The `cache` Attributes |
| |
| [width="100%",cols="10%,16%,74%",options="header",] |
| |=== |
| |Attribute |Default |Description |
| |`key` |ServletPath`_`Suffix |(optional) The name used by the container |
| to access the cached entry. The cache key is suffixed to the servlet |
| path to generate a key to access the cached entry. If no key is |
| specified, a number is generated according to the position of the tag in |
| the page. |
| |
| |`timeout` |`60s` |(optional) The time in seconds after which the body |
| of the tag is executed and the cache is refreshed. By default, this |
| value is interpreted in seconds. To specify a different unit of time, |
| add a suffix to the timeout value as follows: `s` for seconds, `m` for |
| minutes, `h` for hours, `d` for days. For example, `2h` specifies two |
| hours. |
| |
| |`nocache` |`false` |(optional) If set to `true`, the body content is |
| executed and served as if there were no `cache` tag. This offers a way |
| to programmatically decide whether the cached response is sent or |
| whether the body has to be executed, though the response is not cached. |
| |
| |`refresh` |`false` |(optional) If set to `true`, the body content is |
| executed and the response is cached again. This lets you |
| programmatically refresh the cache immediately regardless of the |
| `timeout` setting. |
| |
| |`scope` |`application` |(optional) The scope of the cache. Can be |
| `request`, `session`, or `application`. See link:#gaxcr[Caching Scope]. |
| |=== |
| |
| |
| [[fvyeh]][[GSDVG00024]][[example-of-cache]] |
| |
| Example of `cache` |
| |
| The following example represents a cached JSP file: |
| |
| [source,xml] |
| ---- |
| <%@ taglib prefix="mypfx" uri="http://glassfish.org/taglibs/cache" %> |
| <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
| <mypfx:cache key="${sessionScope.loginId}" |
| nocache="${param.nocache}" |
| refresh="${param.refresh}" |
| timeout="10m"> |
| <c:choose> |
| <c:when test="${param.page == 'frontPage'}"> |
| <%-- get headlines from database --%> |
| </c:when> |
| <c:otherwise> |
| ... |
| </c:otherwise> |
| </c:choose> |
| </mypfx:cache> |
| <mypfx:cache timeout="1h"> |
| <h2> Local News </h2> |
| <%-- get the headline news and cache them --%> |
| </mypfx:cache> |
| ---- |
| |
| [[beagy]][[GSDVG00260]][[the-flush-tag]] |
| |
| ===== The `flush` Tag |
| |
| Forces the cache to be flushed. If a `key` is specified, only the entry |
| with that key is flushed. If no key is specified, the entire cache is |
| flushed. |
| |
| [[fvykp]][[GSDVG00025]][[attributes-of-flush]] |
| |
| Attributes of `flush` |
| |
| The following table describes attributes for the `flush` tag. |
| |
| [[GSDVG542]][[sthref14]][[fvyep]] |
| |
| |
| Table 7-2 The `flush` Attributes |
| |
| [width="100%",cols="11%,20%,69%",options="header",] |
| |=== |
| |Attribute |Default |Description |
| |`key` |ServletPath`_`Suffix |(optional) The name used by the container |
| to access the cached entry. The cache key is suffixed to the servlet |
| path to generate a key to access the cached entry. If no key is |
| specified, a number is generated according to the position of the tag in |
| the page. |
| |
| |`scope` |`application` |(optional) The scope of the cache. Can be |
| `request`, `session`, or `application`. See link:#gaxcr[Caching Scope]. |
| |=== |
| |
| |
| [[fvyle]][[GSDVG00026]][[examples-of-flush]] |
| |
| Examples of `flush` |
| |
| To flush the entry with `key="foobar"`: |
| |
| [source,xml] |
| ---- |
| <mypfx:flush key="foobar"/> |
| ---- |
| |
| To flush the entire cache: |
| |
| [source,xml] |
| ---- |
| <c:if test="${empty sessionScope.clearCache}"> |
| <mypfx:flush /> |
| </c:if> |
| ---- |
| |
| [[beagz]][[GSDVG00401]][[options-for-compiling-jsp-files]] |
| |
| ==== Options for Compiling JSP Files |
| |
| {productName} provides the following ways of compiling JSP source |
| files into servlets: |
| |
| * JSP files are automatically compiled at runtime. |
| * The `asadmin deploy` command has a `--precompilejsp` option. For |
| details, see the link:reference-manual.html#GSRFM[{productName} |
| Reference Manual]. |
| * The `jspc` command line tool allows you to precompile JSP files at the |
| command line. For details, see the link:reference-manual.html#GSRFM[{productName} Reference Manual]. |
| |
| [[beaha]][[GSDVG00142]][[creating-and-managing-sessions]] |
| |
| === Creating and Managing Sessions |
| |
| This section describes how to create and manage HTTP sessions that |
| allows users and transaction information to persist between |
| interactions. |
| |
| The following topics are addressed here: |
| |
| * link:#beahb[Configuring Sessions] |
| * link:#beahf[Session Managers] |
| |
| [[beahb]][[GSDVG00402]][[configuring-sessions]] |
| |
| ==== Configuring Sessions |
| |
| The following topics are addressed here: |
| |
| * link:#beahc[HTTP Sessions, Cookies, and URL Rewriting] |
| * link:#beahd[Coordinating Session Access] |
| * link:#ghmih[Saving Sessions During Redeployment] |
| * link:#gixeb[Logging Session Attributes] |
| * link:#beahe[Distributed Sessions and Persistence] |
| |
| [[beahc]][[GSDVG00261]][[http-sessions-cookies-and-url-rewriting]] |
| |
| ===== HTTP Sessions, Cookies, and URL Rewriting |
| |
| To configure whether and how HTTP sessions use cookies and URL |
| rewriting, edit the `session-properties` and `cookie-properties` |
| elements in the `glassfish-web.xml` file for an individual web |
| application. For more about the properties you can configure, see |
| "link:application-deployment-guide/dd-elements.html#GSDPG00276[session-properties]" in {productName} Application Deployment Guide and |
| "link:application-deployment-guide/dd-elements.html#GSDPG00130[cookie-properties]" in {productName} Application Deployment Guide. |
| |
| For information about configuring default session properties for the |
| entire web container, see link:#beagc[Using the `default-web.xml` File] |
| and the link:ha-administration-guide.html#GSHAG[{productName} High |
| Availability Administration Guide]. |
| |
| [[beahd]][[GSDVG00262]][[coordinating-session-access]] |
| |
| ===== Coordinating Session Access |
| |
| Make sure that multiple threads don't simultaneously modify the same |
| session object in conflicting ways. If the persistence type is |
| `replicated` (see link:#gdshu[The `replicated` Persistence Type]), the |
| following message in the log file indicates that this might be |
| happening: |
| |
| [source] |
| ---- |
| Primary Key Constraint violation while saving session session_id |
| ---- |
| |
| This is especially likely to occur in web applications that use HTML |
| frames where multiple servlets are executing simultaneously on behalf of |
| the same client. A good solution is to ensure that one of the servlets |
| modifies the session and the others have read-only access. |
| |
| [[ghmih]][[GSDVG00263]][[saving-sessions-during-redeployment]] |
| |
| ===== Saving Sessions During Redeployment |
| |
| Whenever a redeployment is done, the sessions at that transit time |
| become invalid unless you use the `--keepstate=true` option of the |
| `asadmin redeploy` command. For example: |
| |
| [source] |
| ---- |
| asadmin redeploy --keepstate=true --name hello.war |
| ---- |
| |
| For details, see the link:reference-manual.html#GSRFM[{productName} |
| Reference Manual]. |
| |
| The default for `--keepstate` is false. This option is supported only on |
| the default server instance, named `server`. It is not supported and |
| ignored for any other target. |
| |
| For web applications, this feature is applicable only if in the |
| `glassfish-web-app.xml` file the `persistence-type` attribute of the |
| `session-manager` element is `file`. |
| |
| If any active web session fails to be preserved or restored, none of the |
| sessions will be available when the redeployment is complete. However, |
| the redeployment continues and a warning is logged. |
| |
| The new class loader of the redeployed application is used to |
| deserialize any sessions previously saved. The usual restrictions about |
| serialization and deserialization apply. For example, any |
| application-specific class referenced by a session attribute may evolve |
| only in a backward-compatible fashion. For more information about class |
| loaders, see link:class-loaders.html#beade[Class Loaders]. |
| |
| [[gixeb]][[GSDVG00264]][[logging-session-attributes]] |
| |
| ===== Logging Session Attributes |
| |
| You can write session attribute values to an access log. The access log |
| format token ``%session.``name``%`` logs one of the following: |
| |
| * The value of the session attribute with the name name |
| * ``NULL-SESSION-ATTRIBUTE-``name if the named attribute does not exist in the session |
| * `NULL-SESSION` if no session exists |
| |
| For more information about access logging and format tokens, see online |
| help for the Access Log tab of the HTTP Service page in the |
| Administration Console. |
| |
| [[beahe]][[GSDVG00265]][[distributed-sessions-and-persistence]] |
| |
| ===== Distributed Sessions and Persistence |
| |
| A distributed HTTP session can run in multiple {productName} |
| instances, provided the following criteria are met: |
| |
| * Each server instance has the same distributable web application |
| deployed to it. The `web-app` element of the `web.xml` deployment |
| descriptor file must have the `distributable` subelement specified. |
| * The web application uses high-availability session persistence. If a |
| non-distributable web application is configured to use high-availability |
| session persistence, a warning is written to the server log, and the |
| session persistence type reverts to `memory`. See link:#gdshu[The |
| `replicated` Persistence Type]. |
| * All objects bound into a distributed session must be of the types |
| listed in link:#fvyem[Table 7-3]. |
| * The web application must be deployed using the `deploy` or `deploydir` |
| command with the `--availabilityenabled` option set to `true`. See the |
| link:reference-manual.html#GSRFM[{productName} Reference Manual]. |
| |
| |
| [NOTE] |
| ==== |
| Contrary to the Servlet 5.0 specification, {productName} does not |
| throw an `IllegalArgumentException` if an object type not supported for |
| failover is bound into a distributed session. |
| |
| Keep the distributed session size as small as possible. Session size has |
| a direct impact on overall system throughput. |
| ==== |
| |
| |
| In the event of an instance or hardware failure, another server instance |
| can take over a distributed session, with the following limitations: |
| |
| * If a distributable web application references a Jakarta EE component or |
| resource, the reference might be lost. See link:#fvyem[Table 7-3] for a |
| list of the types of references that `HTTPSession` failover supports. |
| * References to open files or network connections are lost. |
| |
| For information about how to work around these limitations, see the |
| link:deployment-planning-guide.html#GSPLG[{productName} Deployment Planning |
| Guide]. |
| |
| In the following table, No indicates that failover for the object type |
| might not work in all cases and that no failover support is provided. |
| However, failover might work in some cases for that object type. For |
| example, failover might work because the class implementing that type is |
| serializable. |
| |
| For more information about the `InitialContext`, see |
| link:jndi.html#beans[Accessing the Naming Context]. For more information |
| about transaction recovery, see link:transaction-service.html#beanm[Using |
| the Transaction Service]. For more information about Administered |
| Objects, see "link:administration-guide/jms.html#GSADG00599[Administering JMS Physical Destinations]" |
| in {productName} Administration Guide. |
| |
| [[GSDVG543]][[sthref15]][[fvyem]] |
| |
| |
| Table 7-3 Object Types Supported for Jakarta EE Web Application Session |
| State Failover |
| |
| [width="100%",cols="45%,55%",options="header",] |
| |=== |
| |Java Object Type |Failover Support |
| |Colocated or distributed stateless session, stateful session, or entity |
| bean reference |Yes |
| |
| |JNDI context |Yes, `InitialContext` and `java:comp/env` |
| |
| |UserTransaction |Yes, but if the instance that fails is never |
| restarted, any prepared global transactions are lost and might not be |
| correctly rolled back or committed. |
| |
| |JDBC DataSource |No |
| |
| |Java Message Service (JMS) ConnectionFactory, Destination |No |
| |
| |JavaMail Session |No |
| |
| |Connection Factory |No |
| |
| |Administered Object |No |
| |
| |Web service reference |No |
| |
| |Serializable Java types |Yes |
| |
| |Extended persistence context |No |
| |=== |
| |
| |
| [[beahf]][[GSDVG00403]][[session-managers]] |
| |
| ==== Session Managers |
| |
| A session manager automatically creates new session objects whenever a |
| new session starts. In some circumstances, clients do not join the |
| session, for example, if the session manager uses cookies and the client |
| does not accept cookies. |
| |
| {productName} offers these session management options, determined by |
| the `session-manager` element's `persistence-type` attribute in the |
| `glassfish-web.xml` file: |
| |
| * link:#beahg[The `memory` Persistence Type], the default |
| * link:#beahh[The `file` Persistence Type], which uses a file to store |
| session data |
| * link:#gdshu[The `replicated` Persistence Type], which uses other |
| servers in the cluster for session persistence |
| |
| |
| [NOTE] |
| ==== |
| If the session manager configuration contains an error, the error is |
| written to the server log and the default (`memory`) configuration is |
| used. |
| ==== |
| |
| |
| For more information, see "link:application-deployment-guide/dd-elements.html#GSDPG00275[session-manager]" in |
| {productName} Application Deployment Guide. |
| |
| [[beahg]][[GSDVG00266]][[the-memory-persistence-type]] |
| |
| ===== The `memory` Persistence Type |
| |
| This persistence type is not designed for a production environment that |
| requires session persistence. It provides no session persistence. |
| However, you can configure it so that the session state in memory is |
| written to the file system prior to server shutdown. |
| |
| To specify the `memory` persistence type for a specific web application, |
| edit the `glassfish-web.xml` file as in the following example. The |
| `persistence-type` attribute is optional, but must be set to `memory` if |
| included. This overrides the web container availability settings for the |
| web application. |
| |
| [source,xml] |
| ---- |
| <glassfish-web-app> |
| ... |
| |
| <session-config> |
| <session-manager persistence-type="memory" /> |
| <manager-properties> |
| <property name="sessionFilename" value="sessionstate" /> |
| </manager-properties> |
| </session-manager> |
| ... |
| </session-config> |
| ... |
| </glassfish-web-app> |
| ---- |
| |
| The only manager property that the `memory` persistence type supports is |
| `sessionFilename`, which is listed under |
| "link:application-deployment-guide/dd-elements.html#GSDPG00192[manager-properties]" in {productName} Application Deployment Guide. The `sessionFilename` property |
| specifies the name of the file where sessions are serialized and |
| persisted if the web application or the server is stopped. To disable |
| this behavior, specify an empty string as the value of |
| `sessionFilename`. The default value is an empty string. |
| |
| For more information about the `glassfish-web.xml` file, see the |
| link:application-deployment-guide.html#GSDPG[{productName} Application Deployment |
| Guide]. |
| |
| [[beahh]][[GSDVG00267]][[the-file-persistence-type]] |
| |
| ===== The `file` Persistence Type |
| |
| This persistence type provides session persistence to the local file |
| system, and allows a single server domain to recover the session state |
| after a failure and restart. The session state is persisted in the |
| background, and the rate at which this occurs is configurable. The store |
| also provides passivation and activation of the session state to help |
| control the amount of memory used. This option is not supported in a |
| production environment. However, it is useful for a development system |
| with a single server instance. |
| |
| |
| [NOTE] |
| ==== |
| Make sure the `delete` option is set in the `server.policy` file, or |
| expired file-based sessions might not be deleted properly. For more |
| information about `server.policy`, see link:securing-apps.html#beabx[The |
| `server.policy` File]. |
| ==== |
| |
| |
| To specify the `file` persistence type for a specific web application, |
| edit the `glassfish-web.xml` file as in the following example. Note that |
| `persistence-type` must be set to `file`. This overrides the web |
| container availability settings for the web application. |
| |
| [source,xml] |
| ---- |
| <glassfish-web-app> |
| ... |
| <session-config> |
| <session-manager persistence-type="file"> |
| <store-properties> |
| <property name="directory" value="sessiondir" /> |
| </store-properties> |
| </session-manager> |
| ... |
| </session-config> |
| ... |
| </glassfish-web-app> |
| ---- |
| |
| The `file` persistence type supports all the manager properties listed |
| under "link:application-deployment-guide/dd-elements.html#GSDPG00192[manager-properties]" in {productName} Application Deployment Guide except `sessionFilename`, |
| and supports the `directory` store property listed under |
| "link:application-deployment-guide/dd-elements.html#GSDPG00279[store-properties]" in {productName} Application Deployment Guide. |
| |
| For more information about the `glassfish-web.xml` file, see the |
| link:application-deployment-guide.html#GSDPG[{productName} Application Deployment |
| Guide]. |
| |
| [[gdshu]][[GSDVG00268]][[the-replicated-persistence-type]] |
| |
| ===== The `replicated` Persistence Type |
| |
| The replicated persistence type uses other servers in the cluster for |
| session persistence. Clustered server instances replicate session state. |
| Each backup instance stores the replicated data in memory. This allows |
| sessions to be distributed. For details, see link:#beahe[Distributed |
| Sessions and Persistence]. In addition, you can configure the frequency |
| and scope of session persistence. The other servers are also used as the |
| passivation and activation store. Use this option in a production |
| environment that requires session persistence. |
| |
| To use the replicated persistence type, you must enable availability. |
| Select the Availability Service component under the relevant |
| configuration in the Administration Console. Check the Availability |
| Service box. To enable availability for the web container, select the |
| Web Container Availability tab, then check the Availability Service box. |
| All instances in an {productName} cluster should have the same |
| availability settings to ensure consistent behavior. For details, see |
| the link:ha-administration-guide.html#GSHAG[{productName} High Availability |
| Administration Guide]. |
| |
| To change settings such as persistence frequency and persistence scope |
| for the entire web container, use the Persistence Frequency and |
| Persistence Scope drop-down lists on the Web Container Availability tab |
| in the Administration Console, or use the `asadmin set` command. For |
| example: |
| |
| [source] |
| ---- |
| asadmin set |
| server-config.availability-service.web-container-availability.persistence-frequency=time-based |
| ---- |
| |
| For more information, see the description of the `asadmin set` command |
| in the link:reference-manual.html#GSRFM[{productName} Reference |
| Manual]. |
| |
| To specify the `replicated` persistence type for a specific web |
| application, edit the `glassfish-web.xml` file as in the following |
| example. Note that `persistence-type` must be set to `replicated`. This |
| overrides the web container availability settings for the web |
| application. |
| |
| [source,xml] |
| ---- |
| <glassfish-web-app> |
| ... |
| <session-config> |
| <session-manager persistence-type="replicated"> |
| <manager-properties> |
| <property name="persistenceFrequency" value="web-method" /> |
| </manager-properties> |
| <store-properties> |
| <property name="persistenceScope" value="session" /> |
| </store-properties> |
| </session-manager> |
| ... |
| </session-config> |
| ... |
| </glassfish-web-app> |
| ---- |
| |
| The `replicated` persistence type supports all the manager properties |
| listed under "link:application-deployment-guide/dd-elements.html#GSDPG00192[manager-properties]" in {productName} Application Deployment Guide except |
| `sessionFilename`, and supports the `persistenceScope` store property |
| listed under "link:application-deployment-guide/dd-elements.html#GSDPG00279[store-properties]" in {productName} Application Deployment Guide. |
| |
| For more information about the `glassfish-web.xml` file, see the |
| link:application-deployment-guide.html#GSDPG[{productName} Application Deployment |
| Guide]. |
| |
| To specify that web sessions for which high availability is enabled are |
| first buffered and then replicated using a separate asynchronous thread, |
| use the `--asyncreplication=true` option of the `asadmin deploy` |
| command. For example: |
| |
| [source] |
| ---- |
| asadmin deploy --availabilityenabled=true --asyncreplication=true --name hello.war |
| ---- |
| |
| If `--asyncreplication` is set to true (the default), performance is |
| improved but availability is reduced. If the instance where states are |
| buffered but not yet replicated fails, the states are lost. If set to |
| false, performance is reduced but availability is guaranteed. States are |
| not buffered but immediately transmitted to other instances in the |
| cluster. |
| |
| [[ggrgt]][[GSDVG00143]][[using-comet]] |
| |
| === Using Comet |
| |
| This section explains the Comet programming technique and how to create |
| and deploy a Comet-enabled application with the {productName}. |
| |
| The following topics are addressed here: |
| |
| * link:#ggrgy[Introduction to Comet] |
| * link:#ghgxk[Grizzly Comet] |
| * link:#ghgxn[Bayeux Protocol] |
| |
| [[ggrgy]][[GSDVG00404]][[introduction-to-comet]] |
| |
| ==== Introduction to Comet |
| |
| Comet is a programming technique that allows a web server to send |
| updates to clients without requiring the clients to explicitly request |
| them. |
| |
| This kind of programming technique is called server push, which means |
| that the server pushes data to the client. The opposite style is client |
| pull, which means that the client must pull the data from the server, |
| usually through a user-initiated event, such as a button click. |
| |
| Web applications that use the Comet technique can deliver updates to |
| clients in a more timely manner than those that use the client-pull |
| style while avoiding the latency that results from clients frequently |
| polling the server. |
| |
| One of the many use cases for Comet is a chat room application. When the |
| server receives a message from one of the chat clients, it needs to send |
| the message to the other clients without requiring them to ask for it. |
| With Comet, the server can deliver messages to the clients as they are |
| posted rather than expecting the clients to poll the server for new |
| messages. |
| |
| To accomplish this scenario, a Comet application establishes a |
| long-lived HTTP connection. This connection is suspended on the server |
| side, waiting for an event to happen before resuming. This kind of |
| connection remains open, allowing an application that uses the Comet |
| technique to send updates to clients when they are available rather than |
| expecting clients to reopen the connection to poll the server for |
| updates. |
| |
| [[ggrib]][[GSDVG00270]][[the-grizzly-implementation-of-comet]] |
| |
| ===== The Grizzly Implementation of Comet |
| |
| A limitation of the Comet technique is that you must use it with a web |
| server that supports non-blocking connections to avoid poor performance. |
| Non-blocking connections are those that do not need to allocate one |
| thread for each request. If the web server were to use blocking |
| connections then it might end up holding many thousands of threads, |
| thereby hindering its scalability. |
| |
| The {productName} includes the Grizzly HTTP Engine, which enables |
| asynchronous request processing (ARP) by avoiding blocking connections. |
| Grizzly's ARP implementation accomplishes this by using the Java NIO |
| API. |
| |
| With Java NIO, Grizzly enables greater performance and scalability by |
| avoiding the limitations experienced by traditional web servers that |
| must run a thread for each request. Instead, Grizzly's ARP mechanism |
| makes efficient use of a thread pool system and also keeps the state of |
| requests so that it can keep requests alive without holding a single |
| thread for each of them. |
| |
| Grizzly supports two different implementations of Comet: |
| |
| * link:#ghgxk[Grizzly Comet] — Based on ARP, this includes a set of APIs |
| that you use from a web component to enable Comet functionality in your |
| web application. Grizzly Comet is specific to the {productName}. |
| * link:#ghgxn[Bayeux Protocol] — Often referred to as `Cometd`, it |
| consists of the JSON-based Bayeux message protocol, a set of Dojo or |
| Ajax libraries, and an event handler. The Bayeux protocol uses a |
| publish/subscribe model for server/client communication. The Bayeux |
| protocol is portable, but it is container dependent if you want to |
| invoke it from an Enterprise Java Beans (EJB ) component. The Grizzly |
| implementation of `Cometd` consists of a servlet that you reference from |
| your web application. |
| |
| [[ggrim]][[GSDVG00271]][[client-technologies-to-use-with-comet]] |
| |
| ===== Client Technologies to Use With Comet |
| |
| In addition to creating a web component that uses the Comet APIs, you |
| need to enable your client to accept asynchronous updates from the web |
| component. To accomplish this, you can use JavaScript, IFrames, or a |
| framework, such as http://dojotoolkit.org[Dojo] |
| (`http://dojotoolkit.org`). |
| |
| An IFrame is an HTML element that allows you to include other content in |
| an HTML page. As a result, the client can embed updated content in the |
| IFrame without having to reload the page. |
| |
| The example in this tutorial employs a combination of JavaScript and |
| IFrames to allow the client to accept asynchronous updates. A servlet |
| included in the example writes out JavaScript code to one of the |
| IFrames. The JavaScript code contains the updated content and invokes a |
| function in the page that updates the appropriate elements in the page |
| with the new content. |
| |
| The next section explains the two kinds of connections that you can make |
| to the server. While you can use any of the client technologies listed |
| in this section with either kind of connection, it is more difficult to |
| use JavaScript with an HTTP-streaming connection. |
| |
| [[ggrgo]][[GSDVG00272]][[types-of-comet-connections]] |
| |
| ===== Types of Comet Connections |
| |
| When working with Comet, as implemented in Grizzly, you have two |
| different ways to handle client connections to the server: |
| |
| * HTTP Streaming |
| * Long Polling |
| |
| [[ggriu]][[GSDVG00027]][[http-streaming]] |
| |
| HTTP Streaming |
| |
| The HTTP Streaming technique keeps a connection open indefinitely. It |
| never closes, even after the server pushes data to the client. |
| |
| In the case of HTTP streaming, the application sends a single request |
| and receives responses as they come, reusing the same connection |
| forever. This technique significantly reduces the network latency |
| because the client and the server don't need to open and close the |
| connection. |
| |
| The basic life cycle of an application using HTTP-streaming is: |
| |
| request > suspend > data available > write response > data available > |
| write response |
| |
| The client makes an initial request and then suspends the request, |
| meaning that it waits for a response. Whenever data is available, the |
| server writes it to the response. |
| |
| [[ggrhv]][[GSDVG00028]][[long-polling]] |
| |
| Long Polling |
| |
| The long-polling technique is a combination of server-push and |
| client-pull because the client needs to resume the connection after a |
| certain amount of time or after the server pushes an update to the |
| client. |
| |
| The basic life cycle of an application using long-polling is: |
| |
| request > suspend > data available > write response > resume |
| |
| The client makes an initial request and then suspends the request. When |
| an update is available, the server writes it to the response. The |
| connection closes, and the client optionally resumes the connection. |
| |
| [[ggtjb]][[GSDVG00029]][[how-to-choose-the-type-of-connection]] |
| |
| How to Choose the Type of Connection |
| |
| If you anticipate that your web application will need to send frequent |
| updates to the client, you should use the HTTP-streaming connection so |
| that the client does not have to frequently reestablish a connection. If |
| you anticipate less frequent updates, you should use the long-polling |
| connection so that the web server does not need to keep a connection |
| open when no updates are occurring. One caveat to using the |
| HTTP-streaming connection is that if you are streaming through a proxy, |
| the proxy can buffer the response from the server. So, be sure to test |
| your application if you plan to use HTTP-streaming behind a proxy. |
| |
| [[ghgxk]][[GSDVG00405]][[grizzly-comet]] |
| |
| ==== Grizzly Comet |
| |
| For details on using Grizzly Comet including a sample application, refer |
| to the https://eclipse-ee4j.github.io/grizzly/comet.html[Grizzly Comet documentation]. |
| |
| Grizzly's support for Comet includes a small set of APIs that make it |
| easy to add Comet functionality to your web applications. The Grizzly |
| Comet APIs that developers use most often are the following: |
| |
| * `CometContext`: A Comet context, which is a shareable space to which |
| applications subscribe to receive updates. |
| * `CometEngine`: The entry point to any component using Comet. |
| Components can be servlets, JavaServer Pages ( JSP), JavaServer Faces |
| components, or pure Java classes. |
| * `CometEvent`: Contains the state of the `CometContext` object |
| * `CometHandler`: The interface an application implements to be part of |
| one or more Comet contexts. |
| |
| The way a developer would use this API in a web component is to perform |
| the following tasks: |
| |
| 1. Register the context path of the application with the `CometContext` |
| object: |
| + |
| [source,java] |
| ---- |
| CometEngine cometEngine = CometEngine.getEngine(); |
| CometContext cometContext = cometEngine.register(contextPath) |
| ---- |
| 2. Register the CometHandler implementation with the `CometContext` |
| object: |
| + |
| [source,java] |
| ---- |
| cometContext.addCometHandler(handler) |
| ---- |
| 3. Notify one or more CometHandler implementations when an event |
| happens: |
| + |
| [source,java] |
| ---- |
| cometContext.notify((Object)(handler)) |
| ---- |
| |
| [[ghgxn]][[GSDVG00406]][[bayeux-protocol]] |
| |
| ==== Bayeux Protocol |
| |
| The Bayeux protocol, often referred to as `Cometd`, greatly simplifies |
| the use of Comet. No server-side coding is needed for servers such as |
| {productName} that support the Bayeux protocol. Just enable Comet and |
| the Bayeux protocol, then write and deploy the client. |
| |
| The following topics are addressed here: |
| |
| * link:#ghhaw[Enabling Comet] |
| * link:#ghhap[To Configure the `web.xml` File] |
| * link:#ghhtv[To Write, Deploy, and Run the Client] |
| |
| [[ghhaw]][[GSDVG00280]][[enabling-comet]] |
| |
| ===== Enabling Comet |
| |
| Before running a Comet-enabled application, you need to enable Comet in |
| the HTTP listener for your application by setting a special attribute in |
| the associated protocol configuration. The following example shows the |
| `asadmin set` command that adds this attribute: |
| |
| [source] |
| ---- |
| asadmin set server-config.network-config.protocols.protocol.http-1.http.comet-support-enabled="true" |
| ---- |
| |
| Substitute the name of the protocol for `http-1`. |
| |
| [[ghhap]][[GSDVG00067]][[to-configure-the-web.xml-file]] |
| |
| ===== To Configure the `web.xml` File |
| |
| To enable the Bayeux protocol on the {productName}, you must |
| reference the `CometdServlet` in your web application's `web.xml` file. |
| In addition, if your web application includes a servlet, set the |
| `load-on-startup` value for your servlet to `0` (zero) so that it will |
| not load until the client makes a request to it. |
| |
| 1. Open the `web.xml` file for your web application in a text editor. |
| 2. Add the following XML code to the `web.xml` file: |
| + |
| [source,xml] |
| ---- |
| <servlet> |
| <servlet-name>Grizzly Cometd Servlet</servlet-name> |
| <servlet-class> |
| com.sun.grizzly.cometd.servlet.CometdServlet |
| </servlet-class> |
| <init-param> |
| <description> |
| expirationDelay is the long delay before a request is |
| resumed. -1 means never. |
| </description> |
| <param-name>expirationDelay</param-name> |
| <param-value>-1</param-value> |
| </init-param> |
| <load-on-startup>1</load-on-startup> |
| </servlet> |
| <servlet-mapping> |
| <servlet-name>Grizzly Cometd Servlet</servlet-name> |
| <url-pattern>/cometd/*</url-pattern> |
| </servlet-mapping> |
| ---- |
| Note that the `load-on-startup` value for the `CometdServlet` is `1`. |
| 3. If your web application includes a servlet, set the |
| `load-on-startup` value to `0` for your servlet (not the |
| `CometdServlet`) as follows: |
| + |
| [source,xml] |
| ---- |
| <servlet> |
| ... |
| <load-on-startup>0</load-on-startup> |
| </servlet> |
| ---- |
| 4. Save the `web.xml` file. |
| |
| [[ghhtv]][[GSDVG00068]][[to-write-deploy-and-run-the-client]] |
| |
| ===== To Write, Deploy, and Run the Client |
| |
| 1. Add script tags to the HTML page. For example: |
| + |
| [source,xml] |
| ---- |
| <script type="text/javascript" src="chat.js"></script> |
| ---- |
| 2. In the script, call the needed libraries. For example: |
| + |
| [source] |
| ---- |
| dojo.require("dojo.io.cometd"); |
| ---- |
| 3. In the script, use `publish` and `subscribe` methods to send and |
| receive messages. For example: |
| + |
| [source] |
| ---- |
| cometd.subscribe("/chat/demo", false, room, "_chat"); |
| cometd.publish("/chat/demo", { user: room._username, chat: text}); |
| ---- |
| 4. Deploy the web application as you would any other web application. |
| For example: |
| + |
| [source] |
| ---- |
| asadmin deploy cometd-example.war |
| ---- |
| 5. Run the application as you would any other web application. |
| + |
| The context root for the example chat application is ``/cometd`` and the |
| HTML page is `index.html`. So the URL might look like this: |
| + |
| [source] |
| ---- |
| http://localhost:8080/cometd/index.html |
| ---- |
| |
| [[GSDVG544]] |
| |
| See Also |
| |
| For more information about deployment in the {productName}, see the |
| link:application-deployment-guide.html#GSDPG[{productName} Application Deployment |
| Guide]. |
| |
| For more information about the Bayeux protocol, see |
| https://docs.cometd.org/current/reference/#_bayeux[Bayeux Protocol] |
| (`https://docs.cometd.org/current/reference/#_bayeux`). |
| |
| For more information about the Dojo toolkit, see |
| `http://dojotoolkit.org/`. |
| |
| [[beaft]][[GSDVG00144]][[advanced-web-application-features]] |
| |
| === Advanced Web Application Features |
| |
| The following topics are addressed here: |
| |
| * link:#beafu[Internationalization Issues] |
| * link:#gilyj[Virtual Server Properties] |
| * link:#beagb[Class Loader Delegation] |
| * link:#beagc[Using the `default-web.xml` File] |
| * link:#beagd[Configuring Logging and Monitoring in the Web Container] |
| * link:#beage[Configuring Idempotent URL Requests] |
| * link:#beagi[Header Management] |
| * link:#geqrh[Configuring Valves and Catalina Listeners] |
| * link:#geqpl[Alternate Document Roots] |
| * link:#geurd[Using a context.xml File] |
| * link:#gezcx[Enabling WebDav] |
| * link:#ghepd[Using SSI] |
| * link:#ghepi[Using CGI] |
| |
| [[beafu]][[GSDVG00407]][[internationalization-issues]] |
| |
| ==== Internationalization Issues |
| |
| The following topics are addressed here: |
| |
| * link:#beafv[The Server's Default Locale] |
| * link:#beafw[Servlet Character Encoding] |
| |
| [[beafv]][[GSDVG00281]][[the-servers-default-locale]] |
| |
| ===== The Server's Default Locale |
| |
| To set the default locale of the entire {productName}, which |
| determines the locale of the Administration Console, the logs, and so |
| on, use the Administration Console. Select the domain component. Then |
| type a value in the Locale field. For details, click the Help button in |
| the Administration Console. |
| |
| [[beafw]][[GSDVG00282]][[servlet-character-encoding]] |
| |
| ===== Servlet Character Encoding |
| |
| This section explains how the {productName} determines the character |
| encoding for the servlet request and the servlet response. For encodings |
| you can use, see |
| `http://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html`. |
| |
| [[beafx]][[GSDVG00031]][[servlet-request]] |
| |
| Servlet Request |
| |
| When processing a servlet request, the server uses the following order |
| of precedence, first to last, to determine the request character |
| encoding: |
| |
| * The `getCharacterEncoding` method |
| * A hidden field in the form, specified by the `form-hint-field` |
| attribute of the `parameter-encoding` element in the `glassfish-web.xml` |
| file |
| * The `default-charset` attribute of the `parameter-encoding` element in |
| the `glassfish-web.xml` file |
| * The default, which is `ISO-8859-1` |
| |
| For details about the `parameter-encoding` element, see |
| "link:application-deployment-guide/dd-elements.html#GSDPG00218[parameter-encoding]" in {productName} Application Deployment Guide. |
| |
| [[beafy]][[GSDVG00032]][[servlet-response]] |
| |
| Servlet Response |
| |
| When processing a servlet response, the server uses the following order |
| of precedence, first to last, to determine the response character |
| encoding: |
| |
| * The `setCharacterEncoding` or `setContentType` method |
| * The `setLocale` method |
| * The default, which is `ISO-8859-1` |
| |
| [[gilyj]][[GSDVG00408]][[virtual-server-properties]] |
| |
| ==== Virtual Server Properties |
| |
| You can set virtual server properties in the following ways: |
| |
| * You can define virtual server properties using the |
| `asadmin create-virtual-server` command. For example: |
| + |
| [source] |
| ---- |
| asadmin create-virtual-server --hosts localhost --property authRealm=ldap MyVS |
| ---- |
| For details and a complete list of virtual server properties, see |
| link:reference-manual/create-virtual-server.html#GSRFM00062[`create-virtual-server`(1)]. |
| * You can define virtual server properties using the `asadmin set` |
| command. For example: |
| + |
| [source] |
| ---- |
| asadmin set server-config.http-service.virtual-server.MyVS.property.authRealm="ldap" |
| ---- |
| For details, see link:reference-manual/set.html#GSRFM00226[`set`(1)]. |
| * You can define virtual server properties using the Administration |
| Console. Select the HTTP Service component under the relevant |
| configuration, select Virtual Servers, and select the desired virtual |
| server. Select Add Property, enter the property name and value, check |
| the enable box, and select Save. For details and a complete list of |
| virtual server properties, click the Help button in the Administration |
| Console. |
| |
| Some virtual server properties can be set for a specific web |
| application. For details, see "link:application-deployment-guide/dd-elements.html#GSDPG00161[glassfish-web-app]" in |
| {productName} Application Deployment Guide. |
| |
| [[beagb]][[GSDVG00409]][[class-loader-delegation]] |
| |
| ==== Class Loader Delegation |
| |
| The Servlet specification recommends that a web application class loader |
| look in the local class loader before delegating to its parent. To make |
| the web application class loader follow the delegation model in the |
| Servlet specification, set `delegate="false"` in the `class-loader` |
| element of the `glassfish-web.xml` file. It's safe to do this only for a |
| web module that does not interact with any other modules. |
| |
| The default value is `delegate="true"`, which causes the web application |
| class loader to delegate in the same manner as the other class loaders. |
| Use `delegate="true"` for a web application that accesses EJB components |
| or that acts as a web service client or endpoint. For details about |
| `glassfish-web.xml`, see the link:application-deployment-guide.html#GSDPG[{productName} Application Deployment Guide]. |
| |
| For a number of packages, including `java.*` and `javax.*`, symbol |
| resolution is always delegated to the parent class loader regardless of |
| the `delegate` setting. This prevents applications from overriding core |
| Java runtime classes or changing the API versions of specifications that |
| are part of the Jakarta EE platform. |
| |
| For general information about class loaders, see |
| link:class-loaders.html#beade[Class Loaders]. |
| |
| [[beagc]][[GSDVG00410]][[using-the-default-web.xml-file]] |
| |
| ==== Using the `default-web.xml` File |
| |
| You can use the `default-web.xml` file to define features such as |
| filters and security constraints that apply to all web applications. |
| |
| For example, directory listings are disabled by default for added |
| security. To enable directory listings, in your domain's |
| `default-web.xml` file, search for the definition of the servlet whose |
| `servlet-name` is equal to `default`, and set the value of the |
| `init-param` named `listings` to `true`. Then redeploy your web |
| application if it has already been deployed, or restart the server. |
| |
| [source,xml] |
| ---- |
| <init-param> |
| <param-name>listings</param-name> |
| <param-value>true</param-value> |
| </init-param> |
| ---- |
| |
| If `listings` is set to `true`, you can also determine how directory |
| listings are sorted. Set the value of the `init-param` named `sortedBy` |
| to `NAME`, `SIZE`, or `LAST_MODIFIED`. Then redeploy your web |
| application if it has already been deployed, or restart the server. |
| |
| [source,xml] |
| ---- |
| <init-param> |
| <param-name>sortedBy</param-name> |
| <param-value>LAST_MODIFIED</param-value> |
| </init-param> |
| ---- |
| |
| The `mime-mapping` elements in `default-web.xml` are global and |
| inherited by all web applications. You can override these mappings or |
| define your own using `mime-mapping` elements in your web application's |
| `web.xml` file. For more information about `mime-mapping` elements, see |
| the Servlet specification. |
| |
| You can use the Administration Console to edit the `default-web.xml` |
| file. For details, click the Help button in the Administration Console. |
| As an alternative, you can edit the file directly using the following |
| steps. |
| |
| [[fvymc]][[GSDVG00069]][[to-use-the-default-web.xml-file]] |
| |
| ===== To Use the `default-web.xml` File |
| |
| 1. Place the JAR file for the filter, security constraint, or other |
| feature in the domain-dir``/lib`` directory. |
| 2. Edit the domain-dir``/config/default-web.xml`` file to refer to the |
| JAR file. |
| 3. Restart the server. |
| |
| [[beagd]][[GSDVG00411]][[configuring-logging-and-monitoring-in-the-web-container]] |
| |
| ==== Configuring Logging and Monitoring in the Web Container |
| |
| For information about configuring logging and monitoring in the web |
| container using the Administration Console, click the Help button in the |
| Administration Console. Select Logger Settings under the relevant |
| configuration, or select the Stand-Alone Instances component, select the |
| instance from the table, and select the Monitor tab. |
| |
| [[beage]][[GSDVG00412]][[configuring-idempotent-url-requests]] |
| |
| ==== Configuring Idempotent URL Requests |
| |
| An idempotent request is one that does not cause any change or |
| inconsistency in an application when retried. To enhance the |
| availability of your applications deployed on an {productName} |
| cluster, configure the load balancer to retry failed idempotent HTTP |
| requests on all the {productName} instances in a cluster. This option |
| can be used for read-only requests, for example, to retry a search |
| request. |
| |
| The following topics are addressed here: |
| |
| * link:#beagf[Specifying an Idempotent URL] |
| * link:#beagg[Characteristics of an Idempotent URL] |
| |
| [[beagf]][[GSDVG00283]][[specifying-an-idempotent-url]] |
| |
| ===== Specifying an Idempotent URL |
| |
| To configure idempotent URL response, specify the URLs that can be |
| safely retried in `idempotent-url-pattern` elements in the |
| `glassfish-web.xml` file. For example: |
| |
| [source,xml] |
| ---- |
| <idempotent-url-pattern url-pattern="sun_java/*" no-of-retries="10"/> |
| ---- |
| |
| For details, see "link:application-deployment-guide/dd-elements.html#GSDPG00164[idempotent-url-pattern]" in {productName} Application Deployment Guide. |
| |
| If none of the server instances can successfully serve the request, an |
| error page is returned. |
| |
| [[beagg]][[GSDVG00284]][[characteristics-of-an-idempotent-url]] |
| |
| ===== Characteristics of an Idempotent URL |
| |
| Since all requests for a given session are sent to the same application |
| server instance, and if that {productName} instance is unreachable, |
| the load balancer returns an error message. Normally, the request is not |
| retried on another {productName} instance. However, if the URL |
| pattern matches that specified in the `glassfish-web.xml` file, the |
| request is implicitly retried on another {productName} instance in |
| the cluster. |
| |
| In HTTP, some methods (such as GET) are idempotent, while other methods |
| (such as POST) are not. In effect, retrying an idempotent URL should not |
| cause values to change on the server or in the database. The only |
| difference should be a change in the response received by the user. |
| |
| Examples of idempotent requests include search engine queries and |
| database queries. The underlying principle is that the retry does not |
| cause an update or modification of data. |
| |
| A search engine, for example, sends HTTP requests with the same URL |
| pattern to the load balancer. Specifying the URL pattern of the search |
| request to the load balancer ensures that HTTP requests with the |
| specified URL pattern are implicitly retried on another {productName} |
| instance. |
| |
| For example, if the request URL sent to the {productName} is of the |
| type ``/search/``something``.html``, then the URL pattern can be specified |
| as ``/search/*``. |
| |
| Examples of non-idempotent requests include banking transactions and |
| online shopping. If you retry such requests, money might be transferred |
| twice from your account. |
| |
| [[beagi]][[GSDVG00413]][[header-management]] |
| |
| ==== Header Management |
| |
| In all Editions of the {productName}, the `Enumeration` from |
| `request.getHeaders()` contains multiple elements (one element per |
| request header) instead of a single, aggregated value. |
| |
| The header names used in ``HttpServletResponse.add``XXX``Header()`` and |
| ``HttpServletResponse.set``XXX``Header()`` are returned as they were |
| created. |
| |
| [[geqrh]][[GSDVG00414]][[configuring-valves-and-catalina-listeners]] |
| |
| ==== Configuring Valves and Catalina Listeners |
| |
| You can configure custom valves and Catalina listeners for web modules |
| or virtual servers by defining properties. A valve class must implement |
| the org.apache.catalina.Valve interface from Tomcat or previous |
| {productName} releases, or the org.glassfish.web.valve.GlassFishValve |
| interface from the current {productName} release. A listener class |
| for a virtual server must implement the |
| org.apache.catalina.ContainerListener or |
| org.apache.catalina.LifecycleListener interface. A listener class for a |
| web module must implement the org.apache.catalina.ContainerListener , |
| org.apache.catalina.LifecycleListener, or |
| org.apache.catalina.InstanceListener interface. |
| |
| In the `glassfish-web.xml` file, valve and listener properties for a web |
| module look like this: |
| |
| [source,xml] |
| ---- |
| <glassfish-web-app ...> |
| ... |
| <property name="valve_1" value="org.glassfish.extension.Valve"/> |
| <property name="listener_1" value="org.glassfish.extension.MyLifecycleListener"/> |
| </glassfish-web-app> |
| ---- |
| |
| You can define these same properties for a virtual server. For more |
| information, see link:#gilyj[Virtual Server Properties]. |
| |
| [[geqpl]][[GSDVG00415]][[alternate-document-roots]] |
| |
| ==== Alternate Document Roots |
| |
| An alternate document root (docroot) allows a web application to serve |
| requests for certain resources from outside its own docroot, based on |
| whether those requests match one (or more) of the URI patterns of the |
| web application's alternate docroots. |
| |
| To specify an alternate docroot for a web application or a virtual |
| server, use the `alternatedocroot_n` property, where n is a positive |
| integer that allows specification of more than one. This property can be |
| a subelement of a `glassfish-web-app` element in the `glassfish-web.xml` |
| file or a virtual server property. For more information about these |
| elements, see "link:application-deployment-guide/dd-elements.html#GSDPG00161[glassfish-web-app]" in {productName} Application Deployment Guide. |
| |
| A virtual server's alternate docroots are considered only if a request |
| does not map to any of the web modules deployed on that virtual server. |
| A web module's alternate docroots are considered only once a request has |
| been mapped to that web module. |
| |
| If a request matches an alternate docroot's URI pattern, it is mapped to |
| the alternate docroot by appending the request URI (minus the web |
| application's context root) to the alternate docroot's physical location |
| (directory). If a request matches multiple URI patterns, the alternate |
| docroot is determined according to the following precedence order: |
| |
| * Exact match |
| * Longest path match |
| * Extension match |
| |
| For example, the following properties specify three `glassfish-web.xml` |
| docroots. The URI pattern of the first alternate docroot uses an exact |
| match, whereas the URI patterns of the second and third alternate |
| docroots use extension and longest path prefix matches, respectively. |
| |
| [source,xml] |
| ---- |
| <property name="alternatedocroot_1" value="from=/my.jpg dir=/srv/images/jpg"/> |
| <property name="alternatedocroot_2" value="from=*.jpg dir=/srv/images/jpg"/> |
| <property name="alternatedocroot_3" value="from=/jpg/* dir=/src/images"/> |
| ---- |
| |
| The `value` of each alternate docroot has two components: The first |
| component, `from`, specifies the alternate docroot's URI pattern, and |
| the second component, `dir`, specifies the alternate docroot's physical |
| location (directory). |
| |
| Suppose the above examples belong to a web application deployed at |
| `http://company22.com/myapp`. The first alternate docroot maps any |
| requests with this URL: |
| |
| [source] |
| ---- |
| http://company22.com/myapp/my.jpg |
| ---- |
| |
| To this resource: |
| |
| [source] |
| ---- |
| /svr/images/jpg/my.jpg |
| ---- |
| |
| The second alternate docroot maps any requests with a `*.jpg` suffix, |
| such as: |
| |
| [source] |
| ---- |
| http://company22.com/myapp/*.jpg |
| ---- |
| |
| To this physical location: |
| |
| [source] |
| ---- |
| /svr/images/jpg |
| ---- |
| |
| The third alternate docroot maps any requests whose URI starts with |
| `/myapp/jpg/`, such as: |
| |
| [source] |
| ---- |
| http://company22.com/myapp/jpg/* |
| ---- |
| |
| To the same directory as the second alternate docroot. |
| |
| For example, the second alternate docroot maps this request: |
| |
| [source] |
| ---- |
| http://company22.com/myapp/abc/def/my.jpg |
| ---- |
| |
| To: |
| |
| [source] |
| ---- |
| /srv/images/jpg/abc/def/my.jpg |
| ---- |
| |
| The third alternate docroot maps: |
| |
| [source] |
| ---- |
| http://company22.com/myapp/jpg/abc/resource |
| ---- |
| |
| To: |
| |
| [source] |
| ---- |
| /srv/images/jpg/abc/resource |
| ---- |
| |
| If a request does not match any of the target web application's |
| alternate docroots, or if the target web application does not specify |
| any alternate docroots, the request is served from the web application's |
| standard docroot, as usual. |
| |
| [[geurd]][[GSDVG00416]][[using-a-context.xml-file]] |
| |
| ==== Using a context.xml File |
| |
| You can define a `context.xml` file for all web applications, for web |
| applications assigned to a specific virtual server, or for a specific |
| web application. |
| |
| To define a global `context.xml` file, place the file in the |
| domain-dir``/config`` directory and name it `context.xml`. |
| |
| Use the `contextXmlDefault` property to specify the name and the |
| location, relative to domain-dir, of the `context.xml` file for a |
| specific virtual server. Specify this property in one of the following |
| ways: |
| |
| * In the Administration Console, open the HTTP Service component under |
| the relevant configuration. Open the Virtual Servers component and |
| scroll down to the bottom of the page. Enter `contextXmlDefault` as the |
| property name and the path and file name relative to domain-dir as the |
| property value. |
| * Use the `asadmin create-virtual-server` command. For example: |
| + |
| [source] |
| ---- |
| asadmin create-virtual-server --property contextXmlDefault=config/vs1ctx.xml vs1 |
| ---- |
| * Use the `asadmin set` command for an existing virtual server. For |
| example: |
| + |
| [source] |
| ---- |
| asadmin set server-config.http-service.virtual-server.vs1.property.contextXmlDefault=config/myctx.xml |
| ---- |
| |
| To define a `context.xml` file for a specific web application, place the |
| file in the `META-INF` directory and name it `context.xml`. |
| |
| For more information about virtual server properties, see |
| link:#gilyj[Virtual Server Properties]. For more information about the |
| `context.xml` file, see |
| http://tomcat.apache.org/tomcat-5.5-doc/config/context.html[The Context |
| Container] |
| (`http://tomcat.apache.org/tomcat-5.5-doc/config/context.html`). Context |
| parameters, environment entries, and resource definitions in |
| `context.xml` are supported in the {productName}. |
| |
| [[gezcx]][[GSDVG00417]][[enabling-webdav]] |
| |
| ==== Enabling WebDav |
| |
| To enable WebDav in the {productName}, you edit the `web.xml` and |
| `glassfish-web.xml` files as follows. |
| |
| First, enable the WebDav servlet in your `web.xml` file: |
| |
| [source,xml] |
| ---- |
| <servlet> |
| <servlet-name>webdav</servlet-name> |
| <servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class> |
| <init-param> |
| <param-name>debug</param-name> |
| <param-value>0</param-value> |
| </init-param> |
| <init-param> |
| <param-name>listings</param-name> |
| <param-value>true</param-value> |
| </init-param> |
| <init-param> |
| <param-name>readonly</param-name> |
| <param-value>false</param-value> |
| </init-param> |
| </servlet> |
| ---- |
| |
| Then define the servlet mapping associated with your WebDav servlet in |
| your `web.xml` file: |
| |
| [source,xml] |
| ---- |
| <servlet-mapping> |
| <servlet-name>webdav</servlet-name> |
| <url-pattern>/webdav/*</url-pattern> |
| </servlet-mapping> |
| ---- |
| |
| To protect the WebDav servlet so other users can't modify it, add a |
| security constraint in your `web.xml` file: |
| |
| [source,xml] |
| ---- |
| <security-constraint> |
| <web-resource-collection> |
| <web-resource-name>Login Resources</web-resource-name> |
| <url-pattern>/webdav/*</url-pattern> |
| </web-resource-collection> |
| <auth-constraint> |
| <role-name>Admin</role-name> |
| </auth-constraint> |
| <user-data-constraint> |
| <transport-guarantee>NONE</transport-guarantee> |
| </user-data-constraint> |
| <login-config> |
| <auth-method>BASIC</auth-method> |
| <realm-name>default</realm-name> |
| </login-config> |
| <security-role> |
| <role-name>Admin</role-name> |
| </security-role> |
| </security-constraint> |
| ---- |
| |
| Then define a security role mapping in your `glassfish-web.xml` file: |
| |
| [source,xml] |
| ---- |
| <security-role-mapping> |
| <role-name>Admin</role-name> |
| <group-name>Admin</group-name> |
| </security-role-mapping> |
| ---- |
| |
| If you are using the `file` realm, create a user and password. For |
| example: |
| |
| [source] |
| ---- |
| asadmin create-file-user --groups Admin --authrealmname default admin |
| ---- |
| |
| Enable the security manager as described in |
| link:securing-apps.html#gbyah[Enabling and Disabling the Security |
| Manager]. |
| |
| You can now use any WebDav client by connecting to the WebDav servlet |
| URL, which has this format: |
| |
| [source] |
| ---- |
| http://host:port/context-root/webdav/file |
| ---- |
| |
| For example: |
| |
| [source] |
| ---- |
| http://localhost:80/glassfish-webdav/webdav/index.html |
| ---- |
| |
| You can add the WebDav servlet to your `default-web.xml` file to enable |
| it for all applications, but you can't set up a security role mapping to |
| protect it. |
| |
| [[ghepd]][[GSDVG00418]][[using-ssi]] |
| |
| ==== Using SSI |
| |
| To enable SSI (server-side includes) processing for a specific web |
| module, add the `SSIServlet` to your `web.xml` file as follows: |
| |
| [source,xml] |
| ---- |
| <web-app> |
| <servlet> |
| <servlet-name>ssi</servlet-name> |
| <servlet-class>org.apache.catalina.ssi.SSIServlet</servlet-class> |
| </servlet> |
| ... |
| <servlet-mapping> |
| <servlet-name>ssi</servlet-name> |
| <url-pattern>*.shtml</url-pattern> |
| </servlet-mapping> |
| ... |
| <mime-mapping> |
| <extension>shtml</extension> |
| <mime-type>text/html</mime-type> |
| </mime-mapping> |
| </web-app> |
| ---- |
| |
| To enable SSI processing for all web modules, un-comment the |
| corresponding sections in the `default-web.xml` file. |
| |
| If the `mime-mapping` is not specified in `web.xml`, {productName} |
| attempts to determine the MIME type from `default-web.xml` or the |
| operating system default. |
| |
| You can configure the following `init-param` values for the |
| `SSIServlet`. |
| |
| [[GSDVG545]][[sthref16]][[gheoy]] |
| |
| |
| Table 7-4 `SSIServlet` `init-param` Values |
| |
| [width="100%",cols="28%,11%,20%,41%",options="header",] |
| |=== |
| |init-param |Type |Default |Description |
| |buffered |`boolean` |`false` |Specifies whether the output should be |
| buffered. |
| |
| |debug |`int` |`0` (for no debugging) |Specifies the debugging level. |
| |
| |expires |`Long` |`Expires` header in HTTP response not set |Specifies |
| the expiration time in seconds. |
| |
| |inputEncoding |`String` |operating system encoding |Specifies encoding |
| for the SSI input if there is no URL content encoding specified. |
| |
| |isVirtualWebappRelative |`boolean` |`false` (relative to the given SSI |
| file) |Specifies whether the virtual path of the `#include` directive is |
| relative to the `content-root`. |
| |
| |outputEncoding |`String` |UTF-8 |Specifies encoding for the SSI output. |
| |=== |
| |
| |
| For more information about SSI, see |
| `http://httpd.apache.org/docs/2.2/mod/mod_include.html`. |
| |
| [[ghepi]][[GSDVG00419]][[using-cgi]] |
| |
| ==== Using CGI |
| |
| To enable CGI (common gateway interface) processing for a specific web |
| module, add the `CGIServlet` to your `web.xml` file as follows: |
| |
| [source,xml] |
| ---- |
| <web-app> |
| <servlet> |
| <servlet-name>cgi</servlet-name> |
| <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> |
| </servlet> |
| ... |
| <servlet-mapping> |
| <servlet-name>cgi</servlet-name> |
| <url-pattern>/cgi-bin/*</url-pattern> |
| </servlet-mapping> |
| </web-app> |
| ---- |
| |
| To enable CGI processing for all web modules, un-comment the |
| corresponding sections in the `default-web.xml` file. |
| |
| Package the CGI program under the `cgiPathPrefix`. The default |
| `cgiPathPrefix` is `WEB-INF/cgi`. For security, it is highly recommended |
| that the contents and binaries of CGI programs be prohibited from direct |
| viewing or download. For information about hiding directory listings, |
| see link:#beagc[Using the `default-web.xml` File]. |
| |
| Invoke the CGI program using a URL of the following format: |
| |
| [source] |
| ---- |
| http://host:8080/context-root/cgi-bin/cgi-name |
| ---- |
| |
| For example: |
| |
| [source] |
| ---- |
| http://localhost:8080/mycontext/cgi-bin/hello |
| ---- |
| |
| You can configure the following `init-param` values for the |
| `CGIServlet`. |
| |
| [[GSDVG546]][[sthref17]][[ghern]] |
| |
| |
| Table 7-5 `CGIServlet` `init-param` Values |
| |
| [width="100%",cols="25%,11%,27%,37%",options="header",] |
| |=== |
| |init-param |Type |Default |Description |
| |cgiPathPrefix |`String` |`WEB-INF/cgi` |Specifies the subdirectory |
| containing the CGI programs. |
| |
| |debug |`int` |`0` (for no debugging) |Specifies the debugging level. |
| |
| |executable |`String` |`perl` |Specifies the executable for running the |
| CGI script. |
| |
| |parameterEncoding |`String` |`System.getProperty``("file.encoding",` |
| `"UTF-8")` |Specifies the parameter's encoding. |
| |
| |passShellEnvironment |`boolean` |`false` |Specifies whether to pass |
| shell environment properties to the CGI program. |
| |=== |
| |
| |
| To work with a native executable, do the following: |
| |
| 1. Set the value of the `init-param` named executable to an empty |
| `String` in the `web.xml` file. |
| 2. Make sure the executable has its executable bits set correctly. |
| 3. Use directory deployment to deploy the web module. Do not deploy it |
| as a WAR file, because the executable bit information is lost during the |
| process of `jar` and `unjar`. For more information about directory |
| deployment, see the link:application-deployment-guide.html#GSDPG[{productName} |
| Application Deployment Guide]. |
| |
| |