一个简单的Servlet程序

Servlet简介

Servlet是什么?简单地说,它就是一个java程序,是一个运行在web服务器上的程序。它可以对Web浏览器或其他HTTP客服端程序发出的请求进行处理。但是使Servlet能够处理以上请求的前提条件是Servlet对象要被布置在Servlet容器当中,我们这里用的Servlet容器就是我们前面用到的Tomcat服务器。

Servlet的使用和JSP不同,它需要web.xml文件的配置。当一个客户端发出HTTP请求时,服务器会根据配置文件中的配置信息将该请求的信息发送给相对应的Servlet进行处理。

Servlet的基本结构

Servlet就是一段由java编写的程序,由服务器来维护。为了方便服务器的处理,Servlet需要遵循一定的结构规范。通常我们所说的Servlet就是一个实现了HttpServlet抽象类的类的实例。代码结构如下:

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

public class ServTest extends HttpServlet {
    //init method
    public void init() throws ServletException {}
    //handle get request
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    //handle post request
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    //handle put request
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    //handle delete request
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    //destroy
    public void destroy() {}
}

7行,Servlet继承HttpServlet类。

9行,init()方法,服务器在创建Servlet实例后会调用该方法进行初始化的工作。

11~20行,Servlet就是通过这些do方法来处理对应的Http请求的。事实上,这些do方法都是从HttpServlet中继承来的,我们这里需要对这些方法进行重写以处理具体的请求。

23行,当服务器关闭时,该destroy()方法会被调用,销毁该实例。

Servlet生命周期

我们知道,Servlet是由服务器维护的。那么服务器是如何管理Servlet的呢?通常有以下几个阶段,这些阶段也就是Servlet从生到死的生命周期:

  • 当某个Servlet第一次被请求的时候,服务器会加载对应的Servlet类,将其放在Servlet实例池中。
  • 创建Servlet实例后,将调用该实例的init()方法进行一些初始化操作。(即Servlet的代码结构中的init())
  • 服务器通过调用Servlet的service()方法来处理客户端发送的请求。实际上,上面的Servlet的代码结构中的do方法都是通过service()来调用的。代码结构中我们没有显式地看到service()方法是因为我们没有对继承的该方法进行重写。
  • Servlet实例创建后会一直存在于内存中,直到服务器关闭,Servlet的destroy()方法被调用,该实例被销毁。

关于Servlet的生命周期,我们有一个实验来看,见以下文章:

实验说明Servlet的生命周期

Servlet的xml配置

Servlet在使用之前需要进行一定的配置,来告诉服务器被请求的Servlet应该发到哪里。这其实就是一个Servlet在服务器的注册过程,这样服务器就会知道哪个Servlet请求对应哪个Servlet对象。配置过程通常分为Servlet的声明和Servlet的映射两部分。

Servlet的声明

语法格式如下:

<servlet>
  <servlet-name>name</servlet-name>
  <servlet-class>path</servler-class>
</servlet>

第一条语句中的name是声明的Servlet对象的名字,名字你可以自取,就像声明一个String abc一样,abc名字可以自取。

第二条语句中的path是用于指定你的Servlet的class文件的路径的。通常你把你的Servlet编译好的class文件放在Tomacat安装目录下的/webapp/ProjectName/WEB-INF/classes文件夹下,此时只需要写你的Servlet的class文件的名字就行了:

<servlet-class>ServTest</servler-class>

ProjectName是你的webapp文件夹,里面的WEB-INF及classes文件夹需要手动创建。

如果你的Servlet在某个package中,比如说:

package servPack

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

public class ServTest extends HttpServlet {
}

该servTest在servPack包中,此时你要在/WEB-INF/classes文件中创建servPack文件夹,将你的servTest编译的class文件放到servPack中,路径写为:

<servlet-class>servPack.ServTest</servler-class>

Servlet的映射

语法格式如下:

<servlet-mapping>
  <servlet-name>name</servlet-name>
  <url-pattern>path</url-pattern>
<servlet-mapping>

这里是对我们上面声明的Servlet的一个映射,所以这里的name要和上面声明中的name一样才行。

url-pattern用于映射你的访问URL,例如将你的访问URL映射为:

<url-pattern>/ServletTest<url-pattern>

你就可以通过

localhost:8080/ServletTest

来请求该Servlet了。

一个简单的Servlet程序:

在Servlet的简单介绍后,做一个简单的Servlet程序。

首先在Tomcat安装目录下的webapps文件夹下创建一个SimpleServlet文件夹。依次创建目录:

/webapps/SimpleServlet/WEB-INF/classes

接下来我们在/SimpleServlet目录下创建一个jsp文件来调用Servlet:index.jsp

index.jsp

<%@ page contentType="text/html;charset=gb2312" language="java" %>
<html>
  <head>
    <title>Servlet</title>
  </head>
  <body>
    <center>
      <form action="MyServlet" name="form" method="post">
      Your Name:<input type="text" name="USERNAME"><br>
      <input type="submit" value="SUBMIT"></form>
    </center>
  </body>
</html>

上面的JSP中表单指定了请求为post,我们套用上面介绍的代码结构:

ServTest.java

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

public class ServTest extends HttpServlet {
    //handle post request
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("gb2312");

        PrintWriter out = response.getWriter();
        String name = request.getParameter("USERNAME");

        out.println("Your Name : " + name);

    }
    //destroy
    public void destroy() {}
}

由于表单指定的请求为post类型,我们这里只简单重写了doPost()方法。service()方法会识别并调用这里的doPost方法进行处理。把这个java文件进行编译,编译后的class文件放入/WEB-INF/classes/文件夹下。

如果你使用javac编译该java文件,你需要把下载的javax.servlet的jar文件包含在calsspath环境变量中。如果你使用的集成开发环境,你需要在工程中添加该jar包。

接下来就是写配置文件了,也就是对该Servlet对象在服务器进行注册,进入到/SimpleServlet/WEB-INF/文件夹下,新建web.xml文件:

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">

    <servlet>
            <servlet-name>ServletHandle</servlet-name>
            <servlet-class>ServTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletHandle</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>
</web-app>

照样复制过来就可以了。我特意取了三个不同的名字:ServTest(类文件名),ServletHandle以及映射URL的/MyServlet。看明白这三个不同的名字有利于区分这些概念。注意表单中的

action="MyServlet"

接下来,运行Tomcat服务器,在浏览器中输入:

localhost:8080/SimpleServlet/index.jsp

然后在文本框内输入你的名字,最好是英文,中文可能出现乱码。如下图:

然后点击submit,会得到以下输出:

http://localhost:8080/SimpleServlet/MyServlet
Your Name : easy

第一行是地址栏。

推荐阅读:

实验说明Servlet的生命周期

你可能感兴趣的:(java,tomcat,servlet)