tomcat常见错误跳转到指定页面

通过URL访问tomcat中资源,有许多常见的错误,比如说404呀,500呀什么的,如果不加设置,浏览器页面会直接显示这些错误,用户感受当然是相当不好的了,那么如何解决这个问题呢?

其实很简单,只需要在项目的web.xml中添加一些配置

<error-page>
    <error-code>400</error-code>
    <location>/WEB-INF/views/error/400.jsp</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/WEB-INF/views/error/403.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/views/error/404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/views/error/500.jsp</location>
</error-page>
<!-- java.lang.Exception异常错误,依据这个标记可定义多个类似错误提示 -->
<!--<error-page>-->
   <!--<exception-type>java.lang.Exception</exception-type>-->
   <!--<location>/error.jsp</location>-->
<!--</error-page>-->



具体的如下:

Tomcat 的错误页面是由 org.apache.catalina.valves.ErrorReportValve 类输出来的。如果想自定义错误页面,不需要修改该类。Servlet 规范声明了相关的API,只需要在每个 web 应用的 web.xml 里定义。可按照错误类型、错误代码配置。例如:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

<display-name>Welcome to Tomcat</display-name>
<description>
     Welcome to Tomcat
</description>

<error-page>
<error-code>404</error-code>
<location>/errorpages/404.jsp</location>
</error-page>  

<error-page>
  <exception-type>java.lang.Exception</exception-type>
  <location>/errorpages/exception.jsp</location>
 </error-page>


</web-app>

注意错误页面必须以“/”开头,这样任何path的404错误页面及exception错误都会映射到这两个文件。然后在本web引用的errorpages下面放置404.jsp, exception.jsp两个文件。

错误页面 404.jsp:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<html>
<header>
<title>404 page</title>
<body>

<pre>
<%
    Enumeration<String> attributeNames = request.getAttributeNames();
    while (attributeNames.hasMoreElements())
    {
        String attributeName = attributeNames.nextElement();
        Object attribute = request.getAttribute(attributeName);
   out.println("request.attribute['" + attributeName + "'] = " + attribute); 
    }
%>
</pre>

代码中输出了所有的 request 中的变量。从中也可以看到访问哪个文件出错,跳到哪个错误页面了,从而进行更详细、更人性化的错误处理。例如,提示可能的正确网址等等。

例如:访问一个不存在的页面 page_not_exist.html,显示的信息为:

request.attribute['javax.servlet.forward.request_uri'] = /page_not_exists.html
request.attribute['javax.servlet.forward.context_path'] = 
request.attribute['javax.servlet.forward.servlet_path'] = /page_not_exists.html
request.attribute['javax.servlet.forward.path_info'] = /errorpages/404.jsp
request.attribute['javax.servlet.error.message'] = /page_not_exists.html
request.attribute['javax.servlet.error.status_code'] = 404
request.attribute['javax.servlet.error.servlet_name'] = default
request.attribute['javax.servlet.error.request_uri'] = /page_not_exists.html

注意,该错误页面必须大于512字节,否则IE将不予显示。因为IE默认只显示大于512字节的错误页面。Firefox中正常显示。可以添加一些其他信息,将页面大小扩充到512字节以上。如果仍不能显示,请检查IE设置,将该选项选中。


异常处理页面 exception.jsp:

<%@ page contentType="text/html; charset=UTF-8" isErrorPage="true" %>
<%@ page import="java.io.*" %>
<html>
<header>
<title>exception page</title>
<body>
<hr/>
<pre>
<%
response.getWriter().println("Exception: " + exception); 

if(exception != null)
{
   response.getWriter().println("<pre>"); 
   exception.printStackTrace(response.getWriter()); 
   response.getWriter().println("</pre>"); 
}

response.getWriter().println("<hr/>"); 
%>

注意isErrorPage熟悉必须为true,才能使用exception对象。exception即捕捉到的异常。此处可以对exception进行处理,比如记录日志、重定向等等。这里把exception trace打印出来了。

