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的子类,将输出的 ...
随机推荐
- python标准库之glob介绍
python标准库之glob介绍 glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob ...
- Android--打开指定程序(微博/微信/QQ等)
Intent intent = new Intent(); ComponentName cmp = new ComponentName("com.sina.weibo"," ...
- Java字节流文件复制
1.字节流 在 Java 中,文件的复制使用字节输入流和字节输出流实现,java.io 包有 InputStream 和 OutputStream 这两个顶层抽象类规范了读写文件所需的核心 API. ...
- spring的事务传播行为与隔离级别
具体请参考blog:https://bbs.csdn.net/topics/391875990 要明白2个概念: 1.“spring的事务传播属性” 2.“spring的事务隔离级别” 例如正常的sp ...
- SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?
刚刚过去的在巴塞罗那举行的2019 SAP TechEd,SAP照例向全球广大的SAP生态圈从业者们传达了一些重要的信息,其中一条为:Building Extensions for the Intel ...
- JSP中Get提交方式的中文乱码解决
最近对JSP&Servlert的原理很感兴趣,所以今天花时间看了一下:无奈在一个编码问题上困扰很久 这是我的解决思路: (1)检查网页(html/jsp)页面的编码: (2)检查服务器端的处理 ...
- WPF登录功能,对于密码框的操作,其实WPF有个PasswordBox专门的密码框控件,完全可以选择自己要显示的密码符号。
在链接数据库后,点击登录时需要判断用户名和密码框是否为空,而PasswordBox不像textbox那样判断 textbox判断文本框为空 if (this.UserName.Text.Trim()= ...
- Centos7启动流程及systemd中Nginx启动配置
Centos7启动流程: 1.post(Power-On-Self-Test) 加电自检 主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主 ...
- openwrt配置strongswan对接hillstone ipsec的笔记
一.主要参考资料: https://openwrt.org/docs/guide-user/services/vpn/ipsec/strongswan/roadwarrior https://open ...
- 分布式结构化存储系统-Kudu简介
分布式结构化存储系统-Kudu简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Hadoop生态系统发展到现在,存储层主要由HDFS和HBase两个系统把持着,一直没有太大突破. ...