ProblemYou want to use an external configuration file (such as web.xml ) to configure the resource that is included in a servlet. SolutionUse 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. DiscussionYou 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>
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
See AlsoRecipe 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. |