手写第一个Servlet程序

手动创建 Servlet 并部署到 Tomcat

Servlet 不能独立运行,需要由 Servlet 容器来调用。一个 Servlet 就是一个 Java 类型,它是供其他 Java 程序(Servlet 引擎)调用的 Java 类,其运行完全由 Servlet 引擎来控制和调度。一个 Servlet 程序一般由不止一个 Servlet 类组成。

下面手动创建一个 Servlet 类并添加到 web 应用中。

继承关系:sun公司的servlet接口tomcat去实现这个接口(HttpServlet)web应用中具体的servlet类(HomeServlet)

创建 Servlet 类

使用普通 JavaSE 版本的 Eclipse 创建一个普通类,无需 main 方法。引入 Tomcat 目录 lib 文件夹下的 servlet-api.jar,代码如下:

package cn.bamn.demo;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HomeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("www.bamn.cn 北盟网校");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}Code language: JavaScript (javascript)

编译与部署

Eclipse 会在类文件修改后自动编译为 .class 文件。将编译后的 HomeServlet.class 放到 web 应用的 WEB-INF/classes 目录下(注意不是 bin 目录)。如果类属于某个包,需将整个包目录拷贝到 classes 下,否则会报 ClassNotFoundException

配置 web.xml 映射

Servlet 需要通过 URL 地址映射到具体的 Servlet 类,在 web.xml 中配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                          http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
      version="3.1"
      metadata-complete="true">

    <servlet>
        <servlet-name>homeservlet</servlet-name>
        <servlet-class>cn.bamn.demo.HomeServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>homeservlet</servlet-name>
        <url-pattern>/home</url-pattern>
    </servlet-mapping>
</web-app>Code language: HTML, XML (xml)

常见错误

若未正确拷贝包目录结构,访问时会出现以下错误:

HTTP Status 500 - Wrapper cannot find servlet class cn.bamn.demo.UserServlet or a class it depends on
root cause: java.lang.ClassNotFoundException: cn.bamn.demo.UserServletCode language: CSS (css)

我们的servlet变异后的class文件应该要把整个包文件都拷贝过去。

当我们访问一个URL地址的时候。其实我们的浏览器帮我们发起了对服务器的请求。

在浏览器的开发者工具中。我们可以看到。比如我们访问

http://localhost:8080/homepage/home

这个地址的时候

一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容

HTTP请求

包括请求标头和请求正文

请求行-以何种方式获取那个地址的内容

  请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST

  用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。

  不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1

  GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。

  如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。

消息头-告诉服务器客户端的一些信息

  HTTP请求中的常用消息头

  accept:浏览器通过这个头告诉服务器,它所支持的数据类型

  Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集

  Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式

  Accept-Language:浏览器通过这个头告诉服务器,它的语言环境

  Host:浏览器通过这个头告诉服务器,想访问哪台主机

  If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间

  Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的  防盗链

  Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接

HTTP响应

一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容

包括响应标头 和响应正文

关键一点是 理解浏览器请求过程和服务器响应过程。

请求过程 有一个请求方法 get post等 同时会带上客户端这边的一些信息。这些信息有利于服务器进行业务设计

浏览器发起请求的时候回带上一些信息。

服务器给客户响应的时候也会带上信息

处理响应标头 还包含响应正文

响应正文就是我们看到的html代码

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注