当前位置: 首页 > news >正文

JavaWeb-Ajax、监听器、过滤器及对应案例和jstl补充

目录

一、Ajax学习

二、JQuery中的ajax

三、JSON格式

四、监听器

五、监听器案例-实现在线人数统计

六、过滤器

七、jstl补充-jstl中的if标签


一、Ajax学习

1.Ajax是什么?

(1)Asynchronous Javascript And XML:异步JavaScript和XML。

(2)可以在JavaScript中发送HTTP请求,这个是请求的发送是异步提交。

2.Ajax可以解决局部刷新的问题

(1)可以缓解后台服务器处理的压力,提高访问效率。

(2)在网络繁忙的时候,更新的数据量比较小,网络很容易支持。

3.同步和异步

(1)同步:在发送第一个请求之后,如果这个请求响应没有回来,那么是无法发送下一个请求的,必须等第一个请求的响应回来后,才可以发送下一个请求,这个请求和响应是有关联的,有点类似于打电话。

(2)异步:在发送第一个请求后,不需要等这个请求的响应回来就可以发送下一个请求,请求和响应是没有关联的,响应不会影响到第二个,第三个,第n个请求的发送,这个有点类似发短信。

(3)异步可以节约处理的时间。

二、JQuery中的ajax

1.获取当前工程运行的根目录

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";//basePath获取的是当前工程运行的根目录
%>
<html><head><base href="<%=basePath%>"> <%--当前项目中的路径参考工程运行的根目录为起始--%><title>$Title$</title></head><body></body>
</html>

2.get与post请求及响应

(1)get请求:

  • 格式:$.get("请求的servlet的目标",{参数,json格式,键值对},function(data){回调函数});
  • function(data){}:是回调函数,用来接收servlet中return回来的数据。

(2)post请求:

  • 格式:格式:$.post("请求的servlet的目标",{参数,json格式,键值对},function(data){回调函数});
  • function(data){}:是回调函数,用来接收servlet中return回来的数据。

(3)axios也是异步的,封装了ajax。

三、JSON格式

1.在Servlet中将普通数据转换为JSON格式

(1)new一个Gson对象。

(2)使用Gson对象名.toJson(要转换的数据)。

(3)案例:

package com.manager.servlet;import com.google.gson.Gson;
import com.manager.pojo.User;
import com.manager.util.DBUtil;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;@WebServlet(name = "ServletTest",urlPatterns = "/ServletTest")
public class ServletTest extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");PreparedStatement pstmt = DBUtil.getPstmt("select * from t_user2 where sid = 21");ArrayList<User> users = new ArrayList<>();User u =null;try {ResultSet rs = pstmt.executeQuery();while(rs.next()){int sid = rs.getInt("sid");String uname = rs.getString("uname");String pwd = rs.getString("pwd");int spower = rs.getInt("spower");u = new User(sid,uname,pwd,spower);users.add(new User(sid,uname,pwd,spower));}} catch (SQLException e) {e.printStackTrace();}Gson g = new Gson();//创建gson对象String userJson = g.toJson(users);//可以把对象转化成对应的json格式,如果是集合或数组,则转成json的数组格式的字符串,如果是单个对象String uJson = g.toJson(u);resp.getWriter().write(uJson);System.out.println(uJson);}
}

2.在js中将接收到的JSON格式数据转换为普通数据

(1)使用eval("var 对象名=" + 接收到的后端数据)。

