WEB基础知识总结

1. JDBC

1.1. JDBC的操作流程

第一步: Class.forName()加载数据库连接驱动

第二步: DriverManager.getConnection()获取数据连接对象

第三步:根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、 PreparedStatement

第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX()

第五步:关闭结果集、关闭会话、关闭连接


1.2. 使用 PreparedStatement

1.PreparedStatement 接口继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象

2.作为 Statement 的子类 , PreparedStatement 继承了 Statement 的所有功能 。三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数

3.在 JDBC 应用中,在任何时候都不要使用 Statement,原因如下:

一、代码的可读性和可维护性.Statement 需要不断地拼接,而 PreparedStatement 不会。

二、 PreparedStatement 尽最大可能提高性能.DB 有缓存机制,相同的预编译语句再次被调用不会再次需要编译。

三、最重要的一点是极大地提高了安全性.Statement 容易被 SQL 注入,而 PreparedStatementc 传入的内容不会和 sql 语句发生任何匹配关系


1.3. 关系数据库中连接池

1.从连接池获取或创建可用连接

2.使用完毕之后,把连接返回给连接池

3.在系统关闭前,断开所有连接并释放连接占用的系统资源

4.能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值

连接池中的概念

最小连接数连接池一直保持的数据连接。如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费掉

最大连接数是连接池能申请的最大连接数。如果数据连接请求超过此数,后面的数据连接请求将被加入到等待队列中,这会影响之后的数据库操作

如果最小连接数与最大连接数相差太大,那么,最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放

上面的解释,可以这样理解:数据库池连接数量一直保持一个不少于最小连接数的数量,当数量不够时,数据库会创建一些连接,直到一个最大连接数,之后连接数据库就会等待


2. Http

Http协议,超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式

2.1. Http长连接和短连接

HTTP 协议有 HTTP/1.0 版本和 HTTP/1.1 版本。 HTTP1.1 默认保持长连接(HTTP persistent connection,也 翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名下继续用这个 通道传输数据;相反的就是短连接

在 HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。 从 HTTP/1.1 起,默认使用的是长连接, 用以保持连接特性


2.2. Get和Post

Http的两种请求方式

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

GET 从指定的资源请求数据

POST 向指定的资源提交要被处理的数据

. Get Post
后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)
书签 可收藏为书签 不可收藏为书签
缓存 能被缓存 不能缓存
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码
历史 参数保留在浏览器历史中 参数不会保存在浏览器历史中
对数据长度的限制 是的,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符) 无限制
对数据类型的限制 只允许 ASCII 字符 没有限制。也允许二进制数据
安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分,在发送密码或其他敏感信息时绝不要使用 GET ! POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中
可见性 数据在 URL 中对所有人都是可见的 数据不会显示在 URL 中

2.3. Get和Post的区别标准答案

GET在浏览器回退时是无害的,而POST会再次提交请求

GET产生的URL地址可以被Bookmark,而POST不可以

GET请求会被浏览器主动cache,而POST不会,除非手动设置

GET请求只能进行url编码,而POST支持多种编码方式

GET**请求参数会被完整保留在浏览器历史记录里,而**POST中的参数不会被保留

GET请求在URL中传送的参数是有长度限制的,而POST没有

对参数的数据类型,GET只接受ASCII字符,而POST没有限制

GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息

GET参数通过URL传递,POST放在Request body中


2.4. 深入答案

GET和POST是HTTP协议中的两种发送请求的方法

HTTP是基于TCP/IP关于数据如何在万维网中如何通信的协议,**HTTP的底层是TCP/IP,所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。**GET和POST能做的事情是一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的

GET产生一个TCP数据包;POST产生两个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)


2.5. Http请求协议的格式

POST请求是可以有请求体的,而GET请求不能有请求体

格式:

请求首行

请求头信息

空行

请求体


2.6. 响应码

200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中

404:请求的资源没有找到,说明客户端错误的请求了不存在的资源

500:请求资源找到了,但服务器内部出现了错误

302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址


2.7. Http三次握手

TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时客户端发syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据

socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket


