/*
* 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.
*/
package org.apache.wicket.protocol.http;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* Please use {@link WicketFilter} if you require advanced chaining of resources.
*
* Servlet class for all wicket applications. The specific application class to
* instantiate should be specified to the application server via an init-params
* argument named "applicationClassName" in the servlet declaration, which is
* typically in a <i>web.xml </i> file. The servlet declaration may vary from
* one application server to another, but should look something like this:
*
* <pre>
* <servlet>
* <servlet-name>MyApplication</servlet-name>
* <servlet-class>org.apache.wicket.protocol.http.WicketServlet</servlet-class>
* <init-param>
* <param-name>applicationClassName</param-name>
* <param-value>com.whoever.MyApplication</param-value>
* </init-param>
* <load-on-startup>1</load-on-startup>
* </servlet>
* </pre>
*
* Note that the applicationClassName parameter you specify must be the fully
* qualified name of a class that extends WebApplication. If your class cannot
* be found, does not extend WebApplication or cannot be instantiated, a runtime
* exception of type WicketRuntimeException will be thrown.
* </p>
* As an alternative, you can configure an application factory instead. This
* looks like:
*
* <pre>
* <init-param>
* <param-name>applicationFactoryClassName</param-name>
* <param-value>teachscape.platform.web.wicket.SpringApplicationFactory</param-value>
* </init-param>
* </pre>
*
* and it has to satisfy interface
* {@link org.apache.wicket.protocol.http.IWebApplicationFactory}.
*
* <p>
* When GET/POST requests are made via HTTP, a WebRequestCycle object is
* created from the request, response and session objects (after wrapping them
* in the appropriate wicket wrappers). The RequestCycle's render() method is
* then called to produce a response to the HTTP request.
* <p>
* If you want to use servlet specific configuration, e.g. using init parameters
* from the {@link javax.servlet.ServletConfig}object, you should override the
* init() method of {@link javax.servlet.GenericServlet}. For example:
*
* <pre>
* public void init() throws ServletException
* {
* ServletConfig config = getServletConfig();
* String webXMLParameter = config.getInitParameter("myWebXMLParameter");
* ...
* </pre>
*
* </p>
* In order to support frameworks like Spring, the class is non-final and the
* variable webApplication is protected instead of private. Thus subclasses may
* provide their own means of providing the application object.
*
* @see org.apache.wicket.RequestCycle
* @author Jonathan Locke
* @author Timur Mehrvarz
* @author Juergen Donnerstag
* @author Igor Vaynberg (ivaynberg)
* @author Al Maw
*/
public class WicketServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
/** Log. */
private static final Logger log = LoggerFactory.getLogger(WicketServlet.class);
/** The WicketFilter where all the handling is done */
protected WicketFilter wicketFilter;
/**
* Handles servlet page requests.
*
* @param servletRequest
* Servlet request object
* @param servletResponse
* Servlet response object
* @throws ServletException
* Thrown if something goes wrong during request handling
* @throws IOException
*/
public final void doGet(final HttpServletRequest servletRequest,
final HttpServletResponse servletResponse) throws ServletException, IOException
{
wicketFilter.doGet(servletRequest, servletResponse);
}
/**
* Calls doGet with arguments.
*
* @param servletRequest
* Servlet request object
* @param servletResponse
* Servlet response object
* @see WicketServlet#doGet(HttpServletRequest, HttpServletResponse)
* @throws ServletException
* Thrown if something goes wrong during request handling
* @throws IOException
*/
public final void doPost(final HttpServletRequest servletRequest,
final HttpServletResponse servletResponse) throws ServletException, IOException
{
wicketFilter.doGet(servletRequest, servletResponse);
}
/**
* Servlet initialization
*/
public void init() throws ServletException
{
wicketFilter = newWicketFilter();
wicketFilter.init(new FilterConfig()
{
/**
* @see javax.servlet.FilterConfig#getServletContext()
*/
public ServletContext getServletContext()
{
return WicketServlet.this.getServletContext();
}
/**
* @see javax.servlet.FilterConfig#getInitParameterNames()
*/
public Enumeration getInitParameterNames()
{
return WicketServlet.this.getInitParameterNames();
}
/**
* @see javax.servlet.FilterConfig#getInitParameter(java.lang.String)
*/
public String getInitParameter(String name)
{
if (WicketFilter.FILTER_MAPPING_PARAM.equals(name))
{
return WicketFilter.SERVLET_PATH_HOLDER;
}
return WicketServlet.this.getInitParameter(name);
}
/**
* @see javax.servlet.FilterConfig#getFilterName()
*/
public String getFilterName()
{
return WicketServlet.this.getServletName();
}
});
}
/**
* @return The wicket filter
*/
protected WicketFilter newWicketFilter()
{
return new WicketFilter();
}
/**
* Servlet cleanup.
*/
public void destroy()
{
wicketFilter.destroy();
wicketFilter = null;
}
/**
* @see javax.servlet.http.HttpServlet#getLastModified(javax.servlet.http.HttpServletRequest)
*/
protected long getLastModified(final HttpServletRequest servletRequest)
{
return wicketFilter.getLastModified(servletRequest);
}
}