zoukankan      html  css  js  c++  java
  • Servlet基础学习笔记

    之前记在文档里的Servlet基础笔记,发出来供大家一起交流学习。

    一. Servlet概述
    JavaWeb应用程序的所有请求的响应都是由Servlet完成的。Servlet是JavaWeb的核心程序,所有的网址最终都交给Servlet来处理,Servlet并没有main之类的方法,当用户访问服务器的时候,Tomcat是调用Servlet的某些方法来完成整个处理过程。

    1.1.Servlet工作流程
    浏览器提交的请求是遵循HTTP协议的文本。这段文本由服务器也就是Tomcat接收并解析,封装成了HttpServletRequest类型的request对象。所有的HTTP头数据都可以通过request相应的方法查询到。
    Tomcat同时把输出流封装为HttpServletReponse类型的response对象,通过设置response属性就可以控制输出的内容。然后,Tomcat把request、response作为参数,调用Servlet的相应方法,例如doPost(request,response)、doGet(request,response)等。
    Servlet中主要处理业务逻辑,例如读取数据库、权限检查、业务处理等。

    1.2.Servlet接口
    Servlet是一种实现了javax.servlet.Servlet接口的类。Servlet接口规定了特定的方法来处理特定的请求。开发者只需要实现Servlet的相关方法,用户访问Web程序的时候,Tomcat会调用这些方法完成业务处理。

    1.3.Servlet生命周期
    1.init方法:初始化Servlet,第一次加载Servlet会调用此方法,该方法只调用一次。
    2.service方法:处理业务逻辑,程序员需要将代码写在该方法中,每加载servlet一次都会调用该方法。
    3.destroy方法:销毁servlet,销毁方式:1)relaod或remove 2)关闭tomcat 3)关机

    二. HttpServlet
    2.1.HttpServlet概述
    HttpServlet类是GenericServlet的直接继承子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。同时免去了从ServletRequest和ServletResponse到HttpServletRequest和HttpServletResponse的强转动作。

    2.2.HttpServlet覆盖了service方法

    2.3.HttpServlet的doGet方法和doPost方法
    在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST。如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求,会去调用doPost()方法,所以我们在HttpServlet的子类去覆盖doGet()或doPost()方法即可。

    三. HttpServletResponse

    3.1.reponse概述
    在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法,最终根据请求方式的不同会传给doGet()或doPost()方法中使用。
    response对象可以完成对客户端的响应工作。
    response对象的功能分为以下四种:
    设置响应头信息;发送状态码;设置响应正文;重定向;

    3.2.reponse响应正文
    response中共封装了两个流,用于服务器向客户端写数据。response.getWriter()获得字符输出流,只能向请求者(浏览器)写字符。response.getOutputStream()获得字节输出流,只能向请求者(浏览器)写字节。
    注意:在同一个请求中,不能同时使用两个流,只能使用其中一个,否则会抛异常。

    3.2.2重定向
    重定向是你访问A servelt的时候,A Servlet无法处理,然后告诉浏览器去重新访问B Servlet。在重定向的过程中,浏览器发送了至少两次请求。
    表现在地址栏中的地址会发生变化。重定向的响应码是302。

    完成重定向有两种方式:
    1)通过设置响应码和响应头。
    response.setStatus(302);
    response.setHeader(“Location”,”http://www.baidu.com“);
    2)调用response的重定向方法。
    response.sendRedirect(“http://www.baidu.com“);

    重定向总结:
    重定向是两次(至少)请求;
    重定向的URL可以是其他应用,不局限于当前应用;
    重定向的响应头为302,并且必须要有Location响应头;
    重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,否则可能会出现异常。

    四. HttpServletRequest
    在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。

    request的功能包括以下几种:
    封装了请求头数据;
    封装了请求正文数据,如果是GET请求,那么就没有正文;
    request是一个域对象,可以把它当成Map来添加获取数据;
    request提供了请求转发和请求包含功能。

    4.1.request是域对象

    4.2.获得请求头信息

    4.3.获取请求参数

    4.4.请求转发
    当浏览器请求A,但是A没有处理,把请求直接在服务器内部转给B。对浏览器来说,并不知道有请求转发的存在,浏览器地址栏也不会有任何的变化。
    注意与重定向的区别。
    RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);//获得请求转发器
    rd.forward(request,response);//转发出去

    4.5.请求包含
    在A中,把请求包含到B。
    RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);
    rd.include(request,response);

    请求转发与包含比较
    1. 如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用 response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;
    2. 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(“text/html;charset=utf-8”);
    3. 请求包含大多是应用在JSP页面中,完成多页面的合并;
    4. 请求转发大多是应用在Servlet中,转发目标大多是JSP页面;

  • 相关阅读:
    来自lombok的注解(解决idea中的找不到get,set方法,找不到log的问题)
    IDL语言开发规范
    神经网络训练时出现nan错误
    Hadoop WordCount程序
    Hadoop2.4.1伪分布式安装
    Hadoop简介
    linux 安装tensorflow(gpu版本)
    高级映射,查询缓存和与spring整合
    用mybatis实现dao的编写或者实现mapper代理
    mybatis介绍与环境搭建
  • 原文地址:https://www.cnblogs.com/lishbo/p/9956051.html
Copyright © 2011-2022 走看看