这里写目录标题
1.初始Servlet
①Servlet是什么
Servlet是一种实现动态页面的技术,是一组Tomcat提供给程序猿的API,能帮助程序猿简单高效的开发一个WebApp.
②Servlet怎么学
学习Servlet主要是学习三个类(class),分别是HttpServlet,HttpRequset,HttpResponse.
Servlet主要做的工作
- 允许程序猿注册一个类,在Tomcat收到某个特定的Http请求的时候,执行这个类中的一些方法
- 帮助程序猿解析Http请求,把Http请求从一个字符串解析成一个HttpRequset对象
- 帮助程序构造Http响应,程序猿只要给指定的HttpResponse对象填写一些属性字段,Servlet就会自动的加载Http协议的方式构造出一个Http响应字符串,并通过Socket写回给客户端.
简而言之,Servlet,就是帮助开发人员减少开发工作量的,使开发人员把精力放到代码逻辑上.
2.第一个Servlet程序
刚学习 C 语言的时候第一个程序是在控制台上输出HelloWorld
,学习 Java 的时候也是输出HelloWorld
,那么,学习Servlet我们还是输出HelloWorld
,接下来就要考虑怎么使用Servlet来实现我们的第一个程序? 实现第一个Servlet大致可以分为七步,下面就一步步来实现.
①创建项目
使用IDEA创建一个Maven项目
1)菜单 -> 文件 -> 新建项目 -> Maven
2)选择项目要存放的目录
3)项目创建完毕
②引入依赖
Maven项目创建完毕后,会自动生成一个pom.xmal文件.
我们需要在pom.xml中引入Servlet API 依赖的jar包.
1)在中央仓库https://mvnrepository.com/search?q=Servlet中搜索 “Servlet”,一般第一个结果就是
2)选择版本.一般我们使用3.1.0版本
Servlet的版本要和Tomcatpp
我的Tomcat是8.5的,所以选择Servlet3.1.0
3)把中央仓库中提供的xml赋值到项目的pom.xml中
Servlet配置文件
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
Servlet API导入前
修改后的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
下载前
下载后
③创建目录
我们在第一步没有使用模板来创建工程,所以还有一些目录是需要我们自己创建的.
初始目录
除了上面这些目录我们还需创建一个目录
webapp 目录就是未来部署到 Tomcat 中的一个重要的目录. 当前我们可以往 webapp 中放一些静态资源, 比如 html , css 等 .
在这个目录中还有一个重要的文件 web.xml. Tomcat 找到这个文件才能正确处理webapp 中的动态资源
web.xml配置文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
</web-app>
④编写代码
在 java 目录中创建一个类 HelloServlet 代码如下:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
resp.getWriter().write("Hello Servlet");
}
}
- 创建一个类
HelloServlet
,继承HttpServlet
- 在这个类上方加上
@WebServlet("/hello")
注解, 表示 Tomcat 收到的请求中, 路径为/hello
的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path)- 重写
doGet
方法.doGet
的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发HttpServletRequest
表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个HttpServletRequest
对象. 后续想获取请求中的信息(方法, url, header, body 等) 都是通过这个对象来获取.HttpServletResponse
表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header,body 等)- resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器.
⑤打包程序
打包前的准备
默认的打包是jar,我们需要把jar改为war.
war 包和 jar 的区别
jar 包是普通的 java 程序打包的结果. 里面会包含一些 .class 文件.war 包是 java web 的程序, 里面除了会包含 .class 文件之外, 还会包含 HTML, CSS, JavaScript, 图片, 以及其他的 jar 包. 打成 war 包格式才能被 Tomcat 识别
配置文件
<packaging>war</packaging>
<build>
<finalName>he1</finalName>
</build>
⑥部署程序
把 war 包拷贝到 Tomcat 的 webapps 目录下 启动 Tomcat , Tomcat 就会自动把 war 包解压缩
看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp
⑦验证程序
此时通过浏览器访问 http://127.0.0.1:8080/he1/hello
就可以看到结果了.
到这里我们的第一个Servlet程序就已经创建完成了.
3.Maven中Tomcat
上面这个七步创建一个Servlet程序,是不是感觉有一丝丝的小麻烦,看的脑瓜子痛,其实可以使用IEDA中的Maven,可以减少一些工作量
①第一步
②第二歩
③第三歩
④第四歩
⑤第五歩
点击运行
⑥第六步
自己加上hello路径
4.访问出错怎么办
①出现404
404表示用户访问的资源不存在,大概率是URL的路径写的不正确
错误实例1: 少写了 Context Path
通过/hello
访问服务器
**错误实例2: ** 少写了 Servlet Path
通过/he1
访问服务器
错误实例3: Servletpath 写的和URL 不匹配
修改 @WebServlet 注解的路径
错误实例4: web.xml出错
清除 web.xml 中的内容
②出现405
405 表示对应的 HTTP 请求方法没有实现
错误实例: 没有实现doGet方法:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
}
③出现 500
往往是 Servlet 代码中抛出异常导致的 .
在页面上已经有具体的异常调用栈
异常信息里已经提示了出现异常的代码是 HelloServlet.java 的第 15 行.
resp.getWriter().write(s.length());
仔细检查这里的代码就可以看到空指针异常
⑤出现页面空白
错误实例:
修改代码, 去掉 resp.getWritter().write() 操作
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello");
}
}
小结
熟悉 HTTP 协议能够让我们调试问题事半功倍.
-
4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.
-
5xx 的状态码表示服务器出现错误, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.
-
出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.
-
空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.
-
观察日志是调试程序的重要途径. Tomcat 的日志往往很多, 需要同学们耐心阅读, 经常阅读, 熟练
了就能更快速的找到问题了