本文参考了这篇博客:Servlet、Servlet容器等内容讲解 - 江清澜静 - 博客园 (cnblogs.com)

一. Servlet的创建

  1. Servlet接口的定义

  Servlet接口,GenericServlet实现类, HttpServlet实现类的关系如图所示

 

vip

   GenericServlet实现了Servlet接口,HttpServlet继承了GenericServlet。

  2. Servlet接口的实现

  HelloServlet实现Servlet接口,声明如下

public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("构造器方法 HelloServlet");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化方法 init");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("处理请求 service");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("销毁 destroy");

    }
}

  注意:需要在web.xml文件中配置相关信息。

  web.xml文件声明如下

    <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>com.hsp.servlet.HelloServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

  <servlet>标签中:<servlet-class>标签是需要访问的servlet程序的位置【包名 . 类名】;<servlet-name>标签是给这个servlet程序起一个别名

  <servlet-mapping>标签:建立 url 和 servlet程序的映射关系

           <servlet-name>标签 即 在<servlet>标签中的<servlet-name>给servlet程序取的别名;

           <url-pattern>标签 就是 加上了一截其他的字符串,实际上通过浏览器翻出请求后,Tomcat将应用上下文路径截掉只剩下一个字符串作为servlet的映射匹配。

           url-pattern的理解:参看这篇博客(229条消息) 理解servlet的url-pattern_ApplauseWow的博客-CSDN博客

           上下文路径的理解:参看这篇博客(229条消息) 理解上下文路径问题_零零JA的博客-CSDN博客_上下文路径

  具体映射流程如下:

    当用户通过浏览器直接访问:localhost:8080/javaWeb01/hello后,

vip

    tomcat服务器做了如下操作

vip

    运行结果如下

构造器方法 HelloServlet
初始化方法 init
处理请求 service

    当关闭web项目时,才会打印销毁 destroy。

   3. HelloServlet处理请求

  3.1 在web目录下创建pages文件夹,并在pages目录下,创建test.html

   test.html【POST请求】声明如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <form action="http://localhost:8080/javaWeb01/hello" method="POST">
        用户: <input type="text" name="username"/><br/>
        密码: <input type="text" name="password"/><br/>
        <input type="submit" value="提交">
    </form>

</body>
</html>

  test.html【GET请求】声明如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <form action="http://localhost:8080/javaWeb01/hello" method="GET">
        用户: <input type="text" name="username"/><br/>
        密码: <input type="text" name="password"/><br/>
        <input type="submit" value="提交">
    </form>

</body>
</html>

  HelloServlet实现类通过service()方法处理请求,service()方法声明如下

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("处理请求 service");
        servletRequest.setCharacterEncoding("utf-8");
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");
        System.out.println(username + ", " + password);
    }

  两次请求得到的结果:

处理请求 service
Tom, 123
处理请求 service
Tom, 123

  问题:如何区分这两种不同的请求呢?

   将 ServletRequest  servletRequest 对象强转成 HttpServletRequest类型,调用HttpServletRequest的getMethod()方法

  此时service()方法声明如下

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("处理请求 service");
        servletRequest.setCharacterEncoding("utf-8");
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        if(method.equals("GET")){
            // 处理GET请求
            doGet();
        }else if(method.equals("POST")){
            // 处理POST请求
            doPost();
        }

    }

    // 处理GET请求
    public void doGet(){
        System.out.println("这是一个get请求");
    }

    // 处理POST请求
    public void doPost(){
        System.out.println("这是一个post请求");
    }

  分别处理这两种不同的请求,运行结果如下

处理请求 service
这是一个get请求
处理请求 service
这是一个post请求

  目前,编写servlet程序,最常用的就是继承HttpServlet实现类

  如HelloServlet2声明如下

public class HelloServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get请求:");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username + "," + password);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post请求:");
        req.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username + "," + password);
    }
}

 二. Servlet的作用