(2)案例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<script src="js/jquery.js"></script>
<script>$(function () {$("#but").click(function () {$.get("ServletTest",function (data) {// alert(data);//测试是否获取到了后台的数据eval("var u ="+ data);//上面等同于申明了一个json对象 var  u = {"sid":21,"uname":"韩信","pwd":"54321","spower":1}alert(u.uname);alert(u.pwd);//使用申明的方式创建一个json对象var  u2 = {"sid":1,"uname":"韩信2","pwd":"123","spower":1}alert(u2.uname)alert(u2.pwd)})})})
</script>
<body><input type="button" id="but" value="测试gson">
</body>
</html>

四、监听器

1.概念

(1)Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

2.监听对象

(1)Request

(2)Session

(3)Application(ServletContext)

3.监听内容

(1)创建、销毁、属性改变事件。

4.监听作用

(1)在事件发生之前,之后进行一些处理,比如统计在线人数。

5.使用

(1)监听request,使用ServletRequestListener接口

  • 创建一个普通类,实现接口,重写方法。
  • 注解:@WebListener(value = "当前类名")。
  • ServletRequestListener接口:监听的是request对象的创建与销毁。
  • ServletRequestAttributeListener接口:监听的是request的作用域中的值的添加,删除,修改。
  • 在ServletRequestListener接口和ServletRequestAttributeListener接口中都可以通过参数名.getServletRequest()拿到request对象的父对象,然后再强转一下就可以了。
  • 案例:
  • package com.web;import javax.servlet.*;
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpServletRequest;@WebListener(value = "MyRequestListener")
    public class MyRequestListener implements ServletRequestListener, ServletRequestAttributeListener {@Overridepublic void requestDestroyed(ServletRequestEvent sre) {ServletRequest servletRequest = sre.getServletRequest();HttpServletRequest req = (HttpServletRequest) servletRequest;//在销毁的时候处理一些事情ServletContext servletContext = req.getSession().getServletContext();System.out.println("request对象正在被销毁");}@Overridepublic void requestInitialized(ServletRequestEvent sre) {ServletRequest servletRequest = sre.getServletRequest();HttpServletRequest req = (HttpServletRequest) servletRequest;req.setAttribute("msg","数据");String uname = req.getParameter("uname");System.out.println("request对象被创建了");System.out.println("监听器中uname; " + uname);}/*** 监听request对象的Attribute的变化* @param srae*/@Overridepublic void attributeAdded(ServletRequestAttributeEvent srae) {System.out.println("request对象中加入了Attribute");ServletRequest servletRequest = srae.getServletRequest();HttpServletRequest req = (HttpServletRequest) servletRequest;}@Overridepublic void attributeRemoved(ServletRequestAttributeEvent srae) {System.out.println("request对象中的Attribute,有数据被移除");}@Overridepublic void attributeReplaced(ServletRequestAttributeEvent srae) {System.out.println("request对象中的Attribute,有数据被修改");System.out.println("---------------------------------------");}
    }

(2)监听session,使用HttpSessionListener

  • session的监听和request差不多。
  • 注解:@WebListener(value = "当前类名")。
  • HttpSessionListener接口:监听的是session对象的创建与销毁。
  • HttpSessionAttributeListener接口:监听的是session的作用域中的值的添加,删除,修改。
  • 案例:
  • package com.web;import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;@WebListener(value = "MySessionListener")
    public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("session被创建了");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("session被销毁了");}@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {System.out.println("session中加入了数据");}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {System.out.println("session中有数据被移除");}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {System.out.println("session中有数据被修改");}
    }

(3)监听application(ServletContext),使用ServletContextListener

  • application的监听和session差不多。
  • 注解:@WebListener(value = "当前类名")。
  • ServletContextListener接口:监听的是ServletContext对象的创建与销毁。
  • ServletContextAttributeListener接口:监听的是ServletContext的作用域中的值的添加,删除,修改。

五、监听器案例-实现在线人数统计

1.案例:

package com.web.dao.listener;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;@WebListener(value = "CountListener")
public class CountListener implements HttpSessionListener, HttpSessionAttributeListener, ServletContextListener {//当ServletContext初始化的时候定义一个所有用户都可以访问的变量key,value ===> num,0@Overridepublic void contextInitialized(ServletContextEvent sce) {//num值用来记录当前网站的在线人数ServletContext sc = sce.getServletContext();sc.setAttribute("num",0);//放入servlet作用域中的值的类型会默认提升为Object}/*** 监听session对象中的加入属性的动作* @param se*/@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {HttpSession session = se.getSession();ServletContext sc = session.getServletContext();//在这个对象中有一个记录在线人数的num  keyInteger num = (Integer) sc.getAttribute("num");//一旦有用户登录num++;//num在做完自增运算后,重新放入ServletContext对象中sc.setAttribute("num",num);//网页上要取这个值:el表达式-->${num}}/*** 用户退出,需要让num--,在session销毁时* @param se*/@Overridepublic void sessionDestroyed(HttpSessionEvent se) {HttpSession session = se.getSession();ServletContext sc = session.getServletContext();Integer num = (Integer) sc.getAttribute("num");num--;sc.setAttribute("num",num);}
}

六、过滤器

1.过滤器可以对我们所有的请求进行过滤。

2.作用:

(1)对服务器资源进行管理。

(2)保护servlet。

(3)校验请求是否合法(比如:权限是否够)。

3.使用(Filter接口):

(1)需要写一个类实现Filter接口(javax.Servlet下面的)

(2)重写doFilter方法

(3)写一个@WebFilter("")注解,这个注解有在一般情况下有三种,也就是在java中会有三层过滤器

  • @WebFilter("/*"):这个表示拦截所有请求,*是通配符,匹配所有访问的url。
  • @WebFilter("*.do"):这个表示拦截以.do结尾的Servlet请求。
  • @WebFilter("/指定Servlet访问路径"):这个可以拦截指定的某一个Servlet,只需要将过滤器的注解路径设置为和Servlet访问路径一致就可以了。

(4)注意:使用过滤器拦截后,需要将数据放行,否则用户无法访问后面的内容

  • 格式:使用filterChain.doFilter(servletRequest,servletResponse)就可以放行了。

(5)案例:

  • Filter1代码
  • package com.web.filter;import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;@WebFilter("/*") //  /*表示过滤(拦截)所有请求,*是通配符,匹配所有的url
    public class Filter1 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("长沙南站--过滤器1");//可以在当前的过滤器中作相关的数据处理//放行请求filterChain.doFilter(servletRequest,servletResponse);}
    }
  • Filter2代码
  • package com.web.filter;import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;@WebFilter("*.do") //表示拦截以.do结尾的请求
    public class Filter2 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("北京西站--过滤器2");//放行filterChain.doFilter(servletRequest,servletResponse);}
    }
  • Filter3代码
  • package com.web.filter;import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;@WebFilter("/home.do")  //表示拦截访问home.do的请求
    public class Filter3 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("静静家所在小区门口的保安--过滤器3");//放行filterChain.doFilter(servletRequest,servletResponse);}
    }

4.详解过滤器

(1)服务器在接收到浏览器发过来的请求后,先解析请求信息,创建对象request和response,然后根据请求URL地址判断如果符合过滤器的过滤范围,则会调用过滤器中的dofilter来进行请求拦截,并将request和response对象作为实参传递给doFilter方法,我们可以在doFilter方法中申明过滤器的拦截代码。

(2)Init方法:服务器开启时调用。

(3)Destory方法:服务器关闭时调用。

(4)证明过滤器的生命周期:从服务器开启,到服务器关闭。

七、jstl补充-jstl中的if标签

1.格式:<c:if test="布尔值"></c:if>

(1)注意:test的值可以是一个表达式,但结果必须是布尔值。

2.案例:

<%@ page import="java.util.ArrayList" %><%--Created by IntelliJ IDEA.User: DevilDate: 2021/11/28Time: 19:50To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html><head><base href="<%=basePath%>"><title>jstl演示</title></head><body><%ArrayList<String> list = new ArrayList<>();list.add("静静");list.add("夏莉");list.add("莉莉");session.setAttribute("users",list);int age = 18;session.setAttribute("age",age);%> <c:forEach items="${users}" var="user">  <%--等同于增强for循环:for(String user:users){}--%>${user}<br></c:forEach><c:if test="${age>=18}">成年了</c:if><c:if test="${age<18}">未成年</c:if></body>
</html>
http://www.dtcms.com/a/415630.html

相关文章:

  • 如何自己免费建网站做最优秀的自己演讲视频网站
  • 文件包含与下载漏洞
  • centos7.9下安装freeswitch-1.10.5.-release详细教程(极其简单)
  • 慢慢来做网站多少钱互联网保险经纪公司十大排名
  • 【开题答辩全过程】以 Springboot大学英语四、六级学习系统开题为例,包含答辩的问题和答案
  • php网站开发有什么软件男人女人做性关系网站
  • 网站访客qq获取原理南昌网站开发机构
  • 获取淘宝商品视频API接口解析:通过商品链接url获取商品视频item_video
  • k8s node 节点加入 matser 错误 cannot construct envvars
  • 做个自己的网站需要多少钱桂林网络平台开发公司
  • 网站的建设背景临沂seo推广
  • 网站建设合同免费下载做网页公司有哪些
  • 【TS6】Cherry Studio项目介绍
  • 自己创免费网站网站建设人员构成
  • 永远网站建设推荐商城网站建设
  • 【探寻C++之旅】第十五章:哈希表
  • 线程的生命周期
  • 网站建设男装定位微信公众平台注册官网入口
  • 廊坊seo网站排名ui设计培训班有用吗
  • 公司网站定位建议广州手工活外发加工网
  • 高光谱成像在壁画研究分析以及保护的应用
  • 从试水到普及,AI 通识课全面爆发
  • TCP/IP 的韧性:尽力而为 可靠传输协议
  • 与做网站的人怎么谈判网页设计与制作的原则
  • 咸宁网站建设价格有没有专做于投融资的网站
  • 门户网站建设和运行招标公告如何在第三方网站做推广
  • 南宁网站建设找哪家wordpress 技术类主题
  • 如何使用Python压缩和解压文件
  • 小迪web自用笔记40
  • 奇异值分解(Singular Value Decomposition, SVD)详解——从特征值到奇异值