[ Team LiB ] Previous Section Next Section

Recipe 6.2 Using an External Configuration to Include a Resource in a Servlet

Problem

You want to use an external configuration file (such as web.xml) to configure the resource that is included in a servlet.

Solution

Use init parameters with the including servlet to allow the external configuration of the include mechanism, then include the resource with the javax.servlet.RequestDispatcher.include(request,response) method.

Discussion

You may want to periodically change the resource that a servlet includes, without changing and recompiling the servlet code. You can make these changes by altering the servlet's init parameters in web.xml. Using this strategy, either the included resource's file location itself or the method of retrieving the resource (such as from a database) can change. You can ensure that the servlet imports the correct resource by altering the content of the param-value element. Example 6-3 shows a servlet that is configured to include a file named privacy.jspf. This represents a standard privacy statement for the web application.

Example 6-3. Specifying an included resource by using the servlet's init-param element
<servlet>
    <servlet-name>PrivacyServlet</servlet-name>
    <servlet-class>com.jspservletcookbook.IncludeServlet</servlet-class>
    <init-param>
        <param-name>included-resource</param-name>
        <param-value>privacy.jspf</param-value>
    <init-param>
</servlet>

Example 6-4 shows the doGet( ) method of the PrivacyServlet. This method gets the value of the included-resource init parameter (privacy.jspf), then includes the JSP segment.

Example 6-4. Including a resource specified by an init parameter
public void doGet(HttpServletRequest request, 
  HttpServletResponse response) throws ServletException,
   java.io.IOException {
        
        response.setContentType("text/html");
        java.io.PrintWriter out = response.getWriter( );
        
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Include Servlet</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Welcome To Our Universe</h1>");
        out.println("Imagine the rest of the page here.<br><br>");
        //Include the privacy information based on an init-param value
        String includeRes = (String) getInitParameter(
          "included-resource");
        //get a RequestDispatcher object based on the init-param value
        RequestDispatcher dispatcher = request.
          getRequestDispatcher(includeRes);
        dispatcher.include(request, response);
        out.println("</body>");
        out.println("</html>");
      
        
       }

Example 6-4 gets a RequestDispatcher representing the configured init-param value with this code:

//the includeRes variable holds the init-param value "privacy.jspf"
RequestDispatcher dispatcher = request.getRequestDispatcher(includeRes);

Then the dispatcher.include(request,response) method is replaced by the output of the privacy.jspf file. Example 6-5 shows the JSP segment that the PrivacyServlet includes. The JSP's content has some HTML tags that fit into the HTML represented by the including page.

Example 6-5. A JSP segment included in a servlet with a RequestDispatcher
<%@page errorPage="/error.jsp"%>
<p><strong>Parker River Net Solutions Privacy Policy</strong></p>
<p>Any personal information you provide to us regarding Web- or software-development
services or shareware software, such as your name, address, telephone number, and e-mail
address, will not be released, sold, or rented to any entities or individuals outside
of Parker River Net Solutions.</p>

Included segments or pages cannot set or change response headers, so any attempts to set the content type in an included servlet or JSP as in:

<%@ page contentType="text/xml" %>

are ignored.


All the included JSP does is specify an error page composed of some formatting-related HTML tags and text. Figure 6-2 shows the browser page for the PrivacyServlet.

Figure 6-2. A web page with an included JSP segment
figs/jsjc_0602.gif

You may also want to augment Example 6-4 to provide a default resource for inclusion in the servlet, just in case the deployment descriptor (web.xml) mistakenly omits an init parameter for the servlet. The method getInitParameter returns null in the event of this omission. You could test for this null condition and then provide a default value for the included statement.


See Also

Recipe 6.3 on including resources that have nested includes; Recipe 6.4-Recipe 6.8 on including resources in JSPs; Chapter SRV.14.2.5 of the Servlet Recipe 2.4 specification; Chapter JSP.1.10.3 of the JSP 2.0 specification on including files in JSPs.

    [ Team LiB ] Previous Section Next Section