servlet 理解大全
2018-07-03 本文已影响149人
奔跑的蛙牛
看完我的servlet大全希望你对servlet有个清晰的认识
JVM与编辑器对比
JVM | 编辑器 |
---|---|
JVM让程序运行 | 编辑器产生文件 |
严格进行语法检查 | 编译文件变成二进制(速度快的一方面原因) |
JVM控制存取的安全性问题 | 对文件进行安全性检查,规避大部分错误 |
java拾荒
java创建的对象存放在堆中。java虚拟机会主动察觉不再使用的java对象,内存紧张的时候,垃圾收集器会启动清理垃圾,回收空间
小思考
- java通过public、static、final使变量展现类似全局变量的能力
- 数量庞大的文件,压缩成包,定义mainfest文件指出main所在的启动类
什么是容器?
- servlet没有main方法。他们受控于另一个java应用,这个java应用称之为容器。
-
tomact 就是一个容器,web请求servlet,服务器先把请求交给容器,由容器向servlet提供HTTP请求和响应,而且由容器调用servlet的doPos()和doGet()方法,之后请求处理过之后再到达web容器 web服务器再返还给客户端
image.png
如何在没有容器的前提下,实现类似tomcat容器的功能?
- 创建与服务器的socket连接,并为这个socket创建一个监听者
- 创建一个线程管理器
- 实现安全
- 对日志之间的过滤
- jsp支持
- 还有内存管理
容器能提供什么?
-
通信支持 无需建立ServletSocket,监听端口,创建流。有内在API,只考虑业务
-
控制servlet的生命周期
-
多线程支持
-
声明方式实现安全 类似xml部署描述文件
-
jsp支持 容器把jsp代码翻译成java代码
浏览器输入一个url并返回html文件的过程
- 浏览器把请求交给web容器
- 容器根据url找到正确的servlet,并把请求交给这个servlet
- servlet 调用model返回一个结果,并把结果增加到请求对象中
- servlet 把请求分派给jsp
- jsp从请求对象中得到回答
- jsp组合生成页面
- 容器把页面交给用户
servlet 技术模型
- 对应http方法使用httpServlet对应的方法
- 使用httpServletRequest接口,编写代码获取请求信息
- 使用httpServletReponse接口,设置http响应或设置响应头
- 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
- 每个servlet又一个servletConfig对象,用于向servlet传递部署信息,用于访问servletContext
- 每个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生命周期(不能在详细了...)
只有第一个请求 会具有如此复杂的操作
- 一堆jsp文件部署为web应用的一部分
- 容器读取这个应用的web.xml,但是对.jsp文件不做任何处理
- jsp 等待着请求来请求
- 客户点击连接请求jsp
- 服务器将.jsp翻译成一个servlet的java源代码
- 会在这个阶段发现jsp源代码错误
- 容器把.java文件翻译成.class文件 会在这里捕获到java语法错误
- 容器加载新生成的servlet类
- 容器实例化servlet类,并导致servlet的jspinit方法运行
- 对象现在成为一个真正的servlet,准备就绪接受客户请求
- 容器创建一个新线程处理客户请求,servlet的_jspService()方法运行
- 客户返回一个响应或者转发到另一个组件
初始化JSP
可以在JSP中完成servlet的初始化工作,但是与常规的servlet稍有不同
- 配置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>
- 覆盖jspInit()
<%!
public void jspInit(){
ServletConfig sConfig = getServletConfig();
String emailAddr = sConfig.getInitParameter("email");
ServletContext ctx = getServletContext();
ctx.setAttribute("mail",emailAddr);
}
%>