javaweb学习笔记(三)
一、javaweb高级(Filter和Listener)的简单介绍
1、过滤器Filter (https://www.cnblogs.com/vanl/p/5742501.html)
①定义
Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletResponse)进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
②Filter的几个用处
在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
③Filter的实际项目用途
可以实现编码统一,防止乱码
2、监听器Listener(https://blog.csdn.net/qq_40435621/article/details/87273667)
①定义
监听器 。用于监听某一个事件的发生。
②监听器的内部机制
  其实就是接口回调.
  接口的回调是这么回事呢?
  和一般的监听器一样,应为监听器的设计人员不知到软件编写者会给监听后出发怎样的功能,所以设计者会给编写者一个接口,由编写者自己实现接口。而这种写法一般使用匿名类的写法。
二、Ajax异步请求
1.定义
  Ajax:(Asynchronous JavaScript And XML)指异步 JavaScript 及 XML
  不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术,是基于JavaScript、XML、HTML、CSS新用法。
  Ajax:只刷新局部页面的技术
  JavaScript:更新局部的网页
  XML:一般用于请求数据和响应数据的封装
  XMLHttpRequest对象:发送请求到服务器并获得返回结果
  CSS:美化页面样式
  异步:发送请求后不等返回结果,由回调函数处理结果
2.配置
需要导入Jquery https://jquery.com/download/
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
3.常用的三种使用方法(ajax、get、post)
①ajax请求
$.ajax({
                url: "<%=application.getContextPath()%>/login.do",
                data: {account: $("input[name=account]").val(), pwd: $("input[name=pwd]").val()},
                type: "POST",
                success: function (result) {
                    console.log(result)
                    $("#result").html(result.msg)
                },
                beforeSend: function () {
                    console.log("请求发送之前")
                },
                error: function () {
                    console.log("失败时调用")
                }
            });
②get请求(常用)
$.get("user/findOne", {}, function (data) {
            var msg = "欢迎回来," + data.name;
            $("#span_username").html(msg);
        });
//get里面第一个参数是请求地址,第二个是传递参数,第三个是返回的数据的参数名(一般为json数据)
③post请求(常用)
$.post("route/isFavorite",{rid:rid}, function (flag) {
            if(flag) {
                //用户已经收藏过
                //<a  class="btn already" disabled="disabled">
                //设置收藏按钮的样式
                $("#favorite").addClass("already");
                $("#favorite").attr("disabled", "disabled");
                //删除按钮的点击事件
                $("#favorite").removeAttr("onclick");
            } else {
                //用户没有收藏
            }
        });
//post与get请求格式是一样的 里面第一个参数是请求地址,第二个是传递参数,第三个是返回的数据的参数名(一般为json数据)
*Jquery中的入口函数(即 在页面加载时触发的函数 更多请看→https://blog.csdn.net/weixin_43592512/article/details/90034509)
$(function(){
    window.alert("jQuery的入口函数3");
})
//栗子↓
$(function () {
    //1.发送请求,判断用户是否收藏过该线路
    var rid = getParameter("rid");
    $.get("route/isFavorite",{rid:rid}, function (flag) {
        if(flag) {
            //用户已经收藏过
            //<a  class="btn already" disabled="disabled">
            //设置收藏按钮的样式
            $("#favorite").addClass("already");
            $("#favorite").attr("disabled", "disabled");
            //删除按钮的点击事件
            $("#favorite").removeAttr("onclick");
        } else {
            //用户没有收藏
        }
    });
});
在servlet中的返回样式
/**
* 直接将传入的对象序列化为json,并且写回客户端
* @param obj
*/
public void writeValue(Object obj,HttpServletResponse response) throws IOException {
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),obj);
}
三、Redis 缓存数据库
1.定义
  Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
                1) 字符串类型 string
                2) 哈希类型 hash
                3) 列表类型 list
                4) 集合类型 set
                5) 有序集合类型 sortedset
              redis的应用场景
                •    缓存(数据查询、短连接、新闻内容、商品内容等等)
                •    聊天室的在线好友列表
                •    任务队列。(秒杀、抢购、12306等等)
                •    应用排行榜
                •    网站访问统计
                •    数据过期处理(可以精确到毫秒
                •    分布式集群架构中的session分离
2.常用命令
命令操作
        1. redis的数据结构:
            * redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
                * value的数据结构:
                    1) 字符串类型 string
                    2) 哈希类型 hash : map格式  
                    3) 列表类型 list : linkedlist格式。支持重复元素
                    4) 集合类型 set  : 不允许重复元素
                    5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
        
        2. 字符串类型 string
            1. 存储: set key value
                127.0.0.1:6379> set username zhangsan
                OK
            2. 获取: get key
                127.0.0.1:6379> get username
                "zhangsan"
            3. 删除: del key
                127.0.0.1:6379> del age
                (integer) 1
        3. 哈希类型 hash
            1. 存储: hset key field value
                127.0.0.1:6379> hset myhash username lisi
                (integer) 1
                127.0.0.1:6379> hset myhash password 123
                (integer) 1
            2. 获取: 
                * hget key field: 获取指定的field对应的值
                    127.0.0.1:6379> hget myhash username
                    "lisi"
                * hgetall key:获取所有的field和value
                    127.0.0.1:6379> hgetall myhash
                    1) "username"
                    2) "lisi"
                    3) "password"
                    4) "123"
                    
            3. 删除: hdel key field
                127.0.0.1:6379> hdel myhash username
                (integer) 1
        
        4. 列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
            1. 添加:
                1. lpush key value: 将元素加入列表左表
                    
                2. rpush key value:将元素加入列表右边
                    
                    127.0.0.1:6379> lpush myList a
                    (integer) 1
                    127.0.0.1:6379> lpush myList b
                    (integer) 2
                    127.0.0.1:6379> rpush myList c
                    (integer) 3
            2. 获取:
                * lrange key start end :范围获取
                    127.0.0.1:6379> lrange myList 0 -1
                    1) "b"
                    2) "a"
                    3) "c"
            3. 删除:
                * lpop key: 删除列表最左边的元素,并将元素返回
                * rpop key: 删除列表最右边的元素,并将元素返回
