Created an extension to the webmacro servlet that automatically handles
exceptions in a user friendly way. git-svn-id: https://samskivert.googlecode.com/svn/trunk@43 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
@@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// $Id: FriendlyException.java,v 1.1 2001/02/13 18:49:41 mdb Exp $
|
||||||
|
|
||||||
|
package com.samskivert.webmacro;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The friendly exception provides a mechanism by which a servlet can
|
||||||
|
* abort its processing and report a human readable error to the servlet
|
||||||
|
* framework that will be inserted into the context in the appropriate
|
||||||
|
* place so that the error message will be displayed to the user. Simply
|
||||||
|
* construct a friendly exception with the desired error message and throw
|
||||||
|
* it during the call to <code>populateContext</code>.
|
||||||
|
*
|
||||||
|
* @see FriendlyServlet
|
||||||
|
*/
|
||||||
|
public class FriendlyException extends Exception
|
||||||
|
{
|
||||||
|
public FriendlyException (String message)
|
||||||
|
{
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
//
|
||||||
|
// $Id: FriendlyServlet.java,v 1.1 2001/02/13 18:49:41 mdb Exp $
|
||||||
|
|
||||||
|
package com.samskivert.webmacro;
|
||||||
|
|
||||||
|
import org.webmacro.*;
|
||||||
|
import org.webmacro.servlet.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The friendly servlet adds a common error handling paradigm to the basic
|
||||||
|
* webmacro servlet. This paradigm is to catch any exceptions thrown in
|
||||||
|
* the <code>populateContext</code> method (used instead of the
|
||||||
|
* <code>handle</code> method) and to convert them into friendly error
|
||||||
|
* messages that are inserted into the context with the key
|
||||||
|
* <code>"error"</code> for easy display to the user in the resulting web
|
||||||
|
* page.
|
||||||
|
*
|
||||||
|
* <p> To make this work, the process of template selection is separated
|
||||||
|
* from the process of data generation. First the template is selected; if
|
||||||
|
* that process fails, a standard error response is given to the user as
|
||||||
|
* we have no template into which to substitute the template selection
|
||||||
|
* failure error message. Subsequently, the data is generated. If that
|
||||||
|
* fails, we can substitute a friendly error message into the selected
|
||||||
|
* template. Finally, the template is executed, which is a standard
|
||||||
|
* webmacro procedure.
|
||||||
|
*
|
||||||
|
* <p> The process of mapping exceptions to friendly error messages is
|
||||||
|
* done through a properties file loaded via the classpath. The properties
|
||||||
|
* file should be named 'exceptionmap.properties' and placed in a
|
||||||
|
* directory contained in the classpath of the JVM in which the servlet is
|
||||||
|
* executed. The file should contain mappings from exception classes to
|
||||||
|
* friendly error messages. For example:
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* com.samskivert.webmacro.FriendlyException = An error occurred while \
|
||||||
|
* processing your request: {m}
|
||||||
|
* java.sql.SQLException = The database is currently unavailable. Please \
|
||||||
|
* try your request again later.
|
||||||
|
* java.lang.Exception = An unexpected error occurred while processing \
|
||||||
|
* your request. Please try again later.
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* The message associated with the exception will be substituted into the
|
||||||
|
* error string in place of <code>{m}</code>.
|
||||||
|
*/
|
||||||
|
public abstract class FriendlyServlet extends WMServlet
|
||||||
|
{
|
||||||
|
public Template handle (WebContext ctx) throws HandlerException
|
||||||
|
{
|
||||||
|
// first we select the template
|
||||||
|
Template tmpl;
|
||||||
|
try {
|
||||||
|
tmpl = selectTemplate(ctx);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new HandlerException("Unable to load template: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// then we populate the context with data
|
||||||
|
try {
|
||||||
|
populateContext(ctx, tmpl);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override this member function with code that selects and loads the
|
||||||
|
* proper template based on whatever criterion appropriate for this
|
||||||
|
* servlet.
|
||||||
|
*
|
||||||
|
* @param ctx The context of this request.
|
||||||
|
*
|
||||||
|
* @return The template to be used in generating the response.
|
||||||
|
*/
|
||||||
|
protected abstract Template selectTemplate (WebContext ctx)
|
||||||
|
throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override this member function with code that populates the context
|
||||||
|
* with whatever data is appropriate for this servlet. Presumably this
|
||||||
|
* is where the real work of the servlet takes place.
|
||||||
|
*
|
||||||
|
* @param ctx The context of this request.
|
||||||
|
* @param tmpl The webmacro template previously selected by the
|
||||||
|
* invocation of the <code>selectTemplate</code> method.
|
||||||
|
*/
|
||||||
|
protected abstract void populateContext (WebContext ctx, Template tmpl)
|
||||||
|
throws Exception;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#
|
||||||
|
# $Id: Makefile,v 1.1 2001/02/13 18:49:41 mdb Exp $
|
||||||
|
|
||||||
|
ROOT = ../../..
|
||||||
|
|
||||||
|
SRCS = \
|
||||||
|
FriendlyException.java \
|
||||||
|
FriendlyServlet.java \
|
||||||
|
|
||||||
|
include $(ROOT)/build/Makefile.java
|
||||||
Reference in New Issue
Block a user