一、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.注册过滤器

完整代码:

  1. @WebFilter("/*") //注册 生效
  2. public class HelloFilter implements Filter {
  3. //初始化
  4. @Override
  5. public void init(FilterConfig filterConfig) throws ServletException {
  6. System.err.println("初始化……");
  7. }
  8. //核心方法-实现过滤的方法
  9. @Override
  10. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  11. HttpServletRequest request= (HttpServletRequest) servletRequest;
  12. System.err.println("前:过滤……"+request.getRequestURI());
  13. System.err.println("传递的参数:"+request.getParameter("name"));
  14. //放行
  15. filterChain.doFilter(servletRequest,servletResponse);
  16. System.err.println("后:过滤");
  17. }
  18. //销毁
  19. @Override
  20. public void destroy() {
  21. System.err.println("销毁……");
  22. }
  23. }

过滤器的两种注册方式:

1.注解

@WebFilter(“/过滤的路径”) 一般都是/*

2.xml

在web.xml文件中

  1. <filter>
  2. <filter-name>Hello</filter-name>
  3. <filter-class>com.qfedu.web.filter.HelloFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>Hello</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

1.4 基于Filter实现参数校验

需求:对应当前传递的参数进行非空校验,通过就放行,不通过就拦截请求,并返回结果

参考代码:

  1. @WebFilter("/*")
  2. public class ParamFilter implements Filter {
  3. @Override
  4. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  5. //获取请求的参数
  6. HttpServletRequest request= (HttpServletRequest) servletRequest;
  7. Map<String, String[]> map= request.getParameterMap();
  8. boolean r=true;
  9. //遍历所有的参数
  10. lb:for(String k:map.keySet()){
  11. //遍历参数的所有的值
  12. for(String v:map.get(k)){
  13. if(v==null || v.length()==0){
  14. r=false;
  15. break lb;
  16. }
  17. }
  18. }
  19. if(r){
  20. //放行
  21. filterChain.doFilter(servletRequest, servletResponse);
  22. }else{
  23. //拦截
  24. //返回验证信息
  25. HttpServletResponse response=(HttpServletResponse)servletResponse;
  26. response.setContentType("text/html;charset=UTF-8");
  27. response.getWriter().print("亲,传递的参数值非法!");
  28. }
  29. }
  30. }

思考题:如何实现登陆的范围过滤校验?

有些接口需要登陆才可以访问,如果不登陆,就必须跳转到登陆页面

二分查找算法:

折半查找:数组先排序,每次取中间值进行比较,如果要查找的内容大于中间值,应该右边再次进行折半查找,依次类推。如果小于应该在左边进行折半查询

  1. /**
  2. *
  3. *二分查找算法
  4. * @param arr 数组升序排列*/
  5. public static int check(int[] arr,int num){
  6. int index=-1,start=0,end=arr.length;
  7. while (start<end){
  8. //每次去中间值
  9. int mid=(end+start)/2;
  10. if(num>arr[mid]){
  11. //右边
  12. start=mid+1;
  13. }else if(num<arr[mid]){
  14. //左边
  15. end=mid-1;
  16. }else if (num==arr[mid]){
  17. index=mid;
  18. break;
  19. }
  20. }
  21. return index;
  22. }

二、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.注册

示例代码:

  1. @WebListener
  2. public class MyServletContext implements ServletContextListener,ServletContextAttributeListener {
  3. // 初始化
  4. @Override
  5. public void contextInitialized(ServletContextEvent sce) {
  6. System.err.println("系统启动运行中……");
  7. }
  8. // 销毁
  9. @Override
  10. public void contextDestroyed(ServletContextEvent sce) {
  11. System.err.println("系统已停止……");
  12. }
  13. @Override
  14. public void attributeAdded(ServletContextAttributeEvent scae) {
  15. //往ServletContext中添加了内容
  16. System.err.println("添加了内容:"+scae.getName()+"---->"+scae.getValue());
  17. }
  18. }

Listener的注册有2种:

1.注解

@WebListener

2.xml


com.qfedu.web.listener.MyServletContext

2.4 基于监听器实现在线用户

一个HttpSession的创建就是一个用户,如果HttpSession销毁了用户就退出了

我们使用HashSet存储在线用户的HttpSession的id(唯一)

实现步骤:

1.监听ServletContext 完成在线用户容器的初始化

核心代码:

  1. @WebListener
  2. public class ApplicationListener implements ServletContextListener {
  3. @Override
  4. public void contextInitialized(ServletContextEvent sce) {
  5. //完成初始化
  6. sce.getServletContext().setAttribute("users",new HashSet<>());
  7. }
  8. }

2.监听HttpSession的创建和销毁

核心代码:

  1. @WebListener
  2. public class HttpSessionCreateListener implements HttpSessionListener {
  3. @Override
  4. public void sessionCreated(HttpSessionEvent se) {
  5. //新建会话 添加
  6. //获取当前的在线用户的id
  7. HashSet<String> set= (HashSet<String>) se.getSession().getServletContext().getAttribute("users");
  8. //将当前的用户添加
  9. set.add(se.getSession().getId());
  10. //重新赋值
  11. se.getSession().getServletContext().setAttribute("users",set);
  12. }
  13. @Override
  14. public void sessionDestroyed(HttpSessionEvent se) {
  15. //销毁会话 移除
  16. HashSet<String> set= (HashSet<String>) se.getSession().getServletContext().getAttribute("users");
  17. //将当前的用户添加
  18. set.remove(se.getSession().getId());
  19. System.err.println("退出:"+se.getSession().getId());
  20. //重新赋值
  21. se.getSession().getServletContext().setAttribute("users",set);
  22. }
  23. }