5. 集合类型 set : 不允许重复元素
            1. 存储:sadd key value
                127.0.0.1:6379> sadd myset a
                (integer) 1
                127.0.0.1:6379> sadd myset a
                (integer) 0
            2. 获取:smembers key:获取set集合中所有元素
                127.0.0.1:6379> smembers myset
                1) "a"
            3. 删除:srem key value:删除set集合中的某个元素    
                127.0.0.1:6379> srem myset a
                (integer) 1
        6. 有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
1. 存储:zadd key score value
                127.0.0.1:6379> zadd mysort 60 zhangsan
                (integer) 1
                127.0.0.1:6379> zadd mysort 50 lisi
                (integer) 1
                127.0.0.1:6379> zadd mysort 80 wangwu
                (integer) 1
            2. 获取:zrange key start end [withscores]
                127.0.0.1:6379> zrange mysort 0 -1
                1) "lisi"
                2) "zhangsan"
                3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
                1) "zhangsan"
                2) "60"
                3) "wangwu"
                4) "80"
                5) "lisi"
                6) "500"
            3. 删除:zrem key value
                127.0.0.1:6379> zrem mysort lisi
                (integer) 1
7. 通用命令
            1. keys * : 查询所有的键
            2. type key : 获取键对应的value的类型
            3. del key:删除指定的key value
3、Java客户端 Jedis(一款java操作redis数据库的工具)
①使用
//1. 获取连接
Jedis jedis = new Jedis("localhost",6379);
//2. 操作
jedis.set("username","zhangsan");
//3. 关闭连接
jedis.close();
②Jedis操作各种redis中的数据结构
    1) 字符串类型 string
                set
                get
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
//存储
jedis.set("username","zhangsan");
//获取
String username = jedis.get("username");
System.out.println(username); //可以使用setex()方法存储可以指定过期时间的 key value
jedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对 //3. 关闭连接
jedis.close();
2) 哈希类型 hash : map格式  
                hset
                hget
                hgetAll
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// 存储hash
jedis.hset("user","name","lisi");
jedis.hset("user","age","23");
jedis.hset("user","gender","female"); // 获取hash
String name = jedis.hget("user", "name");
System.out.println(name); // 获取hash的所有map中的数据
Map<String, String> user = jedis.hgetAll("user"); // keyset
Set<String> keySet = user.keySet();
for (String key : keySet) {
//获取value
String value = user.get(key);
System.out.println(key + ":" + value);
} //3. 关闭连接
jedis.close();
3) 列表类型 list : linkedlist格式。支持重复元素
                lpush / rpush
                lpop / rpop
                lrange start end : 范围获取
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// list 存储
jedis.lpush("mylist","a","b","c");//从左边存
jedis.rpush("mylist","a","b","c");//从右边存 // list 范围获取
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist); // list 弹出
String element1 = jedis.lpop("mylist");//c
System.out.println(element1); String element2 = jedis.rpop("mylist");//c
System.out.println(element2); // list 范围获取
List<String> mylist2 = jedis.lrange("mylist", 0, -1);
System.out.println(mylist2); //3. 关闭连接
jedis.close();
4) 集合类型 set  : 不允许重复元素
                sadd
                smembers:获取所有元素
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作 // set 存储
jedis.sadd("myset","java","php","c++"); // set 获取
Set<String> myset = jedis.smembers("myset");
System.out.println(myset); //3. 关闭连接
jedis.close();
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
                zadd
                zrange
