文章目录

  • 一、404是什么
  • 二、错误原因
  • 1. 路径写错了
  • 2. 创建的Servlet的注解问题
  • 3. 系统问题
  • 4. 特别的404
  • 4.1 背景
  • 4.2 误区
  • 4.3 解决方法
  • 4.4 反思



一、404是什么

404报错就是请求路径错误。就是项目中没有找到这个路径的文件。

二、错误原因

1. 路径写错了

  1. 就是确实是你自己路径写错了,所以在请求转发寻找这个路径的时候没有找到。
  2. 使用jQuery对象获取项目根路径,获取错了,所以找不到这个路径。

解决方法:根据那个报错的路径,从项目的根目录开始一直向下查找,看有没有这个文件。检查一下是不是自己写错路径了,或者是没有获取到正确的路径。

2. 创建的Servlet的注解问题

今天用之前一个版本的idea创建了一个Servlet页面,自己以为「注解」一般都是系统自动生成的应该没有问题。结果,如下图所示,这个「注解」的路径信息是不全的,只写了name属性,没有value属性,导致一直报404获取不到这个路径。

请求路径命名规范java 请求路径错误_intellij-idea


解决方法:创建完Servlet页面,还是要检查一下。

可以这么写

请求路径命名规范java 请求路径错误_java-ee_02


也可以这么写

请求路径命名规范java 请求路径错误_tomcat_03

3. 系统问题

  1. 一般新建Servlet文件后,需要重启一下服务器。只有将该文件也添加到Tomcat服务器里面,这样才能找到该文件。
  2. 今天,我的同学引入jQuery包后,输入包路径后始终获取显示404,获取不到这个包的路径。最终的解决方法是重启一下软件就好了。

4. 特别的404

昨天搞了一下午,今天上午又搞了几个小时,终于找到了这个404的问题,找到之后真的让我有点有点哭笑不得。这个bug给我最大的收获就是解决bug千万不要思维定式

4.1 背景

这个404是做Ajax异步请求时出现的,我要做的异步请求是点击省的名称后,要出现对应的市的名称。而这个特别的404问题算不上是一个真正的404问题,下面记录了一下自己解决这个bug的思考过程,希望可以给阅读到这里的小伙伴一些解决bug的思路。
开始问题在于出现bug,它只会打印错误的状态码,控制台也只打印错误的状态码。这是由我的程序决定的,代码如下。

error: function (xmlHttpRequest) {
 	 alert(xmlHttpRequest.status);
}

这样的话,你就无法定位到具体是哪一行出错了。程序加载后,先出现的其实是500,由于代码逻辑比较简单,所以自己并不觉得是自己的语法或逻辑出了问题。后来点击「省」后,就会报404。由于自己现在也是刚入门,所以就把重点放在了404上,觉得一定是自己的路径出了什么问题。根据404,自己首先想到的就是自己的路径错了。但一般如果是路径写错了,其实还是比较好解决的,就像我上面提到的哪些解决方法。

4.2 误区

程序的报错是程序运行后先报500,然后当我点击404。报500就说明是后台代码出错了,但是又报404,说明路径请求也有问题,昨天,自己是把重点放在了404上,认为可能主要的原因就是自己的路径问题引起的,所以到最后都没能解决这个问题。

4.3 解决方法

今天,我采取的方法是:
①先整体浏览一遍自己写的程序,看是否真的是路径写错了,检查之后,确认自己的路径是没有问题的。之前配置过Tomcat服务器启动后,配置后可以自动加载初始页面。如果有问题,唯一能想到的就是是不是那个配置有问题。但是又想到,自己之前的程序都是在这个配置下运行的,而且我省的名字是可以查到的,只是在查市时,出现了404,因此排除是因为配置的问题或是自己的请求路径写错的可能性。
②既然是路径出错了,是不是注解有问题,没起作用。

@WebServlet("/SearchCityServlet")