2.8. Http 中重定向和请求转发的区别

本质区别: 转发是服务器行为,重定向是客户端行为

重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会丢失

请求转发特点:一次请求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会丢失

3. Cookie和Session

Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。 以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie

Session 是存储在 web 服务器端的一块信息。 session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去

1、无论客户端做怎样的设置, session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie

2、在存储的数据量方面: session 能够存储任意的 java 对象cookie 只能存储 String 类型的对象


4. JSP

JS中定义变量都是var

JS是弱类型,同一变量可以接受不同的数据类型

typeof操作符,判断指定变量的数据类型

4.1. 五种原始数据类型

关键字 说明
number 数值型:整数和浮点数
boolean 布尔类型:true/false
string 字符串类型:包含字符和字符串
object 对象类型,定义对象语法: var obj = { 属性名:属性值, 属性名:属性值 };
undefined 未定义的类型

4.2. 字符串转换成数字类型

转换函数 作用
parseInt() 将一个字符串转成整数,如果一个字符串包含非数字字符,那么parseInt函数会从首字母 开始取数字字符,一旦发现非数字字符,马上停止获取内容。
parseFloat() 将一个字符串转成小数,转换原理同上。
isNaN() 转换前判断被转换的字符串是否是一个数字,非数字返回true

4.3. js内置对象

4.3.1. 数组

创建数组的方式 说明
new Array() 无参的构造方法,创建一个长度为0的数组
new Array(5) 有参的构造方法,指定数组的长度
new Array(2,4,10,6,41) 有参的构造方法,指定数组中的每个元素
[4,3,20,6] 使用中括号的方式创建数组
数组的特点:
1) 数组中的每个元素的类型是可以不同的。
2) 数组的长度可以动态变化
3) 数组中包含大量的方法,类似于Java中的集合,而Java中的数组没有方法。

常用方法

方法名 功能
concat() 连接两个或更多的数组,并返回结果
reverse() 将数组进行反转
join(separator) 与split()功能相反,将数组通过分隔符,拼成一个字符串。
sort() 对字符串数组进行排序 如果要对数字进行排序,要指定比较器函数。
sort(function(m,n)) 数字两两比较
1) 如果m大于n,则返回正整数
2) 如果m小于n,则返回负整数
3) 如果m等于n,则返回0

4.4. BOM编程和DOM编程

BOM:Browser Object Model 浏览器对象模型

BOM的作用:用于操作浏览器中的各种对象,不同浏览器定义上是有差别的,实现方式也会有不同。以下是Chrome浏览器各个 BOM对象

BOM的核心对象是window,它表示浏览器的一个实例

window中与对话框有关的方法 作用
alert(“提示信息”) 弹出一个确认按钮的信息框
string prompt(“提示信息”,”默认值”) 弹出一个输入信息框,返回字符串类型
boolean confirm(“提示信息”) 弹出一个信息框,有确定和取消按钮。 如果点确定,返回true,点取消返回false

DOM:Document Object Model 文档对象模型,用于操作网页中元素

DOM的作用:每个HTML页面在被浏览器解析的时候都会在内存中创建一棵DOM树,我们通过编写JS代码就可以访问这棵树上任 何一个节点,并且对节点进行操作。通过 DOM模型,可以访问所有的 HTML 元素,连同它们所包含的文本和属 性。可以对其中的内容进行修改和删除,同时也可以创建新的元素。新创建的元素对象,要挂到DOM树上才可以在网页上显示出来。

4.5. 查找节点

获取元素的方法 作用
document.getElementById(“id”) 通过id属性到唯一的元素 如果页面上有多个同名的id,则得到第1个元素
document.getElementsByName(“name”) 通过name属性得到一组标签,返回一个数组
document.getElementsByTagName (“标签名”) 通过标签名字得到一组标签,返回一个数组
document.getElementsByClassName(“类名”) 通过类名得到一组标签,返回一个数组

4.6. Jsp和Servlet

处理请求和发送响应的过程是由叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西

Jsp 本质上就是一个 Servlet,它是 Servlet 的一种特殊形式(由 SUN 公司推出),每个 jsp 页面都是一个 servlet 实例

