Uma exceção do servidor 500 ocorreu. Se for tratado por padrão, captará a exceção e pulará para a página de exceção padrão do Tomcat, conforme mostrado na figura abaixo.
Não importa qual site seja o mesmo, então o Tomcat também permite que os estilos personalizados atendam às necessidades personalizadas. Ou seja, configure -o no arquivo web.xml:
<rorwerp-age> <rorw-code> 500 </rorwror-code> <catative> /error.jsp </catching> </rorwror-page>
Primeiro, vamos falar sobre a lógica que vem com ela. Se ocorrer um erro durante a execução de uma página JSP, o mecanismo JSP gerará automaticamente um objeto de exceção. Se a página JSP especificar outra página JSP como um manipulador de erros, o mecanismo JSP colocará esse objeto de exceção no objeto de solicitação e o passará para o manipulador de erros. Se você tem a impressão de escrever servlets, é a mesma idéia que javax.servlet.forward.request_uri, que se volta para o modelo JSP, mantém o caminho de solicitação original em vez do caminho da página JSP. No manipulador de erros, porque o valor da propriedade ISERRORPAGE da Diretiva de Compilação da Página é definida como TRUE, o mecanismo JSP declarará automaticamente um objeto de exceção, obtido a partir dos parâmetros HTTP contidos no objeto de solicitação.
As informações de exceção contidas no objeto de solicitação são muito ricas, como mostrado abaixo:
Você pode usar o java declaração request.getAttribute ("javax.servlet.error.status_code") ou pode usar expressões El na página jsp, como $ {requestscope ["javax.servlet.error.status_code"]}.
Embora esta página de erro personalizada seja simples, o próprio JSP possui bons resultados de encapsulamento. Eu também vi muitos recursos de outras pessoas, mas depois de um estudo cuidadoso, também há muito "aprendizado", então eu quero "moer esta roda" novamente - antes de tudo, o local é uma página JSP ou um servlet, mas se o servlet não puder ser iniciado, basta usar uma página JSP simples. Definimos métodos de classe interna através de páginas JSP para alcançar a separação de página e lógica (sem necessidade de escrever servlets). As idéias restantes são as seguintes:
Preencha a classe ErrorHandler no JSP. Outra página chama essa classe ErrorHandler. Ele pode não apenas aceitar erros da página JSP, mas também aceitar erros passados pelo controlador do servlet. Ele extrai o máximo de informações possível e grava todo o conteúdo da memória primeiro e, em seguida, produz as informações de erro de dois fluxos de saída para a página e o arquivo. Ao mesmo tempo, ao adicionar algumas frases simples, você também pode escrever uma cópia das informações na página da web no banco de dados ou texto para retornar HTML/JSON/XML
O código de implementação é o seguinte:
/ *** Classe de manuseio de exceção*/ classe ErrorHandler {// Todos os conteúdos são gravados primeiro na memória e depois a saída de dois fluxos de saída para a página e o arquivo, respectivamente. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream (); PrintStream privado PrintStream = new PrintStream (byteArrayOutputStream); / ** * Colete informações de erro * @param request * @param excepção * @param out */ public errorHandler (solicitação httpServletRequest, exceção de arremesso, jspwriter out) {setRequest (request); setException (exceção); if (out! = null) {tente {out.print (bytearrayoutputStream); // saída para a página da web} catch (ioexception e) {e.printStackTrace (); }} log (solicitação); if (byteArrayOutputStream! = null) tente {bytearrayoutputStream.close (); } catch (ioexception e) {e.printStackTrace (); } if (printStream! = null) printStream.close (); } / ** * * @param request * / private void setRequest (httpServletRequest Request) {printStream.println (); printStream.println ("Conta de usuário:" + request.getSession (). getAttribute ("nome de usuário")); printStream.println ("Caminho acessado:" + getinfo (solicitação, "javax.servlet.forward.request_uri", string.class)); printStream.println ("Endereço da página de erro:" + getinfo (solicitação, "javax.servlet.error.request_uri", string.class)); printStream.println ("Código de erro:" + getinfo (solicitação, "javax.servlet.error.status_code", int.class)); printStream.println ("Tipo de exceção:" + getinfo (solicitação, "javax.servlet.error.exception_type", classe.class)); printStream.println ("Informações de exceção:" + getinfo (solicitação, "javax.servlet.error.message", string.class)); printStream.println ("Exception servlet:" + getinfo (solicitação, "javax.servlet.error.servlet_name", string.class)); printStream.println (); // os outros dois objetos getinfo (solicitação, "javax.servlet.jspexception", throwable.class); getinfo (solicitação, "javax.servlet.forward.jspexception", throwable.class); getinfo (solicitação, "javax.servlet.forward.jspexception", throwable.class); Mapa <string, string []> map = request.getParameterMap (); para (chave de string: map.keyset ()) {printStream.println ("O parâmetro na solicitação inclui:"); printStream.println (key + "=" + request.getParameter (key)); printStream.println (); } para (cookie cookie: request.getcookies ()) {// cookie.getValue () printStream.println ("cookies na solicitação incluem:"); printStream.println (cookie.getName () + "=" + cookie.getValue ()); printStream.println (); }} / ** * * @param Exception * / private void setException (Exceção de Throwable) {if (Exception! = null) {printStream.println ("Informações da exceção"); printStream.println (excepcion.getClass () + ":" + excepcion.getMessage ()); printStream.println (); printStream.println ("Stackinformation"); Exception.printStackTrace (PrintStream); printStream.println (); }}/** * * @param request */private void log (httpServletRequest request) {file dir = novo arquivo (request.getSession (). getServletContext (). getRealPath ("/errorLog")); if (! Dir.Exists ()) {Dir.mkdir (); } String timestamp = new java.text.simpledateFormat ("yyyymmddhhmmsss"). Formato (new Date ()); Arquivo de arquivo = novo arquivo (dir.getabsolutepath () + file.separatorchar + "error-" + timestamp + ".txt"); // Try (FileOutputStream fileOutputStream = new FileOutputStream (FILE); // PrintStream PS = new PrintStream (FileOutputStream)) {// grava no arquivo // ps.print (byteArrayoutStream); //} catch (filenotfoundException e) {// e.printStackTrace (); //} catch (ioexception e) {// e.printStackTrace (); //} catch (Exceção e) {// e.printStackTrace (); //}}/ ** * * @param request * @param key * @param tipo * @return */ @suppresswarnings ("desmarcado") privado <t> t getinfo (httpServletRequest solicitação, chave de string, classe <T) {object obj = request.getAttribute (key); retornar obj == null? nulo: (t) obj; }} Isso permitirá o controle de exceção. A seguir, define web.xml para deixar o erro do tomcat levar ao erro error.jsp que acabamos de especificar
<!-404 Não há erro na página-> <rorwerpage> <rorwer-code> 404 </rorwercode> <ctatherion> /web-inf/jsp/common/default/error.jsp </catchode> </error-page> <!-//-> <! <Catherion> /web-inf/jsp/common/default/error.jsp </location> </rorwror-page> <!-//->
Organizamos uma página padrão da seguinte maneira
O código -fonte é o seguinte:
<%@ página páginancoding = "utf-8" iserRorPage = "true"%> <%@ incluir file = "/web-inf/jsp/Common/Classicjsp/util.jsp"%> <! Min-largura: 320px; margem: 0 automático; Top-top: 2%; } textarea {largura: 100%; Min-altura: 300px; } h1 {text-align: certo; Cor: LightGray; } div {margin-top: 1%; } </style> </head> <body> <h1> desculpe! </h1> <div style = "preenchimento: 2% 0; text-indent: 2em;"> Prezados usuários: estamos comprometidos em fornecer melhores serviços, mas os cálculos humanos não são tão bons quanto os cálculos de Deus. Alguns erros ocorreram e espero que estejam no escopo de controle ... se o problema ocorrer repetidamente, por favor, por favor, feedback ao administrador do sistema. </div> <sexttarea> <% new ErrorHandler (solicitação, exceção, out); %> </sexttarea> <div> <Center> <a href = "$ {PageContext.request.ContextPath}"> de volta à página inicial </a> | <a href = "javascript: History.go (-1);"> página anterior </a> </fenter> </div> </body> </html>O exposto acima é tudo sobre este artigo, espero que seja útil para o aprendizado de todos.