Servlet

 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步骤

  1. 继承HttpServlet抽象类
  2. 重写HttpServlet的部分方法,如doGet()或doPost()方法
  3. 获取HTTP请求信息。通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串
  4. 生成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()输出数据,不然可能会出现异常;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值