Servlet 是由 Java 提供用于开发 web 服务器应用程序的一个组件,运行在服务端,由 servlet 容器管理,用来生成动态内容。一个 servlet 实例是实现了特殊接口 Servlet 的 Java 类,所有自定义的 servlet 均必须实现 Servlet 接口

区别

Jsp 是 html 页面中内嵌的 Java 代码,侧重页面显示

Servlet 是 html 代码和 Java 代码分离,侧重逻辑控制, mvc 设计思想中 Jsp 位于视图层, servlet 位于控制层


4.7. Jsp 域对象

四大域对象:

1.pageContext page 域-指当前页面,在当前 jsp 页面有效,跳到其它页面失效

2.request request 域-指一次请求范围内有效,从 http 请求到服务器处理结束,返回响应的整个过程。 在这个过程中使用 forward(请求转发)方式跳转多个 jsp,在这些页面里你都可以使用这个变量

3.session session 域-指当前会话有效范围,浏览器从打开到关闭过程中,转发、重定向均可以使用

4.application context 域-指只能在同一个 web 中使用,服务器未关闭或者重启,数据就有效


5. FreeMarker

FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML, JSP 或 Java 等,说白点,就是可以根据提供的数据和创建好的模板,去自动的创建html静态页面

放在电商项目中的话,比如说商品详情页面,为了减少数据库的压力,提高用户体验度,我们想到了如果直接把商品详情页面准备好,那么久不需要在去数据库查找了,节约了大量的资源

freemarker就是起到了这么一个作用,每增加一个商品就自动生成一个静态页面,保存到web层中


5.1. FreeMarker的优点

分离表现层和业务逻辑

使用JSP开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难。FreeMarker根本不支持Java脚本代码,而是使用el表达式来输出展示数据。FreeMarker的设计初衷就是:模板+数据模型=输出,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都是由数据模型来处理的。用户最终看到的输出是模板和数据模型合并后创建的。

提高开发效率

在我们以往的开发中,使用的都是JSP页面来展示数据的,即所谓的表现层。我们都知道,JSP在第一次执行的时候需要转换成Servlet类,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,那么试想一天中我们浪费在程序编译的时间有多少。相对于JSP来说,FreeMarker模板技术不存在编译和转换的问题,所以就不会存在上述问题。而且开发过程中,我们在不必在等待界面设计开发人员完成页面原形后,我们再来开发程序

分工明确

以往用JSP展现数据时,程序员并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。协调工作很困难,使用FreeMarker后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据


5.2. FTL指令

1.assign 指令

此指令用于在页面上定义一个变量

(1)定义简单类型

<#assign linkman="周先生">
联系人: ${linkman}

(2)定义对象类型

<#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
电话: ${info.mobile} 地址: ${info.address}

2. include 指令

此指令用于模板文件的嵌套

创建模板文件 head.ftl

<h1>黑马信息网</h1>

我们修改 test.ftl,在模板文件中使用 include 指令引入刚才我们建立的模板

<#include "head.ftl">

3.if 指令
在模板文件上添加

<#if success=true>
    你已通过实名认证
<#else>
    你未通过实名认证
</#if>

在代码中对 str 变量赋值

map.put("success", true);

在 freemarker 的判断中,可以使用= 也可以使用==

4.list 指令

( 1)代码中对变量 goodsList 赋值

List goodsList=new ArrayList();
Map goods1=new HashMap();
goods1.put("name", "苹果");
goods1.put("price", 5.8);
Map goods2=new HashMap();
goods2.put("name", "香蕉");
goods2.put("price", 2.5);
Map goods3=new HashMap();
goods3.put("name", "橘子");
goods3.put("price", 3.2);
goodsList.add(goods1);
goodsList.add(goods2);
goodsList.add(goods3);
map.put("goodsList", goodsList);

( 2)在模板文件上添加
—-商品价格表—-

<#list goodsList as goods>
    ${goods_index+1} 商品名称: ${goods.name} 价格: ${goods.price}<br>
</#list>

如果想在循环中得到索引,使用循环变量+_index 就可以得到。