//1. 获取连接
Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口
//2. 操作
// sortedset 存储
jedis.zadd("mysortedset",3,"亚瑟");
jedis.zadd("mysortedset",30,"后裔");
jedis.zadd("mysortedset",55,"孙悟空"); // sortedset 获取
Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1); System.out.println(mysortedset); //3. 关闭连接
jedis.close();
4、配置文件(jedis.properties)和工具类(JedisUtils.java)
jedis.properties
host=127.0.0.1
port=6379
maxTotal=50
maxIdle=10
JedisUtils.java
package cn.gcl.travel.util; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; /**
* Jedis工具类
*/
public final class JedisUtil {
private static JedisPool jedisPool; static {
//读取配置文件
InputStream is = JedisPool.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建Properties对象
Properties pro = new Properties();
//关联文件
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//获取数据,设置到JedisPoolConfig中
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle"))); //初始化JedisPool
jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port"))); } /**
* 获取连接方法
*/
public static Jedis getJedis() {
return jedisPool.getResource();
} /**
* 关闭Jedis
*/
public static void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
5.获取连接
Jedis jedis = JedisUtil.getJedis();
6.需要在之前导入Jedis坐标
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
四、常用maven坐标
<!-- junit单元测试,在test文件下可以进行测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency> <!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency> <!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>compile</scope>
</dependency> <!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency> <!--jdbcTemplate-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
<scope>compile</scope>
</dependency> <!--beanUtils-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
<scope>compile</scope>
</dependency> <!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.3</version>
</dependency> <!--javaMail-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.3</version>
</dependency> <!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<!-- jstl -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>

已上就是我对所学的javaweb基本总结♪(´▽`)~
javaweb学习笔记(三)的更多相关文章
- JavaWeb学习笔记三 Servlet
		Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API,动态的向客户 ... 
- JavaWeb学习笔记总结 目录篇
		JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ... 
- javaweb学习笔记整理补课
		javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ... 
- Oracle学习笔记三 SQL命令
		SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL) 
- JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB
		JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命 ... 
- [Firefly引擎][学习笔记三][已完结]所需模块封装
		原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ... 
- JSP学习笔记(三):简单的Tomcat Web服务器
		注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ... 
- java之jvm学习笔记三(Class文件检验器)
		java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ... 
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
		原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ... 
- Java IO学习笔记三
		Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ... 
随机推荐
- 屏蔽组合键[CTRL+N]
			https://www.cnblogs.com/gaodu2003/archive/2011/05/05/2037229.html …… const _KeyPressMask=$80000000; ... 
- Django中的admin
			1.基本知识 在用Django框架写了一个网站之后,我们添加数据大概有两种方式: 1.在连接的数据库中添加数据 2.登录admin,进入后台添加数据 创建一个Django项目后,我们在url.py中会 ... 
- 精确选择识别png图片有像素的区域(使用方法)
			/** * * *---------------------------------------* * | ***精确选择识别png图片有像素的区域*** | * *----------------- ... 
- [高清·非影印] Python机器学习经典实例(电子书+源码)
			------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ... 
- tomcat线程池调优
			之前项目一直在tomcat下开发,后来在上线之前,需要进行性能安全测试,可是测试的同事反应,登陆口线程并发一多的时候,系统立马就没法登陆了. 中间件是tomcat6. tomcat的日志总是简洁的很 ... 
- CCF 2016-04-2 俄罗斯方块
			CCF 2016-04-2 俄罗斯方块 题目 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者 ... 
- .NET母版实例2(UI页面)
			8.<div id="navlist"> <asp:SiteMapDataSource ID="SiteMapDataSource1" ... 
- .net core 定时程序
			using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft. ... 
- C# vb .net实现移除透明度效果
			在.net中,如何简单快捷地实现Photoshop滤镜组中的移除透明度效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 ... 
- Linux 下 maven 的下载、上传与安装
			要运行maven,必须要有 JDK ,maven 是由 Java 语言编写的 一.JDK 的安装 ORACLE 官网下载JDK jdk-8u231-linux-x64.tar.gz 上传 JDK 至 ... 
