Wrapping a Natural for Ajax Application as a Servlet

In a production environment, it is inconvenient to start an application with a URL such as the following:

http://myappserver:4711/cisnatural/servlet/StartCISPage?PAGEURL=%2Fcisnatural%2FNatLogon.html&xciParameters.natserver=mywebio&xciParameters.natprog=nwo.sh&xciParameters.natport=4712&xciParameters.natparam=stack%3D%28logon+SYSEXNJX%3BMENU-NJX%3BFIN%29

The URL can be shortened by defining a corresponding session profile in the configuration tool . For example:

http://myappserver:4711/cisnatural/servlet/StartCISPage?PAGEURL=%2Fcisnatural%2FNatLogon.html&xciParameters.natsession=DemoApplication

However, this shortened URL is still not practical for security reasons because end users should not be allowed to access the generic servlet StartCISPage .

When you define a dedicated servlet for each application, you can easily define the security constraints for each application in the file web.xml (for further information on this file, see Configuring Container-Managed Security ). With the servlet com.softwareag.cis.server.StartCISPageWithParams , you define a wrapper servlet for a given Natural for Ajax application so that the application can later be invoked with a URL such as the following:

http://myappserver:4711/cisnatural/servlet/DemoApplication

Note:
The servlet com.softwareag.cis.server.StartCISPageWithParams can also be used with the HTTP method POST . See Starting a Natural Application with a URL .

The following example shows how you define an application as a servlet in the file web.xml .

<servlet id="DemoApplication">
  <servlet-name>DemoApplication</servlet-name>
  <display-name>DemoApplication</display-name>
  <servlet-class>com.softwareag.cis.server.StartCISPageWithParams</servlet-class>
  <load-on-startup>1</load-on-startup>
  <init-param id="OVERWRITE">
    <param-name>OVERWRITE</param-name>
    <param-value>false</param-value>
  </init-param>
  <init-param id="PAGEURL">
    <param-name>PAGEURL</param-name>
    <param-value>/cisnatural/NatLogon.html</param-value>
  </init-param>
  <init-param id="xciParameters.natsession">
    <param-name>xciParameters.natsession</param-name>
    <param-value>Local</param-value>
  </init-param>
  <init-param id="xciParameters.natserver">
    <param-name>xciParameters.natserver</param-name>
    <param-value>localhost</param-value>
  </init-param>
  <init-param id="xciParameters.natport">
    <param-name>xciParameters.natport</param-name>
    <param-value>2900</param-value>
  </init-param>
  <init-param id="xciParameters.natparamext">
    <param-name>xciParameters.natparamext</param-name>
    <param-value>STACK=(LOGON SYSEXNJX;MENU-NJX;FIN)</param-value>
  </init-param>
</servlet>

You can omit the parameters xciParameters.natserver , xciParameters.natport and xciParameters.natparamext if the corresponding values are defined in the session definition that is referenced in xciParameters.natsession . This the recommended way, because the settings can thus be changed in the configuration tool at any time without the need to adapt the file web.xml .

To complete the definition, you define a corresponding servlet mapping in the file web.xml :

<servlet-mapping>
  <servlet-name>DemoApplication</servlet-name>
  <url-pattern>/servlet/DemoApplication</url-pattern>
</servlet-mapping>

With this servlet mapping, you can now start your application by URL. Example: http://myhost:myport/mywebapp/servlet/DemoApplication

If you additionally want to prevent users from starting other NJX applications you can do the following:

Exchange the servlet class com.softwareag.cis.server.StartCISPage with a different servlet class, namely com.softwareag.cis.server.StartCISPageInSession . This servlet class cannot be called directly; it can only be called in an Application Designer session which is already active. Therefore, each attempt to start an arbitrary - not wrapped - application by just building a URL based on StartCISPage will result in an error message.

To exchange the servlet class, you change the following in the file web.xml

<servlet id="StartCISPage">
  <servlet-name>StartCISPage</servlet-name>
  <display-name>StartCISPage</display-name>
  <servlet-class>com.softwareag.cis.server.StartCISPage</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

to

<servlet id="StartCISPage">
  <servlet-name>StartCISPage</servlet-name>
  <display-name>StartCISPage</display-name>
  <servlet-class>com.softwareag.cis.server.StartCISPageInSession</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

If your application uses pop-ups, subcispage controls or web I/O pages you have to add the parameter ALLOWSUBPAGES to the servlet definition in your web.xml :

<servlet id="StartCISPage">
  <servlet-name>StartCISPage</servlet-name>
  <display-name>StartCISPage</display-name>
  <servlet-class>com.softwareag.cis.server.StartCISPageInSession</servlet-class>
  <load-on-startup>1</load-on-startup>
  <init-param id="ALLOWSUBPAGES"> 
    <param-name>ALLOWSUBPAGES</param-name> 
    <param-value>true</param-value> 
  </init-param>
</servlet>

For a workplace application , the definition of the com.softwareag.cis.server.StartCISPageWithParams in the web.xml is slightly different. You do not define the start-up page of the workplace directly in the PAGEURL parameter. Instead, you define an intermediate navigation page /HTMLBasedGUI/com.softwareag.cis.util.navigatetopage.html . The start-up page of the workplace is specified in the navPage parameter. The navigation page makes sure that an Applicaton Designer session is created before it navigates to the start-up page of the workplace.

<servlet id="WorkplaceDemo">
  <servlet-name>WorkplaceDemo</servlet-name>
  <display-name>WorkplaceDemo</display-name>
  <servlet-class>com.softwareag.cis.server.StartCISPageWithParams</servlet-class>
  <load-on-startup>1</load-on-startup>
  <init-param id="OVERWRITE">
    <param-name>OVERWRITE</param-name>
    <param-value>false</param-value>
  </init-param>
  <init-param id="PAGEURL">
    <param-name>PAGEURL</param-name>
    <param-value>/HTMLBasedGUI/com.softwareag.cis.util.navigatetopage.html</param-value>
  </init-param>
  <init-param id="navPage">
    <param-name>navPage</param-name>
    <param-value>/njxdemos/wpdynworkplace.html</param-value>
  </init-param>
</servlet>

In this case, the corresponding servlet mapping is defined as follows:

<servlet-mapping>
  <servlet-name>WorkplaceDemo</servlet-name>
  <url-pattern>/servlet/WorkplaceDemo</url-pattern>
</servlet-mapping>

Note:
For further information on the above mentioned servlets, see the Java API documentation which is provided with Application Designer.