然后注释了注解,配置了web.xml文件的路径

<servlet>
        <!--Servlet的内部名称-->
        <servlet-name>SearchCityServlet</servlet-name>
        <!--Servlet的类名 包名+简单类名-->
        <servlet-class>servlets.SearchCityServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--Servlet的内部名称-->
        <servlet-name>SearchCityServlet</servlet-name>
        <!--Servlet的访问名称,url地址 /名称-->
        <url-pattern>/SearchCityServlet</url-pattern>
    </servlet-mapping>

还是没有起作用,这就排除了可能的原因是注解或xml文件配置出了错。

③这个文件是在idea2020.3.3上创建的,但我电脑上还有一个idea2020.3.1的版本。编写市的代码的时候我是用idea2020.3.1的那个版本打开创建的那个SearchCityServlet,我想是不是因为不同版本的idea的创建的Servlet不同而引起的。

于是,我又在项目下创建了一个SearchCityServlet2,看看能不能访问到这个SearchCityServlet2。结果是可以的。我想这样就解决了404路径问题了啊!我只需要把SearchCityServlet内容移动到SearchCityServlet2不就解决了这个问题了吗!发现移动过来后还是会报同样的问题。这样就排除了是因为在不同idea版本创建的Servlet不同的可能。说明是自己的代码真的是有问题的。

④注释部分代码,一点一点排错,我做了如下修改:

把之前的Ajax代码注释掉,添加form表单,直接提交表单,看表单的内容能不能发送到SearchCityServlet。

请求路径命名规范java 请求路径错误_java-ee_04


提交表单的代码

请求路径命名规范java 请求路径错误_java-ee_05


在SearchCityServlet进行输出,看看SearchCityServlet能不能获取到数据,如果可以的话,那说明这个路径是没有问题的,问题出在Ajax异步请求上。

请求路径命名规范java 请求路径错误_ide_06


结果报错如下:

加载程序后先报了500

请求路径命名规范java 请求路径错误_tomcat_07


当我点击省后,又出现了404。这说明问题不是在Ajax。

请求路径命名规范java 请求路径错误_intellij-idea_08


这时我才重视起来这个500错误。首先我是查了 Error instantiating servlet class [servlets.SearchCityServlet] 查到的大部分解决方案是 web.xml 文件配置有问题。这个在我这里显然是不成立的。

接下来,我又往下看了看,让我眼前一亮的是 Root Cause 根本原因是 service.CityService.<init>(CityService.java:8)。然后我看了一下 CityService 才发现真正的问题是

请求路径命名规范java 请求路径错误_tomcat_09


看到这个,我~~!本应该是创建一个 CityDao 对象,然后调用 CityDao 里面的方法来获取到所有的市的信息,结果代码敲的有点快,创建了一个本类对象,用本类的对象调用本类的方法,导致的栈溢出。写完后又没有测试一下这一部分的代码,大意了,导致浪费了这么多的时间!

这个算不上是404问题,而是由500引起的,首先第一次Ajax异步请求是发送到 SearchCityServlet 的。而在执行这条代码的时候,由于栈溢出,出现了500错误。

List<City> cities = cityService.selectByProvinceId(provinceId);

由于代码问题出现500错误,导致当自己再次点击「省」想要获取到「市」时,异步请求出错,就无法找到 SearchCityServlet,所以才会报错404。

4.4 反思

这个bug也提醒自己,在解决bug需要按bug的出现次序来依次解决。这次的bug由于我过渡重视这个404而忽略了500,导致自己浪费了太多的时间,忽略500也许是因为这个程序比较简单,自己觉得自己写得没有问题,没有很复杂的逻辑,应该不会出现什么逻辑错误。
可是由于自己的疏忽,而最终导致的这种无意错写还是时有发生的,所以切忌盲目自信。不得不承认,自从写程序,自己确实比之前细心了不少。出现问题后,还是需要从前向后依次排查。