欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet

程序员文章站 2022-06-03 10:48:17
...

1.Servlet概述

1.1 什么是Servlet
由SUN公司提供的动态Web资源开发技术,本质上就是一段Java程序, 和Java程序不同的是, Servlet程序必须放在Servlet容器(其实就是服务器, 比如tomcat服务器)中, 由容器调用才可以执行.
1.2 开发Servlet程序的步骤
(1)写一个类, 实现一个Servlet接口(标准), 并添加未实现的方法
(2)将编译后的Servlet程序放在Web应用中, 并在web.xml文件中配置Servlet对外访问的虚拟路径.
1.3 案例: 通过记事本开发一个Servlet程序
1.需求: 浏览器向服务器发送一个请求, 访问FirstServlet, FirstServlet将表示当前时间的字符串发送浏览器
2.详细开发步骤
(1)创建一个FirstServlet.java文件
Servlet
(2)编写FirstServlet类, 实现Servlet接口(或继承Servlet接口的子类), 并添加未实现的方法.
Servlet
(3)实现Servlet中提供的处理请求的方法service方法, 将表示当前时间的字符串响应给浏览器
Servlet
(4)细节处理(添加servlet类的包路径和导入依赖包)
Servlet
(5)打开CMD窗口, 编译FirstServlet类
通过命令编译会出现如下错误:
Servlet
原因是 javax.servlet这个包不存在, 所有下面出现了很多找不到符号错误.
在tomcat服务器的lib目录下有servlet的jar包, 可以设置包路径:
Servlet
接着再次进行编译:
Servlet
(6)将FirstServlet类放在WEB应用中, 并在web.xml文件中配置Servlet对外访问的虚拟路径
将编译好的class文件(包括包路径)放在web应用的classes目录下.
Servlet
在WEB应用的web.xml文件中配置servlet对外访问的虚拟路径:
Servlet
(7)将WEB应用部署到虚拟主机中, 启动服务器, 通过浏览器访问FirstServletServlet.
Servlet
FirstServlet类:

public class FirstServlet extends GenericServlet{
    public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{
       String dateStr = new Date().toLocaleString();
       res.getWriter().write( dateStr );
    }
}

2.Servlet继承关系

2.1 Servlet继承关系
Servlet接口 – 通用的Servlet接口, 定义一个Servlet具有的最基本的功能

|-- GenericServlet抽象类, 实现了Servlet接口, 并且实现了其中大部分的方法. 但是service方法没有实现, 因为这个方法是处理请求的核心方法, 需要开发人员自己来实现. 因此如果我们开发Servlet继承这个类, 只需要实现service方法来处理请求即可!
       |
       |-- HttpServlet抽象类, 继承了GenericServlet类, 并且实现了service方法, 在service方法中判断请求方式, 根据不同的请求方式来做不同处理(调用不同的doXxx方法).因此, 在开发中, 我们只需要写一个类, 直接继承HttpServlet, 并且覆盖其中的doGet方法和doPost方法, 来处理GET请求和POST请求即可!

3 Servlet调用过程

3.1 Servlet调用过程
<<参考Servlet调用过程图解>>
Servlet

4 Servlet开发细节

4.1 Servlet虚拟路径的配置
写好一个Servlet程序后, 需要在web.xml文件中对Servlet进行配置, 其中url-pattern是配置Servlet对外访问的虚拟路径, 其中虚拟路径的配置可以有两种方式:
1、直接写一个固定的路径, 比如:
/FirstServlet、/SecondServlet
2、以*星号配置路径
(1) 以 / 开头, 以 /* 结尾
/servlet/、/abc/、/a/b/c/*
(2) 以 *.后缀 的形式
.abc、.do、.action、.html、*.jsp
通过*号配置路径可以让路径的访问变得更加的灵活,但是也可能会造成一个路径会被多个url-pattern所匹配, 到底对应哪一个?
示例:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
当请求URL为“/abc/a.html”,“/abc/”和“/”都匹配,哪个servlet响应
Servlet1将会匹配
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
Servlet3将会匹配
当请求URL为“/abc/a.do”时,“/abc/”和“.do”都匹配,哪个servlet响应
Servlet1将会匹配
当请求URL为“/a.do”时,“/”和“.do”都匹配,哪个servlet响应
Servlet2将会匹配
总结: 当一个路径被多个url-pattern匹配时, 优先级规则是:
(1)哪一个更像/更具体/更精确哪一个起作用!
(2)*.后缀的优先级永远是最低的!