一、Filter
1.1 过滤器
过滤器:JavaEE的一种技术,主要是实现对请求和响应的过滤处理,处理的结果要么放行,要么拦截返回结果
运行在Tomcat上
1.2 为什么使用过滤器
在日常开发中,我们经常需要对请求进行过滤,比如校验时候包含某个参数,实现登陆校验、参数的校验、统一结果等等的操作
1.项目中可以有多个过滤器
2.需要注册(1.基于注解 @WebFilter 2.基于xml
3.实现Filter接口,重写doFilter方法
1.3 Filter的使用
实现步骤:
1.创建类
2.实现接口Filter
3.重写方法
重点:doFilter
默认是拦截
4.注册过滤器
完整代码:
@WebFilter("/*") //注册 生效
public class HelloFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.err.println("初始化……");
}
//核心方法-实现过滤的方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
System.err.println("前:过滤……"+request.getRequestURI());
System.err.println("传递的参数:"+request.getParameter("name"));
//放行
filterChain.doFilter(servletRequest,servletResponse);
System.err.println("后:过滤");
}
//销毁
@Override
public void destroy() {
System.err.println("销毁……");
}
}
过滤器的两种注册方式:
1.注解
@WebFilter(“/过滤的路径”) 一般都是/*
2.xml
在web.xml文件中
<filter>
<filter-name>Hello</filter-name>
<filter-class>com.qfedu.web.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Hello</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.4 基于Filter实现参数校验
需求:对应当前传递的参数进行非空校验,通过就放行,不通过就拦截请求,并返回结果
参考代码:
@WebFilter("/*")
public class ParamFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//获取请求的参数
HttpServletRequest request= (HttpServletRequest) servletRequest;
Map<String, String[]> map= request.getParameterMap();
boolean r=true;
//遍历所有的参数
lb:for(String k:map.keySet()){
//遍历参数的所有的值
for(String v:map.get(k)){
if(v==null || v.length()==0){
r=false;
break lb;
}
}
}
if(r){
//放行
filterChain.doFilter(servletRequest, servletResponse);
}else{
//拦截
//返回验证信息
HttpServletResponse response=(HttpServletResponse)servletResponse;
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("亲,传递的参数值非法!");
}
}
}
思考题:如何实现登陆的范围过滤校验?
有些接口需要登陆才可以访问,如果不登陆,就必须跳转到登陆页面
二分查找算法:
折半查找:数组先排序,每次取中间值进行比较,如果要查找的内容大于中间值,应该右边再次进行折半查找,依次类推。如果小于应该在左边进行折半查询
/**
*
*二分查找算法
* @param arr 数组升序排列*/
public static int check(int[] arr,int num){
int index=-1,start=0,end=arr.length;
while (start<end){
//每次去中间值
int mid=(end+start)/2;
if(num>arr[mid]){
//右边
start=mid+1;
}else if(num<arr[mid]){
//左边
end=mid-1;
}else if (num==arr[mid]){
index=mid;
break;
}
}
return index;
}
二、Listener
2.1 监听器
监听器:JavaEE给出一种用来监听ServletContext、HttpSession、HttpServletRequest的变化的一种技术
监听器分为三类:
1.监听ServletContext(application)
1.初始化和销毁:ServletContextListener
2.域中的数据变化:ServletContextAttributeListener
2.监听HttpSession(session)
1.初始化和销毁 HttpSessionListener
2.域中的数据变化
3.钝化和活化
3.监听HttpServletRequest(request)
1.初始化和销毁
2.域中的数据变化
2.2 为什么使用监听器
开发中,需要知道某些内容(ServletContext、HttpSession、HttpServletRequest)的变化,就需要使用监听器获取变化
比如Spring框架的底层就是一个全局监听器(ServletContext初始化和销毁)
2.3 监听器的使用
使用步骤:
1.创建类
2.实现接口ServletContextListener
监听ServletContext的初始化和销毁
3.重写初始化和销毁的方法
4.注册
示例代码:
@WebListener
public class MyServletContext implements ServletContextListener,ServletContextAttributeListener {
// 初始化
@Override
public void contextInitialized(ServletContextEvent sce) {
System.err.println("系统启动运行中……");
}
// 销毁
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.err.println("系统已停止……");
}
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
//往ServletContext中添加了内容
System.err.println("添加了内容:"+scae.getName()+"---->"+scae.getValue());
}
}
Listener的注册有2种:
1.注解
@WebListener
2.xml
2.4 基于监听器实现在线用户
一个HttpSession的创建就是一个用户,如果HttpSession销毁了用户就退出了
我们使用HashSet存储在线用户的HttpSession的id(唯一)
实现步骤:
1.监听ServletContext 完成在线用户容器的初始化
核心代码:
@WebListener
public class ApplicationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//完成初始化
sce.getServletContext().setAttribute("users",new HashSet<>());
}
}
2.监听HttpSession的创建和销毁
核心代码:
@WebListener
public class HttpSessionCreateListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
//新建会话 添加
//获取当前的在线用户的id
HashSet<String> set= (HashSet<String>) se.getSession().getServletContext().getAttribute("users");
//将当前的用户添加
set.add(se.getSession().getId());
//重新赋值
se.getSession().getServletContext().setAttribute("users",set);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//销毁会话 移除
HashSet<String> set= (HashSet<String>) se.getSession().getServletContext().getAttribute("users");
//将当前的用户添加
set.remove(se.getSession().getId());
System.err.println("退出:"+se.getSession().getId());
//重新赋值
se.getSession().getServletContext().setAttribute("users",set);
}
}
思考题:Listener和Filter和Servlet 区别?启动的顺序?
三、jQuery
3.1 jQuery是什么
jQuery 是一个 JavaScript 库。
jQuery 极大地简化了 JavaScript 编程。
jQuery:就是对Js进行的封装,目的是为了简化js的操作
回顾:
js:Java Script:浏览器脚本交互语言
1.基本语法
1.数据类型
原始类型:基本类型 数字、浮点数、布尔
引用类型:数组、对象、Number、Date
2.运算符
算术、逻辑、赋值、比较
3.分支
if
4.循环
for
2.函数
实现特定功能的代码块
语法格式:
function 函数名(参数名,……){
实现特定功能的代码
return 返回值;
}
3.Dom操作
基于js操作html的标签
document.getElementById(“”)
实现对标签的css样式改变、事件、内容等操作
4.Bom操作
基于js实现浏览器默认提供的各种对象的操作
window 、location、cookie 、setInterval
https://www.runoob.com/js/js-tutorial.html
3.2 jQuery的特点
可以更方便的操作dom对象信息,扩展性,兼容性
封装了很多原始的操作,让我们操作html标签变得越来越简单
3.3 jQuery使用
实现步骤:
1.html页面中引入js库
2.操作html标签
语法格式:
$(“选择器”).行为(函数|其他)
选择器:
1.id选择器 #
2.class选择器 .
3.标签选择器
行为:
1.标签的事件
事件的值是个函数
2.标签的样式
css
获取CSS 属性的值:$(“选择器”).css(“样式名称”)
设置CSS属性的值:$(“选择器”).css(“样式名称”,”值”)
3.操作标签的内容
获取或设置(传递要设置的内容)内容:
text()——innerText 获取标签的内容,过滤html元素
html()——innerHtml 获取标签的内容,包含html元素
val()———form表单的标签的value属性
append()——追加内容
3.4 jQuery核心
掌握行为的三种类型:1.事件 2.样式 3.内容
思考题:完成一个全选/全不选的案例
<!-- 全选、全不选 -->
<div>
<h1>你喜欢的明星:</h1>
<div><input type="checkbox" id="ckall">全选\全不选</div>
<div>
<input type="checkbox" class="ckchild" name="likes" />肖战
<input type="checkbox" class="ckchild" name="likes" />易烊千玺
<input type="checkbox" class="ckchild" name="likes" />嘎子
<input type="checkbox" class="ckchild" name="likes" />潘叔
<input type="checkbox" class="ckchild" name="likes" />赵丽颖
<input type="checkbox" class="ckchild" name="likes" />栋哥
</div>
</div>
//全选、全不选
$("#ckall").click(function(){
//验证当前的复选框的状态
console.log(this.checked);
//为子选项设置相同的结果
//prop 遍历元素
$(".ckchild").prop("checked",this.checked);
})
//监听 子选项
$(".ckchild").click(function(){
if(this.checked){
var cks=$(".ckchild");
for(i in cks){
if(i<=cks.length-1){
if(!cks[i].checked){
return;
}
}
}
//选中 都选中 需要将全选按钮 变得选中 判断所有复选框的状态
$("#ckall")[0].checked=true;
}else{
//未选中
if($("#ckall")[0].checked){
$("#ckall")[0].checked=false;
}
}
})
四、Ajax
4.1Ajax是什么
AJAX(Asynchronous JavaScript and XML))是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新。
就是网页中请求后端接口的一种技术,可以请求的时候传递数据,并获取服务器接口的返回数据
4.2 Ajax的作用
实现网页中局部加载数据,可以请求后端接口地址
接口:返回值
4.3 Ajax的使用
基于jQuery实现Ajax的使用
1.后端接口
https://v1.jinrishici.com/all.json
2.前端代码
结合接口的请求方式进行代码的编写
<div>
<h1><button id="btn1">每日诗词</button></h1>
</div>
<div>
<h2 id="dvtitle"></h2>
</div>
<script>
$("#btn1").click(function(){
/**
* 发起get请求,参数说明:1.请求的路径 2.回调函数 接收接口的返回值*/
$.get("https://v1.jinrishici.com/all.json",function(res){
console.log(res);
$("#dvtitle").html(res.content);
})
});
</script>
4.4 jQuery中的Ajax的封装
1.get请求
$.get(接口地址,回调函数(变量名){
})
2.post请求
$.post(接口地址,键值对对象,回调函数(变量名){
})
3.ajax请求
$.ajax({
url:”接口地址”,
data:”请求的参数”,
method:请求方式,
success:function(变量名){
}
})
名称 | 值/描述 |
---|---|
async | 布尔值,表示请求是否异步处理。默认是 true。 |
beforeSend(xhr) | 发送请求前运行的函数。 |
cache | 布尔值,表示浏览器是否缓存被请求页面。默认是 true。 |
complete(xhr,status) | 请求完成时运行的函数(在请求成功或失败之后均调用,即在 success 和 error 函数之后)。 |
| | contentType | 发送数据到服务器时所使用的内容类型。默认是:”application/x-www-form-urlencoded”。 | | context | 为所有 AJAX 相关的回调函数规定 “this” 值。 | | data | 规定要发送到服务器的数据。 | | dataFilter(data,type) | 用于处理 XMLHttpRequest 原始响应数据的函数。 | | dataType | 预期的服务器响应的数据类型。 | | error(xhr,status,error) | 如果请求失败要运行的函数。 | | global | 布尔值,规定是否为请求触发全局 AJAX 事件处理程序。默认是 true。
| | ifModified | 布尔值,规定是否仅在最后一次请求以来响应发生改变时才请求成功。默认是 false。 | | jsonp | 在一个 jsonp 中重写回调函数的字符串。 | | jsonpCallback | 在一个 jsonp 中规定回调函数的名称。 | | password | 规定在 HTTP 访问认证请求中使用的密码。 | | processData | 布尔值,规定通过请求发送的数据是否转换为查询字符串。默认是 true。 | | scriptCharset | 规定请求的字符集。 | | success(result,status,xhr) | 当请求成功时运行的函数。 | | timeout | 设置本地的请求超时时间(以毫秒计)。 | | traditional | 布尔值,规定是否使用参数序列化的传统样式。 | | type | 规定请求的类型(GET 或 POST)。 | | url | 规定发送请求的 URL。默认是当前页面。
| | username | 规定在 HTTP 访问认证请求中使用的用户名。 | | xhr | 用于创建 XMLHttpRequest 对象的函数。 |
五、Json
5.1 什么是json
JSON:是一种特殊的字符串,符合一定的语法格式
JSON中的语法:
{}:对象
[]:数组,元素
“”属性名称或者字符串类型的值
: 连接属性和值的符号
, 连接多个属性或者多个元素
eg:
[“id”:1,”name”:”abc”] 错误的
[{“id”:1,”name”:”abc”}] 对的
{1,2,3} 错误的
[1,2,3] 对的
{“id”:1} 对的
5.2 json的生成
阿里巴巴-Fastjson
JSON.toJSONString(对象|集合)
示例代码:
public static void main(String[] args) {
//准备
Student st=new Student(1,"魏总","男");
//生成 对象变为字符串
String json= JSON.toJSONString(st);
System.err.println(json);
//演示生成json数组
List<Student> list=new ArrayList<>();
for(int i=1;i<10;i++){
list.add(new Student(i,"小魏-"+i,"男"));
}
System.err.println(JSON.toJSONString(list));
}
5.3 json的解析
解析json对象的
JSON.parseObject(要解析的json字符串,对应的Class);
解析json数组的
JSON.parseArray(要解析的json字符串,对应的Class);
示例代码:
public static void main(String[] args) {
String json1="{\"id\":1,\"name\":\"魏总\",\"sex\":\"男\"}";
String json2="[{\"id\":1,\"name\":\"小魏-1\",\"sex\":\"男\"},{\"id\":2,\"name\":\"小魏-2\",\"sex\":\"男\"},{\"id\":3,\"name\":\"小魏-3\",\"sex\":\"男\"},{\"id\":4,\"name\":\"小魏-4\",\"sex\":\"男\"},{\"id\":5,\"name\":\"小魏-5\",\"sex\":\"男\"},{\"id\":6,\"name\":\"小魏-6\",\"sex\":\"男\"},{\"id\":7,\"name\":\"小魏-7\",\"sex\":\"男\"},{\"id\":8,\"name\":\"小魏-8\",\"sex\":\"男\"},{\"id\":9,\"name\":\"小魏-9\",\"sex\":\"男\"}]";
//解析json字符串 把字符串转变为对象
Student student=JSON.parseObject(json1,Student.class);
System.err.println(student.getName());
//解析数组
System.err.println(JSON.parseArray(json2,Student.class).size());
}
MIME类型:标记资源的类型
组成格式:大类型/小类型
text/html