como capturar erros globalmente, registrá-los e mostrar ao usuário uma página de erro no aplicativo J2EE

Pesquisei este tópico no google um pouco e vi algumas práticas recomendadas. Mas preciso de alguns conselhos específicos. Estou trabalhando em um aplicativo J2EE que possui servlets / Struts2 / Call para DAO de JSP's. Portanto, o aplicativo está todo bagunçado. A maioria dos dados é buscada através de procedimentos armazenados, que estão sendo chamados pelo iBatis ORM / Spring. Às vezes, quando um erro ocorre no lado do SP, ele exibe uma mensagem feia para o usuário, como abaixo:

javax.servlet.ServletException: org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in debtowed.xml.  
--- The error occurred while applying a parameter map.  
--- Check the debtowed.getFormerTenantData.  
--- Check the statement (update procedure failed).  
--- Cause: java.sql.SQLException: ORA-06550: line 1, column 11:
PLS-00905: object package.GET_FORMER_ADDRESS is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Caused by: java.sql.SQLException: ORA-06550: line 1, column 11:
PLS-00905: object package.GET_FORMER_ADDRESS is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Nesse ponto, as informações acima são exibidas no navegador e registradas no server.log.
No entanto, quero fazer o seguinte:

Apresentar ao usuário uma página de erro personalizadaregistre os erros em myapp.log em vez de server.log (fazemos isso em alguns outros lugares quando usamos log4j)

Por favor, diga-me qual é a melhor maneira de fazer isso? Devo adicionar algo no web.xml? como um ouvinte? Essa será a única alteração ou terei que alterar o código existente?

O código não realiza nenhuma verificação de erro. apenas chama o SP como abaixo

getSqlMapClientTemplate().queryForList("sp.getfmrAddy", paramMap);

questionAnswers(2)

yourAnswerToTheQuestion