Java技术升华后端小树林基础知识

servlet 理解大全

2018-07-03  本文已影响149人  奔跑的蛙牛

看完我的servlet大全希望你对servlet有个清晰的认识

JVM与编辑器对比

JVM 编辑器
JVM让程序运行 编辑器产生文件
严格进行语法检查 编译文件变成二进制(速度快的一方面原因)
JVM控制存取的安全性问题 对文件进行安全性检查,规避大部分错误

java拾荒

java创建的对象存放在堆中。java虚拟机会主动察觉不再使用的java对象,内存紧张的时候,垃圾收集器会启动清理垃圾,回收空间

小思考

  1. java通过public、static、final使变量展现类似全局变量的能力
  2. 数量庞大的文件,压缩成包,定义mainfest文件指出main所在的启动类

什么是容器?

  1. servlet没有main方法。他们受控于另一个java应用,这个java应用称之为容器。
  2. tomact 就是一个容器,web请求servlet,服务器先把请求交给容器,由容器向servlet提供HTTP请求和响应,而且由容器调用servlet的doPos()和doGet()方法,之后请求处理过之后再到达web容器 web服务器再返还给客户端


    image.png

如何在没有容器的前提下,实现类似tomcat容器的功能?

  1. 创建与服务器的socket连接,并为这个socket创建一个监听者
  2. 创建一个线程管理器
  3. 实现安全
  4. 对日志之间的过滤
  5. jsp支持
  6. 还有内存管理

容器能提供什么?

  1. 通信支持 无需建立ServletSocket,监听端口,创建流。有内在API,只考虑业务

  2. 控制servlet的生命周期

  3. 多线程支持

  4. 声明方式实现安全 类似xml部署描述文件

  5. jsp支持 容器把jsp代码翻译成java代码

浏览器输入一个url并返回html文件的过程

  1. 浏览器把请求交给web容器
  2. 容器根据url找到正确的servlet,并把请求交给这个servlet
  3. servlet 调用model返回一个结果,并把结果增加到请求对象中
  4. servlet 把请求分派给jsp
  5. jsp从请求对象中得到回答
  6. jsp组合生成页面
  7. 容器把页面交给用户

servlet 技术模型

  1. 对应http方法使用httpServlet对应的方法
  2. 使用httpServletRequest接口,编写代码获取请求信息
  3. 使用httpServletReponse接口,设置http响应或设置响应头
  4. servlet的生命周期和事件 (1)servlet类加载(2)servlet类实例化(3)调用service方法
    (4)调用service方法-->从httpServlet继承而来,doget,dopost由它调用(5)调用destory方法

servlet 参与流程

url指向servlet--->容器创建两个httpservletrequest对象和httpservletresponse对象--->容器根据url找到对应的servlet,为servlet创建线程,塞入两个请求对象--->servlet根据用户的http方法调用相应的方法--->servlet返回响应对象--->service方法结束,线程撤销或销毁,对象不保留,客户端得到相应

servlet生命周期图解

image.png

每一个http请求就是一个线程

servletConfig和servletContext

  1. 每个servlet又一个servletConfig对象,用于向servlet传递部署信息,用于访问servletContext
  2. 每个web应用又一个servletContext,用于访问web参数相当于公告栏和获取一些应用基本信息

编写监听者类模仿数据库操作

  public class MyServletContextListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event){
    ServletContext sc = event.getServletContext();
    String dogBreed = sc.getInitParamter("breed");
    Dog d = new Dog(dogBreed);
    sc.setAttribute("dog",d);  // 其他servlet就能得到这个值了
}
public void contextDestory(ServletContextEvent event){
// 这里什么都不做
}
}

JSP生命周期(不能在详细了...)

只有第一个请求 会具有如此复杂的操作

  1. 一堆jsp文件部署为web应用的一部分
  2. 容器读取这个应用的web.xml,但是对.jsp文件不做任何处理
  3. jsp 等待着请求来请求
  4. 客户点击连接请求jsp
  5. 服务器将.jsp翻译成一个servlet的java源代码
  6. 会在这个阶段发现jsp源代码错误
  7. 容器把.java文件翻译成.class文件 会在这里捕获到java语法错误
  8. 容器加载新生成的servlet类
  9. 容器实例化servlet类,并导致servlet的jspinit方法运行
  10. 对象现在成为一个真正的servlet,准备就绪接受客户请求
  11. 容器创建一个新线程处理客户请求,servlet的_jspService()方法运行
  12. 客户返回一个响应或者转发到另一个组件

初始化JSP

可以在JSP中完成servlet的初始化工作,但是与常规的servlet稍有不同
  1. 配置servlet初始化参数
    配置jsp初始化参数与普通无差别,区别就在于一个<jsp-file> \
// 请看下面代码
<web-app>
    <servlet>
          <servlet-name>email</servlet-name>
          <jsp-file>/TestInit.jsp</jsp-file>
          <init-param>
              <param-name>email</param-name>
              <param-value>gaomengjie_1@163.com</param-value>
          </init-param>
    </servlet>
    <servlet-mapping>
          <servlet-name>MyTestInit</servlet-name>
          <url-pattern>/TestInit.jsp</url-pattern>
    </servlet-mapping>
</web-app>
  1. 覆盖jspInit()
    <%!
    public void jspInit(){
    ServletConfig sConfig = getServletConfig();
    String emailAddr = sConfig.getInitParameter("email");
    ServletContext ctx = getServletContext();
    ctx.setAttribute("mail",emailAddr);
    }
    %>
上一篇下一篇

猜你喜欢

热点阅读