2010-01-12 6 views
2

J'utilise Tomcat. J'ai défini certains <error-page> dans web.xml et mappé erreur 404 à la page /error/error.jsp. Je dois détecter si la ressource existe et définir le statut de réponse sur 404 si la ressource n'est pas disponible.Comment envoyer une réponse de servlet à la page d'erreur configurée web.xml

response.setStatus(404); 

Mais Tomcat ne redirige pas vers la page 404 je définissais, donc ma question est, est-il API pour obtenir l'emplacement de page défini dans web.xml? Je ne veux pas analyser le web.xml par moi-même.

+0

fournissent peut-être un peu plus d'informations pour que nous puissions résoudre le problème lui-même. Parce que connaître la page d'erreur pourrait ne pas aider. – Bozho

Répondre

4

utiliser juste HttpServletResponse#sendError() avec un status code. Par exemple.

File resource = new File(path, name); 
if (!resource.exists()) { 
    response.sendError(HttpServletResponse.SC_NOT_FOUND); // Sends 404. 
    return; 
} 

Le servletcontainer affichera alors la page d'erreur appropriée.

Note: la déclaration return est pas là pour la décoration. Cela évitera que la rémanence du code dans le même bloc de méthode continue de s'exécuter et pourrait produire IllegalStateException dans les logs du serveur d'applications! Les starters pensent souvent que les méthodes comme sendRedirect(), forward(), sendError(), etc, sortent automagiquement du bloc de méthode quand ils sont invoqués. C'est donc pas vrai)

+0

merci, je vais essayer! – Brodie

1

Non, il n'y a pas d'API. Le paramètre est interne à Tomcat, il ne l'expose pas directement au monde extérieur. (Vous pouvez, comme vous l'avez dit, analyser le web.xml - puisque c'est XML, il serait simple d'écrire un XQuery pour le retirer).

Je pense que vous semblez aussi être confus quant à exactement comment cela est censé fonctionner. Vous fournissez un URI à Tomcat qu'il utilisera pour servir le corps HTML d'une réponse 404. Il devra être capable de résoudre cette URI en une ressource réelle comme si elle était fournie dans une requête. Ainsi, dans de nombreux cas, vous n'avez pas besoin d'une servlet pour détecter si la ressource existe - vous avez besoin d'une servlet pour contenir la ressource à servir. L'exception est si vous utilisez Tomcat pour fournir des données de système de fichiers statiques pour certaines URL, ce que je crois est possible bien que rarement utilisé.

Si vous avez un Tomcat mis en place sans servlets, qu'attendez-vous pour servir de toute façon? Où diable voulez-vous obtenir votre page error.jsp? Comment voulez-vous qu'il le sache? Ce que vous devez faire est d'ajouter au moins un servlet Tomcat (contenant le fichier error.jsp), et assurez-vous que l'URL web.xml cartes /error/error.jsp à cette servlet (et que la ressource est placée dans le sous-répertoire d'erreur dans le servlet) .

Une fois que cela est fait, vous devriez être capable de passer manuellement à, par exemple. http://localhost:8080/<context>/error/error.jsp et avoir la réponse servie (éventuellement avec un contenu étrange car il n'y a pas d'exception réelle mais le fichier doit être trouvé). De même, si vous avez correctement configuré la directive error-page dans le fichier web.xml, vous devez afficher votre page d'erreur sous la forme d'une URL umapped (par exemple http://localhost:8080/<context>/asdfghjasgh).

+0

merci pour votre réponse, je sais que la question semblait un peu étrange, je suis en train de concevoir un cadre, le servlet est en train d'envoyer la demande à l'action appropriée. – Brodie

Questions connexes