思考题: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.标签的事件
JavaWeb技术 - 图1

事件的值是个函数

2.标签的样式

css
获取CSS 属性的值:$(“选择器”).css(“样式名称”)

设置CSS属性的值:$(“选择器”).css(“样式名称”,”值”)

3.操作标签的内容

获取或设置(传递要设置的内容)内容:

text()——innerText 获取标签的内容,过滤html元素

html()——innerHtml 获取标签的内容,包含html元素

val()———form表单的标签的value属性

append()——追加内容

3.4 jQuery核心


掌握行为的三种类型:1.事件 2.样式 3.内容

思考题:完成一个全选/全不选的案例

  1. <!-- 全选、全不选 -->
  2. <div>
  3. <h1>你喜欢的明星:</h1>
  4. <div><input type="checkbox" id="ckall">全选\全不选</div>
  5. <div>
  6. <input type="checkbox" class="ckchild" name="likes" />肖战
  7. <input type="checkbox" class="ckchild" name="likes" />易烊千玺
  8. <input type="checkbox" class="ckchild" name="likes" />嘎子
  9. <input type="checkbox" class="ckchild" name="likes" />潘叔
  10. <input type="checkbox" class="ckchild" name="likes" />赵丽颖
  11. <input type="checkbox" class="ckchild" name="likes" />栋哥
  12. </div>
  13. </div>
  1. //全选、全不选
  2. $("#ckall").click(function(){
  3. //验证当前的复选框的状态
  4. console.log(this.checked);
  5. //为子选项设置相同的结果
  6. //prop 遍历元素
  7. $(".ckchild").prop("checked",this.checked);
  8. })
  9. //监听 子选项
  10. $(".ckchild").click(function(){
  11. if(this.checked){
  12. var cks=$(".ckchild");
  13. for(i in cks){
  14. if(i<=cks.length-1){
  15. if(!cks[i].checked){
  16. return;
  17. }
  18. }
  19. }
  20. //选中 都选中 需要将全选按钮 变得选中 判断所有复选框的状态
  21. $("#ckall")[0].checked=true;
  22. }else{
  23. //未选中
  24. if($("#ckall")[0].checked){
  25. $("#ckall")[0].checked=false;
  26. }
  27. }
  28. })

四、Ajax

4.1Ajax是什么

AJAX(Asynchronous JavaScript and XML))是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新。

就是网页中请求后端接口的一种技术,可以请求的时候传递数据,并获取服务器接口的返回数据

4.2 Ajax的作用

实现网页中局部加载数据,可以请求后端接口地址

接口:返回值

4.3 Ajax的使用

基于jQuery实现Ajax的使用

1.后端接口

https://v1.jinrishici.com/all.json

2.前端代码

结合接口的请求方式进行代码的编写

  1. <div>
  2. <h1><button id="btn1">每日诗词</button></h1>
  3. </div>
  4. <div>
  5. <h2 id="dvtitle"></h2>
  6. </div>
  7. <script>
  8. $("#btn1").click(function(){
  9. /**
  10. * 发起get请求,参数说明:1.请求的路径 2.回调函数 接收接口的返回值*/
  11. $.get("https://v1.jinrishici.com/all.json",function(res){
  12. console.log(res);
  13. $("#dvtitle").html(res.content);
  14. })
  15. });
  16. </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:是一种特殊的字符串,符合一定的语法格式
J
SON中的语法:

{}:对象

[]:数组,元素

“”属性名称或者字符串类型的值

: 连接属性和值的符号

, 连接多个属性或者多个元素

eg:

[“id”:1,”name”:”abc”] 错误的

[{“id”:1,”name”:”abc”}] 对的

{1,2,3} 错误的

[1,2,3] 对的

{“id”:1} 对的

5.2 json的生成

阿里巴巴-Fastjson

JSON.toJSONString(对象|集合)

示例代码:

  1. public static void main(String[] args) {
  2. //准备
  3. Student st=new Student(1,"魏总","男");
  4. //生成 对象变为字符串
  5. String json= JSON.toJSONString(st);
  6. System.err.println(json);
  7. //演示生成json数组
  8. List<Student> list=new ArrayList<>();
  9. for(int i=1;i<10;i++){
  10. list.add(new Student(i,"小魏-"+i,"男"));
  11. }
  12. System.err.println(JSON.toJSONString(list));
  13. }

5.3 json的解析

解析json对象的

JSON.parseObject(要解析的json字符串,对应的Class);


解析json数组的


JSON.parseArray(要解析的json字符串,对应的Class);

示例代码:
  1. public static void main(String[] args) {
  2. String json1="{\"id\":1,\"name\":\"魏总\",\"sex\":\"男\"}";
  3. 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\":\"男\"}]";
  4. //解析json字符串 把字符串转变为对象
  5. Student student=JSON.parseObject(json1,Student.class);
  6. System.err.println(student.getName());
  7. //解析数组
  8. System.err.println(JSON.parseArray(json2,Student.class).size());
  9. }

MIME类型:标记资源的类型

组成格式:大类型/小类型

text/html