500、505 等错误页面的处理类似于404。



### Tomcat 中 JSP 文件 404 错误解决方案 当遇到 Tomcat 返回 `HTTP Status 404` 的错误提示时,通常表示服务器未能到请求的资源。对于 JSP 文件而言,这可能是由于 Web 应用未正确配置或缺少必要的依赖项所致。 以下是可能导致此问题的原因以及对应的解决方法: #### 原因分析与解决措施 1. **未正确设置 Server Runtime** 如果项目中缺失 Tomcat 运行库的支持,则可能会导致 JSP 页面无法被编译并返回给客户端。可以通过以下方式解决问题: 在 Eclipse 或其他 IDE 中操作如下: - 右键点击项目名称 -> Build Path -> Configure Build Path。 - 转到 Libraries 标签页,点击 Add Library...。 - 选择 Server Runtime 并指定 Apache Tomcat vX.X 版本[^1]。 2. **Web Facet 配置不完整** 若项目的 Web Facet 设置不当,也可能引发此类问题。确保项目已启用动态 Web 模块支持,并将其版本调整至适合当前使用的 Servlet 容器标准(如 Tomcat 8 对应的是 Servlet 3.1)。具体步骤如下: - 打开 Project Properties (右键单击项目名 -> Properties)。 - 导航至 Project Facets,在这里勾选 Dynamic Web Module 和 Java EE 相关选项。 - 将其版本号设为匹配所部署容器的要求[^2]。 3. **文件路径定义有误** 确认所有的 JSP 文件都存放在 WEB-INF 外部目录下,因为放置于该位置内的任何内容都不会对外公开访问。如果确实需要保护某些静态资源免受直接调用影响的话,可以考虑通过 servlet 映射来间接获取它们的内容[^3]。 4. **上下文根路径冲突** 当多个应用共享同一个虚拟主机或者端口监听地址时,容易造成命名空间重叠现象从而引起不到页面的情况发生。因此建议检查 server.xml 文件中的 Context 元素属性值是否唯一无重复;另外还需注意 URL 请求串拼接过程中是否存在多余斜杠等问题[^4]。 5. **重新启动服务实例** 即使完成了上述更改之后仍然看不到预期效果,那么很可能是因为缓存机制干扰到了最新改动的实际生效过程。此时应当尝试停止再重启整个 Tomcat 实例以清除内存残留数据的影响[^5]。 ```bash # 使用命令行管理 Tomcat 生命周期 $CATALINA_HOME/bin/shutdown.sh && $CATALINA_HOME/bin/startup.sh ``` --- ### 示例代码片段展示如何映射自定义Servlet处理特定URL模式下的请求转发逻辑 下面给出一段简单的例子演示怎样创建一个新的servlet并将它绑定到某个固定的url-pattern上实现跳转功能: ```java // MyCustomServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MyCustomServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ String targetPage="/index.jsp"; //目标jsp页面相对路径 RequestDispatcher dispatcher=getServletContext().getRequestDispatcher(targetPage); if(dispatcher!=null){ dispatcher.forward(request,response); }else{ throw new ServletException("Unable to locate resource "+targetPage); } } } ``` 接着修改webapp/WEB-INF/web.xml添加相应的<servlet>和<servlet-mapping>声明部分即可完成全部准备工作. ```xml <!-- web.xml --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1"> <!-- Define the custom servlet --> <servlet> <description>This is an example of a simple servlet</description> <display-name>My Custom Servlet</display-name> <servlet-name>mycustomservlet</servlet-name> <servlet-class>com.example.MyCustomServlet</servlet-class> </servlet> <!-- Map /example/* requests to our defined servlet above--> <servlet-mapping> <servlet-name>mycustomservlet</servlet-name> <url-pattern>/example/*</url-pattern> </servlet-mapping> </web-app> ``` 以上就是针对Tomcat环境下出现JSP Not Found(即状态码404)这一常见故障排查思路总结及相关技术要点说明文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值