Package: groovy.servlet

## [Java] Class ServletBinding

- groovy.servlet.ServletBinding

-     public class ServletBinding
      extends Binding

  Servlet-specific binding extension to lazy load the writer or the output stream from the response.

  ### Eager variables

  - `"request"` : the `HttpServletRequest` object
  - `"response"` : the `HttpServletRequest` object
  - `"context"` : the `ServletContext` object
  - `"application"` : same as context
  - `"session"` : shorthand for `request.getSession(`false`)` - can be null!
  - `"params"` : map of all form parameters - can be empty
  - `"headers"` : map of all `request` header fields

  ### Lazy variables

  - `"out"` : `response.getWriter()`
  - `"sout"` : `response.getOutputStream()`
  - `"html"` : `new MarkupBuilder(response.getWriter())` - `expandEmptyElements` flag is set to true
  - `"json"` : `new JsonBuilder()`
  As per the Servlet specification, a call to `response.getWriter()` should not be done if a call to `response.getOutputStream()` has already occurred or the other way around. You may wonder then how the above lazy variables can possibly be provided - since setting them up would involve calling both of the above methods. The trick is catered for behind the scenes using lazy variables. Lazy bound variables can be requested without side effects; under the covers the writer and stream are wrapped. That means `response.getWriter()` is never directly called until some output is done using 'out' or 'html'. Once a write method call is done using either of these variable, then an attempt to write using 'sout' will cause an `IllegalStateException`. Similarly, if a write method call on 'sout' has been done already, then any further write method call on 'out' or 'html' will cause an `IllegalStateException`.

  ### Reserved internal variable names (see "Methods" below)

  - `"forward"`
  - `"include"`
  - `"redirect"`
  If `response.getWriter()` is called directly (without using out), then a write method call on 'sout' will not cause the `IllegalStateException`, but it will still be invalid. It is the responsibility of the user of this class to not mix these different usage styles. The same applies to calling `response.getOutputStream()` and using 'out' or 'html'.

  ### Methods

  - `"forward(String path)"` : `request.getRequestDispatcher(path).forward(request, response)`
  - `"include(String path)"` : `request.getRequestDispatcher(path).include(request, response)`
  - `"redirect(String location)"` : `response.sendRedirect(location)`

- - ### Constructor Summary

    Constructors
    Constructor and description
    `ServletBinding(HttpServletRequest request, HttpServletResponse response, ServletContext context)` Initializes a servlet binding.

  - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `public void` | `forward(String path)` Forwards the current request to another resource using the same request and response.
    `` | `public Object` | `getVariable(String name)` Returns: a writer, an output stream, a markup builder or another requested object
    `` | `public Map` | `getVariables()` Returns the current binding variables after initializing the lazy servlet helpers.
    `` | `public void` | `include(String path)` Includes another resource in the current response.
    `` | `public void` | `redirect(String location)` Sends a redirect response to the supplied location.
    `` | `public void` | `setVariable(String name, Object value)` Binds a servlet variable while protecting the reserved lazy helper names.

  - ### Inherited Methods Summary

    Inherited Methods
    Methods inherited from class | Name
    --- | ---
    `class Binding` | `getProperty, getVariable, getVariables, hasVariable, removeVariable, setProperty, setVariable`
    `class GroovyObjectSupport` | `getMetaClass, setMetaClass`

- - ### Constructor Detail

    - #### public ServletBinding(HttpServletRequest request, HttpServletResponse response, ServletContext context)

      Initializes a servlet binding.

      Parameters:
        `request` - the HttpServletRequest object
        `response` - the HttpServletRequest object
        `context` - the ServletContext object

  - ### Method Detail

    - #### public void forward(String path)

      Forwards the current request to another resource using the same request and response.

      throws:
        ServletException if the target resource fails
      throws:
        IOException if request dispatching fails
      Parameters:
        `path` - the dispatcher path to forward to

    - #### public Object getVariable(String name)

      Returns:
        a writer, an output stream, a markup builder or another requested object

    - #### public Map getVariables()

      Returns the current binding variables after initializing the lazy servlet helpers.

      Returns:
        the binding variables map

    - #### public void include(String path)

      Includes another resource in the current response.

      throws:
        ServletException if the target resource fails
      throws:
        IOException if request dispatching fails
      Parameters:
        `path` - the dispatcher path to include

    - #### public void redirect(String location)

      Sends a redirect response to the supplied location.

      throws:
        IOException if the redirect cannot be sent
      Parameters:
        `location` - the redirect target

    - #### public void setVariable(String name, Object value)

      Binds a servlet variable while protecting the reserved lazy helper names.

      Parameters:
        `name` - the variable name to bind
        `value` - the value to expose through the binding