【学习笔记】
1.servlet生命周期(面试必考)
2.数据有效性验证
3.表达式语言与标准标签库
4.servlet是个单实例多线程
5.java内存模型
-------------------------------------------------------------【面试题】------------------------------------------
如果在servlet里面定义有一个私有全局变量intc,并在doget里面进行操作c++;,如果统计调用次数,这样做会有问题吗回答:有问题,java内存模型:servlet由于是多线程的,多个线程共享一个内存,当数据量一大,并发很多,就会形成冲突。
-----------------------------------------------------------------------------------------------------------
书籍:servlet 3.1规范 pdf文档 http权威指南
【回顾】:反射创建对象
Class.forName("com.tanlan.ishop.web.servlet").newinstance();
一、1.【servlet生命周期(面试必考)】
问题:【创建】:由谁创建,何时创建,创建几个,怎么调用
回答:【由谁创建】:servlet是由JSP/Servlet容器(Tomcat)通过解析web.xml得到servlet的类名,
通过反射创建servlet的实例
【何时创建】:既然是通过反射实例化,可定就是调用无参构造方法,可以把无参构造方法
写出来,里面输出一句话来确定是容器启动时还是调用时实例化对象,
经过试验,当servlet第一次处理请求,该servlet会实例化
【创建几个】:一个servlet只会创建一个实例
【怎么调用】:容器自身也有一个main方法,是一个无线循环的线程,这也是web程序的入口
------------------------------------【servlet自动加载】-------------------
<load-on-startup>数字</load-on-startup> 在容器自动时自动加载servlet,
部署在web.xml中.就不需要映射了mapping了,里面的数字是个相对大小,如1或者2
那么1先实例化,2后实例化,容器会使用多线程的方式调用处理请求的方法
--------------------------------------------------------------------------
【有几个阶段?这些阶段会对应哪些方法】
【初始化】:init方法:做初始化工作,一般会读取web,xml配置信息,只调用一次
【处理请求】:service方法:处理信息
【销毁】:destroy方法:将程序从容器中移除,正常关闭容器
--------------------------------------------------------
正常关闭容器 点击service--tomcat---stop server
问题:既然说请求是由service处理的,那么doget与dopost方法是如何得到请求的
回答:模版方法
2.servlet的类层次结构
二、表达式语言与标准编程库
1.【jsp】:只显示数据
【作用域:存储数据的范围
从小到大】:page(页面作用域),request(请求作用域),session(会话作用域),application(容器作用域)
表达式语言是专门在JSP页面显示数据的,该数据来自作用域
【从小到大依次寻找其中的属性】,如:setAttribute("属性名",数据对象)进而得到其数据,
必要时可以使用前缀区分确定在哪个作用域里找pageScope,requestScope,
sessionScope,applicationScope。用法如页面里的a属性 ${pageScope.a}
【语法】:${exppress} 【注:注释没用,即使注释掉也会解析】
1.如果属性对应的是个实例对象,可以直接用属性名打点调用属性名来获得数据值(利用反射:首字母大写 前加get)
2.如果属性对应的是个字符串,直接可以用属性名就可以显示
3.集合显示:会用到标签库 下面介绍
【javaBean】规范:没有规范不能使用框架(框架利用反射时取值不能成功)
2.标签库:核心,SQL,XML,Format,Function
用法:第一步:引用一个指令<%@taglibprefix="c" uri="http://java.sun.com/jstl/core_rt"%>
定义的c就是标签;后面制定的链接就是标签库 用c打冒号就可以使用里面的标签
第二步:<c:forEachitems="${categoryes}" var="category">调用需要的标签,
${category.id} 利用属性打点调用数据
${category.name}
...
</c:forEach> 结束