5.3. 内建函数

内建函数语法格式: 变量+?+函数名称

1.获取集合大小

我们使用 size 函数来实现,代码如下:

${goodsList?size} 条记录

2.转换 JSON 字符串为对象

我们通常需要将 json 字符串转换为对象,那如何处理呢?看代码

<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
    <#assign data=text?eval />
开户行: ${data.bank} 账号: ${data.account}

3.日期格式化
代码中对变量赋值:

dataModel.put("today", new Date());

在模板文件中加入

当前日期: ${today?date} <br>
当前时间: ${today?time} <br>
当前日期+时间: ${today?datetime} <br>
当前格式化: ${today?string("yyyy年MM月")} <br>

4.数字转字符串

代码中对变量赋值:

map.put("point", 102920122);

修改模板:

累计积分: ${point}

页面显示:

累计积分:102,920,122

我们会发现数字会以每三位一个分隔符显示,有些时候我们不需要这个分隔符,就需要将数字转换为字符串,使用内建函数 c

累计积分: ${point?c}

页面显示效果如下:

累计积分:102920122


5.4. 空值处理运算符

如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常。但是有些时候,有的变量确实是 null,怎么解决这个问题呢?

判断某变量是否存在:“??“

用法为:variable??,如果该变量存在,返回 true,否则返回 false

<#if aaa??>
aaa 变量存在
<#else>
aaa 变量不存在
</#if>

缺失变量默认值:“!”

我们除了可以判断是否为空值,也可以使用!对 null 值做转换处理

在模板文件中加入

${aaa!'-'}

在代码中不对 aaa 赋值,也不会报错了 ,当 aaa 为 null 则返回!后边的内容-


5.5. 运算符

算数运算符

FreeMarker 表达式中完全支持算术运算,FreeMarker 支持的算术运算符包括:+, - , * , / , %

逻辑运算符

逻辑运算符有如下几个:

逻辑与:&&

逻辑或:||

逻辑非:!

逻辑运算符只能作用于布尔值,否则将产生错误

比较运算符

1 =或者==:判断两个值是否相等.

2 !=:判断两个值是否不等.

3 >或者 gt:判断左边值是否大于右边值

4 >=或者 gte:判断左边值是否大于等于右边值

5 <或者 lt:判断左边值是否小于右边值

6 <=或者 lte:判断左边值是否小于等于右边值

注意: =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且 FreeMarker 是精确比较,”x”,”x “,”X”是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker 会把>解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>


6. Solr

Apache Solr 是一个流行的开源搜索服务器,它通过使用类似 REST 的 HTTP API,这就确保你能从几乎任何编程语言来使用 solr

Solr 是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。 Solr 是企业级的,快速的和高度可扩展的。 使用 Solr 构建的应用程序非常复杂,可提供高性能

Solr 是一个高性能,采用 Java5 开发,基于 Lucene 的全文搜索服务器。同时对其进行 了扩展,提供了比
Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能 进行了优化,并且提供了一个完善的功能管
理界面,是一款非常优秀的全文搜索引擎。

在一些大型门户网站、电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快、搜索结果按相关度排序、搜索内容格式不固定等,这里就需要使用全文检索技术实现搜索功能


为什么要用solr

1、solr是将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品)

2、solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送请求,接收响应即可,降低了业务系统的负载

3、solr部署在专门的服务器上,它的索引库就不会受业务系统服务器存储空间的限制

4、solr支持分布式集群,索引服务的容量和能力可以线性扩展

单独使用Lucene实现站内搜索需要开发的工作量较大,主要表现在:索引维护、索引性能优化、搜索性能优化等,因此不建议采用

基于Solr实现站内搜索扩展性较好并且可以减少程序员的工作量,因为Solr提供了较为完备的搜索引擎解决方案,因此在门户、论坛等系统中常用此方案


solr的工作机制:

1、solr就是在lucene工具包的基础之上进行了封装,而且是以web服务的形式对外提供索引功能

2、业务系统需要使用到索引的功能(建索引,查索引)时,只要发出http请求,并将返回数据进行解析即可


