I have searched this topic on google a bit and seen some best practices. But I need some specific advice. I am working on a J2EE app that has servlets/Struts2/Call to DAO\'
use java util logging package its easy to use can be declared with every property method at backend while on front end where you want to make error visible to user show it using h:message tag in xhtml or jsf or also with f:ajax error handling tag
I expect this is already solved in some way by Struts - so best check struts docco. If i were you i'd write an ExceptionFilter that can wrap your servlet calls:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class ExceptionFilter implements Filter{
private static final Logger logger = Logger.getLogger(ExceptionFilter.class);
private ExceptionService exceptionService = null;
@Override
public void destroy() {
exceptionService.shutdown();
}
@Override
public void doFilter(ServletRequest rq, ServletResponse rs, FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(rq, rs); // this calls the servlet which is where your exceptions will bubble up from
} catch (Throwable t) {
// deal with exception, then do redirect to custom jsp page
logger.warn(t);
exceptionService.dealWithException(t); // you could have a service to track counts of exceptions / log them to DB etc
HttpServletResponse response = (HttpServletResponse) resp;
response.sendRedirect("somejsp.jsp");
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
exceptionService = new ExceptionService();
}
}
and add this to your web.xml:
<filter>
<filter-name>ExceptionFilter</filter-name>
<filter-class>com.example.ExceptionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ExceptionFilter</filter-name>
<servlet-name>MyMainServlet</servlet-name>
</filter-mapping>
then add filter mappings for all your servlets.
Hope that helps.