1.Servlet编程基础
(1)什么是Servlet
Servlet是基于Java语言的Web编程技术,部署在服务器端的Web容器里,获取客户端的访问请求,并根据请求生成响应信息返回给客户端。
创建Servlet的方式,有
如下图:一般创建Servlet都是通过继承HttpServlet来实现,如图中的HelloServlet。
(类图快捷键:Ctrl + Alt + U)

1.创建一个基于Maven的web项目。

2.创建java和resources文件夹

3.修改web.xml的版本

4.导入servlet的依赖
<!--servlet的依赖-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>
(2)Servlet的生命周期
init():当服务器启动,第一次访问Servlet的时候,servlet进行初始化
service():在服务器启动期间,可以不断的处理请求。
destroy():在服务器停止的时候,去销毁Servlet.
(3)Servlet的主要功能
(1)读取客户端发送到服务器端的显式数据(表单数据)
(2)读取客户端发送到服务器端的隐式数据(请求报头)
(3)服务器端发送显式数据到客户端(HTML)
(4)服务器端发送隐式数据到客户端(状态代码和响应报头)

2.编写Servlet类
1.通过Servlet生成静态网页
package com.ambow.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 *  作用:通过Servlet,动态生成HTML网页
 * @author foxbill
 * @date 2021/11/2 10:58
 */
@WebServlet(name = "FirstServlet")
public class FirstServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");//设置响应的字符集格式为UTF-8
        response.setContentType("text/html");//设置响应正文的MIME类型
        PrintWriter out = response.getWriter();//返回一个PrintWriter对象,Servlet使用它来输出字符串形式的正文数据
        out.println("<!doctype html>");
        out.println("<html>");
        out.println("<head><title>动态生成的HTML文档</title></head>");
        out.println("<body>");
        out.println("<table border='0' align='center'>");
        out.println("<tr><td bgcolor='skyblue' colspan=2>动态生成HTML文档</td></tr>");
        out.println("</table>");
        out.println("</body>");
        out.println("</html>");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}web.xml的相关代码:
<servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>com.ambow.test.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/first</url-pattern>
</servlet-mapping>
2.通过Servlet生成动态网页
package com.ambow.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalTime;
/**
 * @author foxbill
 * @date 2023/8/9 16:35
 */
@WebServlet(name = "TestServlet")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //请求处理代码(功能:写一个动态网页)
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        LocalTime now = LocalTime.now();
        int hour = now.getHour();
        out.println("<!doctype html>");
        out.println("<html>");
        out.println("<head>");
        out.println("</head>");
        out.println("<body>");
        if (hour>0 && hour < 6){
            out.println("晚安!");
        }
        if (hour>=6 && hour <= 12){
            out.println("早安!");
        }
        if (hour>12){
            out.println("午安!");
        }
        out.println("</body>");
        out.println("</html>");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}web.xml的相关代码:
<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.ambow.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>
3.编写web.xml配置文件
(一)配置虚拟路径
1.Servlet的多重映射
方式一:
<servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>com.ambow.test.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/first01</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/first02</url-pattern>
</servlet-mapping>方式二:
<servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>com.ambow.test.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/first01</url-pattern>
    <url-pattern>/first02</url-pattern>
</servlet-mapping>2.映射路径中使用通配符,格式有两种 :
*.do:优先级最低
/*
<url-pattern>*.do</url-pattern>
<url-pattern>/*</url-pattern>
<url-pattern>/test/*</url-pattern>3.缺省Servlet : /
缺省servlet其实就是servlet-mapping元素中url为/的servlet,在tomcat安装目录中:conf下的web.xml中有这样一个代码:
<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>缺省Servlet的作用就是处理servlet-mapping中url都匹配不到的请求。
在web访问任何资源都是在访问Servlet,当访问tomcat服务中的某个静态html文件和图片时,实际上是在访问这个缺省的servlet。
如果在web应用下的web.xml没有1.html对应的url-pattern,也就是没有相对应的servlet,服务器则会运行缺省servlet,由该servlet对应的org.apache.catalina.servlets.DefaultServlet类将1.html静态页面的数据读取出来显示到页面上。
把上述中的代码注释掉,重启tomcat服务器,输入http://localhost:8080 ,将发现页面中的图片将显示不出,也即是因为这个原因。