solr和Lucene区别

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎

Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能


什么是solr

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化

Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

solr是基于lucene开发企业级搜索服务器,实际上就是封装了lucene。

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果


中文分析器 IK Analyzer

Ik 分词器的分词原理本质上是词典分词。 先在内存中初始化一个词典,然后在分词过程中挨个读取字符,和字典
中的字符相匹配,把文档中的所有的词语拆分出来的过程。

IK分词器,基本可分为两种模式,一种为smart模式,一种为非smart模式

张三说的确实在理

smart模式的下分词结果为:

张三 | 说的 | 确实 | 在理

而非smart模式下的分词结果为:

张三 | 三 | 说的 | 的确 | 的 | 确实 | 实在 | 在理

可见非smart模式所做的就是将能够分出来的词全部输出;smart模式下,IK分词器则会根据内在方法输出一个认为最合理的分词结果,这就涉及到了歧义判断。


solr 怎么设置搜索结果排名靠前

可以设置文档中域的 boost 值, boost 值越高,计算出来的相关度得分就越高,排名也就越靠前。此方法可以把
热点商品或者推广商品的排名提高。


SolrHome 和 SolrCore

创建一个Solr home目录,SolrHome是Solr运行的主目录,目录中包括了运行Solr实例所有的配置文件和数据文件,Solr实例就是SolrCore,一个SolrHome可以包括多个SolrCore(Solr实例),每个SolrCore提供单独的搜索和索引服务


7. Filter和Listener

7.1. 什么是Filter

Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能或业务上的功能

常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。


7.2. Filter的生命周期

服务器启动的时候加载过滤器的实例,并调用init()方法来初始化实例,每一次请求时都只调用方法doFilter()进行处理,停止服务器时调用destroy()方法 ,销毁实例


7.3. Filter与interceptor的区别

1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
3.拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。 
4.拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5.在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

7.4. Filter的应用

Filter实现统一全站编码
细粒度权限控制
分ip统计网站的访问次数 
Filter实现页面静态化(详见下图)

Filer


7.5. 什么是Listener

Listener是Servlet事件监听器,Servlet事件监听器就是一个实现特定接口的Java程序,专门用于监听Web应用程序中ServletContext、HttpSession和ServletRequest等域对象的创建和销毁过程,监听这些域对象属性的修改以及感知绑定到HttpSession域中某个对象的状态。


7.6. Listener的应用场景

统计当前在线人数
日志志监
特定要求过滤关键字拦截(域中过滤敏感字符)

8. Web Service

Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以WebService可以在任何支持这些标准的环境(Windows,Linux)中使用。


