1.Servlet的生命周期

(1)什么是Servlet的生命周期?

servlet容器如何创建servlet对象、如何对其进行初始化处理、 如果调用其方法来处理请求,以及如何销毁该对象的整个过程。

(2)servlet生命周期分成哪几个阶段?

1)实例化

a.什么是实例化?

容器调用Servlet的构造器,创建Servlet对象。

b.什么时候实例化?

情形1(默认): 容器收到请求之后,立即创建。
情形2: 容器启动之后,立即创建(需要做一些配置)。

    <!-- 
    配置启动加载,即容器启动之后,会立即创建该
    Servlet对象。
    注:
        参数值是一个大于等于零的整数,值越小,
        优先级越高(即先被创建)。   
    -->
    <load-on-startup>1</load-on-startup>

c.容器会创建几个实例?

一个!

2)初始化

a.什么是初始化?

容器在创建完servlet对象之后,会立即调用该对象的init方法。
注:
    该方法只会执行一次!

b.GenericServlet已经提供了init方法的实现

将容器传递过来的ServletConfig对象保存下来了,并且
提供了一个getServletConfig方法来获得该对象。

c.如何实现自已的初始化处理逻辑?

override GenericServlet的init()方法即可。

d.初始化参数的使用

step1.配置初始化参数
 <init-param>
    <param-name>company</param-name>
    <param-value>IBM</param-value>
 </init-param>

step2. 读取初始化参数
String company = 
        config.getInitParameter("company");
System.out.println("company:" + company);

3)就绪

a.什么是就绪?

容器收到请求之后,会调用Servlet对象的service方法。

b.HttpServlet已经提供了service方法的实现:

依据请求类型,调用对应的doXXX方法。
比如,get请求调用doGet方法,post请求调用doPost方法。
这些doXXX方法,只是抛出了一个异常。

4)销毁

a.什么是销毁?

容器在删除Servlet对象之前,会调用该对象的destroy方法。
注:
    该方法只会执行一次!

b.GenericServlet已经提供了destroy方法的基本实现。

可以override destroy方法来实现自己的销毁处理逻辑。

(3)生命周期相关的几个接口与类(了解)

a.Servlet接口

init(ServletConfig config)
service()
destroy()

b.GenericServlet抽象类

该类实现了Servlet接口中的部分方法(init,destroy)。

c.HttpServlet抽象类

该类继承了GenericServlet,实现了service方法。

2. jsp

(1)什么是jsp?

sun公司制订的一种服务器端动态页面技术规范。

注:
    a.因为虽然可以使用servlet生成动态页面,但是过于
繁琐(需要使用out.println输出),并且不利于页面的维护
(修改页面,就需要修改java代码),所以,sun才推出了jsp
规范。
    b.jsp是一个以".jsp"为后缀的文件(主要内容是html和少
量的java代码),容器会将jsp转换成一个对应的Servlet然后执行。
也就是说,jsp本质就是一个Servlet!

(2)如何写一个jsp文件?

1)html(css,javascript)

直接写即可。

2)java代码

方式一: java代码片断

<% java代码    %>

方式二: jsp表达式

<%= java表达式 %>

3)隐含对象

a.什么是隐含对象?

在jsp里面,直接可以使用的对象。比如out、request、response。

b.为什么可以直接使用这些隐含对象?

容器会添加获得这些对象的代码。

4)指令

a.什么是指令?

通过指令,告诉容器,在将jsp转换成Servlet时,做一些额外的
处理,比如导包。

b.语法

<%@ 指令名  属性=值 %>
注:
    如果有多个属性,使用空格隔开。

c.page指令

import属性:用来指定要导入的包名。
比如 <%@ page import="java.util.*,java.text.*"%>
注:
    导多个包,要使用","隔开。
contentType属性:设置response.setContentType方法的参数值。
pageEncoding属性:告诉容器,在读取jsp文件的内容时,使用指
    定的字符集来解码。

(3)jsp是如何执行的?

阶段一: 容器要将jsp转换成一个对应的Servlet。

html(css,js) -----> 在service方法里面,使用out.write输出。
<%       %>  -----> 照搬到service方法里面。
<%=      %>  -----> 在service方法里,使用out.print输出。

阶段二:容器调用该Servlet。

容器会编译、然后实例化、初始化、调用service方法。

练习

计算一个人的BMI指数:

用户提交身高、体重和性别,服务器端计算BMI指数,返回体重状况:

bmi = 体重(公斤) / 身高 (米)/ 身高(米)
要求
    bmi指数的范围使用初始化参数来配置。
<init-param>
    <param-name>male</param-name>
    <param-value>20,25</param-value>
</init-param>
<init-param>
    <param-name>female</param-name>
    <param-value>19,24</param-value>
</init-param>

练习

写一个jsp (date.jsp),输出当前的系统日期,比如输出 2019-01-30