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>