JAVASE知识点梳理
Servlet对象
概念
运行在服务器端的,已多线程的方式处理客户端请求的小程序。Servlet API会自动处理提交上来的值的解析和解码
Tomcat
Web容器,也称为servlet引擎(容器)。servlet容器包含并管理着servlet对象的生命周期。提供处理request并发送response的网络服务。Servlet通过tomcat提供的request/response范式与web客户端实现交互。所有的方法调用都通过Tomcat操作servlet对象来完成。
请求方式介绍
- get:默认的提交方式,通过超链接(a)、js或直接输入地址等方法提交均为get。Get方式提交的数据会拼接在跳转路径后面,提交的数据长度受地址栏长度限制,且信息完全暴露,安全性较差。
【使用场景:如分享链接时显示产品相关信息】
- Post:只有在表单中规定了提交方式method为post时才是post方法提交数据。Post提交数据是将数据保存在请求体中,常规操作无法获取其中的数据,安全性相对于get方法要高,且提交的数据量也比get方法多。
【账号密码登录一般用post提交】
Servlet执行流程
请求流程
客户端发出一个请求URL,URL中的一部分是Servlet的名字。
Web服务器转发请求到Servlet引擎,Servlet class实例在其里 面。
Servlet引擎调用Servlet的方法。
在HttpServlet中,Servlet的service方法最终将调用doPost()方法 或者doGet()方法。
响应流程
Servlet将动态响应请求,并把结果发到Web服务器。
Web服务器发送动态生成的响应给客户端。
客户端发送http请求==》服务器接收==》发送到web容器==》servlet对象解析数据,并生成动态响应==》响应发送至服务器端==》返回http响应给客户端
Servlet生命周期
1.Servlet对象类创建
当客户端第一次向服务端发送请求时,对应的Servlet对象就被创建。
创建方式1:自定义类实现Servlet接口,并重写其中全部的抽象 方法。【该方式需要重写五个抽象方法,通常我们只需要重写其中 的service方法,故使用时较为繁琐】
创建方式2:自定义类继承GenericServlet类,只需要重写其中的 service方法。
创建方式3:自定义类继承HttpServlet类,该类当中没有抽象方法,只要根据需要,重写其中的DoGet、DoPost等相关方法即可。
【根据数据的提交方式来执行相应的Do方法,如DoGet、DoPost】
2.方法调用
Init方法调用:对象创建成功后,会调用init方法对其配置信 息进行初始化。
Service方法调用:每次客户端向服务器端发送请求时,对应的Servlet对象即会调用service方法。【包括第一次发送请求】
Destroy方法调用:对象被处理回收时调用。
getServletInfo方法
一般不重写,Servlet API的文件建议使用GetServletInfo方法返回诸如作者、版本和版权的信息。如果要重写,最好返回尽量简单的信息。
getServletConfig方法
除非想亲自追踪对象config,否则一般来说不要重写这个方法.
3.对象的处理回收
当tomcat停止运行或者servlet对象所在的项目从tomcat中移除时,对象会被回收。
Web项目组成结构
- src:存放java代码
- Tomcat文件包
- JDK文件包
- WebContent内容。
①html文件
②WEB-INF(内含web.xml文件用于配置信息、lib用于存放 第三方jar包文件)
③META-INF
Servlet配置
所有新建的Servlet必须添加配置信息才能进行使用。Servlet配置信息写在web.xml中。配置过程如下:
<servlet> <servlet-name>formServlet</servlet-name> 【定义servlet的名称,可以自定义,没有限制】 <servlet-class>com.aowin.servlet.FormServlet</servlet-class> 【定义servlet的类型。输入的内容为servlet的完全路径:包名+类名】 </servlet> <servlet-mapping> <servlet-name>formServlet</servlet-name> 【servlet的名称,必须与前面定义的名称完全一致】 <url-pattern>/formServlet</url-pattern> 【定义servlet的url访问路径,在客户端url栏输入用来访问。必须以斜杠/开头】 </servlet-mapping>
Servlet使用
- Tomcat执行
- 客户端输入相应的url地址。
Url组成:协议+主机地址+端口号+项目名称+servlet的url路径
举例:http://localhost:8080/servlet_01/firstServlet
request对象使用
请求对象,其中包含了所有请求相关的信息。
public String getParameter(String name) 获得指定名称的对应值
public String[] getParameterValues(String name) 获得指定名称对应值的集合
request.getMethod(); http的请求方式(get/post)
request.getRequestURI();获得端口号后字符串(项目名+文件名)
request.getRequestURL().toString();获得完整的URL字符串
request.getServerName();获得主机名称
request.getServerPort();获得端口号
request.getServletPath();获得servlet路径。项目+文件路径
request.getScheme();获得协议名称
request.getServletContext().getContextPath();获得项目名称
【项目相关信息保存在application中,因此从application中可以获取项目的名称】
Response对象使用
响应对象,其中包含了所有与对客户端响应相关的信息
public ServletOutputStream getOutputStream() throws IOException
获得输出字节流
public PrintWriter getWriter() throws IOException获得输出字符流
文字乱码解决方法
乱码产生的原因:编码不一致
请求
在获取数据之前设置request的编码。request.setCharacterEncoding("gbk")
get:
因为get方法提交的数据直接写在url地址中,因此编码格式由tomcat决定。修改tomcat的配置文件server.xml,在8080节点上增加一个属性URIEncoding="gbk"
post:
post方法提交的数据包含在请求体中,直接在获取数据前设置编码格式即可。【无需其他操作】
响应
在获取输出流之前设置response的编码。
1)response.setCharacterEncoding("") 设置响应内容的编码
2)response.setContentType("text/html ;charset=gbk") 设置响应的编码,告诉浏览器使用这个编码显示页面
涉及方法
request.setCharacterEncoding("utf-8");
设置请求的编码格式
response.setContentType("text/html;charset=utf-8");
设置相应文件的编码格式
response.setCharacterEncoding("utf-8");
只设置编码格式,不限定文件类型
作用域
作用
用于数据存储。
分类
Request
数据类型
HttpServletRequest。保存一次请求中的相关信息。当客户端发起一次新的请求时,原先保存在request对象中的数据即丢失。
setAttribute("username", username);向request对象设置属性和属性值
getAttribute("username")request对象通过属性名称拿到对应的属性值
Session
数据类型HttpSession。保存一次会话中的相关信息。用户重复请求不会影响其中的内容。
【浏览器不关闭均视为一次会话。通常用于存储用户的登录信息】
request.getSession()通过request对象拿到session对象
session.setAttribute("username", username);设置属性和属性值
session.getAttribute("account");通过属性名称获取对应属性值
Application
项目作用域。数据类型ServletContext。用于保存项目的公共数据,该数据被所有连接至该项目的所有用户共享。【类似于类当中的静态属性,比如访问量,点击量】
- request.getServletContext();通过request对象获得
- Request.getSession().getServletContext()通过session对象获得对象
- setAttribute("count", 1)设置属性和属性值
- getAttribute("count");获得对应属性的属性值
【对于所有的作用域而言,如果事先没有设置对应的属性和属性值,直接通过get方法拿到的值为null】
路径的区别
相对路径
相对路径不能以斜杠开头。用指定的内容替换url地址中最后一个斜杠后面的内容。【../表示向前推一个斜杠】
绝对路径
绝对路径必须用斜杠开头,表示一个完整的url地址。
客户端中的绝对路径:开头的斜杠表示包括协议、主机地址和端口号的信息,需要在后面指明项目的名称及文件路径。
服务端中的绝对路径:开头的斜杠表示包括协议、主机地址、端口号和项目名称的信息,需要在后面指明文件的路径。
Servlet对象响应的方式
1. 获得响应的输出流,直接输出
2. 跳转
跳转
服务器端跳转
服务器的行为,不需要客户端重新发出请求,浏览器中的地址会停留在初次请求的资源界面,不会发生改变。可以访问所有的资源。Request对象保存中的数据不会丢失。
跳转方法:
request.getRequestDispatcher("login.html").forward(request, response);
response对象】
客户端跳转
也称为重定向,需要客户端重新发出请求,此时客户端中的地址会对应的发生变化。只能访问有权限的资源(WEB-INF下的资源均不能访问),并且Request对象保存中的数据会丢失。
【需要注意的是,重新请求只更新了客户端的地址信息,并未携带任何其他信息,因此request中不会有表单的数据】
跳转方法:
response.sendRedirect("test.html");
【参数为跳转的路径,完成跳转后客户端的路径会变成该路径】
Servlet线程安全
在Servlet概念中提到,servlet是多线程、单实例模式。也就是多个客户端访问同一个项目时,其处理对象是由同一个servlet对象进行处理。如果该对象中存储了成员变量,在访问过程中可能会导致数据异常。
保证线程安全的三种方式
- servlet实现SingleThreadModel接口
- Servlet对象设置方法为同步方法
- 避免在servlet方法中使用成员变量。(推荐)
优劣比较:
一 第一种强制限制只能单线程访问servlet对象,这会迫使web容器为每一个访问用户创建一个serlvet实例,性能损耗严重;
二 第二种方法限制方法同步,需要其他客户端完成操作后才能执行,在实际中会导致用户长时间等待的情况,,效率较低。
三 推荐使用第三种方式。
表单提交校验
校验的三种方式
- 在提交按钮submit上添加onclick=”return check()”事件,当check()方法返回false值时,则不提交;若返回true,则提交成功。具体的判断条件写在check()方法体中。
- 在提交按钮button上添加check()事件,在check()方法体中进行条件判断,若不符合要求,用return直接结束方法,若条件符合要求,调用form的submit()方法进行提交。
- 在表单上添加onsubmit=”return check()”事件。在check()方法中进行条件判断,当check()方法返回false值时,则不提交;若返回true,则提交成功。
方式1和方式3处理的方式本质上是一致的,只是事件添加位置的区别。方式2中button本身没有方法,是需要自己定义提交的时机。
防止表单重复提交的方式
- 在javascript中设置一个标志变量。
举例说明:设置标志变量var tag = false,当tag为false时,表示表单还未提交。若此时接收到了提交的操作,将tag的值改为true,表示已经提交。之后如果再收到提交请求,根据tag的值来判断,true时表示已经提交过,此次提交为重复提交,则不进行提交操作。
【由于表单提交的操作一定伴随着页面的重新加载,对应的标志变量也会进行初始化,故不会影响新一次的表单提交】
- 设置提交按钮不可使用disabled=”true”
按钮中的disabled属性默认值为false,表示当前按钮可以进行点击,在第一次点击提交后将属性值改为true,此时按钮变成不可使用的状态,也不会触发任何点击事件,可以避免重复提交。
- 在传输的数据中添加时间戳来避免刷新导致的重复提交。
具体步骤:在提交的表单中添加一个隐藏的表单<input type="hidden" name="time">,通过js将提交的时间作为该表单的值进行提交;服务端在获取数据时将该值与储存在session作用域的该属性对应值进行比较:
①若session中未找到该属性:表示本次会话中第一次提交,对session进行第一次赋值,并对提交的数据进行处理。
②若发现有该属性但是属性值不同:表示是新的一次表单提交,对属性进行重新赋值,并对提交的数据进行处理。
③若发现有该属性并且属性值相同:表示此次提交是由刷新导致,提交的数据与前一次提交完全一致,此时直接跳过,不对提交数据做任何处理。
【需要注意的是,刷新导致的重复提交所对应的request对象是同一个,并未发生改变,因此其中保存的时间是一致的,以此作为依据来区分是否为重复提交】
Cookie使用
Cookie是服务器端保存在客户端的一些信息。当客户端再次发出请求的时候,浏览器自动将对应路径的cookie提交上去。
不太安全,但是会cookie记录sessionid等数据,所以不能禁用
创建cookie
Cookie c1 = new Cookie("名称",对应值);
设置cookie在客户端保存的时长,以秒为单位
c1.setMaxAge(24*60*60);//表示保存一天(24h)
添加到客户端
response.addCookie(c1);
获取cookie
Cookie[] cs = request.getCookies();
【因为cookie可能不止一个,所以返回的是一个数组】
通过名称获取对应值
for(Cookie c:cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+"="+value);
}
【由于不能确定所需的cookie信息存储在哪个位置,需要对数组进行遍历,附加条件判定来获取指定的对应值】
JSP
概念
JSP是一种让你混合静态HTML和JAVA代码,并且能动态生成HTML的技术。是一种服务器端脚本语言。
JSP运行模式
客户端向服务器请求jsp界面时,web容器将对应的jsp源文件编译成servlet代码,进一步编译生成class字节码文件被web容器读取运行,返回相应信息给客户端。
Java脚本的三种方式
- <% 代码%>:这种形式的java代码作为service方法中的一部分执行,声明的变量为该方法中的局部变量,不能在其中定义新方法。一个页面中有多个<% 代码%>块时,执行顺序自上而下。
- <%!代码 %>:这种形式的java代码作为类的一部分,可以在其中定义方法和成员变量。
- <%= 内容%>:这里的内容作为out.print的参数输出到html界面,这里的内容必须是有结果的表达式
- jsp注释方法:<%-- 注释内容--%>
- html注释方法:<!-- -->
- Java注释方法:// 或者 /**/
注释方法
JSP指令 Directives
JSP directives是一些被JSP引擎调用的语句,其在页面编译成Servlet的时候会被调用。不会产生输出内容,主要用来设置相关的属性。
三种directives
page directives
定义一些页面特有的属性。
language=”java”//使用的编程语言
contentType=”MIMEType;charset=编码格式”//设置编码类型
import=”packageList”//导入的外部文件。导包用。
session=”true/false”//是否使用session。默认都设置为true
errorPage=”error_url”当前页面发生错误时跳转至指定的错误页面
isErrorPage=”true/false”//指定当前页面是否为错误页面。
一般格式: <%@ page 属性=”属性值”,属性=“属性值” %>
【多个属性之间用空格隔开,导入文件时,若需导入多个,文件名写在一个字符串中,中间用逗号隔开。如:import="com.aowin.dao.*,com.aowin.model.*"】
include directives
在当前页面中引入外部文件。实现机制是直接将外部文件的代码进行复制,在当前页面执行。是静态的,运行时不能做修改。
一般格式:<%@ include file=”导入文件的路径” %>
taglib directives
格式化标签。
<%@ taglib uri=”tagLibraryURI” prefix=”tagPrefix” %>
内嵌变量
request
javax.servlet.http. HttpServletRequest (接口)。
表示客户端请求。与servlet中用法一致。
Response
javax.servlet.http.HttpServletResponse (接口)。
表示服务端响应,与servlet用法一致。
Session
javax.servlet.http.httpSession (接口)。
表示会话作用域,用于存放数据。与servlet中用法一致。
application
javax.servlet.ServletContext(接口)。
表示项目作用域。特别注意其数据类型。与servlet中用法一致。
Config
javax.servlet.ServletConfig(接口)。
存放配置信息。与servlet中使用方法一致。在创建servlet实例时,调用init方法初始化配置信息时用到该参数。
pageContext
javax.servlet.jsp.PageContext。
表示页面作用域。存储的数据只能在当前页面进行使用。
该对象可以对其他作用域进行赋值和取值。
赋值
pageContext.setAttribute("属性名称","属性值",作用域编号);
取值
pageContext.getAttribute("属性名称",作用域编号);
移除属性
pageContext.removeAttribute("属性名称",作用域编号);
【作用域编号:PageContext类中设置了不同静态属性用于表示不同的作用域。如PageContext.SESSION_SCOPE】
【如果未指定作用域编号,那么默认为pageContext作用域】
Out
javax.servlet.jsp.JspWriter。
通过response对象获得的输出流,用于向客户端输出内容。
Page
Java.lang.Object
指当前页面。类型为object,常量。
Exception
java.lang.Throwable
该参数只存在于设置isErrorPage为true的界面。和java中的exception对象一致,可以用于输出异常信息。
【可能涉及的方法:getMessage();获得异常信息】
作用域
pageContext:页面作用域
Request:请求作用域
Session:会话作用域
Application:项目作用域
行为(标签)
Bean使用的标准行为
可以增加个性化的行为
<jsp:include/>
动态包含页面,在运行过程中可以发生变化。
包含指定页面
<jsp:include page=”/templates/copyright.html”/>
包含指定页面,并将值存入当前request对象中。
可以用<jsp:param/>子元素作为参数进行传值。用该方法传递参数时,被包含界面必须是jsp。
<jsp:include page=page_name>
<jsp:param name=param_name value=param_value/>
<jsp:param name=param_name value=param_value/>
</jsp:include>
<jsp:forward />
跳转至指定界面(服务器跳转)
<jsp:forward page=“uri” />:
携带属性和对应值跳转至指定界面
属于服务器跳转。数据存在于request对象中。
<jsp:forward page=“other.jsp” >
<jsp:param name =“参数名称” value=“值”></jsp:forward >
JavaBean
是一个java类,符合SUN的JavaBean规范
JavaBean规范
1.有一些私有的属性,这个属性的get方法必须是get属性名,set方法必须是set属性名, get和set方法中属性名第一个字母大写,如果属性是boolean值,则属性的get方法必须为is属性名。
2.需要一个没有参数的构造函数
3.需要实现序列化的接口implements Serializable
JavaBean对象创建及使用
实例化对象
如果没有实例则产生一个新的Bean;
如果实例已经存在,则取出这个实例。
<jsp:useBean id="user1" scope="request" class="com.aowin.model.User"></jsp:useBean>
设置属性值
Name的值为对象的id值。
<jsp:setProperty property="account" name="user1" value="xiaohei"/>
获取属性值
Name的值为对象的id值。获取的值会直接进行输出。
<jsp:getProperty property="account" name="user1"/>
MVC结构
m:model,表示数据模型层,完成数据的增删改查,用dao+model
v:view,表示视图层,包括页面(html jsp),img等
c:controller,表示控制层,处理业务流程,用servlet
分层好处:好维护,好扩展,灵活,
分工明确,每一层都可以在不影响其它层的情况下,使用新的技术进行替换
项目流程:
视图层===》控制层===》数据层===》视图层
JDBC事务处理
为了完成一个功能,需要执行多条sql语句,要么都成功,要么都失败
conn.setAutoCommit(false);
......
......
.......
conn.commit();
注意:事务处理的目的是保证数据一致性
在项目中增加service层,完成事务处理,一个service的方法中可能调用多个dao的方法,使用同一个connection,
如果成功则提交,如果某个dao的方法执行错误,需要 回滚
如一次购买:
1)修改产品的库存,减少
2)购物车中增加记录
不管是不是需要多个sql,都可以增加service层,方便管理
EL和JSTL
EL
Expression Language。用于页面内容动态显示,主要的作用是替代jsp中的java代码,可以更方便的获取值用于显示(可以进行简单的运算,但不能进行流程控制)。
运算式
${显示内容}
el默认从作用域中获取数据,不指定具体作用域时,按以下顺序进行查找从中获取数据
查找顺序:
- pageScope :从页面作用域查找
- requestScope 从请求作用域查找
- sessionScope 从会话作用域查找
- applicationScope从项目作用域查找
【找到即止,找不到显示为空""】
运算符
算术运算符
关系运算符
逻辑运算符
条件运算符
表达式?结果1:结果2;【同java】
Empty运算符
用于判断指定变量名是否存在,存在返回true,否则返回false
${ empty param.name }
${ empty username }
.和[]运算符
点运算符:点上属性名称,得到对应值
[]运算符:传入索引值,获得对应集合中指定位置的元素。索引值可以是数字,也可以字符串类型的数字。
隐含变量
JSP
pageContext PageContext 实例对应于当前页面的处理
作用域
pageScope 与页面作用域属性的名称和值相关联的 Map 类
requestScope 与请求作用域属性的名称和值相关联的 Map 类
sessionScope 与会话作用域属性的名称和值相关联的 Map 类
applicationScope 与应用程序作用域属性的名称和值相关的 Map 类
请求参数
param 按名称存储请求参数的主要值的 Map 类
paramValues 将请求参数的所有值作为 String 数组存储的 Map 类
请求头
header 按名称存储请求头主要值的 Map 类
headerValues 将请求头的所有值作为 String 数组存储的 Map 类
Cookie cookie 按名称存储请求附带的 cookie 的 Map 类
初始化参数
initParam 按名称存储 Web 应用程序上下文初始化参数的 Map 类
【从隐含变量中取值只需要用.符号加上要取的变量名称即可。如:
${param.vip}从提交的数据中获取名称为VIP的属性值】
JSTL
JavaServer Pages Standard Tag Library。JSP标准标记库。需要在jsp中进行导入才能使用。
如:<%@ taglib uri="http://java.sun.com /jsp/jstl/core" prefix="c" %>
功能领域 |
uri |
前缀 |
例子 |
核心(Core) |
http://java.sun.com/jsp/jstl/core |
c |
<c:tagname ...> |
国际化(Internationalization) |
http://java.sun.com/jsp/jstl/fmt |
fmt |
<fmt:tagname ...> |
XML |
http://java.sun.com/jsp/jstl/xml |
x |
<x:tagname ...> |
数据库(Database) |
http://java.sun.com/jsp/jstl/sql |
sql |
<sql:tagname ...> |
If条件判断:test表示判断条件
</c:if>
<c:if test="${!empty user }">
</c:if>
选择语句:(类似于switch)
Test表示匹配条件,匹配成功时显示相应内容,都不匹配则显示otherwise中的内容。
<c:choose>
<c:when test="${user.vip>0 and user.vip<=5 }">初级会员</c:when>
<c:when test="${user.vip>5 and user.vip<=10 }">中级会员</c:when>
<c:when test="${user.vip>10 }">高级会员</c:when>
<c:otherwise>请先加入会员</c:otherwise>
</c:choose>
循环遍历
例1:<c:forEach begin="1" end="10" var="i">
${i }--
</c:forEach>
例2:<c:forEach items="${numlist }" var="num" step="2"varStatus="s">
<tr>
<td>${s.index }</td>
<td>${s.count }</td>
<td>${num }</td>
</tr>
</c:forEach>
相关属性:
begin:起始位置
end:结束位置
step:步长==》默认显示集合所有的数据,步长是1
items:要显示的集合
var:变量,代表集合中的元素
varStatus:代表当前项的状态,常用index(索引值,固定) count(迭代计数,变化)
过滤器(Filter)
Filter用于过滤那些与之相关的servlet或JSP页面的请求,对请求内容进行检查和修改。不会发出新的请求,只会让请求延续。
Filter是一段可重用的,转换HTTP请求,响应内容和头信息的代码,它先于与之相关的servlet或JSP页面运行在服务器上。可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
Filter只是修改对资源的请求或对资源的响应,不会重新发出请求。Filter对静态和动态资源都可以起作用。
filter的一般作用:
在request到达它调用的资源之前访问、处理该资源。
修改request头和数据,通过重新包装request对象。
修改response头和数据,通过重新包装response对象。
拦截监听资源的调用。
以一定顺序对一个或一组servlet或者静态资源作用。
常见使用场景
- 编码过滤【对于访问的资源统一设置编码格式】
- 登录过滤【在过滤器中验证是否包含用户信息,若无表示没有进行登录,则跳转至登录界面,若包含信息,则正常访问】
- 权限过滤【权限过滤可以对访问的资源进行目录分类,在过滤器中分别获取访问的路径和人员权限,之后对路径名称和权限进行匹配,若满足权限要求则继续请求,否则跳转至提示界面重新访问】
- init():项目启动时初始化配置信息
- doFilter():有请求访问匹配的路径资源时执行
- Destroy():销毁过滤器
- Chain.doFilter(request,response):延续请求继续访问。【当请求资源符合要求时,让请求继续向前访问,到达下一个过滤器或者访问资源】
- 自定义一个类实现Filter接口,重写doFilter()方法
- 配置信息
过滤器方法
过滤器的创建
(1) 配置方式1:web.xml中配置。与servlet相似。
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
com.aowin.filter.MyEncodingFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>【匹配路径】
</filter-mapping>
(2) 注解形式配置。@WebFilter(“匹配路径”);如果需要匹配多种路径,格式为:@WebFilter(“{路径1,路径2...}”)
【路径为字符串格式】
匹配路径的方式
1)/*:表示过滤所有的请求
2)/pack/*:表示过滤pack文件夹下的请求
3)*.html *.jsp :表示过滤某一类的请求
4)/hello.jsp :表示对固定的请求路径进行过滤
同一个过滤器可以配置多个filter-mapping,过滤多种路径的形式
生命周期
1)web服务器启动的时候初始化过滤器,执行init()方法
2)如果请求匹配filter所配置的路径,执行过滤器的方法doFilter()
3)服务器关闭或者项目停止发布就会销毁filter,执行destroy()
监听器(Listener)
监听器用于监听行为。监听器在项目启动时创建。监听器的配置只需要配置类信息。注解的形式:@WebListener。因为不需要配置路径,所以无需参数。
Request监听
ServletRequestListener
监听request的初始化和销毁。
相关方法:
requestInitialized(ServletRequestEvent sre):request对象初始化时执行
requestDestroyed(ServletRequestEvent sre):request对象销毁时执行
Request对象在每次请求时初始化,当请求结束后则销毁。
ServletRequestAttributeListener
监听request对象添加属性、移除属性、覆盖属性值的行为。
相关方法:
attributeAdded()
监听request对象添加属性的行为【即request对象调用setAttribute()方法添加属性时】
attributeRemoved()
监听request对象移除属性的行为【即request对象调用removeAttribute()方法移除属性时】
attributeReplaced()
监听request对象覆盖属性值的行为()【即request对象调用setAttribute()方法对已有的属性名进行重复赋值时】
Session监听
HttpSessionListener
监听session的创建和销毁。
相关方法:
sessionCreated()
session对象创建时执行。
【当浏览器第一次访问动态资源时,才会创建session对象。若只访问静态资源,则不会进行session对象的创建只要浏览器不关闭,都不会创建新的session对象】
sessionDestroyed()
session对象销毁时执行。
【如果客户端与服务器持续进行交互,则session不会被销毁,当客户端与服务器之间建立会话但客户端一直没有交互(客户端没有操作),那么默认30分钟之后会对session对象进行销毁】
【浏览器关闭时,此时session对象不会被销毁,只有经过30分钟后,服务器没有检测到该session对象的客户端交互动作,才会销毁该对象】
Session对象销毁时间的设置
- 配置信息设置:时间单位为分钟
<session-config>
<session-timeout>1</session-timeout>
</session-config>
- session.setMaxInactiveInterval(时长);设置多少秒后session对象销毁,单位是秒。
- session.invalidate();调用该方法时session对象立即销毁。
HttpSessionAttributeListener
监听session对象添加属性、移除属性、覆盖属性值的行为。
相关方法:
attributeAdded()
监听session对象添加属性的行为【即session对象调用setAttribute()方法添加属性时】
attributeRemoved()
监听session对象移除属性的行为【即session对象调用removeAttribute()方法移除属性时】
attributeReplaced()
监听session对象覆盖属性值的行为()【即session对象调用setAttribute()方法对已有的属性名进行重复赋值时】
ServletContext监听
项目作用域ServletContext在项目启动时进行初始化。
ServletContextListener
监听servletContext的初始化和销毁。
contextInitialized():项目启动时调用该方法初始化servletContext对象
contextDestroyed():项目停止发布时调用该方法销毁对象。
ServletContextAttributeListener
监听servletContext对象添加属性、移除属性、覆盖属性值的行为。
相关方法:
attributeAdded()
监听servletContext对象添加属性的行为【即servletContext对象调用setAttribute()方法添加属性时】
attributeRemoved()
监听servletContext对象移除属性的行为【即servletContext对象调用removeAttribute()方法移除属性时】
attributeReplaced()
监听servletContext对象覆盖属性值的行为()【即servletContext对象调用setAttribute()方法对已有的属性名进行重复赋值时】
AJAX
AJAX指Asynchronous JavaScript and XML,即异步JS和XML。
AJAX可以不刷新页面,从服务器中获取数据对页面内容进行替换。
优点:
- 无需每次都请求整个页面的信息,可以只获取需要进行改动的信息,减轻服务器的负担。
- 只需要局部刷新页面,可以不用重复加载同样的内容,在效率上有极大提高,在用户的角度来看像是实时更新。
- Ajax采用异步数据传输,因此在向服务器请求数据的过程中,用户依然可以对客户端页面进行访问和操作。
- 进一步促进页面和数据分离
- 基于XML标准化,被广泛支持,无需安装插件
缺点:
- 浏览器兼容性问题
- 移动端支持程度低
- 无法通过后退撤销操作
XMLHttpRequest对象
用于在后台与服务器交换数据。
方法:
open(“请求方式”,“请求路径”,“异步参数”);
send(“需要提交的数据”);
abort() 停止当前请求
getAllResponseHeaders() 作为字符串返问完整的headers
getResponseHeader(“headerLabel”) 作为字符串返问单个header标签
setRequestHeader("label", "value") 设置header并和请求一起发送 ('post'方法一定要设置 )
属性:
AJAX使用流程
- 初始化XMLHttpRequest对象。(新建对象:New XMLHttpRequest())
【对于低版本的IE5、IE6可能不支持,需要创建ActiveX对象
New ActiveXObject(“Microsoft.XMLHttp”);】
- 调用open方法设置请求路径,请求方式和异步参数。
【请求路径对应服务器中处理提交数据的路径;
请求方式主要有:1.get方法2.post方法
异步参数:默认为true,即异步传输;false为非异步,非异步传输 时用户无法进行操作】
- 设置获取响应数据后的处理流程。通过设置onreadystatechange属性。该属性的属性值为function函数体。
【若设置为非异步方式,那么不要设置该属性,只需要将方法体中需要执行的代码写在send方法调用后面即可】
- 调用send函数发送数据。
get方法:get方法提交数据时,是将数据拼接在路径后面,一般格式为:路径?属性1=值1&&属性2=值2...;因此在send方法中无需另外设置传递数据,只需要设置参数为null即可。==》Send(null)
Post方法:post方法提交数据时,在send方法中传入提交的数据,一般格式为:send(“属性1=值1&&属性2=值2...”)
特别注意:在使用post方法提交数据时,调用send方法前,必须设置请求头信息。
XMLHttpRequest对象调用
setRequestHeader(“Context-type”,"application/x-www-form-urlencoded")】