JavaBean用于使HTML代码与Java代码分离,简化JSP页面,提高JAVA代码的灵活性和重用性
JavaBean:目前主要使用非可视化的JavaBean实现一些业务逻辑或封装一些业务对象。

JavaBean规范要求JavaBean对象提供默认无参的构造方法,应用在JSP页面中,默认作用于page范围内(可自行手动在page,request,session,application这4种范围内设置)。

<jsp:useBean>标签获取类的实例,其内部是通过实例化类的默认构造方法进行获取,所以JavaBean需要有一个默认的无参的构造方法;
<jsp:getProperty>标签获取JavaBean中的属性,其内部是通过调用指定属性的getXXX()方法进行获取,所以JavaBean规范要求为属性提供公共类型的访问器。

<form>表单信息中的属性名称最好设置成JavaBean中的属性名称,这样就可以在接收页通过
<jsp:setProperty name="person" property="*"/>来接收所有参数

<meta http-equiv="refresh" content="1">实现每秒自动刷新一次页面



Servlet对象对Web应用进行了封装(主要封装了对HTTP请求的处理),提供了对Web应用的编程接口,
并且它的运行需要Servlet容器的支持(运行在Web服务器端)。
Servlet容器很多,最有名的是Tomcat,JBoss等,它们提供了对应用的相关扩展。

通常情况下,我们编写的Servlet对象都继承于HttpServlet,在开发中,所使用的具体的Servlet对象就是HttpServlet对象,
原因是HttpServlet是Servlet接口的实现类,并提供了HTTP请求的处理方法。

Servlet对象在容器启动时被初始化,只有第一次被请求时,Servlet对象被实例化并驻存在内存中。
如果存在多个请求,Servlet不会再被实例化,仍由此Servlet对象处理。每个请求是一个线程(不是进程)。



关于ServletContext对象:ServletContext
    Servlet中:直接拿(调用getServletContext()方法),也可以通过ServletRequest(request)去拿,还可以通过HttpSession去拿,
    Filter中 :只能通过FilterConfig去拿,

关于ServletContext的初始参数:InitParameter
    Servlet中:先拿到ServletContext对象,再直接调用getInitParameter()方法拿,
    jsp页面中:用application对象拿,
    
关于Servlet的初始参数:InitParameter
    Servlet的初始参数可以直接拿,调用:getInitParameter(name),    
    Filter的初始参数要通过FilterConfig去拿,

关于用户提交请求参数:Parameter
    用户提交请求的参数只能通过参数请求对象ServletRequest(request)去拿,调用:getParameter(name),

关于Session对象:
    在Servlet中    :可以通过 HttpSession对象 或 参数请求对象ServletRequest(request) 来获取,
    在jsp内置对象中:可以直接用session【或者pageContext.getSession()】,还可以用request.getSession(),
    
关于属性的设置和获取:Attribute
    属性的设置和获取可以通过ServletRequest(request)、ServletContext、HttpSession三大域对象实现
    在jsp页面中对应:request、application、session三个内置对象
    【注意:这三个对象也刚好有Listener对象来监听属性操作】
     此外:pageContext作用域的属性通过pageContext内置对象(域对象)来设置和获取属性



★★★★
web.xml文件中:
ServletContext参数在<web-app>标签中:
<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://127.0.0.1:3306/demo</param-value>
</context-param>
Servlet初始参数在<servlet>标签中   :
<init-param>
    <param-name>count</param-name>
    <param-value>5000</param-value>
</init-param>
Filter初始参数在<filter>标签中     :
<init-param>
    <param-name>count</param-name>
    <param-value>5000</param-value>
</init-param>
监听器配置                         :<filter><filter-class>com.maple.listener.MyListener</filter-class></filter>
容器配置顺序                       :监听器 ——> 过滤器 ——> Servlet


关于注解:@WebServlet、@WebFilter、@WebListener @WebInitParam
@WebServlet注解属性列表参考:https://blog.csdn.net/maozi_bsz/article/details/46431189 
示例:https://www.cnblogs.com/xdp-gacl/p/4010328.html 
注解所引用的API包:
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebListener;


关于监听器:
监听器由Web容器(比如tomcat)管理,它的作用是监听Web容器的有效事件,
利用Listener接口监听某个执行程序,并根据该程序需求做出适当的响应。

由于session中保存大量访问网站相关的重要信息,因此过多的session数据就会服务器性能的下降,占用过多的内存。因此类似数据库对象的持久化,web容器也会把不常使用的session数据持久化到本地文件或者数据中。这些都是有web容器自己完成,不需要用户设定。
  不用的session数据序列化到本地文件中的过程,就是钝化;
  当再次访问需要到该session的内容时,就会读取本地文件,再次放入内存中,这个过程就是活化。
Servlet 规范中定义了两个特殊的监听器接口”HttpSessionBindingListener和HttpSessionActivationListener”
帮助JavaBean 对象了解自己在Session域中的这些状态,实现这两个接口的类不需要 web.xml 文件中进行注册。
参考:https://www.cnblogs.com/xdp-gacl/p/3961929.html 


注意:
原生的HttpServletRequest类是有许多的缺陷的,
比如无法重复获取其中的流,无法通过setAttribute方法来改写属性,
当我们遇到这样的情况时,一个很好的解决办法就是使用装饰者模式,
重写一个类,继承自Wrapper类,将其中的方法重写以满足我们的需求。
http://www.cnblogs.com/xdp-gacl/p/3798347.html 


总结:
四大作用域:
★JSP客户端:1个
pageContext作用域:    pageContext内置对象(也包含了另外八大对象的引用)

★Servlet服务端:3个
request作用域:        request内置对象            HttpServletRequest
session作用域:        session内置对象            HttpSession
application作用域:    application内置对象        ServletContext