You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by Oleg V Alexeev <go...@penza.net> on 2000/10/24 00:42:07 UTC
extended error processing
Hello struts-dev,
I develop some classes to support more flexible error processing in
struts. May be it can be useful for anybody else.
On base of ErrorsTag I create ExtErrorsTag class to show errors more
flexible - with ability to show property names and messages for this
properties.
> Class to support access to property names in errors container -
>---------------------------------------------------------------------
package org.apache.struts.action;
import java.util.Iterator;
public class ActionErrorsExt extends ActionErrors {
// ------------------------------------------- Public Methods
/**
* Add an error message to the set of errors for default property
* ActionErrors.GLOBAL_ERROR .
*
* @param error The error message to be added
*/
public void add( ActionError error) {
add( ActionErrors.GLOBAL_ERROR, error );
}
/**
* Return Iterator for property names.
*
*/
public Iterator getProperties() {
return errors.keySet().iterator();
}
}
>---------------------------------------------------------------------
> Base class for errors processing tag handlers
>---------------------------------------------------------------------
package org.apache.struts.taglib.errors;
import java.util.Iterator;
import java.util.Locale;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionErrorsExt;
import org.apache.struts.util.BeanUtils;
import org.apache.struts.util.ErrorMessages;
import org.apache.struts.util.MessageResources;
public class BaseErrorsTag extends TagSupport {
// --------------------------------------------------- Static Variables
protected static String ERRORS_HEADER_KEY =
"org.apache.struts.errors.header";
protected static String ERRORS_FOOTER_KEY =
"org.apache.struts.errors.footer";
protected static String ERRORS_PROP_HEADER_KEY =
"org.apache.struts.errors.prop.header";
protected static String ERRORS_PROP_FOOTER_KEY =
"org.apache.struts.errors.prop.footer";
protected static String ERRORS_PROP_NAME_HEADER_KEY =
"org.apache.struts.errors.prop.name.header";
protected static String ERRORS_PROP_NAME_FOOTER_KEY =
"org.apache.struts.errors.prop.name.footer";
protected static String ERRORS_PROP_MESSAGES_HEADER_KEY =
"org.apache.struts.errors.prop.messages.header";
protected static String ERRORS_PROP_MESSAGES_FOOTER_KEY =
"org.apache.struts.errors.prop.messages.footer";
protected static String ERRORS_PROP_MESSAGE_HEADER_KEY =
"org.apache.struts.errors.prop.message.header";
protected static String ERRORS_PROP_MESSAGE_FOOTER_KEY =
"org.apache.struts.errors.prop.message.footer";
// --------------------------------------------------- Instance Variables
/**
* The default locale on our server.
*/
private static Locale defaultLocale = Locale.getDefault();
/**
* Name of the request scope attribute containing our error messages,
* if any.
*/
private String name = Action.ERROR_KEY;
/**
* Display key if message not exist.
*/
private String flexible = null;
// --------------------------------------------------- Constructors
public BaseErrorsTag() {
super();
}
// ---------------------------------------------------- Protected Methods
protected ActionErrorsExt storedErrors() {
ActionErrorsExt errors = new ActionErrorsExt();
try {
Object value = pageContext.getAttribute
(name, PageContext.REQUEST_SCOPE);
if (value == null) {
;
} else if (value instanceof String) {
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError((String) value));
} else if (value instanceof String[]) {
String keys[] = (String[]) value;
for (int i = 0; i < keys.length; i++)
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError(keys[i]));
} else if (value instanceof ErrorMessages) {
String keys[] = ((ErrorMessages) value).getErrors();
if (keys == null)
keys = new String[0];
for (int i = 0; i < keys.length; i++)
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError(keys[i]));
} else if (value instanceof ActionErrors) {
errors = (ActionErrorsExt) value;
}
} catch (Exception e) {
;
}
return errors;
}
protected Locale getLocale() {
Locale locale = null;
try {
locale = (Locale) pageContext.getAttribute
(Action.LOCALE_KEY, PageContext.SESSION_SCOPE);
} catch (IllegalStateException e) { // Invalidated session
locale = null;
}
if (locale == null)
locale = defaultLocale;
return locale;
}
// ----------------------------------------------------------- Properties
/**
* Return the errors attribute name.
*/
public String getName() {
return (this.name);
}
/**
* Set the errors attribute name.
*
* @param name The new errors attribute name
*/
public void setName(String name) {
this.name = name;
}
/**
* Return the errors attribute flexible.
*/
public String getFlexible() {
return (this.flexible);
}
/**
* Set the errors attribute flexible.
*
* @param flexible The new errors attribute flexible
*/
public void setFlexible(String flexible) {
this.flexible = flexible;
}
// ------------------------------------------------------- Public Methods
/**
* Release any acquired resources.
*/
public void release() {
super.release();
name = Action.ERROR_KEY;
flexible = null;
}
}
>-------------------------------------------------------------
> Tag handler for extended error processing
>-------------------------------------------------------------
package org.apache.struts.taglib.errors;
import java.util.Iterator;
import java.io.IOException;
import java.util.Locale;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionErrorsExt;
import org.apache.struts.util.BeanUtils;
import org.apache.struts.util.MessageResources;
public class ExtErrorsTag extends BaseErrorsTag {
// --------------------------------------------------- Constructors
public ExtErrorsTag() {
super();
}
// ------------------------------------------------------- Public Methods
/**
* Render the specified error messages if there are any.
*
* @exception JspException if a JSP exception has occurred
*/
public int doStartTag() throws JspException {
ActionErrorsExt actionErrors = (ActionErrorsExt)storedErrors();
if (actionErrors.empty())
return (EVAL_BODY_INCLUDE);
String property = null;
Locale locale = getLocale();
MessageResources messages = (MessageResources)
pageContext.getAttribute(Action.MESSAGES_KEY,
PageContext.APPLICATION_SCOPE);
StringBuffer results = new StringBuffer();
String errorPropHeader =
messages.getMessage(locale, ERRORS_PROP_HEADER_KEY );
String errorPropFooter =
messages.getMessage(locale, ERRORS_PROP_FOOTER_KEY );
String errorPropNameHeader =
messages.getMessage(locale, ERRORS_PROP_NAME_HEADER_KEY );
String errorPropNameFooter =
messages.getMessage(locale, ERRORS_PROP_NAME_FOOTER_KEY );
String errorPropMessagesHeader =
messages.getMessage(locale, ERRORS_PROP_MESSAGES_HEADER_KEY );
String errorPropMessagesFooter =
messages.getMessage(locale, ERRORS_PROP_MESSAGES_FOOTER_KEY );
String errorPropMessageHeader =
messages.getMessage(locale, ERRORS_PROP_MESSAGE_HEADER_KEY );
String errorPropMessageFooter =
messages.getMessage(locale, ERRORS_PROP_MESSAGE_FOOTER_KEY );
String message =
messages.getMessage(locale, ERRORS_HEADER_KEY );
if (message != null)
results.append(message);
Iterator reports = null;
Iterator properties = actionErrors.getProperties();
while( properties.hasNext() ) {
if( errorPropHeader!=null ) results.append( errorPropHeader );
if( errorPropNameHeader!=null ) results.append( errorPropNameHeader );
property = (String)properties.next();
message = messages.getMessage( locale, property );
if( message!=null )
results.append( message );
else
if( getFlexible()!=null )
results.append( property );
if( errorPropNameFooter!=null ) results.append( errorPropNameFooter );
if( errorPropMessagesHeader!=null ) results.append( errorPropMessagesHeader );
reports = actionErrors.get( property );
while( reports.hasNext() ) {
if( errorPropMessageHeader!=null ) results.append( errorPropMessageHeader );
ActionError report = (ActionError) reports.next();
message = messages.getMessage(locale,
report.getKey(), report.getValues());
if( message!=null )
results.append( message );
else
if( getFlexible()!=null )
results.append( report.getKey() );
if( errorPropMessageFooter!=null ) results.append( errorPropMessageFooter );
}
if( errorPropMessagesFooter!=null ) results.append( errorPropMessagesFooter );
if( errorPropFooter!=null ) results.append( errorPropFooter );
}
message = messages.getMessage(locale, ERRORS_FOOTER_KEY );
if( message!=null )
results.append( message );
JspWriter writer = pageContext.getOut();
try {
writer.print(results.toString());
} catch (IOException e) {
throw new JspException(e.toString());
}
return (EVAL_BODY_INCLUDE);
}
}
>-------------------------------------------------------------
> Resource strings sample
>-------------------------------------------------------------
org.apache.struts.errors.header=<table><tr><td colspan=2>Errors detected!</td></tr>
org.apache.struts.errors.footer=</table>
org.apache.struts.errors.prop.header=<tr>
org.apache.struts.errors.prop.footer=</tr>
org.apache.struts.errors.prop.name.header=<td>
org.apache.struts.errors.prop.name.footer=</td>
org.apache.struts.errors.prop.messages.header=<td>
org.apache.struts.errors.prop.messages.footer=</td>
org.apache.struts.errors.prop.message.header=<li>
org.apache.struts.errors.prop.message.footer=</li>
--
Best regards,
Oleg mailto:gonza@penza.net