笔记:有道云笔记
servlet是什么:
Servlat Applet译为“服务器端小程序”,是一套JavaWeb开发的规范,
所有的Servlet功能都是通过一个Servlet的接口向外暴露
servlet提供两个抽象类,GenericServlet,HttpServlet(更常用)
servlet是第一代的JavaWeb开发技术,jsp是第二代的JavaWeb开发技术
jsp允许html代码和jso代码分离
由于用户访问jsp页面时,jsp代码会被翻译成servlet代码,所以jsp是在servlet的基础上做了进一步的封装
jsp代码可以调用servlet类,功能可以在servlet中实现,然后再jsp中调用即可
java Applet 是“客户端小程序”,一般被嵌入到HTML页面
servlet容器是什么:
解释器:分析、编译和执行源代码
部署动态网页一般至少需要三个组件:Web服务器、脚本语言运行时和数据库
Servlet容器就是Servlet代码的运行环境,用来装类和对象
Servlet类没有main函数,所以需要作为一个模块装入Servlet容器,通过容器进行实例化
提供HTTP服务,相当于一个简化的服务器
Tomcat下载和安装:
唯一注意的是java环境要配对,然后更改文件GDK
Tomcat目录结构:
子目录 |
说明 |
bin |
命令中心(启动命令,关闭命令……) |
conf |
配置中心(端口号,内存大小……) |
lib |
Tomcat 的库文件。Tomcat 运行时需要的 jar 包所在的目录。 |
logs |
存放日志文件。 |
temp |
存储临时产生的文件,即缓存。 |
webapps |
存放项目的文件,web 应用放置到此目录下浏览器可以直接访问。 |
work |
编译以后的 class 文件。 |
Servlet三种创建方式:
创建 Servlet 类有如下三种方式:
- 实现 javax.servlet.Servlet 接口,重写其全部方法。
- 继承 javax.servlet.GenericServlet 抽象类,重写 service() 方法。
- 继承 javax.servlet.http.HttpServlet 抽象类,重写 doGet() 或 doPost() 方法。
Servlet 接口中定义了 5 个方法,下面我们对他们做简单的介绍。
返回值 |
方法 |
备注 |
void |
init(ServletConfig config) |
Servlet 实例化之后,由 Servlet 容器调用,用来初始化 Servlet 对象。该方法只能被调用一次。 参数 config 用来向 Servlet 传递配置信息。 |
void |
service(ServletRequest req,ServletResponse res) |
Servlet 容器调用该方法处理客户端请求。 |
void |
destroy() |
服务器关闭、重启或者 Servlet 对象被移除时,由 Servlet 容器调用,负责释放 Servlet 对象占用的资源。 |
ServletConfig |
getServletConfig() |
该方法用来获取 ServletConfig 对象,该对象中包含了 Servlet 的初始化参数。 |
String |
getServletInfo() |
该方法用于获取 Servlet 的信息,例如作者、版本、版权等。 |
package net.biancheng.www; import javax.servlet.*; import java.io.IOException; import java.io.PrintWriter; public class MyServlet implements Servlet { //Servlet 实例被创建后,调用 init() 方法进行初始化,该方法只能被调用一次 @Override public void init(ServletConfig servletConfig) throws ServletException { } //返回 ServletConfig 对象,该对象包含了 Servlet 的初始化参数 @Override public ServletConfig getServletConfig() { return null; } //每次请求,都会调用一次 service() 方法 @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //设置字符集 servletResponse.setContentType("text/html;charset=UTF-8"); //使用PrintWriter.write()方法向前台页面输出内容 PrintWriter writer = servletResponse.getWriter(); writer.write("编程帮欢迎您的到来,网址: www.biancheng.net"); writer.close(); } //返回关于 Servlet 的信息,例如作者、版本、版权等 @Override public String getServletInfo() { return null; } //Servelet 被销毁时调用 @Override public void destroy() { } }
HttpServlet抽象类:
在 HTTP/1.1 协议中共定义了 7 种请求方式,即 GET、POST、HEAD、PUT、DELETE、TRACE 和 OPTIONS。
HttpServlet 针对这 7 种请求方式分别定义了 7 种方法,即 doGet()、doPost()、doHead()、doPut()、doDelete()、doTrace() 和 doOptions()。
所以通过继承HttpServlet类创建Servlet时,只需要重写doGet或者doPost方法
package net.biancheng.www; import javax.servlet.*; 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 MyServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //使用PrintWriter.write()方法向前台页面输出内容 resp.setContentType("text/html;charset=UTF-8"); PrintWriter writer = resp.getWriter(); writer.write("编程帮欢迎您的到来,网址: www.biancheng.net"); writer.close(); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //使用PrintWriter.write()方法gaifang向前台页面输出内容 PrintWriter writer = resp.getWriter(); writer.write("编程帮欢迎您的到来,网址: www.biancheng.net"); writer.close(); doGet(req, resp); } }
Servlet的部署和访问:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> </web-app>
web.xml中表示资源路径
创建Servlet项目:
Eclipse创建Servlet项目 (biancheng.net)
@WebServlet注解:
web.xml 的顶层标签 中有一个属性:metadata-complete,该属性用于指定当前 web.xml 是否是完全的。若该属性设置为 true,则容器在部署时将只依赖 web.xml,不配置属性,或将其属性设置为false,则表示启动注解
属性名 |
类型 |
标签 |
描述 |
是否必需 |
name |
String |
指定 Servlet 的 name 属性。 如果没有显式指定,则取值为该 Servlet 的完全限定名,即包名+类名。 |
否 |
|
value |
String[ ] |
该属性等价于 urlPatterns 属性,两者不能同时指定。 如果同时指定,通常是忽略 value 的取值。 |
是 |
|
urlPatterns |
String[ ] |
指定一组 Servlet 的 URL 匹配模式。 |
是 |
|
loadOnStartup |
int |
指定 Servlet 的加载顺序。 |
否 |
|
initParams |
WebInitParam[ ] |
指定一组 Servlet 初始化参数。 |
否 |
|
asyncSupported |
boolean |
声明 Servlet 是否支持异步操作模式。 |
否 |
|
description |
String |
指定该 Servlet 的描述信息。 |
否 |
|
displayName |
String |
指定该 Servlet 的显示名。 |
否 |
注意事项:
- 通过实现 Serlvet 接口或继承 GenericServlet 创建的 Servlet 类无法使用 @WebServlet 注解。
- 使用 @WebServlet 注解配置的 Servlet 类,不要在 web.xml 文件中再次配置该 Servlet 相关属性。
Servlet生命周期:
Servlet从创建到销毁的过程,
Servlet 容器管理Servlet生命周期,主要分为以下 3 个阶段。
- 初始化阶段
- 运行时阶段
- 销毁阶段
初始化阶段:
- 加载和实例化Servlet
读取web.xml或@WebServlet中的配置信息,对指定的Servlet进行加载
Servlet容器通过java的反射API来创建Servlet实例
- 调用init()方法进行初始化
调用init()方法进行初始化,init()方法只背调用一次
初始化阶段Servlet实例可以通过ServletConfig对象获取在web.xml或者@WebServlet中配置的初始化参数
运行时阶段:
Servlet 容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象,将它们以参数的形式传入 service() 方法内,并调用该方法对请求进行处理。
Servlet 通过 ServletRequst 对象获取客户端的相关信息和请求信息。在请求处理完成后,通过 ServletResponse 对象将响应信息进行包装,返回给客户端。当 Servlet 容器将响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。
对于 Servlet 的每一次请求,Servlet 容器都会调用一次 service() 方法,并创建新的 ServletRequest 和 ServletResponse 对象
销毁阶段:
对于每个 Servlet 实例来说,destory() 方法只能被调用一次。
创建 Servlet 实例、init() 方法和 destory() 方法都只执行一次。当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调用它的 service() 方法,为接收到的请求服务。
load-on-startup元素:控制Servlet启动优先级
load-on-startup 是 web.xml 中的一个节点,是 servlet 元素的子元素,用来标记 Servlet 容器启动时是否初始化当前 Servlet,以及当前 Servlet 的初始化顺序。
load-on-startup 元素取值规则如下:
- 它的取值必须是一个整数;
- 当值小于 0 或者没有指定时,则表示容器在该 Servlet 被首次请求时才会被加载;
- 当值大于 0 或等于 0 时,表示容器在启动时就加载并初始化该 Servlet,取值越小,优先级越高;
- 当取值相同时,容器就会自行选择顺序进行加载。
- 取负值和默认值时,只有被调用才会被初始化
- load-on-startup元素:控制Servlet启动优先级 (biancheng.net)
Servlet虚拟路径映射:
Servlet 程序若想被外界访问,就必须被映射到一个 URL 地址上,该 URL 地址和 Servlet 程序的物理路径(在硬盘上的存储位置)并不一致,因此它被称为虚拟路径。Servlet 与虚拟路径的对应关系就叫做 Servlet 虚拟路径映射。
Servlet 虚拟路径映射可以被分为 2 类:
- 单一映射
Servelt 单一映射是指一个 Servlet 只被映射到一个虚拟路径上。
Servlet 单一映射的实现方式有 2 种:
①使用 web.xml 实现单一映射;
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> </servlet-mapping>
②使用 @WebServlet 实现单一映射。
@WebServlet("/MyServlet") or @WebServlet(urlPatterns = "/myServlet")
- 多重映射
Servlet 多重映射的实现方式有 3 种:
①配置多个 元素。
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet2</url-pattern> </servlet-mapping>
②配置多个 子元素。
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>net.biancheng.www.MyServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myServlet</url-pattern> <url-pattern>/myServlet3</url-pattern> </servlet-mapping>
③在 @WebServlet 的 urlPatterns 属性中使用字符串数组
@WebServlet( urlPatterns = { "/myServlet", "/myServlet4" })
Servlet虚拟路径匹配规则:
若 URL 为“http://localhost:8080/servletDemo/myServlet”,其应用上下文是 servletDemo,容器会将“http://localhost:8080/servletDemo”去掉,使用剩余的“/myServlet”与 Servlet 虚拟路径进行匹配。
Servlet 虚拟路径匹配规则有以下 4 种:
- 完全路径匹配
- 目录匹配
- 扩展