实用指南:JavaWeb-Ajax、监听器、过滤器及对应案例和jstl补充
目录
一、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获取的是当前工程运行的根目录
%>
<%--当前项目中的路径参考工程运行的根目录为起始--%>
$Title$
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 {
@Override
protected 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 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" %>
Title
<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>
四、监听器
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 { @Override public void requestDestroyed(ServletRequestEvent sre) { ServletRequest servletRequest = sre.getServletRequest(); HttpServletRequest req = (HttpServletRequest) servletRequest; //在销毁的时候处理一些事情 ServletContext servletContext = req.getSession().getServletContext(); System.out.println("request对象正在被销毁"); } @Override public 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 */ @Override public void attributeAdded(ServletRequestAttributeEvent srae) { System.out.println("request对象中加入了Attribute"); ServletRequest servletRequest = srae.getServletRequest(); HttpServletRequest req = (HttpServletRequest) servletRequest; } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { System.out.println("request对象中的Attribute,有数据被移除"); } @Override public 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 { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("session被创建了"); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session被销毁了"); } @Override public void attributeAdded(HttpSessionBindingEvent se) { System.out.println("session中加入了数据"); } @Override public void attributeRemoved(HttpSessionBindingEvent se) { System.out.println("session中有数据被移除"); } @Override public 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
@Override
public void contextInitialized(ServletContextEvent sce) {
//num值用来记录当前网站的在线人数
ServletContext sc = sce.getServletContext();
sc.setAttribute("num",0);//放入servlet作用域中的值的类型会默认提升为Object
}
/**
* 监听session对象中的加入属性的动作
* @param se
*/
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
HttpSession session = se.getSession();
ServletContext sc = session.getServletContext();//在这个对象中有一个记录在线人数的num key
Integer num = (Integer) sc.getAttribute("num");
//一旦有用户登录
num++;
//num在做完自增运算后,重新放入ServletContext对象中
sc.setAttribute("num",num);//网页上要取这个值:el表达式-->${num}
}
/**
* 用户退出,需要让num--,在session销毁时
* @param se
*/
@Override
public 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 { @Override public 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 { @Override public 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 { @Override public 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: Devil
Date: 2021/11/28
Time: 19:50
To 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 + "/";
%>
jstl演示
<%
ArrayList list = new ArrayList<>();
list.add("静静");
list.add("夏莉");
list.add("莉莉");
session.setAttribute("users",list);
int age = 18;
session.setAttribute("age",age);
%>
<%--等同于增强for循环:for(String user:users){}--%>
${user}
成年了
未成年

浙公网安备 33010602011771号