1. Servlet介绍
Servlet是用java编写的服务器端程序,是web的三大组件之一。通过与前端的搭配使用给web网页生成动态内容。在java中Servlet是一个接口,被抽象类GenericServlet继承,GenericServlet又被HttpServlet继承;我们一般使用的servlet类是继承于HttpServlet。
1.1 Servlet工作模式
- 客户端请求发送至服务器
- 服务器调用Servlet根据需求将数据传入服务器
- 服务器转发数据至客户端
2. Servlet的代码实现
我们在实现Servlet功能时,可以选择以下三种方式:
第一种:实现Servlet接口,接口中的方法必须全部实现。使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义。
第二种:继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写。 使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的。
第三种:继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。因此在这里我们只讨论第三种方法
2.1 HttpServlet
Servlet 的生命周期: Servlet 的生命周期就是 Servlet 对象从创建到销毁的过程,下面来介绍其生命周期的过程
Servlet 对象是由 Tomcat 来进行实例化的,并且在实例化完毕之后调用 init 方法(只调用一次)
Tomcat 对于收到的请求,都会通过对应的 Servlet 的 service 方法来进行处理(可以调用多次)
Tomcat 在结束之前,会调用 Servlet 的 destory 方法来进行回收资源(最多调用一次)
创建HttpServlet步骤
- 继承HttpServlet抽象类
- 重写HttpServlet的部分方法,如doGet()或doPost()方法
- 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
- 生成HTTP响应结果。通过HttpServletResponse对象生成响应结果
2.2 HttpServletRequest
常用方法:
String getRequestURI() | 返回该请求的 URL 的一部分,不带协议名、端口号、查询字符串 |
String getContextPath() | 返回指示请求 URL 中 Context Path 部分 |
InputStream getInputStream() | 用于读取请求的正文内容,返回一个 InputStream 对象 |
String getParameter(String name) | 以字符串形式返回请求参数的值,如果参数不存在则返回 null |
String[] getParameterValues(String name) | 返回一个字符串对象的数组,包括所有给定的请求的参数,如果参数不存在则返回 null |
void setAttribute(String name, Object value) | 用来存储一个对象,也可以称之为存储一个域属性 |
Object getAttribute(String name) | 用来获取request中的数据 |
void removeAttribute(String name | 用来移除request中的域属性 |
Map<String,String[ ]> getParameterMap() | 将查询的参数保存在一个Map中 |
void getRequestDispatcher(URL地址).forward(req,resp) | 将该Servlet的request和response转发到URL地址 |
2.3 转发
我们在实际开发中,需要写不同的servlet,每个人servlet完成不同的功能,当我们访问Aservlet的时候, Aservlet实现部分功能后需要跳转到一个新的Bservlet里面,这就是资源跳转的方式,就用到了请求转发。
写法:
1.通过request对象获取请求转发器对象
创建request的getRequsetDispatche对象,参数为转发的访问路径。
⒉.调用dispatcher对象的 forword(),参数为request和response
转发特点:
- 浏览器地址栏不发生变化
- 只能转发到当前服务器的内部资源,不能转发至服务器外部资源
- 转发只是一次请求,多个资源之间使用同一个请求
2.4 HttpServletResponse
response对象的功能分为以下四种:
- 设置响应头信息;
- 发送状态码;
- 设置响应正文;
- 重定向;
设置响应头信息
可以使用response对象的setHeader()方法来设置响应头,使用该方法设置的响应头最终会发送给客户端浏览器
response响应正文
response是响应对象,向客户端输出响应正文(响应体)可以使用response的响应流,repsonse一共提供了两个响应流对象:
- PrintWriter out = response.getWriter():获取字符流;
- ServletOutputStream out = response.getOutputStream():获取字节流;
设置状态码及其他方法
- response.setContentType("text/html;charset=utf-8"):等同与调用response.setHeader(“content-type”, “text/html;charset=utf-8”);
- response.setCharacterEncoding(“utf-8”):设置字符响应流的字符编码为utf-8;
- response.setStatus(200):设置状态码;
- response.sendError(404, “您要查找的资源不存在”)
2.5 重定向
响应码为200表示响应成功,而响应码为302表示重定向。所以完成重定向的第一步就是设置响应码为302。
因为重定向是通知浏览器再第二个请求,所以浏览器需要知道第二个请求的URL,所以完成重定向的第二步是设置Location头,指定第二个请求的URL地址。
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setStatus(302);[设置响应码为302,表示重定向]
response.setHeader("Location", "url");//设置新请求的URL
}
}
便捷的重定向方式
void sendRedirect(String location) 设置 Location 字段,实现重定向
重定向特点
- 重定向是两次请求;
- 重定向的URL可以是其他应用,不局限于当前应用;
- 重定向的响应头为302,并且必须要有Location响应头;
- 重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;