All Downloads are FREE. Search and download functionalities are using the official Maven repository.

groovy.servlet.GroovyServlet Maven / Gradle / Ivy

There is a newer version: 3.9
Show newest version
/*
 * Copyright 2003-2013 the original author or authors.
 *
 * Licensed 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.
 */
package groovy.servlet;

import groovy.lang.Closure;
import groovy.util.GroovyScriptEngine;
import groovy.util.ResourceException;
import groovy.util.ScriptException;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.groovy.runtime.GroovyCategorySupport;

/**
 * This servlet will run Groovy scripts as Groovlets.  Groovlets are scripts
 * with these objects implicit in their scope:
 *
 * 
    *
  • request - the HttpServletRequest
  • *
  • response - the HttpServletResponse
  • *
  • application - the ServletContext associated with the servlet
  • *
  • session - the HttpSession associated with the HttpServletRequest
  • *
  • out - the PrintWriter associated with the ServletRequest
  • *
* *

Your script sources can be placed either in your web application's normal * web root (allows for subdirectories) or in /WEB-INF/groovy/* (also allows * subdirectories). * *

To make your web application more groovy, you must add the GroovyServlet * to your application's web.xml configuration using any mapping you like, so * long as it follows the pattern *.* (more on this below). Here is the * web.xml entry: * *

 *    <servlet>
 *      <servlet-name>Groovy</servlet-name>
 *      <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
 *    </servlet>
 *
 *    <servlet-mapping>
 *      <servlet-name>Groovy</servlet-name>
 *      <url-pattern>*.groovy</url-pattern>
 *      <url-pattern>*.gdo</url-pattern>
 *    </servlet-mapping>
 * 
* *

The URL pattern does not require the "*.groovy" mapping. You can, for * example, make it more Struts-like but groovy by making your mapping "*.gdo". * * @author Sam Pullara * @author Mark Turansky (markturansky at hotmail.com) * @author Guillaume Laforge * @author Christian Stein * @author Marcel Overdijk * * @see groovy.servlet.ServletBinding */ public class GroovyServlet extends AbstractHttpServlet { /** * The script engine executing the Groovy scripts for this servlet */ private GroovyScriptEngine gse; /** * Initialize the GroovyServlet. * * @throws ServletException * if this method encountered difficulties */ public void init(ServletConfig config) throws ServletException { super.init(config); // Set up the scripting engine gse = createGroovyScriptEngine(); servletContext.log("Groovy servlet initialized on " + gse + "."); } /** * Handle web requests to the GroovyServlet */ public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { // Get the script path from the request - include aware (GROOVY-815) final String scriptUri = getScriptUri(request); // Set it to HTML by default response.setContentType("text/html; charset="+encoding); // Set up the script context final ServletBinding binding = new ServletBinding(request, response, servletContext); setVariables(binding); // Run the script try { Closure closure = new Closure(gse) { public Object call() { try { return ((GroovyScriptEngine) getDelegate()).run(scriptUri, binding); } catch (ResourceException e) { throw new RuntimeException(e); } catch (ScriptException e) { throw new RuntimeException(e); } } }; GroovyCategorySupport.use(ServletCategory.class, closure); } catch (RuntimeException runtimeException) { StringBuffer error = new StringBuffer("GroovyServlet Error: "); error.append(" script: '"); error.append(scriptUri); error.append("': "); Throwable e = runtimeException.getCause(); /* * Null cause?! */ if (e == null) { error.append(" Script processing failed.\n"); error.append(runtimeException.getMessage()); if (runtimeException.getStackTrace().length > 0) error.append(runtimeException.getStackTrace()[0].toString()); servletContext.log(error.toString()); System.err.println(error.toString()); runtimeException.printStackTrace(System.err); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, error.toString()); return; } /* * Resource not found. */ if (e instanceof ResourceException) { error.append(" Script not found, sending 404."); servletContext.log(error.toString()); System.err.println(error.toString()); response.sendError(HttpServletResponse.SC_NOT_FOUND); return; } /* * Other internal error. Perhaps syntax?! */ servletContext.log("An error occurred processing the request", runtimeException); error.append(e.getMessage()); if (e.getStackTrace().length > 0) error.append(e.getStackTrace()[0].toString()); servletContext.log(e.toString()); System.err.println(e.toString()); runtimeException.printStackTrace(System.err); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString()); } } /** * Hook method to setup the GroovyScriptEngine to use.
* Subclasses may override this method to provide a custom engine. */ protected GroovyScriptEngine createGroovyScriptEngine(){ return new GroovyScriptEngine(this); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy