初识Servlet

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSO8v9Re-1653037725784)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520150608055.png)]

2)选择项目要存放的目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkesNyO9-1653037725785)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520151200028.png)]

3)项目创建完毕

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EdHr51BU-1653037725786)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520152641743.png)]

②引入依赖

Maven项目创建完毕后,会自动生成一个pom.xmal文件.

我们需要在pom.xml中引入Servlet API 依赖的jar包.

1)在中央仓库https://mvnrepository.com/search?q=Servlet中搜索 “Servlet”,一般第一个结果就是

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ks9x7mem-1653037725786)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520151943040.png)]

2)选择版本.一般我们使用3.1.0版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s1oQRQcD-1653037725786)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520152027541.png)]

Servlet的版本要和Tomcatpp

我的Tomcat是8.5的,所以选择Servlet3.1.0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEQtSnDB-1653037725786)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520152328694.png)]

3)把中央仓库中提供的xml赋值到项目的pom.xml中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhjDW0Kq-1653037725787)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520152514471.png)]

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导入前

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JhAZpICo-1653037725787)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520152935500.png)]

修改后的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>

下载前

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQjT2bLl-1653037725787)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520153517305.png)]

下载后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-usy6zpQQ-1653037725788)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520153645669.png)]

③创建目录

我们在第一步没有使用模板来创建工程,所以还有一些目录是需要我们自己创建的.

初始目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9id6rJEq-1653037725788)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520154349140.png)]

除了上面这些目录我们还需创建一个目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fS4Omm7F-1653037725788)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520154729140.png)]

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 写回给浏览器.

⑤打包程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OczF4c73-1653037725789)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520155825268.png)]

打包前的准备

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzRdA7Wa-1653037725789)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520160020383.png)]

默认的打包是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>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uMlLze5H-1653037725789)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520160404935.png)]

⑥部署程序

把 war 包拷贝到 Tomcat 的 webapps 目录下 启动 Tomcat , Tomcat 就会自动把 war 包解压缩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRZKyclF-1653037725790)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520160540642.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wf8ENxE3-1653037725790)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520160640955.png)]

看到这个日志说明 Tomcat 已经正确识别了 ServletHelloWorld 这个 webapp

⑦验证程序

此时通过浏览器访问 http://127.0.0.1:8080/he1/hello
就可以看到结果了.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Izh0jYM6-1653037725790)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520160909605.png)]

到这里我们的第一个Servlet程序就已经创建完成了.

3.Maven中Tomcat

上面这个七步创建一个Servlet程序,是不是感觉有一丝丝的小麻烦,看的脑瓜子痛,其实可以使用IEDA中的Maven,可以减少一些工作量

①第一步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OojWBUjP-1653037725790)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520161615947.png)]

②第二歩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENfPyA9R-1653037725790)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520161719819.png)]

③第三歩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lUf7a7WI-1653037725791)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520161929632.png)]

④第四歩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-swLb8lx9-1653037725791)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520162200165.png)]

⑤第五歩

点击运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJGUqzGZ-1653037725791)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520162258694.png)]

⑥第六步

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QApbOEs7-1653037725791)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520163812290.png)]

自己加上hello路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAGbXJ0l-1653037725791)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520162716312.png)]

4.访问出错怎么办

①出现404

404表示用户访问的资源不存在,大概率是URL的路径写的不正确

错误实例1: 少写了 Context Path

通过/hello 访问服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tV0OQtJd-1653037725792)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520164601485.png)]

**错误实例2: ** 少写了 Servlet Path

通过/he1 访问服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bckHcQe7-1653037725792)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520164157356.png)]

错误实例3: Servletpath 写的和URL 不匹配

修改 @WebServlet 注解的路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtXPGvmo-1653037725792)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520164754776.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X0pBRI5j-1653037725792)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520164733578.png)]

错误实例4: web.xml出错

清除 web.xml 中的内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mt6oUgoK-1653037725792)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520165035535.png)]

②出现405

405 表示对应的 HTTP 请求方法没有实现

错误实例: 没有实现doGet方法:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ek3hQIvS-1653037725792)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520165543273.png)]

③出现 500

往往是 Servlet 代码中抛出异常导致的 .

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ycK2BKpl-1653037725793)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520165749373.png)]

在页面上已经有具体的异常调用栈

异常信息里已经提示了出现异常的代码是 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");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czWlznNa-1653037725793)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220520170111075.png)]

小结

熟悉 HTTP 协议能够让我们调试问题事半功倍.

  • 4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及Servlet Path 是否一致.

  • 5xx 的状态码表示服务器出现错误, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.

  • 出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误提示.

  • 空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.

  • 观察日志是调试程序的重要途径. Tomcat 的日志往往很多, 需要同学们耐心阅读, 经常阅读, 熟练
    了就能更快速的找到问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值