<?xml version="1.0"?>
<!--
    $Id: installation-was352.xml 481833 2006-12-03 17:32:52Z niallp $

    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You 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.
-->
<document url="installation-was352.html">

    <properties>
        <title>The Struts Framework Project - Installation - WebSphere
            3.5.2</title>
    </properties>

    <body>
        <section name="6.2 Installation" href="installation">
            <subsection name="Installing Struts with your servlet container"
                        href="Containers">

                <h4 id="was352">WebSphere Application Server 3.5 FixPack
                    2</h4>

                <ul>
                    <li>In the steps below,
                        <code>$WAS_HOME</code>
                        refers to the directory in which you
                        have installed WebSphere Application Server, and
                        <code>$STRUTS_HOME</code>
                        is the
                        directory in which you unpacked the Struts binary
                        distribution.
                    </li>

                    <li>WebSphere before 3.5.2 did not support JSP 1.1 and
                        Servlet 2.2, which
                        made it difficult to get Struts functioning without
                        massive code changes.
                        Please upgrade to 3.5.2 (3.5 with FixPack 2) before
                        attempting to use
                        Struts. See
                        <a href="http://www.ibm.com/software/webservers/appserv/efix.html">
                            http://www.ibm.com/software/webservers/appserv/efix.html</a>
                        for download and install instructions on FixPack 2 for
                        WebSphere 3.5
                    </li>

                    <li>Warning: Struts will not work with WebSphere 3.5.2 out
                        of the box. Fixes
                        expected to be in WebSphere 3.5.3 (not released at
                        time of writing) should
                        correct this. However, you can successfully get
                        WebSphere 3.5.2 working
                        with Struts.</li>

                    <li>Make sure the WebSphere Application Server is started.
                        Under Windows
                        NT/2000, it's the "IBM WS AdminServer" service.</li>

                    <li>Start the WebSphere Administrative Console.</li>

                    <li>Once it's started, select "Convert a War File" from
                        the tasks toolbar
                        option, or from the Console->Tasks menu. This will
                        cause a "Convert War
                        File" Wizard dialog to appear.</li>

                    <li>Select a Servlet Engine to host the web application
                        that will result
                        from converting the War file, e.g. "Default Servlet
                        Engine", by expanding
                        the tree control under Nodes. Press the Next
                        button.</li>

                    <li>Select a Virtual Host to associate the resulting web
                        application with,
                        e.g. "default host". Press the Next button.</li>

                    <li>Press the Browse button and choose the
                        <code>$STRUTS_HOME/webapps/struts-example.war</code>
                        . Press the Next button
                    </li>

                    <li>Select a destination directory for the resulting web
                        application, e.g.
                        <code>$WAS_HOME/hosts/default_host</code>
                        . Press the Next button
                    </li>

                    <li>Enter a "Web Application Web Path", e.g.
                        struts-example, and a "Web
                        Application Name", e.g. struts-example. Press the
                        Finish button.</li>

                    <li>You should, after a lengthy pause, get a message box
                        with the text
                        Command "convert war file" completed successfully.
                        Press Ok.</li>

                    <li>You now need to add jaxp.jar and a jaxp compatible
                        parser, e.g.
                        parser.jar from JAXP 1.0.1 to the struts-example web
                        application's
                        servlets directory, e.g.
                        <code>
                            $WAS_HOME/AppServer/hosts/default_host/struts-example/servlets</code>
                    </li>

                    <li>At this point, if WAS 3.5.2 correctly implemented
                        Servlet 2.2, all
                        would be fine. However, WAS 3.5.2 returns null for
                        calls to
                        <code>ServletContext.getResource(String)</code>
                        or
                        <code>
                            ServletContext.getResourceAsStream(String)</code>
                        . This manifests itself as an
                        exception in the application server stdout log, e.g.
                        <code>default_server_stdout.log.</code>
                    </li>

                    <li>Warning: Don't be fooled by the fact that the web
                        application starts
                        successfully from the Admin Console. It actually
                        doesn't. The Admin
                        Console is lying. If you try to access the webapp
                        e.g.
                        <code>http://localhost/struts-example/</code>
                        it will fail.
                    </li>

                    <li>At this point, you need to patch the Struts source.
                        There are three
                        places
                        <code>getResourceAsStream</code>
                        is called:
                    </li>
                </ul>
                <pre>
                    ResourceTag.doStartTag()
                    ActionServlet.initMapping()
                    PropertyMessageResources.loadLocale(String)
                </pre>
                <p>of these,
                    <code>ActionServlet</code>
                    is the most important.
                </p>

                <ul>
                    <li>Change the source from</li>
                </ul>
                <pre>
                    // Acquire an input stream to our configuration resource
                    InputStream input =
                    getServletContext().getResourceAsStream(config);
                </pre>
                <p>to</p>
                <pre>
                    // Acquire an input stream to our configuration resource
                    InputStream input = new
                    java.io.FileInputStream(getServletContext().getRealPath(config));
                </pre>
                <ul>
                    <li>Make similar changes to the other classes if
                        necessary.</li>

                    <li>Recompile ActionServlet and copy the
                        <code>.class</code>
                        file to
                        <br/>

                        <code>
                            $WAS_HOME/AppServer/hosts/default_host/struts-example/servlets/
                            <br/>
                            org/apache/struts/action/ActionServlet.class
                        </code>
                    </li>

                    <li>Another bug with WAS 3.5.2's classloaders is that
                        Class.getResource()
                        wont load a resource from a jar, so you must copy
                        <br/>
                        <code>$STRUTS_HOME/lib/struts-config_1_0.dtd</code>
                        <br/>
                        to
                        <br/>
                        <code>
                            $WAS_HOME/AppServer/hosts/default_host/struts-example/servlets/org/apache/struts/resources/struts-config_1_0.dtd</code>
                        <br/>
                        or be connected to the Internet to fetch the dtd from
                        the Jakarta website.
                    </li>

                    <li>Start your webapp in the Admin Console</li>

                    <li>Test the example application by loading the following
                        URL in your
                        browser of choice:
                        <a href="http://localhost/struts-example/">
                            http://localhost/struts-example/"
                            >http://localhost/struts-example/</a>
                    </li>
                </ul>
                <hr/>
                <p>Back to
                    <a href="installation.html#Containers">Installation</a>
                </p>
            </subsection>
        </section>
    </body>
</document>
