一、Servlet (Server Applet)
1. Servlet 的概念
① Servlet 是 JavaEE 规范之一,规范就是接口
② Servlet 是 JavaWeb 三大组件之一,三大组件分别是:
Servlet 程序、Filter 过滤器、Listener 监听器
③ Servlet 是运行在服务器上的一个 Java 小程序,它可以接收
客户端发送过来的请求,并响应数据给客户端
2. 手动实现 Servlet 程序
① 编写一个类去实现 Servlet 接口
② 实现 service 方法,处理请求,并响应数据
③ 到 web.xml 中去配置 Servlet 程序的访问地址
常见错误:
① url-pattern 中配置的路径没有以斜杠打头
② servlet-name 配置的值不存在
③ servlet-class 标签的全类名配置错误
3. Servlet 的生命周期
① 执行 Servlet 构造器方法
② 执行 init 初始化方法
第一、二步,是在第一次访问的时候创建 Servlet 程序会调用
③ 执行 service 方法
第三步,每次访问都会调用
④ 执行 destroy 销毁方法
第四步,在 web 工程停止的时候调用
4. GET 和 POST 请求的分发处理
/**
* service方法是专门用来处理请求和响应的
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
System.out.println("3 service === Hello Servlet 被访问了");
// 类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
//System.out.println(method);
if ("GET".equals(method)) {
doGet();
} else if ("POST".equals(method)) {
doPost();
}
//System.out.println("get请求");
//System.out.println("post请求");
}
public void doGet() {
System.out.println("get请求");
System.out.println("get请求");
}
public void doPost() {
System.out.println("post请求");
System.out.println("post请求");
}
5. 通过继承 HttpServlet 实现 Servlet 程序
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序
① 编写一个类去继承 HttpServlet 类
② 根据业务需要重写 doGet 或 doPost 方法
③ 到 web.xml 中的配置 Servlet 程序的访问地址
6. Servlet 类的继承体系
7. ServletConfig 类
① ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类
② Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用
③ Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet
程序创建时,就创建一个对应的 ServletConfig 对象
ServletConfig 类的三大作用:
① 可以获取 Servlet 程序的别名 servlet-name 的值
② 获取初始化参数 init-param
③ 获取 ServletContext 对象
8. ServletContext 类
① ServletContext 是一个接口,它表示 Servlet 上下文对象
② 一个 Web 工程,只有一个 ServletContext 对象实例
③ ServletContext 对象是一个域对象
④ ServletContext 是在 web 工程部署启动的时候创建,
在 web 工程停止的时候销毁
什么是域对象:
域对象,是可以像 Map 一样存取数据的对象
这里的域指的是存取数据的操作范围,整个web工程
存数据 | 取数据 | 删除数据 | |
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
(2) ServletContext 类的四个作用
① 获取 web.xml 中配置的上下文参数 context-param
② 获取当前的工程路径,格式:/工程路径
③ 获取工程部署后在服务器硬盘上的绝对路径
④ 像 Map 一样存取数据
9. Http 协议
协议是指双方或多方相互约定好,大家都要遵守的规则
Http 协议,是指客户端和服务器之间通信时,发送的数据,需要遵守的规则
Http 协议中的数据又叫报文
(2) 请求的 Http 协议的格式
客户端给服务器发送数据叫请求,分为 GET 请求和 POST 请求
服务器给客户端回传数据叫响应
1) GET 请求
① 请求行:
请求的方式: GET
请求的资源路径[+?+请求参数] 如:/servletDemo/a.html
请求的协议的版本号: HTTP/1.1
② 请求头:
key:value 组成 ,不同的键值对,表示不同的含义
Accept:告诉服务器,客户端可以接收的数据类型
Accept-Language:告诉服务器,客户端可以接收的语言类型
zh_CN 中文中国
en_US 英文美国
User-Agent:浏览器的信息
Accept-Encoding:告诉服务器,客户端可以接收的数据编码 (压缩) 格式
Host:表示请求的服务器 ip 和端口号
Connection:告诉服务器请求连接如何处理
Keep-Alive 告诉服务器回传数据不要马上关闭,
保持一小段时间的连接
Closed 马上关闭
2) POST 请求
① 请求行:
请求的方式: GET
请求的资源路径[+?+请求参数] 如:/servletDemo/hello3
请求的协议的版本号: HTTP/1.1
② 请求头:
key:value 组成 ,不同的键值对,表示不同的含义
Referer:表示请求发起时,浏览器地址栏中的地址 (从哪来)
Content-Type:表示发送的数据类型
Content-Length:表示发送的数据长度
Cache-Control:表示如何控制缓存 no-cache不缓存
空行
③ 请求体 ===>>> 发送给服务器的数据
3) GET 请求和 POST 请求各有哪些
GET :
① form 标签 method=get
② a 标签
③ link 标签引入 css
④ Script 标签引入 js 文件
⑤ img 标签引入图片
⑥ iframe 引入 html 页面
⑦ 在浏览器地址栏中输入地址后敲回车
POST:
① form 标签 method=post
(3) 响应的 HTTP 格式
① 响应行:
响应的协议和版本号 HTTP/1.1
响应状态码 200
响应状态描述符 OK
② 响应头:
key-value 不同的响应头,有其不同的含义
Server:表示服务器信息
Content-Type:表示响应体的数据类型
Content-Length:响应体的长度
Date:请求响应时间 (这是格林时间)
空行
③ 响应体 ===>>> 就是回传给客户端的数据
(4) 常用的响应码说明
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已经收到了,但是你要的数据不存在 (请求地址错误)
500 表示服务器已经收到请求了,但是服务器内部错误 (代码错误)
(5) MIME 类型说明
① MIME 是 HTTP 协议中数据类型
② MIME 全称是 Multipurpose Internet Mail Extensions,
多功能 Internet 邮件扩充服务
③ MIME 类型的格式是 大类型/小类型,并与某一种文件的扩展名相对应
常见的 MIME 类型:
用浏览器查看HTTP协议:
10. HttpServletRequest 类
(1) 作用
① 每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把
请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
② 然后传递到 service 方法 (doGet 和 doPost) 中给我们使用
③ 我们可以通过 HttpServletRequest 对象,获取到所有请求信息
(2) 常用方法
getRequestURI() | 获取请求的资源路径 |
getRequestURL() | 获取请求的统一资源定位符 (绝对路径) |
getRemoteHost() | 获取客户端的 IP 地址 |
getHeader() | 获取请求头 |
getParameter() | 获取请求的参数 |
getParameterValues() | 获取请求的参数 (多个值的时候使用) |
getMethod() | 获取请求的方式 GET 或 POST |
setAttribute(key,value); | 设置域数据 |
getAttribute(key); | 获取域数据 |
getRequestDispatcher | 获取请求转发对象 |
① 这里注意信息要写在<form></form>里面,
还有 action 这里的地址要写对,不然不会跳转
② hobby 输出前要加个判断,不然没有勾选会报空指针异常
(3) 请求转发
请求转发的特点:
① 浏览器地址栏没有变化
② 他们是一次请求
③ 他们共享 Request 域中的数据
④ 可以转发到 WEB-INF 目录下
⑤ 不可以访问工程以外的资源
(4) base 标签的作用
当我们点击 a 标签进行跳转时,浏览器地址栏中的地址是:
http://localhost:8080/servletDemo/a/b/c.html
跳转回去的 a 标签路径是:../../index.html
所有相对路径在工作时都会参照当前浏览器地址栏中的地址来进行跳转
那么参照后得到的地址是:
http://localhost:8080/servletDemo/index.html
正确的路径
当我们使用请求转发来进行跳转时,浏览器地址栏中的地址是:
http://localhost:8080/servletDemo/forwardC
跳转回去的 a 标签路径是:../../index.html
所有相对路径在工作时都会参照当前浏览器地址栏中的地址来进行跳转
那么参照后得到的地址是:
http://localhost:8080/index.html
错误的路径
base 标签可以设置当前页面中所有相对路径工作时,
参照哪个路径来进行跳转
(5) Web 中的相对路径和绝对路径
在 JavaWeb 中,路径分为相对路径和绝对路径两种
相对路径是:
. 表示当前目录
.. 表示上一级目录
资源名 表示当前目录/资源名
绝对路径是:
http://ip:port/工程路径/资源路径
(6) Web 中 / 斜杠的不同意义
在 Web 中 / 斜杠 是一种绝对路径
/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杠</a>
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径/
① <url-pattern>/servlet1</url-pattern>
② servletContext.getRealPath("/");
③ request.getRequestDispatcher("/");
特殊情况:response.sendRediect("/");
把斜杠发送给浏览器解析,得到:http://ip:port/
11. HttpServletResponse 类
(1) 作用:
① HttpServletResponse 和 HttpServletRequset 类一样,每次请求进来,
Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用
② HttpServletRequset 表示请求过来的信息
HttpServletResponse 表示所有响应的信息
③ 我们如果需要设置返回给客户端的信息,都可以通过
HttpServletResponse 对象来进行设置
(2) 两个输出流
字节流:getOutputStream(); 常用于下载(传递二进制数据)
字符流:getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个,使用字节流就不能使用字符流,反之亦然
(3) 解决响应中文乱码的问题
(4) 请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,
我给你一些地址,你去新地址访问 (因为之前的地址可能已经被废弃)
请求重定向的特点:
① 浏览器地址栏会发生变化
② 两次请求
③ 不共享 Request 域中数据
④ 不能访问 WEB-INF 下的资源
⑤ 可以访问工程外的资源
1) 请求重定向的第一种方案:
2) 请求重定向的第二种方案(推荐使用):
JavaEE 的三层架构
二、JSP
① JSP 全称是 java server pages,Java 服务器页面
② jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据
③ 因为 Servlet 程序回传 html 页面数据是一件非常繁琐的事情,
开发成本和维护成本都极高
① jsp 页面和 html 页面一样,都是存放在 Web 目录下,
访问也跟访问 html 页面一样
② jsp 页面的本质是一个 Servlet 程序,当我们第一次访问
jsp 页面的时候,Tomcat 会帮我们把 jsp 页面翻译成为
一个 java 源文件, 并且对他进行编译成为 .class 字节码程序
我们打开 Java 源文件,不难发现其里面的内容是:
我们跟踪源代码发现,HttpJspBase 类,它直接地继承了 HttpServlet 类
也就是说,Jsp 翻译出来的 Java 类,它间接的继承了 HttpServlet 类
即,翻译出来的是一个 Servlet 程序
//This is the super class of all JSP-generated servlets.
观察其翻译出来的 Servlet 源码,不难发现,其底层实现,
也是通过输出流,把 html 页面数据回传给客户端
2. Jsp 的三种语法
(1) jsp 头部的 page 指令
jsp 的 page 指令可以修改 jsp 页面中的一些重要的属性或者行为
① language 属性:表示 jsp 翻译后是什么语言文件,暂时只支持 java
② contentType 属性:表示 jsp 返回的数据类型是什么,也是源码中
response.setContentType() 参数值
③ pageEncoding 属性:表示当前 jsp 页面文件本身的字符集
④ import 属性:跟 java 源代码中一样,用于导包,导类
//这两个是给 out 输出流使用的
⑤ autoFlush 属性:设置当 out 输出流缓冲区满了之后,是否自动刷新
冲级区,默认是 true
⑥ buffer 属性:设置 out 缓冲区的大小,默认是 8 kb
⑦ errorPage 属性:设置当 jsp 页面运行时出错,自动跳转去的错误
页面途径
⑧ isErrorPage 属性:设置当前到 jsp 页面是否是错误信息页面,
默认是 false,如果是 true ,可以获取异常信息
⑨ session 属性:设置访问当前 jsp 页面,是否会创建 HttpSession 对象,
默认是 true
⑩ extends 属性:设置 jsp 翻译出来的 java 类默认继承谁
(2) jsp 常用脚本
1) 声明脚本
声明脚本的格式是:<%! 声明 java 代码 %>
作用:可以给 jsp 翻译出来的 java 类定义属性和方法
甚至是静态代码块,内部类等
2) 表达式脚本
表达式脚本的格式是:<%= 表达式 %>
作用:在 jsp 页面上输出数据
特点:① 所有的表达式脚本都会被翻译到 _jspServlet 方法中
② 表达式脚本都会被翻译成为 out.print() 输出到页面上
③ 由于表达式脚本翻译的内容都在 _jspServlet 方法中,
所以 _jspServlet 方法中的对象都可以直接使用
④ 表达式脚本中的表达式不能以分号结束
3) 代码脚本
代码脚本的格式是:
<%
java 语句
%>
作用:可以在 jsp 页面中,编写我们自己需要的功能 (写的是 java 语句)
特点:① 代码脚本翻译后都在 _jspServlet 方法中
② 代码脚本由于翻译到 _jspServlet 方法中,
所以 _jspServlet 方法中的对象都可以直接使用
③ 还可以由多个代码脚本块组合完成一个完整的 java 语句
④ 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
(3) jsp 中的三种注释
① html 注释
<!-- 这是 html 注释 -->
html 注释会被翻译到 java 源代码中,在 _jspServlet 方法里,
以 out.writer 输出到客户端
② java 注释
<%
// 单行 java 注释
/* 多行 java 注释 */
%>
java 注释会被翻译到 java 源代码中
③ jsp 注释
<%-- 这是 jsp 注释 --%>
jsp 注释可以注掉,jsp 页面中所有代码
(4) jsp 九大内置对象
jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为
Servlet 源代码后,内部提供的九大对象,叫内置对象
request | 请求对象 |
response | 响应对象 |
pageContext | jsp 的上下文对象 |
session | 会话对象 |
application | ServletContext 对象 |
config | ServletConfig 对象 |
out | jsp 输出流对象 |
page | 指向当前 jsp 的对象 |
exception | 异常对象 |
(5) jsp 四大域对象
pageContext | PageContextimpl 类 | 当前 jsp 页面范围内有效 |
request | HttpServletRequest 类 | 一次请求内有效 |
session | HttpSession 类 | 一个会话范围内有效 (打开浏览器访问服务器, 直到关闭服务器) |
application | ServletContext 类 | 整个 web 工程范围内都有效 (只要 web 工程不停止, 数据都在) |
域对象可以像 Map 一样存取数据的对象,四个域对象功能一样,
不同的是它们对数据的存取范围
使用的优先顺序:
pageContext → request → session → application
(6) jsp 中的 out.write 输出和 reponse.getWriter 输出的区别
① response 中表示响应,我们经常用于设置返回给客户端的内容 (输出)
② out 也是给用户做输出使用的
由于 jsp 翻译后,底层源代码都是使用 out 来进行输出,所以一般情况下,
我们在 jsp 页面中统一使用 out 来进行输出,避免打乱页面输出内容的顺序
out.write() 输出字符串没有问题
out.print() 输出任意数据都没问题 (都转换成为字符串后调用的 write 输出)
深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print() 来进行输出
(7) jsp 的常用标签
1) jsp 静态包含
2) jsp 动态包含
3) jsp 标签-转发
(8) 请求转发的使用
(9) Listener 监听器
① Listener 监听器是 JavaWeb 的三大组件之一
三大组件分别是:Servlet 程序、Fiter 过滤器、Listener 监听器
② Listener 是 JavaEE 的规范,就是接口
③ 监听器的作用是监听某种事物的变化,然后通过调回函数,
反馈给客户 (程序) 去做一些相应的处理
(10) ServletContextListener 监听器
① ServletContextListener 它可以监听 ServletContext 对象的创建和销毁
② ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的
时候销毁,监听到创建和销毁之后都会分别调用 ServletContextListener
监听器的方法反馈
两个方法分别是:
如何使用 ServletContextListener 监听器监听 ServletContext 对象
使用步骤:① 编写一个类去实现 ServletContextListener
② 实现其两个回调方法
③ 到 web.xml 中去配置监听器