JavaWeb(servlet生命周期+servlet上下文对象(servletContext)+线程安全问题+jsp的简介)
servlet特性
servlet的生命周期:
什么是servlet的生命周期
容器如何创建servlet对象,如何为servlet对象分配资源,如何调用servlet对象的方法来处理请求,
以及如何销毁servlet对象的整个过程.
阶段1:实例化
什么叫实例化:
容器调用servlet对象的构造器,创建一个servlet对象.
什么时候实例化servlet:
情形一:开始的时候容器中没有servlet对象,收到请求后创建servlet对象
情形二:容器启动后就立即创建相应的实例.
<load-on-startup>1</load-on-startup>
值可以为整数,0以及负数
当为0和整数的时候:表示容器启动是加载该servlet,值越小,优先级越高.
如果只相等,按web.xml中配置的顺序加载.
当为负数表示访问时加载.
阶段2:初始化
什么是初始化:
容器在创建好servlet对象之后,会立即调用对象的init方法.
一般情况下,我们不用写init方法,因为GenericServlet已经提供了init方法的实现(将容器传递过来的
servletConfig对象保存下来,并且,提供了getServletConfig方法获得servletConfig对象)
(初始化阶段步骤:
Servlet容器加载servlet类,把它的. Class文件中的数据读到内存中。
Servlet容器创建servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。此外servlet容器还会使得servletConfig对象与当前的web应用的servletContext对象关联。
Servlet容器创建servlet对象。
Servlet容器调用servlet对象的init(ServletConfig config)方法。
通过初始化步骤,创建了servlet对象和servletConfig对象,并且servlet对象
与servletConfig对象关联,而servletConfig对象又与当前对象的servletContext对象关联
。当servlet容器完成servlet后,servlet对象只要通过getServletContext()方法
就能得到web应用的servletContext对象。)
init方法 只会执行一次
阶段3:就绪
容器收到请求之后调用servlet对象的service方法来处理请求
阶段4:销毁
容器依据自身的算法删除servlet,删除前会调用destroy()
只会执行一次
可以重写(override)destroy方法实现自己的处理逻辑
应用程序卸载时一定会调用destroy()方法.
什么是servlet上下文?
容器启动之后,会为每一个web应用场景创建唯一的一个符合servletContext接口要求对象,该对象就是servlet上下文
特性:
唯一性:(一个web应用对应一个servlet)
一直存在:(只要容器不关闭,应用没有被卸载,servlet上下文就一直存在.)
如何获得servlet上下文对象
方式1:
通过servletConfig提供的getServletContext()
ServletContext config = getServletConfig().getServletContext();
方式2:
通过httpSession提供的getServletContext().
ServletContext config = request.getSession().getServletContext();
方式3:
通过GenericServlet提供的getServletContext方法
ServletContext context = getServletContext();
方式4:通过FilterConfig提供的getServletContext
作用二:
使用getAttribute获取绑定数据
特点:
servlet上下文绑定的数据可以被整个应用谁给你的所有组件共享,并且一直可以访问
练习:实现访问网站总人数的记录,以及基于某一特点启动的访问记录
分析:由于网站中资源较多,想要保留一次的访问记录则需要一个从应用一启动就存在的空间,
并且应用中的所有资源能访问到这个存储空间
线程安全问题:
容器收到请求以后,会启动一个线程来进行相应的处理
默认情况下,容器只会为每个servlet创建一个实例
如果同时多个请求访问通过一个servlet,则肯定会有多个线程访问这个servlet实例
如果这些线程要修改servlet实例的某一个属性,就有可能发生功能线程安全问题.
如何解决线程安全问题:
压力测试工具:Apach jmeter
加锁(synchronized)
int count=0;
synchronized (this) {
count++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+","+count);
}
jsp基本语法:
jsp的由来
为什么会有jsp规范:
servlet技术产生之后,在使用时最麻烦的是使用大量的out.print语句
输出页面,这样的形式在系统变更,维护,预览效果是都不能方便快捷的完成任务,于是推出这种jsp技术,用来
将servlet中负责显示的语句抽取出来
什么是jsp:
Sun公司制定的一种服务器端动态页面技术的组件规范,jsp是一个以".jsp"为后缀的文件,在该文件中,主要是HTML和少量的
java代码.jsp文件会被容器转换成一个servlet类,然后执行.
转译成servlet时的规则:在service方法中用out.print语句输出该变量,表达式,方法的值.
如何编写jsp
1.写一个以.jsp为后缀的文件
2.在该文件中,可以包含如下内容
-html(css,javascript)
-注释
-java代码
-指令
-隐含对象
jsp中的html代码
像编写html页面一样编写即可,作用:控制页面在浏览器中显示的效果
转译成servlet时的规则:
称为service方法中out.print/out.write语句中的内容
jsp页面的注释
语法:
1.<!--注释内容-->
HTML注释,注释中的内容如果包含java代码,这些java会被执行
2.<%--注释内容-%>
jsp持有的注释,如果注释的内容包含java代码,这些java会被忽略.
3.jsp中的java代码包含以下三种形式:
-jsp表达式 <%=....%>
-jsp小脚本 <%%>
-jsp声明
编写位置:页面的任意位置
作用:控制页面中可变内容的产生.
jsp表达式:
语法规则:<%=....%>
合法内容:变量,变量加运算符组合的表达式,有返回值的方法.
练习:在jsp页面中使用jsp表示式完成输出20行"hello jsp"
<%
for(int i=0;i<20;i++){
%>
<%="NO:"+(i+1)+"hello jsp<br>"%>
<% }
%>
<!-- 使用表达式方式输出 -->
<%
for(int i=0;i<20;i++){
out.print("hello jsp<br>");
}
%>
在页面中输出当前系统时间,按照年月日时分秒格式,并且该时间能够到镶嵌到其他页面
include指令:
在页面中显示员工信息列表(t_emp)并且能实现奇数偶数颜色交错变换的效果.
- 如何从VS2003升级到VS2008
- js中多个Date对象变量间赋值互相影响
- 并发编程之Executor,Executors,ExecutorService和ThreadPoolExecutor
- 【DeveMobile实例】d3.js 与Trianglify 制作SVG格式Low-Poly 特效
- 未来人工智能将把人类分为3层,而你会在哪一层呢?
- IIS 7.0探索用于 Windows Vista 的 Web 服务器和更多内容
- 初学Python 之抓取当当网图书页面目录并保存到txt文件
- JavaScript 基础(二)数组
- 限制扫码付款额度,支付宝和微信要被“祭旗”?
- 拖动条SeekBar及星级评分条
- 【DeveMobile实例】利用Mobile Detect 制作单独移动端页面项目
- 互联网+智能物流高峰论坛举行运的易现场签约完成战略布局
- Quartz.net通过配置文件来完成作业调度
- JavaScript 基础(一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MapReduce之自定义OutputFormat
- 在TensorFlow中使用模型剪枝将机器学习模型变得更小
- 干货 | 滴滴 数据分析原来是这样做的!
- 数据链路层之PPP协议
- matplotlib基础绘图命令之boxplot
- MapReduce之GroupingComparator分组(辅助排序、二次排序)
- MySQL优化--概述以及索引优化分析
- MySQL优化--查询分析工具以及各种锁
- MySQL优化--MVCC
- Linux入门--基础命令
- Linux入门--权限管理、任务调度、磁盘管理
- 【Rust日报】2020-08-05 -- 如何在2020年进一步加快 Rust 编译器的速度
- Linux学习--网络、进程、服务、软件管理
- IOS label 设置行高
- 重学数据结构(序:概览)