IntelliJ IDEA开发Servlet项目 显示404“未找到”问题的解决
软件版本 IntelliJ IDEA 2019.1.3 (Ultimate Edition)
在我的另一篇博客中新建完成一个JavaWeb项目后,在src
文件夹中新建Servlet
我的项目名是testServlet,Tomcat端口是8080
Servlet接口需要实现的各个方法的简单解释:
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(name = "Servlet")
public class Servlet implements javax.servlet.Servlet {
/**
* 执行时机:是Servlet的实例对象被销毁时调用
* 做一些收尾或清理的工作
*/
public void destroy() {
}
/**
* 获得ServletConfig的配置对象
*/
public ServletConfig getServletConfig() {
return null;
}
/**
* 获得当前的Servlet的一些属性
*/
public String getServletInfo() {
return null;
}
/**
* 执行时机:当Servlet示例被创建的时候被调用,做初始化工作
* ServletConfig:Servlet的配置对象,初始化的时候可以进行配置
*/
public void init(ServletConfig config) throws ServletException {
}
/**
* 执行时机:当一个请求来请求当前的Servlet的时候被调用
* 处理当前的Servlet的业务逻辑并把响应返回给浏览器
*/
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
}
web/WEB-INF/web.xml的标签中添加以下内容作为映射:
<servlet>
<!--设置servlet名字-->
<servlet-name>helloServlet</servlet-name>
<!--具体的servlet类-->
<servlet-class>Servlet</servlet-class>
</servlet>
<servlet-mapping>
<!--指定要映射的servlet的名字-->
<servlet-name>helloServlet</servlet-name>
<!--servlet的具体映射路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
实现方法后运行项目,弹出的浏览器的窗口的路径是http://localhost:端口/项目名_war_exploded/
,显示的是index.jsp
中的内容,此时如果直接将/项目名_war_exploded/
改为/hello
(web.xml中设置的具体映射路径)的话会显示404
这一问题的解决
原因: 在配置tomcat的时候Server中Open browser选项勾选之后写入的地址会自动更新到Deployment中的Application content的地址,导致访问的根路径发生变化
解决: 打开idea中的Tomcat服务器配置界面修改下面地方的两个地址,改为/项目名
改为
重启Tomcat服务器后,打开的浏览器窗口的地址默认为http://localhost:8080/testServlet/
在地址后面添加Servlet的具体映射路径,会创建Servlet服务器
附 Servlet的生命周期:
/**
* Servlet生命周期
* Servlet对象实例并不是由我们手动的创建,而是web容器给我们创建
* void init(ServletConfig config):默认情况当Servlet被第一次访问的时候init会被调用
* (说明Servlet的实例默认情况下是第一次被访问的时候创建的,这个是可以改的),
* 第二次往后都不会再被调用。Servlet的实例是单例的
* void service(ServletRequest request, ServletResponse response):每次请求来的时候都会被调用
* void destroy():当Servlet实例销毁时被调用(服务器停了或者项目从服务器中被删掉了等)
*
*/