Servlet
Servlet简介
1、Servlet 是 JavaEE 规范之一,规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器
3、Servlet 是运行在服务器上的一个 java 小程序,
它可以接收客户端发送过来的请求,并响应数据给客户端
Servlet实现
1、编写一个类去
实现
Servlet 接口2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址
Servlet生命周期
1、执行 Servlet 构造器方法
2、执行 init 初始化方法
第一、二步,是在第一次访问的时候创建 Servlet 程序会调用
3、执行 service 方法 第三步,每次访问都会调用
4、执行 destroy 销毁方法 第四步,在 web 工程停止的时候调用
HttpServlet
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序
1、编写一个类去
继承
HttpServlet 类2、根据业务需要
重写
doGet 或 doPost 方法3、到 web.xml 中的配置 Servlet 程序的访问地址
Servlet 的继承体系
ServletConfig
ServletConfig简介
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用
Servlet 程序默认是第一次访问的时候创建,
ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对 象
ServletConfig三大作用
1、可以获取 Servlet 程序的别名 servlet-name 的值
servletConfig.getServletName()
2、获取初始化参数 init-param
servletConfig.getInitParameter("key")
3、获取 ServletContext 对象
servletConfig.getServletContext()
ServletContext
ServletContext简介
1、ServletContext 是一个接口,它表示 Servlet 上下文对象
2、一个 web 工程,只有一个 ServletContext 对象实例
3、ServletContext 对象是一个域对象
什么是域对象? 域对象,是可以像 Map 一样存取数据的对象,叫域对象
这里的域指的是存取数据的操作范围,即整个 web 工程
存数据 取数据 删除数据 Map put() get() remove() 域对象 setAttribute() getAttribute() removeAttribute() 4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁
ServletContext 四个作用
//获取 ServletContext 的两种方法(第二种实质上是调用第一种)
1. ServletContext context = getServletConfig().getServletContext();
2. ServletContext context = getServletContext();
1、获取 web.xml 中配置的上下文参数 context-param
context.getInitParameter("key")
2、获取当前的工程路径,格式: /工程路径
context.getContextPath()
3、获取工程部署后在服务器硬盘上的绝对路径
// "/" 斜杠被服务器解析地址为:http://ip:port/工程名/,映射到 IDEA 代码的 web 目录 context.getRealPath("/")
4、像 Map 一样存取数据
一旦往 context 中存入某个键值对数据,则该键值对数据的作用域是整个 web 工程
//存 context.setAttribute("key1", "value1"); //取 context.getAttribute("key1")
HttpServletRequest
HttpServletRequest简介
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 HttpServletRequest对象中, 然后传递到 service 方法(doGet 和 doPost)中给我们使用
我们可以通过 HttpServletRequest 对象,获取到所有请求的信息
HttpServletRequest常用方法
方法 | 作用 |
---|---|
getRequestURI() | 获取请求的资源路径 |
getRequestURL() | 获取请求的统一资源定位符(绝对路径) |
getRemoteHost() | 获取客户端的 ip 地址 |
getHeader(“xxx”) | 获取请求头 |
getParameter() | 获取请求的参数 |
getParameterValues() | 获取请求的参数(多个值的时候使用) |
getMethod() | 获取请求的方式 GET 或 POST |
setAttribute(key, value) | 设置域数据 |
getAttribute(key) | 获取域数据 |
getRequestDispatcher("/xxx") | 获取请求转发对象 |
请求的中文乱码解决
HttpServletRequest req;
GET
// 获取请求参数
String username = req.getParameter("username");
//1 先以 iso8859-1 进行编码
//2 再以 utf-8 进行解码
username = new String(username.getBytes("iso-8859-1"), "UTF-8");
POST
注意:
setCharacterEncoding("UTF-8")
需要在获取请求参数之前执行
// 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
req.setCharacterEncoding("UTF-8");
// 获取请求参数
String username = req.getParameter("username");
HttpServletResponse
HttpServletResponse简介
HttpServletResponse 类和 HttpServletRequest 类一样
每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用
HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息
我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
HttpServletResponse输出流
两个流同时只能使用一个
使用了字节流,就不能再使用字符流,反之亦然,否则就会报错
类型 | 方法 | 说明 |
---|---|---|
字符流 | getWriter(); | 常用于回传字符串 |
字节流 | getOutputStream(); | 常用于下载(传递二进制数据) |
响应中文乱码
方案一(不推荐)
// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
方案二(推荐)
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");
请求转发
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
请求转发的特点:
- 客户端只执行
一次请求
,浏览器地址栏没有变化共享 Request 域中的数据
(setAttribute(key, value),getAttribute(key))- 可以转发到 WEB-INF 目录下
- 不可以访问工程以外的资源
请求转发代码:
//获取请求转发对象
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//执行请求转发
requestDispatcher.forward(req,resp);
请求重定向
请求重定向,是指客户端给服务器发请求,服务器响应给客户端新的请求地址,客户端再去向服务器请求新地址。
请求重定向的特点:
- 客户端执行
两次请求
,浏览器地址栏发生变化不能共享 Request 域中的数据
(setAttribute(key, value),getAttribute(key))- 不可以转发到 WEB-INF 目录下
- 可以访问工程以外的资源
请求重定向代码:
1、
// 设置响应状态码 302 ,表示重定向
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");
2、(推荐使用)
resp.sendRedirect("http://localhost:8080");
Web中的路径
在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
在 javaWeb 中,路径分为相对路径和绝对路径两种:
相对路径
.
表示当前目录..
表示上一级目录- 资源名 表示当前目录/资源名
绝对路径
- http://ip:port/工程路径/资源路径
Web中的 /
在 web 中 / 斜杠 是一种绝对路径。
- / 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
- / 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径