8.1. WebService的优势和劣势

  优势:
  (1).跨平台。
  (2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。
  (3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。
  (4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。
  (5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。
  (6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。
    缺点:
  (1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。
  (2).WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA。

9. Ajax

Ajax 是一种创建交互式网页应用的的网页开发技术; Asynchronous JavaScript and XML”的缩写
Ajax 的优势:
通过异步模式,提升了用户体验。
优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。
Ajax 引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
Ajax 的最大特点:
可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。

AJAX应用和传统Web应用有什么不同
在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,
需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。
因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。
使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。
通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),
展示给用户的还是通一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应。

10. AngularJS

1、 数据绑定: AngularJS 是数据双向绑定。
2、 MVVM(Model-View-ViewModel)模式: Model 简单数据对象, View 视图(如 HTML,JSP 等),
    ViewModel 是用来提供数据和方法,和 View 进行交互。这种设计模式使得代码解耦合。
3、 依赖注入: AngularJS 支持注入方式把需要的对象,方法等注入到指定的对象中。
4、 指令: AngularJS 内部自带各种常用指令,同时也支持开发者自定义指令。
5、 HTML 模板和扩展 HTML: AngularJS 可以定义与 HTML 兼容的自定义模板。

11. xml

xml 是一种可扩展性标记语言,支持自定义标签(使用前必须预定义)使用 DTD 和 XML Schema 标准化 XML 结构

优点:用于配置文件,格式统一,符合标准;用于在互不兼容的系统间交互数据,共享数据方便;
缺点: xml 文件格式复杂,数据传输占流量,服务端和客户端解析 xml 文件占用大量资源且不易维护
Xml 常用解析器有 2 种,分别是: DOM 和 SAX;
主要区别在于它们解析 xml 文档的方式不同。使用 DOM 解析, xml 文档以 DOM
树形结构加载入内存,而 SAX 采用的是事件模型,
循环遍历  根据放在数组里 角标``` 集合也可以 

12. Jquery

jQuery是一个优秀的javascript的轻量级框架之一,兼容css3和各大浏览器,提供了dom、events、animate、ajax 等简易的操作。并且jquery的插件非常丰富,大多数功能都有相应的插件解决方案。jquery的宗旨是write less do more

jQuery最主要的作用是简化js的Dom树的操作


12.1 jquery引入

<script type="text/javascript" src="jquery-x.x.x.js> 

12.2 jQuery对象与js对象之间的转换

jQuery本质上虽然也是js,但如果使用jQuery的属性和方法那么必须保证对象是jQuery对象而不是js方式获得的DOM对象。使用js方式获取的对象是js的DOM对象,使用jQuery方式获取的对象是jQuery对象。两者的转换关系如下:

js的DOM对象转换成jQuery对象,语法:$(js对象)

jQuery对象转换成js对象,语法:jquery对象[索引] 或 jquery对象.get(索引)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF‐8">
<title>Insert title here</title>
<!‐‐ 引入jQuery ‐‐>
<script type="text/javascript" src="../js/jquery‐3.3.1.js"></script>
<!‐‐ 测试jQuery ‐‐>
<script type="text/javascript">
    $(function(){
        //通过js方式打印div内部的内容
        var divEle = document.getElementById("myDiv");//js的DOM对象
        alert(divEle.innerHTML);//js对象的innerHTML属性
        //通过jQuery方式打印div内部的内容
        var $divEle = $("#myDiv");//jQuery对象
        alert($divEle.html());//jQuery对象的html方法
        //使用js的DOM对象调用jQuery对象的方法
        alert(divEle.html());//错误写法,不能正常执行
        //使用jQuery对象调用js的DOM对象的属性
        alert($divEle.innerHTML);//错误写法,不能正常执行
        //js转换成jQuery对象后在调用jQuery对象的html方法
        alert($(divEle).html());//转换后正常执行
        //jQuery转换成js的DOM对象后在调用js的innerHTML属性
        alert($divEle[0].innerHTML);
});
</script>
</head>
<body>
    <div id="myDiv">通过不同方式获得文本内容</div>
</body>
</html>

12.3 选择器

12.3.1 基本选择器

选择器名称 语法 解释
标签选择器(元素选择器) $(“html标签名”) 获得所有匹配标签名称的于元素
id选择器 $(“#id的属性值”) 获得与指定id属性值匹配的元素
类选择器 $(“.class的属性值”) 获得与指定的class属性值匹配的元素

12.3.2 层级选择器

选择器名称 语法 解释
后代选择器 $(“A B “) 选择A元素内部的所有B元素
子选择器 $(“A > B”) 选择A元素内部的所有B子元素

12.3.3 属性选择器

选择器名称 语法 解释
属性选择器 $(“A[属性名]”) 包含指定属性的选择器
属性选择器 $(“A[属性名=值]”) 包含指定属性等于指定值的选择器
复合属性选择器 $(“A[属性名=值]… …”) 包含多个属性条件的选择器

12.3.4 基本过滤选择器

选择器名称 语法 解释
首元素选择器 :first 获得选择的元素中的第一个元素
尾元素选择器 :last 获得选择的元素中的最后一个元素
非元素选择器 :not(selecter) 不包括指定内容的元素
偶数选择器 :even 偶数,从 0 开始计数
奇数选择器 :odd 奇数,从 0 开始计数
等于索引选择器 :eq(index) 指定索引元素
大于索引选择器 :gt(index) 大于指定索引元素
小于索引选择器 :lt(index) 小于指定索引元素
标题选择器 :header 获得标题元素,固定写法

12.3.5 表单属性选择器

选择器名称 语法 解释
可用元素选择器 :enabled 获得可用元素
不可用元素选择器 :disabled 获得不可用元素
选中选择器 :checked 获得单选/复选框选中的元素
选中选择器 :selected 获得下拉框选中的元素

12.4 jQuery的DOM操作

12.4.1 jQuery对DOM树中的文本和值进行操作

API方法 解释
val([value]) 获得/设置元素value属性相应的值
text([value]) 获得/设置元素的文本内容
html([value]) 获得/设置元素的标签体内容

12.4.2 jQuery对DOM树中的属性进行操作

API方法 解释
attr(name[,value]) 获得/设置属性的值
prop(name[,value]) 获得/设置属性的值(checked,selected)

12.5 jQuery对class进行操作

API方法 解释
css(name[,value]) 获取/设置指定的CSS样式
addClass(value) addClass(类样式名) 给指定的对象添加新的类样式,指定类样式名字即可
removeClass(value) removeClass(类样式名) 删除指定的类样式
toggleClass(value) toggleClass(类样式名) 切换样式,如果没有类样式,则添加,如果有类样式,则删 除

12.6 jQuery创建插入对象

API方法 解释
$(“”) 创建A元素对象
append(element) 添加成最后一个子元素,两者之间是父子关系
prepend(element) 添加成第一个子元素,两者之间是父子关系
before(element) 添加到当前元素的前面,两者之间是兄弟关系
after(element) 添加到当前元素的后面,两者之间是兄弟关系

12.7 jQuery删除对象

API方法 解释
remove() 删除指定元素
empty() 清空指定元素的所有子元素

12.8 jQuery动画

12.8.1 显示效果

方法名称 解释
show([speed,[easing],[fn]]) 显示元素方法
hide([speed,[easing],[fn]]) 隐藏元素方法
toggle([speed],[easing],[fn]) 切换元素方法,显示的使之隐藏,隐藏的使之显示

12.8.2 滑动效果

方法名称 解释
slideDown([speed,[easing],[fn]]) 向下滑动方法
slideUp([speed,[easing],[fn]]) 向上滑动方法
slideToggle([speed],[easing],[fn]) 切换元素方法,显示的使之隐藏,隐藏的使之显示

12.8.3 淡入淡出效果

方法名称 解释
fadeIn([speed,[easing],[fn]]) 淡入显示方法
fadeOut([speed,[easing],[fn]]) 淡出隐藏方法
fadeToggle([speed],[easing],[fn]) 切换元素方法,显示的使之隐藏,隐藏的使之显示

12.9 jQuery的遍历

12.9.1 原始方法遍历

for(var i=0;i<元素数组.length;i++){
    元素数组[i];
}
<html>
    <head>
        <meta charset="UTF‐8">
        <title></title>
        <script src="jquery‐3.3.1.js" type="text/javascript" charset="utf‐8"></script>
        <script type="text/javascript">
            $(function(){
            var $lis = $("#city li");
            //1、原始循环方式
            for(var i=0;i<$lis.length;i++){
            alert($($lis[i]).html());
            }
        });
    </script>
    </head>
<body>
    <ul id="city">
    <li>北京</li>
    <li>上海</li>
    <li>天津</li>
    <li>重庆</li>
</ul>
</body>
</html>

12.9.2 jquery对象方法遍历

jquery对象.each(function(index,element){});
其中,
index:就是元素在集合中的索引
element:就是集合中的每一个元素对象
<html>
    <head>
    <meta charset="UTF‐8">
    <title></title>
    <script src="jquery‐3.3.1.js" type="text/javascript" charset="utf‐8"></script>
    <script type="text/javascript">
        $(function(){
        var $lis = $("#city li");
        $lis.each(function(index,element){
        alert(index+"‐‐"+$(element).html());
        });
    });
    </script>
</head>
<body>
    <ul id="city">
    <li>北京</li>
    <li>上海</li>
    <li>天津</li>
    <li>重庆</li>
    </ul>
</body>
</html>

12.9.3 jquery的全局方法遍历

$.each(jquery对象,function(index,element){});
其中,
index:就是元素在集合中的索引
element:就是集合中的每一个元素对象
<html>
    <head>
        <meta charset="UTF‐8">
        <title></title>
        <script src="jquery‐3.3.1.js" type="text/javascript" charset="utf‐8"></script>
        <script type="text/javascript">
            $(function(){
                var $lis = $("#city li");
                $.each($lis, function(index,element) {
                alert(index+"‐‐"+$(element).html());
                });
            });
</script>
</head>
<body>
    <ul id="city">
    <li>北京</li>
    <li>上海</li>
    <li>天津</li>
    <li>重庆</li>
</ul>
</body>
</html>

12.9.4 jQuery3.0新特性for of语句遍历

for(变量 of jquery对象){
    变量;
}
其中,
变量:定义变量依次接受jquery数组中的每一个元素
jquery对象:要被遍历的jquery对象
<script type="text/javascript">
    $(function(){
        var $lis = $("#city li");
        for(li of $lis){
            alert($(li).html());
        }
    });
</script>

12.10 jQuery的事件绑定与解绑

12.10.1 on绑定事件

jQuery元素对象.on(事件名称,function(){
//逻辑代码
})
其中:事件名称是jQuery的事件方法的方法名称,例如:click、mouseover、mouseout、focus、blur等
<script src="jquery‐3.3.1.js" type="text/javascript" charset="utf‐8"></script>
    <script type="text/javascript">
        $(function(){
            $("#btn").on("click",function(){
            alert("使用on绑定点击事件");
            })
        });
</script>
</head>
<body>
<input id="btn" type="button" value="使用on绑定点击事件">
</body>

12.10.2 off解绑事件

jQuery元素对象.off(事件名称);
其中:参数事件名称如果省略不写,可以解绑该jQuery对象上的所有事件
<script src="jquery‐3.3.1.js" type="text/javascript" charset="utf‐8"></script>
    <script type="text/javascript">
        $(function(){
            $("#btn‐on").on("click",function(){
                alert("使用on绑定点击事件");
            });
            $("#btn‐off").click(function(){
                $("#btn‐on").off("click");
            });
        });
</script>
</head>
<body>
    <input id="btn‐on" type="button" value="使用on绑定点击事件">
    <input id="btn‐off" type="button" value="使用off解绑点击事件">
</body>

12.10.3 事件切换普通写法

<script type="text/javascript">
    $(function(){
        $("#myDiv").mouseover(function(){
            $(this).css("background","green");
        });
        $("#myDiv").mouseout(function(){
            $(this).css("background","red");
        });
    });
</script>
</head>
<body>
<div id="myDiv" style="width:300px;height:300px;background:red">鼠标移入变成绿色,
    移出回复红色</div>
</body>
</html>

12.10.4 事件切换链式写法

<script type="text/javascript">
    $(function(){
        $("#myDiv").mouseover(function(){
            $(this).css("background","green");
        }).mouseout(function(){
            $(this).css("background","red");
        });
    });
</script>
</head>
<body>
<div id="myDiv" style="width:300px;height:300px;background:red">鼠标移入变成绿色,
移出回复红色</div>
</body>
</html>

12.10.5 事件切换切换函数写法

hover([over,]out)
其中,over代表鼠标移入事件触发的函数,out代表鼠标移出事件触发的函数
<script type="text/javascript">
    $(function(){
        $("#myDiv").hover(function(){
        $(this).css("background","green");
        },function(){
            $(this).css("background","red");
        });
    });
</script>
</head>
<body>
<div id="myDiv" style="width:300px;height:300px;background:red">鼠标移入变成绿色,
移出回复红色</div>
</body>
</html>

12.11 jQuery的插件

插件机制

jQuery插件的机制很简单,就是利用jQuery提供的jQuery.fn.extend()和jQuery.extend()方法,扩展jQuery的功能

语法 解释
jQuery.fn.extend(object) 对jQuery对象进行方法扩展
jQuery.extend(object) 对jQuery全局进行方法扩展

猜你喜欢

转载自blog.csdn.net/weixin_42857002/article/details/82468863