JavaWeb(servlet生命周期+servlet上下文对象(servletContext)+线程安全问题+jsp的简介)

servlet特性
servlet的生命周期:
什么是servlet的生命周期
容器如何创建servlet对象,如何为servlet对象分配资源,如何调用servlet对象的方法来处理请求,
以及如何销毁servlet对象的整个过程.

阶段1:实例化
什么叫实例化:
容器调用servlet对象的构造器,创建一个servlet对象.
什么时候实例化servlet:
情形一:开始的时候容器中没有servlet对象,收到请求后创建servlet对象
情形二:容器启动后就立即创建相应的实例.
  1
值可以为整数,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
"%>
<% }
%>

<%
for(int i=0;i<20;i++){
out.print("hello jsp
");    
}
%>


在页面中输出当前系统时间,按照年月日时分秒格式,并且该时间能够到镶嵌到其他页面
include指令:
在页面中显示员工信息列表(t_emp)并且能实现奇数偶数颜色交错变换的效果.


 

你可能感兴趣的:(JavaWeb(servlet生命周期+servlet上下文对象(servletContext)+线程安全问题+jsp的简介))