简单来说:是运行在服务器端的 Java 程序,它作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
用处:
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页及处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
而相比 CGI,Servlet 的优势:
- Servlet 在 Web(网络) 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
- Servlet 是独立于平台的,因为它们是用 Java 编写的。
- 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
- Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
总结:Servlet 是 Java 提供的动态互动 web 资源开发技术(也是 JavaEE 规范之一,实际上就是一个接口)
在正式使用 Servlet 之前先来看一下 Tomcat(一种 Web 运营服务器,同时也算个 Servlet 容器)
而 Tomcat 能帮我们很方便地接收和返回到请求!
Servlet 使用快速入门
特点:
- Servlet 是单例的
- 配置通配符的时候可以用各种的通配符
*.
和一个 Servle t可以被多个配置映射 - 访问 web 任何资源其实都是在访问 Servlet(即便是访问图片资源,Tomcat 都有默认 Servlet 处理)
Servlet 方法介绍:
ServletConfig 和 ServerContext 对象们
前者可以用来读取 web.xml 配置的初始化参数,避免写硬编码,而将配置写在配置文件中
后者是代表当前整个应用,所以它在 Tomcat 启动时就会被创建。我们一般用它来获取整个应用的配置选项或读取资源文件
总结:前者是单个的,后者是整个应用的。
request 和 response 对象们
前者即封装了HTTP的请求头,而后者封装了HTTP的响应头
request 继承体系
request 获取请求数据
通用方式 get/post 获取请求参数
GET | POST | |
---|---|---|
描述 | 从指定资源请求数据 | 向指定资源提交要被处理的数据 |
提交参数 | 显示在 URL | 不会显示在 URL |
查询请求 | 查询字符串发送于 GET 请求的 URL,如下: | 查询字符串发送于 POST 请求的 HTTP 信息主体,如下: |
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded or multipart/form-data。为二进制数据使用多重编码 |
历史记录 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;而 URL 的长度是受限制的(URL 的最大长度是 2048 个字符) | 无限制 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分 在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
用途多见 | 多用于取回数据 | 多用于提交数据 |
请求参数的中文乱码处理
请求参数转发
响应设置
响应重定向(和请求转发比较)
响应字符数据
响应字节数据
路径和虚拟目录设置的问题
Servlet 访问配置
urlPattern 四大配置规则:
XML 旧时配置方式
案例练习
SqlSessionFactor 工具类的抽取
Cookie Session 会话跟踪机制
前面已经看过了 Config(获取配置信息)、Context(代表整个Web应用)、Request(HTTP请求)、Response(HTTP响应)
名词解析:
- 会话:指的是一对游览器和 web 服务器的连接通道(这里面可以包含多次请求和响应)
- 会话跟踪:一种维持游览器状态的方法,由于HTTP协议的设置游览器就需要识别多次请求是否都来自同一个游览器,以便于在会话中的多次请求间共享数据
- HTTP协议是无状态的。这代表每次游览器向服务器请求时,服务器都会将该请求视作新的请求,而业务需要我们通过会话跟踪来实现会话内数据共享
JavaEE HttpSession 接口来指导实现一次会话内的多次请求间数据共享功能。
格式 | 描述 |
---|---|
new Cookie(String name, String value) | 创建对象但必须传入名字和其值 |
getName() | 得到 Cookie 保存的名字 |
getValue() | 得到 Cookie 保存的值 |
setMaxAge(int seconds) | 设置 Cookie 存活时间(默认是负数:代表当客户端游览器关闭时则销毁 Cookie。零则代表删除对应 Cookie) |
request getCookies() | 获取客户端传来的所有 Cookie 对象(HttpServletRequest) |
response addCookie(Cookie cookie) | 将传入 cookie 交给客户端保存(HttpServletResponse) |
Cookie 不能直接存储中文,需要进行转码:URL 编码
格式 | 描述 |
---|---|
request.getSession() | 创建对象 |
void setAttribute(String name, Object o) | 存储数据到 session 域 |
Object getAttribute(String name) | 根据 name 获取值 |
void removeAttribute(String name) | 根据 name 删除值 |
getId() | 获取 session 对应 id |
invalidate() | 让 session 立刻无效 |
setMaxInactiveInterval(int i) | 设置 session 最大的有效时间(这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个 session就失效了) |
Cookie | Session | |
---|---|---|
存储位置 | 客户端(游览器内存) | 服务端 |
安全性 | × | ✔ |
大小限制 | 3KB | 无限制 |
存储时间 | 长期存储 | 默认30分钟 |
是否占用服务器资源 | 不占用服务器资源 | 占用服务器资源 |
比喻 | 酒店的房卡 | 酒店的临时停车票 |
实现关系 | Session 是基于 Cookie 实现的 | Cookie 的实现是基于 HTTP 协议的 |
共同点 | 都是用来完成一次会话内的多次请求间数据共享功能 |
Servlet 代码优化
出现背景:Web 层的 Servlet 个数众多,这不利于维护
方法:将 Servlet 进行归类,比如同一个实体类的操作方法写到一个 Servlet 里面
(将类级别 ——> 方法级别,便于管理)
遇见错误介绍:
注意!web项目要放在其根目录下,且要在项目结构里标记好地址之类的信息。